Разработка в расширениях конфигурации — это современный стандарт адаптации типовых решений 1С под нужды бизнеса. Однако при переносе стандартных форм, содержащих динамические списки, разработчики часто сталкиваются с неочевидными ошибками. Типичный пример — работа со списком «Мои задачи» (задача исполнителя) в конфигурациях на базе БСП (например, Управление торговлей 11.4). При попытке модифицировать динамический список или даже просто открыть форму в конфигураторе расширения возникают критические ошибки парсинга запроса.
В этой статье мы подробно рассмотрим причины возникновения двух распространенных ошибок и разберем по шагам надежные методы их устранения.
Рассмотрим ситуацию: при открытии формы в расширении платформа выдает ошибку вида «Ошибка в запросе набора данных: Неверные параметры "Перечисление.ВариантыВажностиЗадачи.Низкая"». При этом конструктор запроса динамического списка отказывается открываться, хотя в основной конфигурации этот запрос функционирует абсолютно нормально.
Выясним причину этой проблемы. Дело в том, что в тексте запроса динамического списка используется конструкция жесткого сравнения:
КОГДА ЗадачиПоИсполнителю.Важность = ЗНАЧЕНИЕ(Перечисление.ВариантыВажностиЗадачи.Низкая)
Когда мы переносим форму в расширение, платформа пытается скомпилировать схему компоновки данных (которая лежит в основе динамического списка) строго в контексте метаданных самого расширения. Если перечисление ВариантыВажностиЗадачи и его конкретное значение Низкая не добавлены в расширение, платформа считает это обращением к несуществующему объекту и блокирует работу конструктора.
Проанализируем два основных способа решения этой проблемы.
Способ 1. Заимствование объектов в расширение (прямой путь)
Если вам обязательно нужно сохранить исходную структуру запроса в конфигураторе расширения, выполните следующие действия:
ВариантыВажностиЗадачи.Низкая также заимствовано. В зависимости от версии платформы может потребоваться вручную заимствовать конкретные значения перечисления в расширение.После этого схема запроса успешно пройдет валидацию, и вы сможете открыть конструктор запроса в расширении.
Способ 2. Использование параметров запроса (лучшая практика)
Заимствование множества перечислений засоряет расширение и усложняет его дальнейшую поддержку при обновлениях основной конфигурации. Профессиональные разработчики рекомендуют полностью отказаться от использования конструкции ЗНАЧЕНИЕ() в запросах динамических списков внутри расширений.
Рассмотрим по шагам этот изящный метод:
КОГДА ЗадачиПоИсполнителю.Важность = &ВажностьНизкая
ПриСозданииНаСервере программно заполните этот параметр:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Установка параметра перечисления
Список.Параметры.УстановитьЗначениеПараметра("ВажностьНизкая", ПредопределенноеЗначение("Перечисление.ВариантыВажностиЗадачи.Низкая"));
КонецПроцедуры
Поскольку функция ПредопределенноеЗначение вычисляется во время работы приложения (в режиме Предприятия), платформа не требует заимствования самого перечисления в расширение на этапе разработки в конфигураторе.
Следующая серьезная преграда — это ошибка компиляции запроса вида «Таблица не найдена "Задача.ЗадачаИсполнителя.ЗадачиПоИсполнителю"». Разработчики нередко начинают искать реквизит ЗадачаИсполнителя внутри метаданных задачи и заходят в тупик.
Разберем природу этого объекта. Объект Задача.ЗадачаИсполнителя — это полноценный стандартный объект задачи из БСП (Библиотека стандартных подсистем). А конструкция ЗадачиПоИсполнителю — это не физическая таблица в базе данных, а специальная виртуальная таблица, формируемая платформой 1С на лету для реализации механизмов адресации задач.
Виртуальная таблица может существовать только при наличии полной связки метаданных: самой задачи, связанного с ней регистра адресации (например, АдресацияИсполнителей) и реквизитов адресации задачи. В контексте расширения эта цепочка рвется, что и приводит к ошибке «Таблица не найдена».
Для исправления этой ситуации мы можем применить один из двух подходов.
Способ 1. Полное заимствование инфраструктуры адресации
Чтобы платформа смогла инициализировать виртуальную таблицу в конфигураторе расширения, выполните последовательное заимствование:
Задача.ЗадачаИсполнителя.АдресацияИсполнителей), и также заимствуйте его в расширение.Исполнитель, РольИсполнителя и другие, задействованные в логике бизнес-процесса).Только после восстановления всей цепочки связей в расширении конструктор запроса сможет распознать виртуальную таблицу ЗадачиПоИсполнителю.
Способ 2. Динамическое назначение запроса в коде формы (универсальный обходной путь)
Заимствовать всю цепочку адресации — трудоемкий процесс, который повышает связность расширения с основной конфигурацией. Есть более простой и надежный обходной путь — программная инициализация запроса.
Если мы не заимствуем свойства динамического списка в конфигураторе расширения, а передаем текст запроса динамически в коде, платформа не выполняет строгую валидацию схемы при сохранении конфигурации. В режиме Предприятия метаданные расширения и основной конфигурации объединяются, и виртуальная таблица становится полностью доступной.
Проанализируем пример кода реализации этого метода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Формируем текст запроса динамически
ТекстЗапросаСписка =
"ВЫБРАТЬ
| ЗадачиПоИсполнителю.Ссылка КАК Ссылка,
| ЗадачиПоИсполнителю.Наименование КАК Наименование,
| ЗадачиПоИсполнителю.Дата КАК Дата,
| ЗадачиПоИсполнителю.Важность КАК Важность
|ИЗ
| Задача.ЗадачаИсполнителя.ЗадачиПоИсполнителю КАК ЗадачиПоИсполнителю";
// Назначаем текст запроса динамическому списку формы
Список.ТекстЗапроса = ТекстЗапросаСписка;
// При необходимости устанавливаем параметры
Список.Параметры.УстановитьЗначениеПараметра("ВажностьНизкая", ПредопределенноеЗначение("Перечисление.ВариантыВажностиЗадачи.Низкая"));
КонецПроцедуры
Этот способ позволяет избежать избыточного заимствования тяжелых объектов метаданных и гарантирует стабильную работу формы в пользовательском режиме без усложнения поддержки расширения.
При доработке стандартных механизмов задач в расширениях 1С всегда отдавайте предпочтение программным методам настройки динамических списков. Передача параметров вместо жестких конструкций ЗНАЧЕНИЕ() и динамическая установка текста запроса в процедуре ПриСозданииНаСервере сохранят чистоту вашего расширения и избавят от рутинного заимствования десятков связанных объектов метаданных.