Устанавливает значение параметра.
Синтаксис
УстановитьПараметр(<Имя>, <Значение>)Полное описание, параметры и ограничения
КонфигурацияПостроителяDOM.УстановитьПараметр (DOMBuilderConfiguration.SetParameter)
КонфигурацияПостроителяDOM (DOMBuilderConfiguration)
УстановитьПараметр (SetParameter)
Доступен, начиная с версии 8.1.
Синтаксис:
УстановитьПараметр(<Имя>, <Значение>)
Параметры:
<Имя> (обязательный)
Тип: Строка.
Имя параметра.
<Значение> (обязательный)
Тип: Произвольный.
Значение параметра.
Описание:
Устанавливает значение параметра.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
Причины вызова исключений:
указанный квалифицированный параметр не определен в данной конфигурации;
параметр с указанным именем определен в данной конфигурации, но не может быть изменен;
тип устанавливаемого значения параметра отличается от ожидаемого.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Запретить DTD при разборе собственной XML-строки
Проверяем положительный вход без DOCTYPE и отрицательный с локальным пустым объявлением. disallow-doctype — настройка построителя, а не поиск подстроки в произвольном XML.
Где и как запускать
Полный текст собственного серверного общего модуля УчебныеЗадачи. Замените его учебное содержимое всем кодом ниже: процедура ВыполнитьПример уже включена, вспомогательная функция размещается после неё, не внутри процедуры.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.
У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.
Процедура ВыполнитьПример() Экспорт
Построитель = Новый ПостроительDOM;
Настройки = Построитель.КонфигурацияDOM;
Имена = Настройки.ИменаПараметров;
Сообщить(Имена.Содержит("disallow-doctype"));
Для Индекс = 0 По Имена.Количество() - 1 Цикл
Сообщить("Параметр построителя: " + Имена.Элемент(Индекс));
КонецЦикла;
Если Не Настройки.ВозможноУстановитьПараметр("disallow-doctype", Истина) Тогда
ВызватьИсключение "Нельзя включить запрет DTD: разбор не выполняется";
КонецЕсли;
Прежнее = Настройки.ПолучитьПараметр("disallow-doctype");
Настройки.УстановитьПараметр("disallow-doctype", Истина);
Попытка
Документ = ПрочитатьУчебнуюСтроку(Построитель, "<products><product>Книга</product></products>");
Сообщить(Документ.ЭлементДокумента.ИмяЭлемента = "products");
Сообщить(Документ.ЭлементДокумента.ПервыйДочерний.ТекстовоеСодержимое = "Книга");
ОтклонёнDTD = Ложь;
Попытка
СDTD = ПрочитатьУчебнуюСтроку(Построитель, "<!DOCTYPE products><products/>");
Исключение
ОтклонёнDTD = Истина;
Сообщить("Ожидаемый отказ для DOCTYPE: " + ОписаниеОшибки());
КонецПопытки;
Если Не ОтклонёнDTD Тогда
ВызватьИсключение "Отрицательная проверка не пройдена: DOCTYPE был принят";
КонецЕсли;
Сообщить(ОтклонёнDTD);
Исключение
Настройки.УстановитьПараметр("disallow-doctype", Прежнее);
ВызватьИсключение;
КонецПопытки;
Настройки.УстановитьПараметр("disallow-doctype", Прежнее);
Сообщить(Настройки.ПолучитьПараметр("disallow-doctype") = Прежнее);
КонецПроцедуры
Функция ПрочитатьУчебнуюСтроку(Построитель, ТекстXML)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXML);
Попытка
Результат = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Возврат Результат;
КонецФункции
Разбор по шагам
Получаем настройки конкретного ПостроительDOM. ИменаПараметров — СписокСтрокDOM, не обычный Массив: используются Содержит, Количество, Элемент.
Перед изменением проверяем возможность установки, сохраняем прежнее значение и включаем disallow-doctype. Если включение невозможно, пример прекращает разбор.
Вспомогательная функция создаёт и закрывает собственное ЧтениеXML. Положительная строка даёт products с текстом Книга.
Отрицательная строка содержит только собственный DOCTYPE без SYSTEM/PUBLIC и сущностей. Ожидается исключение; факт отказа проверяется вне внутреннего блока Попытка, чтобы не поймать собственную контрольную ошибку.
Прежняя настройка восстанавливается при завершении и при ошибке; это не отменяет уже построенный положительный документ.
Как проверить результат
Проверки наличия disallow-doctype, корня, текста, отказа и восстановления дают Истина.
Сообщение ожидаемого отказа отображает фактическую ошибку платформы; конкретную формулировку не сравниваем.
Ни одна строка не содержит адреса внешнего DTD или файловой ссылки.
Ожидаемый результат
Отработана защитная настройка разбора XML с положительным и отрицательным учебным входом.
На что обратить внимание
Это не полный набор ограничений обработки недоверенного XML: отдельно нужны ограничения размера, времени, схемы и допустимых полей.
Не выключайте запрет для внешнего пользовательского XML ради успешного чтения. Для легитимного DTD требуется отдельная политика безопасных источников.
ПолучитьПараметр с неизвестным именем может вызвать исключение; сначала используйте список имён и проверку возможности установки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Клонировать объявление и отделить равенство от идентичности
Своя служебная пометка связана с узлом, не с XML-текстом. Копия похожа по структуре, но не является тем же объектом и не наследует пользовательские данные.
Где и как запускать
Полный серверный общий модуль своей учебной базы. Внутренний DTD только известной собственной строки, не вход произвольного API.
Подготовка
Только отдельная учебная база. Создайте серверный общий модуль УчебныеЗадачи с процедурой ВыполнитьПример() Экспорт. Полный модуль каждого урока вставьте целиком, включая уже показанную процедуру.
XML содержит только собственный внутренний DTD. Внешнего подмножества DOCTYPE нет, SYSTEM/PUBLIC в двух объявлениях — учебные URN, не пути и не HTTP-адреса.
guideIcon — неразбираемая сущность NDATA; она объявлена, но не используется как &guideIcon; в тексте. Её ресурс не загружается. Нотация описывает формат, не изображение.
Параметры и построитель создаются заново для этой известной строки. Никогда не переносите разрешение DTD на произвольный XML из интернета или API.
Вызовите УчебныеЗадачи.ВыполнитьПример() из серверной учебной команды. Нет записи базы, файлов или сетевых соединений; поведение DOM 1С ещё требует контрольного запуска в учебной базе.
Процедура ВыполнитьПример() Экспорт
Параметры = Новый ПараметрыЧтенияXML(, , , , , Ложь);
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку("<?xml version=""1.0""?>
|<!DOCTYPE products [
|<!NOTATION guideMark PUBLIC ""guide-marker"" ""urn:guide:marker-format"">
|<!ENTITY guideIcon SYSTEM ""urn:guide:marker-payload"" NDATA guideMark>
|]>
|<products xmlns:g=""urn:guide:dtd""><product>Книга</product></products>", Параметры);
Построитель = Новый ПостроительDOM;
Настройки = Построитель.КонфигурацияDOM;
Если НЕ Настройки.ВозможноУстановитьПараметр("disallow-doctype", Ложь) Тогда
Чтение.Закрыть();
ВызватьИсключение "Построитель не разрешает собственный внутренний DTD";
КонецЕсли;
Настройки.УстановитьПараметр("disallow-doctype", Ложь);
Попытка
Документ = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
ОписаниеТипа = Документ.ОпределениеТипаДокумента;
Если ОписаниеТипа = Неопределено Тогда
ВызватьИсключение "Включите чтение типа документа, не подменяйте его пустым новым DOCTYPE";
КонецЕсли;
Сущность = ОписаниеТипа.Сущности.ПолучитьИменованныйЭлемент("guideIcon");
Нотация = ОписаниеТипа.Нотации.ПолучитьИменованныйЭлемент("guideMark");
Если ТипЗнч(Сущность) <> Тип("СущностьDOM") ИЛИ ТипЗнч(Нотация) <> Тип("НотацияDOM") Тогда
ВызватьИсключение "Построитель не сохранил ожидаемые собственные объявления DTD";
КонецЕсли;
Узлы = Новый Массив;
Узлы.Добавить(Сущность);
Узлы.Добавить(Нотация);
Для Каждого Узел Из Узлы Цикл
Прежнее = Узел.УстановитьПользовательскиеДанные("guide-task", "Учебная проверка");
Сообщить(Прежнее = Неопределено);
Сообщить(Узел.ПолучитьПользовательскиеДанные("guide-task") = "Учебная проверка");
Копия = Узел.КлонироватьУзел(Истина);
Сообщить(Узел.УзелИдентичен(Узел));
Сообщить(НЕ Узел.УзелИдентичен(Копия));
Сообщить(Узел.УзелРавен(Копия));
Сообщить(Копия.ПолучитьПользовательскиеДанные("guide-task") = Неопределено);
Сообщить(Копия.РодительскийУзел = Неопределено);
Положение = Узел.СравнитьПозициюВДокументе(Копия);
Сообщить("Положение отдельной копии: " + Строка(Положение));
Копия.Нормализовать();
Сообщить(Копия.ДочерниеУзлы.Количество() = 0);
Снятое = Узел.УстановитьПользовательскиеДанные("guide-task", Неопределено);
Сообщить(Снятое = "Учебная проверка");
Сообщить(Узел.ПолучитьПользовательскиеДанные("guide-task") = Неопределено);
КонецЦикла;
КонецПроцедурыРазбор по шагам
УстановитьПользовательскиеДанные возвращает прежнее значение. Первый вызов связывает свою пометку с реально полученным узлом.
КлонироватьУзел(Истина) создаёт отдельный узел. По локальной справке у копии не определены родитель и пользовательские данные.
УзелИдентичен сравнивает идентичность, УзелРавен структуру. Оба сравнения проверяются и не подменяют друг друга.
СравнитьПозициюВДокументе только диагностируется: отдельная копия не имеет гарантированного порядка до/после в дереве.
Нормализовать у листа не создаёт детей или загружает содержимое SYSTEM. В конце собственная пометка снимается передачей Неопределено, прежняя строка проверяется.
Как проверить результат
По десять Истина для каждого узла и диагностическое положение копии.
Копии не помещаются в корень или коллекции DTD, исходные объявления не удаляются.
Ожидаемый результат
Различие структуры, идентичности и служебных данных показано на настоящем объявлении.
На что обратить внимание
Пользовательская пометка — не атрибут XML и не постоянная запись.
Положение отдельной копии не используйте как индекс коллекции объявлений.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.