Получает соответствие URI пространств имен. Ключом соответствия является префикс, значением - URI пространства имен.
Синтаксис
ПолучитьСоответствияПространствИмен()Полное описание, параметры и ограничения
ЭлементDOM.ПолучитьСоответствияПространствИмен (DOMElement.NamespaceMappings)
ЭлементDOM (DOMElement)
ПолучитьСоответствияПространствИмен (NamespaceMappings)
Доступен, начиная с версии 8.1.
Синтаксис:
ПолучитьСоответствияПространствИмен()
Возвращаемое значение:
Тип: Соответствие.
Описание:
Получает соответствие URI пространств имен.
Ключом соответствия является префикс, значением - URI пространства имен.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Собрать XML-атрибут из текстовых узлов, найти элемент по ID и убрать своё пространство имён
Один самостоятельный опыт: значение id собирается из собственных текстовых узлов, меняется вставкой и заменой, нормализуется, используется для поиска элемента и восстанавливается после удаления. Временное объявление пространства имён проверяется отдельно.
Где и как запускать
Полный модуль управляемой формы ОпытАтрибутXML85.Форма; клиентская команда и серверная функция без контекста, собственный XML DOM только в памяти.
Подготовка
Создайте новую пустую учебную конфигурацию УчебныеАтрибутыXML85 на платформе8.5.1.1343, управляемое приложение. Не используйте рабочую базу или её копию с прикладными обработчиками.
Обработки → ОпытАтрибутXML85 → Формы → Форма, тип Управляемая. Сделайте её основной формой обработки. Реквизиты документов, справочников и табличных частей не нужны.
В форме добавьте команду ПроверитьАтрибутXML85, создайте действие с тем же именем и перетащите команду на форму. Основной код ниже — полный модуль этой формы, не тело отдельного обработчика.
Клиентский обработчик только вызывает серверную функцию и показывает её строковый итог. DOM создаётся и полностью используется на сервере; объекты DOM не передаются через клиент-серверную границу.
Нажмите F7 и обновите только этот новый стенд. runtimeVerifiedScenarios=0: в ходе подготовки справочника 1С и этот пример не запускались; проведённые проверки статические.
После собственного ручного запуска откройте обработку через функции для технического специалиста и нажмите ПроверитьАтрибутXML85. Разрешён только опыт в новой учебной базе.
Файлы, строки внешнего XML, DTD, сеть, сертификаты и настройки безопасности не используются. URI urn:guide:owned-dom85 — идентификатор пространства имён, а не адрес запроса.
Каждое повторное нажатие создаёт новый ДокументDOM с корнем demo и новым атрибутом id; прежние объекты не сохраняются в форме или базе.
&НаКлиенте
Процедура ПроверитьАтрибутXML85(Команда)
Сообщить(ПроверитьСвойDOMНаСервере());
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПроверитьСвойDOMНаСервере()
Документ = Новый ДокументDOM("", "demo");
Корень = Документ.ЭлементДокумента;
Атрибут = Документ.СоздатьАтрибут("id");
Пока Атрибут.ДочерниеУзлы.Количество() > 0 Цикл
Атрибут.УдалитьДочерний(Атрибут.ПервыйДочерний);
КонецЦикла;
Если Атрибут.Значение <> "" Тогда
ВызватьИсключение "Начальное значение собственного атрибута должно быть пустым";
КонецЕсли;
ТекстА = Документ.СоздатьТекстовыйУзел("A");
ТекстБ = Документ.СоздатьТекстовыйУзел("B");
ТекстС = Документ.СоздатьТекстовыйУзел("C");
ТекстД = Документ.СоздатьТекстовыйУзел("D");
Атрибут.ДобавитьДочерний(ТекстА);
Атрибут.ДобавитьДочерний(ТекстБ);
Если Атрибут.Значение <> "AB" Или Атрибут.ДочерниеУзлы.Количество() <> 2 Тогда
ВызватьИсключение "Два собственных текстовых узла должны дать AB";
КонецЕсли;
Вставленный = Атрибут.ВставитьПеред(ТекстС, ТекстБ);
Если Не Вставленный.УзелИдентичен(ТекстС) Или Атрибут.Значение <> "ACB" Тогда
ВызватьИсключение "C должен попасть перед фактическим B: ACB";
КонецЕсли;
Замененный = Атрибут.ЗаменитьДочерний(ТекстД, ТекстС);
Если Не Замененный.УзелИдентичен(ТекстС) Или Атрибут.Значение <> "ADB" Тогда
ВызватьИсключение "Метод возвращает прежний C, а значение должно стать ADB";
КонецЕсли;
Атрибут.Нормализовать();
Если Атрибут.Значение <> "ADB" Или Атрибут.ДочерниеУзлы.Количество() <> 1 Тогда
ВызватьИсключение "Нормализация должна объединить соседние текстовые узлы, сохранив ADB";
КонецЕсли;
Корень.УстановитьУзелАтрибута(Атрибут);
Корень.УстановитьУзелАтрибутаИдентификатора(Атрибут, Истина);
Найденный = Документ.ПолучитьЭлементПоИдентификатору("ADB");
Если Найденный = Неопределено Тогда
ВызватьИсключение "Не найден элемент с явно отмеченным ID";
КонецЕсли;
Если Не Найденный.УзелИдентичен(Корень) Тогда
ВызватьИсключение "ID должен привести к своему корню, а не к другому узлу";
КонецЕсли;
URIУчебногоПространства = "urn:guide:owned-dom85";
Корень.УстановитьСоответствиеПространстваИмен("g", URIУчебногоПространства, Ложь);
Соответствия = Корень.ПолучитьСоответствияПространствИмен();
Если Соответствия.Получить("g") <> URIУчебногоПространства Тогда
ВызватьИсключение "В соответствии ключ — префикс g, значение — URI";
КонецЕсли;
Корень.ОтменитьСоответствиеПространстваИмен(URIУчебногоПространства);
СоответствияПослеУдаления = Корень.ПолучитьСоответствияПространствИмен();
Если СоответствияПослеУдаления.Получить("g") <> Неопределено Тогда
ВызватьИсключение "Своё временное объявление пространства имён ещё существует";
КонецЕсли;
Корень.УстановитьУзелАтрибутаИдентификатора(Атрибут, Ложь);
Если Документ.ПолучитьЭлементПоИдентификатору("ADB") <> Неопределено Тогда
ВызватьИсключение "После снятия ID поиск не должен находить этот элемент";
КонецЕсли;
ЕдинственныйТекст = Атрибут.ПервыйДочерний;
УдаленныйТекст = Атрибут.УдалитьДочерний(ЕдинственныйТекст);
Если Не УдаленныйТекст.УзелИдентичен(ЕдинственныйТекст)
Или Атрибут.Значение <> "" Или Атрибут.ДочерниеУзлы.Количество() <> 0 Тогда
ВызватьИсключение "Удаляется реальный единственный текст; атрибут становится пустым";
КонецЕсли;
УдаленныйАтрибут = Корень.УдалитьУзелАтрибута(Атрибут);
Если Не УдаленныйАтрибут.УзелИдентичен(Атрибут) Тогда
ВызватьИсключение "УдалитьУзелАтрибута должен вернуть наш фактический атрибут";
КонецЕсли;
Атрибут.Значение = "A-01";
Корень.УстановитьУзелАтрибута(Атрибут);
Корень.УстановитьУзелАтрибутаИдентификатора(Атрибут, Истина);
Восстановленный = Документ.ПолучитьЭлементПоИдентификатору("A-01");
Если Восстановленный = Неопределено Тогда
ВызватьИсключение "Повторно присоединённый ID A-01 не найден";
КонецЕсли;
Если Не Восстановленный.УзелИдентичен(Корень) Тогда
ВызватьИсключение "Повторный поиск должен вернуть тот же собственный корень";
КонецЕсли;
Корень.УстановитьУзелАтрибутаИдентификатора(Атрибут, Ложь);
Корень.УдалитьУзелАтрибута(Атрибут);
Возврат "AB → ACB → ADB; текстовых узлов после нормализации: 1; ID и g проверены; повторный ID A-01 найден. Всё только в памяти.";
КонецФункцииРазбор по шагам
Новый ДокументDOM("", "demo") создаёт документ с собственным корнем без пространства имён. СоздатьАтрибут создаёт ещё не присоединённый атрибут; возможные начальные дочерние узлы удаляются через реальные ПервыйДочерний и ДочерниеУзлы.
Четыре вызова СоздатьТекстовыйУзел создают A, B, C и D именно в этом документе. Два ДобавитьДочерний формируют значение AB и два текстовых узла. Значение атрибута — объединение текста его детей, а не коллекция отдельных атрибутов.
ВставитьПеред получает настоящий B в качестве опорного ребёнка: C встаёт между A и B. Возвращённый узел проверяется на идентичность с C; значение проверяется как ACB.
ЗаменитьДочерний получает новый D и старый C в таком порядке. Возвращается удалённый C, не вставленный D. Значение становится ADB; УзелИдентичен проверяет ссылку на прежний объект.
Нормализовать объединяет соседние текстовые узлы: ADB остаётся тем же значением, а число детей становится равным одному. Не используйте после нормализации старые A/B/D как гарантированно остающиеся детьми.
УстановитьУзелАтрибута присоединяет свой id к корню. Отдельный вызов УстановитьУзелАтрибутаИдентификатора с Истина делает его ID; одно имя id само по себе этого не гарантирует. Поиск ADB должен вернуть именно собственный корень.
УстановитьСоответствиеПространстваИмен объявляет g → urn:guide:owned-dom85. ПолучитьСоответствияПространствИмен возвращает Соответствие: ключ g, значение URI. ОтменитьСоответствиеПространстваИмен принимает URI, не g; результат проверяется новым чтением.
Перед изменением id его признак идентификатора снимается. УдалитьДочерний получает фактический единственный ребёнок и возвращает его; значение становится пустым. УдалитьУзелАтрибута удаляет сам id с корня и возвращает этот атрибут.
Отсоединённый собственный атрибут можно заполнить A-01 и повторно присоединить к тому же документу. Повторный поиск ID проверяется, затем признак ID и атрибут снимаются. Только после всех проверок функция возвращает итоговую строку.
Как проверить результат
Исходные контрольные значения должны пройти в порядке AB, ACB, ADB; ошибка на любом шаге прерывает опыт исключением вместо сообщения об успехе.
До нормализации после замены три текстовых узла; после неё ровно один, значение ADB не меняется.
ЗаменитьДочерний возвращает прежний C; УдалитьДочерний возвращает реальный единственный нормализованный текст; УдалитьУзелАтрибута возвращает собственный id.
После отметки ID поиск ADB возвращает собственный demo. После снятия отметки тот же поиск возвращает Неопределено.
До отмены пространства имён Соответствия.Получить("g") равно URI; после отмены новое соответствие не содержит g.
После повторного присоединения атрибута поиск A-01 снова возвращает тот же корень. Второе нажатие команды воспроизводит опыт с новым документом.
Ожидаемый результат
Сообщение: AB → ACB → ADB; текстовых узлов после нормализации: 1; ID и g проверены; повторный ID A-01 найден. Всё только в памяти.
На что обратить внимание
Это урок об атрибуте и его текстовых дочерних узлах, а не о дочерних XML-элементах. Нельзя заменить текстовые узлы произвольными элементами.
Все узлы создаются одним ДокументDOM. Перенос узла из другого документа без предусмотренного импортирования может вызвать исключение.
ВставитьПеред и ЗаменитьДочерний требуют существующий дочерний узел этого атрибута. Совпадение текста не делает другой объект тем же ребёнком.
Установка Атрибут.Значение удаляет прежних детей и создаёт текстовый узел; она используется только на этапе повторного заполнения, а не между шагами A/B/C/D.
Нормализовать меняет структуру текстовых узлов. После неё текущего ребёнка получают заново, а не считают старую переменную всё ещё присоединённой.
Имя id и пользовательский признак ID — разные вещи. В этом документе нет DTD/XSD; метод не изменяет схему и не является проверкой XML по схеме.
ОтменитьСоответствиеПространстваИмен получает URI. Объявление префикса не является переименованием корня и не загружает данные из сети.
Если документ получен извне, read-only, DTD с атрибутами по умолчанию и обработка сущностей потребуют отдельного сценария. Здесь эти условия намеренно исключены созданием собственного документа.
DOM-объекты остаются внутри серверной функции. Возвращается только строка: попытка вернуть DOM в тонкий клиент — другой, неподдержанный данным уроком вариант.
Статическое совпадение имён и сигнатур со справкой8.5.1.1343 не доказывает выполнение в 1С. Перед использованием новичок должен пройти F7 и все проверки в своём стенде.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.