Получает узел DOM по индексу.
Синтаксис
Элемент(<Индекс>)Полное описание, параметры и ограничения
КоллекцияСущностейDOM.Элемент (DOMEntityMap.Item)
КоллекцияСущностейDOM (DOMEntityMap)
Элемент (Item)
Доступен, начиная с версии 8.1.
Синтаксис:
Элемент(<Индекс>)
Параметры:
<Индекс> (обязательный)
Тип: Число.
Индекс узла в коллекции.
Возвращаемое значение:
Тип: СущностьDOM.
Описание:
Получает узел DOM по индексу.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Индексный обход своего DTD: паспорт двух внутренних объявлений и одного формата
На собственной короткой XML-строке получить настоящие коллекции объявлений DTD, обойти сущности и нотацию через Элемент с числовым индексом и распознать ограниченный учебный профиль по полному набору фактических имён и идентификаторов. Клиент видит строковый паспорт только после всех проверок; изменения данных, чтения внешних ресурсов и обещания раскрытия сущностей нет.
Где и как запускать
Сервер; неглобальный непривилегированный общий модуль ПаспортСвоегоDTD85. Клиент получает только Строка через свою управляемую форму.
Подготовка
Будущий опыт выполняйте в собственной НОВОЙ пустой учебной файловой базе на платформе 8.5.1.1343, в толстом управляемом клиенте. Не встраивайте учебный код в рабочую УТ, КА или УНФ. Пример читает только одну собственную строку в памяти: не обращается к объектам базы, файлам или сети.
В Конфигураторе: Общие → Общие модули → создать ПаспортСвоегоDTD85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; Клиент (управляемое приложение)=Нет; Клиент (обычное приложение)=Нет; Внешнее соединение=Нет; Повторное использование возвращаемых значений=Не использовать. Вставьте основной блок ЦЕЛИКОМ в его пустой модуль.
Общие → Общие формы → создать управляемую форму ПаспортВнутреннихОбъявлений85. Один реквизит Результат85, тип Строка неограниченной длины, начальное значение пустое. Выведите его многострочным полем только для чтения. В учебной форме не нужны согласия на запись, реальные пользователи, сведения о всей метадате или скрытые служебные объекты.
В свойствах этой формы установите АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать и СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Оба свойства — перечисления, не Булево. Не включайте собственные обработчики автоматического сохранения.
В форме создайте команду ПроверитьСвойDTD85, Действие=ПроверитьСвойDTD85; выведите кнопку. Второй блок ЦЕЛИКОМ вставьте в пустой модуль этой формы. Команда передаётся самим приложением: не вызывайте обработчик вручную с выдуманным объектом.
Общие → Общие команды → создать ОткрытьСвойПаспортDTD85. Параметр команды отсутствует; включите команду в командный интерфейс собственной учебной подсистемы. Третий блок ЦЕЛИКОМ вставьте в пустой модуль этой общей команды. У неё настоящий обработчик ОбработкаКоманды с двумя штатными параметрами.
Обновите конфигурацию учебной базы, откройте её толстым управляемым клиентом, откройте форму своей общей командой и нажмите ПроверитьСвойDTD85. Основной разбор работает на сервере; на клиент возвращается только строковый паспорт, не DOM-объекты.
Не заменяйте фиксированный XML входом из файла, Интернета, чужой формы или параметра функции. Внутри строки есть только два коротких внутренних объявления и одна публичная текстовая метка нотации. Нет внешнего DTD, SYSTEM, URL, NDATA, рекурсивных или параметрических сущностей.
Фактический разбор в 1С пока не запускался. Если построитель не сохранил DTD, две сущности/одну нотацию или вернул другие типы/идентификаторы, получите остановку «Подготовка не завершена», а не готовый паспорт. Не заменяйте отсутствующие объявления фиктивными новыми объектами.
Функция ПолучитьСвойПаспортDTD85() Экспорт
XML = "<!DOCTYPE ownInvoice85 [<!ENTITY ownPrice85 ""300""><!ENTITY ownQty85 ""6""><!NOTATION ownInvoiceFormat85 PUBLIC ""OWN-INVOICE-85"">]><ownInvoice85/>";
Параметры = Новый ПараметрыЧтенияXML("1.0", , , , , Ложь);
Построитель = Новый ПостроительDOM;
Конфигурация = Построитель.КонфигурацияDOM;
Если ТипЗнч(Конфигурация) <> Тип("КонфигурацияПостроителяDOM") Тогда
ВызватьИсключение "Не получена конфигурация собственного построителя DOM";
КонецЕсли;
Возможно = Конфигурация.ВозможноУстановитьПараметр("disallow-doctype", Ложь);
Если ТипЗнч(Возможно) <> Тип("Булево") Или Не Возможно Тогда
ВызватьИсключение "Подготовка не завершена: свой построитель не разрешил внутренний DTD";
КонецЕсли;
Конфигурация.УстановитьПараметр("disallow-doctype", Ложь);
Читатель = Новый ЧтениеXML;
Попытка
Читатель.УстановитьСтроку(XML, Параметры);
Документ = Построитель.Прочитать(Читатель);
Исключение
ОшибкаЧтения = ИнформацияОбОшибке();
Попытка
Читатель.Закрыть();
Исключение
ВызватьИсключение("Чтение собственного DTD не завершено; попытка закрытия тоже завершилась ошибкой. Исходная причина сохранена.", , "OWNDTD85.READ_CLOSE", , ОшибкаЧтения);
КонецПопытки;
ВызватьИсключение("Чтение собственного DTD не завершено. Исходная причина сохранена.", , "OWNDTD85.READ", , ОшибкаЧтения);
КонецПопытки;
Читатель.Закрыть();
Если ТипЗнч(Документ) <> Тип("ДокументDOM") Тогда
ВызватьИсключение "Нужен настоящий DOM собственного XML, а не HTML или подставленный объект";
КонецЕсли;
DTD = Документ.ОпределениеТипаДокумента;
Если ТипЗнч(DTD) <> Тип("ОпределениеТипаДокументаDOM") Тогда
ВызватьИсключение "Подготовка не завершена: прочитанный документ не сохранил свой DTD";
КонецЕсли;
ИмяDTD = DTD.Имя;
Если ТипЗнч(ИмяDTD) <> Тип("Строка") Или ИмяDTD <> "ownInvoice85"
Или ТипЗнч(DTD.ПубличныйИдентификатор) <> Тип("Строка") Или DTD.ПубличныйИдентификатор <> ""
Или ТипЗнч(DTD.СистемныйИдентификатор) <> Тип("Строка") Или DTD.СистемныйИдентификатор <> "" Тогда
ВызватьИсключение "Не распознан собственный внутренний DTD без внешних идентификаторов";
КонецЕсли;
ВладелецDTD = DTD.ДокументВладелец;
Если ТипЗнч(ВладелецDTD) <> Тип("ДокументDOM") Или Не ВладелецDTD.УзелИдентичен(Документ) Тогда
ВызватьИсключение "DTD должен принадлежать именно прочитанному собственному документу";
КонецЕсли;
Сущности = DTD.Сущности;
Нотации = DTD.Нотации;
Если ТипЗнч(Сущности) <> Тип("КоллекцияСущностейDOM") Или ТипЗнч(Нотации) <> Тип("КоллекцияНотацийDOM") Тогда
ВызватьИсключение "Подготовка не завершена: не получены две настоящие коллекции объявлений";
КонецЕсли;
ЧислоСущностей = Сущности.Количество();
ЧислоНотаций = Нотации.Количество();
Если ТипЗнч(ЧислоСущностей) <> Тип("Число") Или ЧислоСущностей <> 2
Или ТипЗнч(ЧислоНотаций) <> Тип("Число") Или ЧислоНотаций <> 1 Тогда
ВызватьИсключение "Подготовка не завершена: нужны фактически сохранённые две сущности и одна нотация";
КонецЕсли;
ИмяЦены = "";
ИмяКоличества = "";
Для Индекс = 0 По ЧислоСущностей - 1 Цикл
Сущность = Сущности.Элемент(Индекс);
Если ТипЗнч(Сущность) <> Тип("СущностьDOM") Тогда
ВызватьИсключение "Индекс коллекции сущностей должен вернуть настоящую СущностьDOM";
КонецЕсли;
ВладелецСущности = Сущность.ДокументВладелец;
Если ТипЗнч(ВладелецСущности) <> Тип("ДокументDOM") Или Не ВладелецСущности.УзелИдентичен(Документ) Тогда
ВызватьИсключение "Объявление сущности должно принадлежать собственному документу";
КонецЕсли;
Имя = Сущность.ИмяУзла;
Если ТипЗнч(Имя) <> Тип("Строка")
Или ТипЗнч(Сущность.ПубличныйИдентификатор) <> Тип("Строка") Или Сущность.ПубличныйИдентификатор <> ""
Или ТипЗнч(Сущность.СистемныйИдентификатор) <> Тип("Строка") Или Сущность.СистемныйИдентификатор <> "" Тогда
ВызватьИсключение "Разрешены только настоящие собственные внутренние объявления без внешних идентификаторов";
КонецЕсли;
Если Имя = "ownPrice85" Тогда
Если ИмяЦены <> "" Тогда
ВызватьИсключение "Имя собственного объявления цены не должно повторяться";
КонецЕсли;
ИмяЦены = Имя;
ИначеЕсли Имя = "ownQty85" Тогда
Если ИмяКоличества <> "" Тогда
ВызватьИсключение "Имя собственного объявления количества не должно повторяться";
КонецЕсли;
ИмяКоличества = Имя;
Иначе
ВызватьИсключение "Неизвестное имя объявления: учебный профиль не распознан";
КонецЕсли;
КонецЦикла;
Если ИмяЦены = "" Или ИмяКоличества = "" Тогда
ВызватьИсключение "Нужен полный набор двух различных собственных имён, независимо от порядка коллекции";
КонецЕсли;
Нотация = Нотации.Элемент(0);
Если ТипЗнч(Нотация) <> Тип("НотацияDOM") Тогда
ВызватьИсключение "Индекс коллекции нотаций должен вернуть настоящую НотацияDOM";
КонецЕсли;
ВладелецНотации = Нотация.ДокументВладелец;
Если ТипЗнч(ВладелецНотации) <> Тип("ДокументDOM") Или Не ВладелецНотации.УзелИдентичен(Документ) Тогда
ВызватьИсключение "Нотация должна принадлежать собственному документу";
КонецЕсли;
ИмяФормата = Нотация.ИмяУзла;
МеткаФормата = Нотация.ПубличныйИдентификатор;
Если ТипЗнч(ИмяФормата) <> Тип("Строка") Или ИмяФормата <> "ownInvoiceFormat85"
Или ТипЗнч(МеткаФормата) <> Тип("Строка") Или МеткаФормата <> "OWN-INVOICE-85"
Или ТипЗнч(Нотация.СистемныйИдентификатор) <> Тип("Строка") Или Нотация.СистемныйИдентификатор <> "" Тогда
ВызватьИсключение "Не распознан известный собственный формат без внешнего ресурса";
КонецЕсли;
Если Сущности.Количество() <> ЧислоСущностей Или Нотации.Количество() <> ЧислоНотаций Тогда
ВызватьИсключение "Количество собственных объявлений неожиданно изменилось";
КонецЕсли;
Возврат "DTD: " + ИмяDTD + ". Сущности (" + Строка(ЧислоСущностей) + "): " + ИмяЦены + "; " + ИмяКоличества
+ ". Нотации (" + Строка(ЧислоНотаций) + "): " + ИмяФормата + ". Публичная метка: " + МеткаФормата
+ ". Внешние идентификаторы отсутствуют. Учебный профиль распознан.";
КонецФункцииЦелый модуль собственной управляемой формы ПаспортВнутреннихОбъявлений85
Общие → Общие формы → ПаспортВнутреннихОбъявлений85 → пустой модуль формы. Вставить ЦЕЛИКОМ; Результат85 — строковое поле только для чтения; команда ПроверитьСвойDTD85 связана через Действие.
Реальный обработчик своей команды — клиент; функция получения паспорта — сервер. По границе передаётся только строковый результат, не DOM.
&НаКлиенте
Процедура ПроверитьСвойDTD85(Команда)
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ПроверитьСвойDTD85" Тогда
ВызватьИсключение "Нужна настоящая собственная команда формы";
КонецЕсли;
Результат85 = "";
Попытка
Получено = ПолучитьПаспортНаСервере85();
Если ТипЗнч(Получено) <> Тип("Строка") Или Получено = "" Тогда
ВызватьИсключение "Сервер не вернул полный строковый паспорт";
КонецЕсли;
Результат85 = Получено;
Исключение
Результат85 = "Паспорт НЕ получен. Опыт остановлен.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПолучитьПаспортНаСервере85()
Если ИмяФормы <> "ОбщаяФорма.ПаспортВнутреннихОбъявлений85"
Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
ВызватьИсключение "Нужна собственная форма с отключённым сохранением данных";
КонецЕсли;
Паспорт = ПаспортСвоегоDTD85.ПолучитьСвойПаспортDTD85();
Если ТипЗнч(Паспорт) <> Тип("Строка") Или Паспорт = "" Тогда
ВызватьИсключение "Не получен полный строковый результат собственного модуля";
КонецЕсли;
Возврат Паспорт;
КонецФункцииЦелый модуль собственной общей команды ОткрытьСвойПаспортDTD85
Общие → Общие команды → ОткрытьСвойПаспортDTD85 → пустой модуль команды. Вставить ЦЕЛИКОМ; без параметра, команда включена в свой учебный командный интерфейс.
Толстый управляемый клиент; настоящее событие ОбработкаКоманды с обоими штатными параметрами.
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если ПараметрКоманды <> Неопределено
Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
ВызватьИсключение "Откройте свою учебную форму штатной общей командой без параметра";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.ПаспортВнутреннихОбъявлений85");
#Иначе
ВызватьИсключение "Учебная общая команда открывается в толстом управляемом клиенте";
#КонецЕсли
КонецПроцедурыРазбор по шагам
DTD — служебное объявление структуры XML. Сущность даёт имя значению внутри XML; нотация обозначает формат. В этом уроке рассматривается только паспорт объявлений, а не проверка правильности XML по DTD и не раскрытие значений 300/6.
ЧтениеXML получает ровно свою фиксированную строку. Шестой аргумент ПараметрыЧтенияXML явно равен Ложь, чтобы не игнорировать DTD: по умолчанию там Истина. Проверка правильности остаётся НетПроверки. Свой построитель отдельно разрешает документированный параметр disallow-doctype после проверки возможности его установки.
После разбора нужны настоящий ДокументDOM, его настоящий DTD, правильное имя и тот же документ-владелец. Из DTD получаются две разные реальные коллекции: сущности и нотации. Тип коллекции не подменяется из-за неточного слова в описании справки.
Индексы начинаются с нуля. Сущности.Элемент(Индекс) проходит весь фактический диапазон 0..1; каждое объявление проверяется по типу, владельцу, имени и внешним идентификаторам. Порядок коллекции не предполагается: ownPrice85 и ownQty85 могут встретиться в любом порядке, но нужны оба различных имени.
Нотации.Элемент(0) получает единственную настоящую нотацию после проверки количества=1. Её фактические имя и публичная метка распознают собственный формат OWN-INVOICE-85. Это текстовая метка, не команда поиска или загрузки ресурса.
Только после полного контроля из фактически прочитанных имён, метки и количества собирается строковый паспорт. Не используются константы вместо результатов Элемент, значения сущностей не преобразуются в цену/количество и сумма не вычисляется.
При ошибке чтения предпринимается попытка закрыть собственный объект чтения. Первичная ИнформацияОбОшибке остаётся причиной нового исключения с постоянным понятным текстом; если закрытие тоже ошиблось, это отмечено отдельно без обещания успешной очистки. Полный текст ошибки не копируется в результат и не печатается нашим кодом.
Как проверить результат
На неизменной собственной строке ожидается паспорт: DTD ownInvoice85; два имени ownPrice85/ownQty85; количество сущностей 2; нотация ownInvoiceFormat85; публичная метка OWN-INVOICE-85; количество нотаций 1. Порядок перечисления сущностей внутри коллекции не важен. Это ожидаемый будущий результат, не проведённый запуск в 1С.
В отладчике будущего учебного опыта после Прочитать проверьте настоящие типы ДокументDOM, ОпределениеТипаДокументаDOM, КоллекцияСущностейDOM и КоллекцияНотацийDOM. После каждого Элемент убедитесь, что это действительно СущностьDOM или НотацияDOM своего документа, а не подставленный объект.
В собственной копии учебного исходника измените одно имя объявления, сохранив корректную короткую XML-строку. Ожидается остановка «учебный профиль не распознан», без вывода успешного паспорта и без исправления имени.
Добавьте третье собственное внутреннее объявление. Ожидается остановка по фактическому количеству, без пропуска лишнего объявления. Удалите нотацию или измените её собственную публичную метку — паспорт также не должен пройти.
Не вставляйте внешние SYSTEM/URL даже ради отрицательной проверки. Урок принимает только свою фиксированную строку; проверка идентификаторов после разбора не является универсальной защитой чтения произвольного опасного XML.
Если отсутствие идентификатора фактически представлено не пустой Строка, а Неопределено или другим значением, опыт останавливается. Тип и представление должны быть действительно проверены; код не подставляет пустую строку ради успеха.
После отказа или исключения поле должно сообщить «Паспорт НЕ получен. Опыт остановлен». Причина остаётся исключением, ошибка не считается успешным примером. Повторное нажатие в этом полностью своём опыте создаёт новые объекты памяти; ничего не дописывает и не очищает в базе.
Ожидаемый результат
Только при фактическом полном положительном пути: DTD ownInvoice85; два прочитанных имени ownPrice85/ownQty85; две сущности; одна нотация ownInvoiceFormat85 с прочитанной меткой OWN-INVOICE-85. Ошибка или отсутствие реальных объявлений — остановка, не успешный паспорт.
На что обратить внимание
ПостроительDOM.Прочитать прямо говорит: обработка схемы DTD не выполняется, его параметры не переносятся в документ. Наличие разрешения DTD не доказывает, что конкретная среда сохранит все объявления. Отсутствующие реальные карты/узлы — незавершённая подготовка.
Свойства DTD, коллекций, имён, идентификаторов и владельцев только читаются. Урок не вызывает УстановитьИменованныйЭлемент/УдалитьИменованныйЭлемент, не меняет объявления и не обещает изменяемость карт, полученных от построителя.
Публичные и системные идентификаторы документированы как Строка, но справка не гарантирует представление отсутствующего идентификатора. Здесь требуются фактические пустые строки; неожиданное состояние не нормализуется и не засчитывается как положительный путь.
Тип коллекции доступен в большем числе контекстов, чем её методы: конкретные Количество/Элемент и свойства объявлений здесь выполняются на сервере. Нельзя перенести весь разбор в тонкий клиент по одной строке доступности типа.
Паспорт подтверждает только прочитанные имена/идентификаторы/количества собственного ограниченного профиля. Это не проверка замещающего текста сущностей, не вычисление суммы 1800, не импорт, не криптографическая канонизация и не защита от XML внешнего источника.
Отдельные возможности КаноническийDOM, АдаптироватьУзел, методы изменения карт и прежние неоднозначные HTML-операции сюда не включены. Пустой конструктор, чтение одного свойства или заранее ожидаемая ошибка не заменяют работающий пример.
Запуск компилятора, 1С, ручной формы, чтение реальной базы, файлов или сети не выполнялись. Здесь написан сценарий и сверен установленный контракт; реальный успешный паспорт должен подтвердить будущий ручной учебный опыт.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.