Очищает коллекцию.
Синтаксис
Очистить()Полное описание, параметры и ограничения
ПоляВыбораКомпоновкиДанныхСхемыЗапроса.Очистить (QuerySchemaDataCompositionSelectionFields.Clear)
ПоляВыбораКомпоновкиДанныхСхемыЗапроса (QuerySchemaDataCompositionSelectionFields)
Очистить (Clear)
Доступен, начиная с версии 8.3.14.
Синтаксис:
Очистить()
Описание:
Очищает коллекцию.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.14.
Методическая информация
Практические примеры
Поля выбора СКД: оба способа добавления, порядок, псевдонимы и независимая копия
Настраиваем доступные для выбора код товара и цену в собственной схеме запроса. Меняем порядок и псевдоним, удаляем и восстанавливаем поле, очищаем только расширение СКД. На каждом переходе сверяем полный текст заново разобранной схемой; обычные колонки сохраняются.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи нового собственного стенда УчебныеПараметрыТаблицы85; схемы только в памяти, запуск в1С не проверен.
Подготовка
Создайте НОВУЮ отдельную учебную базу, не копию рабочей, на платформе 8.5.1.1343. Имя конфигурации УчебныеПараметрыТаблицы85, совместимость Не использовать. Единственный собственный регистр сведений УчебнаяИстория85: независимый, В пределах секунды; измерение КодТовара Строка3, ресурс Цена Число12,2; без реквизитов/обработчиков. Других прикладных объектов, расширений, подписок и заданий нет. Записи не нужны: схема использует только метаданные.
Создайте собственный общий модуль УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной код в этот модуль. Остальные вручную созданные модули своей конфигурации пусты.
Создайте собственную внешнюю обработку УчебныеПоляВыбора85, управляемую Форму, команду и кнопку Выполнить с действием Выполнить. Реквизиты не нужны. Вставьте полный отдельный модуль формы, показанный ниже. Он вызывает серверный модуль; классы схемы не создаются в тонком клиенте.
До опыта завершите прежний собственный сеанс без транзакции; сохраните конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (F7). После успеха откройте свежий собственный управляемый клиент и свою обработку. F7, форма и BSL здесь не запускались.
РежимКомпоновкиДанных включается ДО УстановитьТекстЗапроса. Не используйте ИТОГИ и недоступные в этом режиме свойства итогов. Текст исходного запроса обычный, без вручную выдуманных скобок; расширение выбора формирует сама СхемаЗапроса.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойМинимальныйСтенд();
ПроверитьСвойРегистр();
Схема = Новый СхемаЗапроса;
Схема.РежимКомпоновкиДанных = Истина;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ История.КодТовара КАК КодТовара, История.Цена КАК Цена
|ИЗ РегистрСведений.УчебнаяИстория85 КАК История");
Выбор = ПолучитьСвойВыбор(Схема);
Поля = Выбор.ПоляВыбораКомпоновкиДанных;
ПустойПорядок = Новый Массив;
ПроверитьСвоиПоля(Выбор, ПустойПорядок);
ПроверитьПовторныйРазборПолей(Схема, ПустойПорядок);
КодКолонка = Выбор.Колонки.Найти("КодТовара");
ПолеКода = Поля.Добавить(КодКолонка);
ПолеКода.Псевдоним = "КодДляОтчета";
ПолеЦены = Поля.Добавить("Цена");
ПолеЦены.Псевдоним = "Стоимость";
СнимокКода = СнимокСвоегоПоля(ПолеКода, "КодТовара", "КодДляОтчета");
СнимокЦены = СнимокСвоегоПоля(ПолеЦены, "Цена", "Стоимость");
ИсходныйПорядок = СвойПорядок(СнимокКода, СнимокЦены);
ОбратныйПорядок = СвойПорядок(СнимокЦены, СнимокКода);
ПроверитьСвоиПоля(Выбор, ИсходныйПорядок);
ПроверитьПовторныйРазборПолей(Схема, ИсходныйПорядок);
Поля.Переместить(ПолеЦены, 0);
ПроверитьСвоиПоля(Выбор, ОбратныйПорядок);
ПроверитьПовторныйРазборПолей(Схема, ОбратныйПорядок);
Поля.Сдвинуть(0, 1);
ПроверитьСвоиПоля(Выбор, ИсходныйПорядок);
ПроверитьПовторныйРазборПолей(Схема, ИсходныйПорядок);
Поля.Переместить(0, 1);
ПроверитьСвоиПоля(Выбор, ОбратныйПорядок);
ПроверитьПовторныйРазборПолей(Схема, ОбратныйПорядок);
Поля.Сдвинуть(ПолеКода, -1);
ПроверитьСвоиПоля(Выбор, ИсходныйПорядок);
ПроверитьПовторныйРазборПолей(Схема, ИсходныйПорядок);
ПолеКода.Псевдоним = "ТоварДляВыбора";
ПереименованныйКод = Новый Структура("ИмяКолонки,Псевдоним,ИспользоватьРеквизиты", "КодТовара", "ТоварДляВыбора", СнимокКода.ИспользоватьРеквизиты);
ПроверитьСвоиПоля(Выбор, СвойПорядок(ПереименованныйКод, СнимокЦены));
ПроверитьПовторныйРазборПолей(Схема, СвойПорядок(ПереименованныйКод, СнимокЦены));
Поля.Удалить(0);
ПроверитьСвоиПоля(Выбор, СвойПорядок(СнимокЦены));
ПроверитьПовторныйРазборПолей(Схема, СвойПорядок(СнимокЦены));
ВосстановленноеПоле = Поля.Добавить(КодКолонка);
ВосстановленноеПоле.Псевдоним = "КодДляОтчета";
Поля.Переместить(ВосстановленноеПоле, 0);
ПроверитьСвоиПоля(Выбор, ИсходныйПорядок);
ПроверитьПовторныйРазборПолей(Схема, ИсходныйПорядок);
КопияСхемы = Новый СхемаЗапроса;
КопияСхемы.РежимКомпоновкиДанных = Истина;
КопияСхемы.УстановитьТекстЗапроса(Схема.ПолучитьТекстЗапроса());
КопияВыбора = ПолучитьСвойВыбор(КопияСхемы);
ПроверитьСвоиПоля(КопияВыбора, ИсходныйПорядок);
Поля.Очистить();
Выбор = ПолучитьСвойВыбор(Схема);
ПроверитьСвоиПоля(Выбор, ПустойПорядок);
ПроверитьПовторныйРазборПолей(Схема, ПустойПорядок);
ПроверитьСвоиПоля(КопияВыбора, ИсходныйПорядок);
Сообщить("Исходный список СКД пуст, две обычные колонки сохранены; самостоятельная копия содержит КодДляОтчета и Стоимость");
Сообщить("Readonly-признаки сохранены: код=" + Строка(СнимокКода.ИспользоватьРеквизиты) + ", цена=" + Строка(СнимокЦены.ИспользоватьРеквизиты));
КонецПроцедуры
Процедура ПроверитьСвойМинимальныйСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 1 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойРегистр()
Если ПривилегированныйРежим() Тогда
ВызватьИсключение "Привилегированный режим для учебного разбора не нужен";
КонецЕсли;
МетаРегистр = Метаданные.РегистрыСведений.Найти("УчебнаяИстория85");
Если МетаРегистр = Неопределено Тогда
ВызватьИсключение "Нужен только собственный регистр УчебнаяИстория85";
КонецЕсли;
Если МетаРегистр.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый
Или МетаРегистр.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Секунда
Или МетаРегистр.Измерения.Количество() <> 1 Или МетаРегистр.Ресурсы.Количество() <> 1
Или МетаРегистр.Реквизиты.Количество() <> 0 Тогда
ВызватьИсключение "Нужен независимый периодический регистр с одним измерением и ресурсом";
КонецЕсли;
МетаКод = МетаРегистр.Измерения.Найти("КодТовара");
МетаЦена = МетаРегистр.Ресурсы.Найти("Цена");
Если МетаКод = Неопределено Или МетаЦена = Неопределено Тогда
ВызватьИсключение "Нужны свои КодТовара и Цена";
КонецЕсли;
КодТипы = МетаКод.Тип.Типы();
ЦенаТипы = МетаЦена.Тип.Типы();
Если КодТипы.Количество() <> 1 Или ЦенаТипы.Количество() <> 1 Тогда
ВызватьИсключение "Составные типы своих полей не подходят";
КонецЕсли;
Если КодТипы[0] <> Тип("Строка") Или ЦенаТипы[0] <> Тип("Число")
Или МетаКод.Тип.КвалификаторыСтроки.Длина <> 3
Или МетаЦена.Тип.КвалификаторыЧисла.Разрядность <> 12
Или МетаЦена.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2 Тогда
ВызватьИсключение "Не совпали полные собственные типы полей";
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСвойОператор(Схема)
Если Не Схема.РежимКомпоновкиДанных Или Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Нужна одна собственная схема в режиме СКД";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Или Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один собственный запрос выбора и оператор";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Если ТипЗнч(Оператор) <> Тип("ОператорВыбратьСхемыЗапроса") Или Оператор.Источники.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один собственный источник";
КонецЕсли;
Источник = Оператор.Источники.Получить(0);
Таблица = Источник.Источник;
Если ТипЗнч(Таблица) <> Тип("ТаблицаСхемыЗапроса")
Или НРег(Таблица.ИмяТаблицы) <> НРег("РегистрСведений.УчебнаяИстория85")
Или Таблица.Псевдоним <> "История" Тогда
ВызватьИсключение "Только свой физический источник История, без виртуальных или вложенных таблиц";
КонецЕсли;
Возврат Оператор;
КонецФункции
Функция ПолучитьСвойВыбор(Схема)
Оператор = ПолучитьСвойОператор(Схема);
Выбор = Схема.ПакетЗапросов.Получить(0);
Если Выбор.Колонки.Количество() <> 2 Или Оператор.ВыбираемыеПоля.Количество() <> 2 Тогда
ВызватьИсключение "Нужны ровно две собственные исходные колонки";
КонецЕсли;
Для Индекс = 0 По 1 Цикл
Колонка = Выбор.Колонки.Получить(Индекс);
Если Индекс = 0 Тогда
Имя = "КодТовара";
Выражение = Новый ВыражениеСхемыЗапроса("История.КодТовара");
ОжидаемыйТип = Тип("Строка");
Иначе
Имя = "Цена";
Выражение = Новый ВыражениеСхемыЗапроса("История.Цена");
ОжидаемыйТип = Тип("Число");
КонецЕсли;
Если ТипЗнч(Колонка) <> Тип("КолонкаСхемыЗапроса") Или Колонка.Псевдоним <> Имя
Или Выбор.Колонки.Найти(Имя) <> Колонка Или Колонка.Поля.Количество() <> 1
Или ТипЗнч(Колонка.Поля.Получить(0)) <> Тип("ВыражениеСхемыЗапроса")
Или Колонка.Поля.Получить(0) <> Выражение Тогда
ВызватьИсключение "Не совпали имя, порядок и полное выражение собственной колонки";
КонецЕсли;
Если ТипЗнч(Колонка.ТипЗначения) <> Тип("ОписаниеТипов") Тогда
ВызватьИсключение "Нужно описание типа собственной колонки";
КонецЕсли;
Типы = Колонка.ТипЗначения.Типы();
Если Типы.Количество() <> 1 Или Типы[0] <> ОжидаемыйТип Тогда
ВызватьИсключение "Не совпал полный набор типов собственной колонки";
КонецЕсли;
КонецЦикла;
Возврат Выбор;
КонецФункции
Функция СнимокСвоегоПоля(Элемент, Имя, Псевдоним)
Если ТипЗнч(Элемент) <> Тип("ПолеВыбораКомпоновкиДанныхСхемыЗапроса")
Или ТипЗнч(Элемент.ИспользоватьРеквизиты) <> Тип("Булево")
Или ТипЗнч(Элемент.Псевдоним) <> Тип("Строка") Или Элемент.Псевдоним <> Псевдоним Тогда
ВызватьИсключение "Не совпали тип элемента, псевдоним или тип readonly-признака";
КонецЕсли;
Возврат Новый Структура("ИмяКолонки,Псевдоним,ИспользоватьРеквизиты", Имя, Псевдоним, Элемент.ИспользоватьРеквизиты);
КонецФункции
Функция СвойПорядок(Первая, Вторая = Неопределено)
Порядок = Новый Массив;
Порядок.Добавить(Первая);
Если Вторая <> Неопределено Тогда
Порядок.Добавить(Вторая);
КонецЕсли;
Возврат Порядок;
КонецФункции
Процедура ПроверитьСвоиПоля(Выбор, Ожидаемые)
Поля = Выбор.ПоляВыбораКомпоновкиДанных;
Если ТипЗнч(Поля) <> Тип("ПоляВыбораКомпоновкиДанныхСхемыЗапроса") Или Поля.Количество() <> Ожидаемые.Количество() Тогда
ВызватьИсключение "Не совпал тип или полный размер собственного списка выбора СКД";
КонецЕсли;
Для Индекс = 0 По Поля.Количество() - 1 Цикл
Элемент = Поля.Получить(Индекс);
Ожидание = Ожидаемые[Индекс];
Если ТипЗнч(Элемент) <> Тип("ПолеВыбораКомпоновкиДанныхСхемыЗапроса")
Или Поля[Индекс] <> Элемент Или Поля.Индекс(Элемент) <> Индекс
Или ТипЗнч(Элемент.Псевдоним) <> Тип("Строка") Или Элемент.Псевдоним <> Ожидание.Псевдоним
Или ТипЗнч(Элемент.ИспользоватьРеквизиты) <> Тип("Булево")
Или Элемент.ИспользоватьРеквизиты <> Ожидание.ИспользоватьРеквизиты Тогда
ВызватьИсключение "Не совпали порядок, типы, псевдоним и сохранённый readonly-признак собственного поля";
КонецЕсли;
СобственнаяКолонка = Выбор.Колонки.Найти(Ожидание.ИмяКолонки);
Если ТипЗнч(СобственнаяКолонка) <> Тип("КолонкаСхемыЗапроса") Тогда
ВызватьИсключение "Нужна реальная колонка текущего собственного запроса";
КонецЕсли;
Если ТипЗнч(Элемент.Поле) = Тип("Строка") Тогда
Если Элемент.Поле <> Ожидание.ИмяКолонки Или Элемент.ИспользоватьРеквизиты Тогда
ВызватьИсключение "Строковое поле должно именовать свою колонку и не расширять реквизиты";
КонецЕсли;
ИначеЕсли ТипЗнч(Элемент.Поле) = Тип("КолонкаСхемыЗапроса") Тогда
Если Элемент.Поле <> СобственнаяКолонка Тогда
ВызватьИсключение "Поле должно ссылаться на колонку именно этой схемы, не другой схемы";
КонецЕсли;
Иначе
ВызватьИсключение "У readonly Поле допустимы только Строка или КолонкаСхемыЗапроса";
КонецЕсли;
Представление = Строка(Элемент);
Если Представление = "" Или Поля.Найти(Представление) <> Элемент Тогда
ВызватьИсключение "Поиск по собственному полному строковому представлению должен вернуть текущий элемент";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьПовторныйРазборПолей(Схема, Ожидаемые)
Текст = Схема.ПолучитьТекстЗапроса();
Если ТипЗнч(Текст) <> Тип("Строка") Или Текст = "" Тогда
ВызватьИсключение "Нужен полный сформированный текст собственной схемы";
КонецЕсли;
Повторная = Новый СхемаЗапроса;
Повторная.РежимКомпоновкиДанных = Истина;
Повторная.УстановитьТекстЗапроса(Текст);
ПовторныйВыбор = ПолучитьСвойВыбор(Повторная);
ПроверитьСвоиПоля(ПовторныйВыбор, Ожидаемые);
КонецПроцедурыУчебныеПоляВыбора85.Форма
Своя внешняя обработка УчебныеПоляВыбора85 → управляемая Форма → Модуль
Модуль своей управляемой формы с отдельным серверным вызовом; здесь не исполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Свои поля выбора СКД, порядок и повторный разбор проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Проверить собственный стенд, физический источник История и ровно две исходные обычные колонки КодТовара и Цена. У каждой проверяются порядок, псевдоним, полное выражение и одноточный набор типов Строка/Число. Сам запрос не выполняется.
У исходного собственного текста список выбора СКД пуст. Проверить его и самостоятельный повторный разбор. Обычные колонки и поля расширения — разные коллекции: первое остаётся из двух элементов при дальнейшей очистке второго.
Первое поле добавить по настоящей КодКолонка текущего запроса, второе — по строковому имени существующей колонки Цена. Дать псевдонимы КодДляОтчета и Стоимость. Сохранить реальные булевы readonly-признаки, не назначая им выдуманные значения.
Поле может быть строкой или КолонкаСхемыЗапроса. Для строки проверить точное собственное имя; для объекта — принадлежность именно текущей собственной колонке. После сериализации допускается нормализация представления Строка/Колонка, но не изменение семантики имени, порядка, псевдонима или признака.
Каждый раз проверить Получить и [], Индекс текущего элемента и Найти по полному фактическому Строка(Элемент). Псевдоним не подставляется в Найти вместо представления; формат представления не выдумывается. Возвращённый объект должен быть тем же элементом текущей коллекции.
Переместить поле цены объектом в индекс0: порядок цена,код. Сдвинуть числовой индекс0 на +1: код,цена. Переместить индекс0 в1 и затем Сдвинуть реальный ПолеКода на -1. Так отличаем абсолютный индекс от относительного смещения и проверяем оба разрешённых типа аргумента.
Переименовать только псевдоним поля СКД в ТоварДляВыбора; физический источник, исходная колонка КодТовара и readonly-признак не меняются. Проверить полное новое состояние и повторно разобрать текст.
Удалить числовой индекс0, оставить только Стоимость. Удалённое ПолеКода больше не читать. Восстановить новым элементом по всё ещё живой обычной КодКолонка, вернуть КодДляОтчета и исходный порядок. Очистка/удаление не трогают две обычные колонки.
Сохранить независимую КопияСхемы с двумя выбранными полями. Очистить список только первой схемы и проверить её исходное пустое расширение. Копия должна сохранить код,цену, оба псевдонима и первоначальные признаки. Всего десять контрольных повторных разборов плюс проверка отдельной сохраняемой копии.
Как проверить результат
Будущий результат: после каждого перемещения порядок совпадает с явными ожиданиями; после переименования только псевдоним кода ТоварДляВыбора; после удаления остаётся только Цена/Стоимость. В финале первая схема: список СКД0 и обычные колонки2. Копия: поля СКД2 в порядке КодТовара/КодДляОтчета, Цена/Стоимость; обычные колонки2.
Для всех непустых состояний проверяются реальные типы ПолеВыбораКомпоновкиДанныхСхемыЗапроса, Строка псевдонима, Булево признака; имя/принадлежность readonly Поле, полный порядок, Индекс, Получить и положительный поиск. Сохранённый при добавлении признак сравнивается во всех повторных разборах; неподтверждённое универсальное значение по умолчанию не обещается.
Будущий отрицательный контроль вне опыта: изменить ожидание Цена на КодТовара только в СнимокЦены. До нового собственного сеанса сохранить/F7. Полная сверка поля должна отказать, даже если оба списка имеют два элемента. Затем вернуть исходный код и до нового сеанса снова F7. Здесь контроль не исполнялся.
Статическая проверка не является запуском: runtimeVerifiedScenarios=0. Проверка не доказывает интерфейс конструктора, выполнение СКД-процессора или строки результата. Никакие данные регистра и реальные рабочие базы не изменяются.
Ожидаемый результат
Полный пример показывает жизненный цикл двух собственных полей выбора СКД и отличает редактирование расширения от редактирования обычных колонок и выполнения запроса.
На что обратить внимание
Поле и ИспользоватьРеквизиты по установленной справке Только чтение, Псевдоним Чтение и запись. В описании признака также есть фраза об установке Истина — это несогласованность native-текста, не основание разрешать присваивание readonly. В этом коде такие присваивания отсутствуют.
Найти ищет строковое представление элемента, не индекс, не объект колонки и не гарантированно один псевдоним. Имя из строкового Добавить уже существует в своём запросе; случайное отсутствующее имя не используется.
Удалить принимает Число. Переместить принимает элемент/индекс и абсолютный новый индекс; Сдвинуть — элемент/индекс и относительное смещение. После удаления/очистки старые дочерние элементы не читаются.
Колонки находятся на ЗапросВыбораСхемыЗапроса, не на ОператорВыбратьСхемыЗапроса. Дочерние объекты разных схем нельзя передавать друг другу: сравниваются значения описаний, а принадлежность колонки проверяется внутри каждой своей схемы.
Это редактирование модели запроса, не фактический выбор товаров и не отчёт СКД. ПолучитьТекстЗапроса используется только для независимого разбора. Запрос.Выполнить, записи, транзакции, сеть, печать и неизвестные входные объекты отсутствуют.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.