Как исправить ошибки с перечислениями и виртуальными таблицами задач при доработке динамического списка в расширении 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

Разработка в расширениях конфигурации — это современный стандарт адаптации типовых решений 1С под нужды бизнеса. Однако при переносе стандартных форм, содержащих динамические списки, разработчики часто сталкиваются с неочевидными ошибками. Типичный пример — работа со списком «Мои задачи» (задача исполнителя) в конфигурациях на базе БСП (например, Управление торговлей 11.4). При попытке модифицировать динамический список или даже просто открыть форму в конфигураторе расширения возникают критические ошибки парсинга запроса.

В этой статье мы подробно рассмотрим причины возникновения двух распространенных ошибок и разберем по шагам надежные методы их устранения.

Часть 1. Ошибка валидации перечисления: «Неверные параметры Перечисление...»

Рассмотрим ситуацию: при открытии формы в расширении платформа выдает ошибку вида «Ошибка в запросе набора данных: Неверные параметры "Перечисление.ВариантыВажностиЗадачи.Низкая"». При этом конструктор запроса динамического списка отказывается открываться, хотя в основной конфигурации этот запрос функционирует абсолютно нормально.

Выясним причину этой проблемы. Дело в том, что в тексте запроса динамического списка используется конструкция жесткого сравнения:


КОГДА ЗадачиПоИсполнителю.Важность = ЗНАЧЕНИЕ(Перечисление.ВариантыВажностиЗадачи.Низкая)

Когда мы переносим форму в расширение, платформа пытается скомпилировать схему компоновки данных (которая лежит в основе динамического списка) строго в контексте метаданных самого расширения. Если перечисление ВариантыВажностиЗадачи и его конкретное значение Низкая не добавлены в расширение, платформа считает это обращением к несуществующему объекту и блокирует работу конструктора.

Проанализируем два основных способа решения этой проблемы.

Способ 1. Заимствование объектов в расширение (прямой путь)

Если вам обязательно нужно сохранить исходную структуру запроса в конфигураторе расширения, выполните следующие действия:

  1. В дереве основной конфигурации найдите перечисление ВариантыВажностиЗадачи.
  2. Нажмите на него правой кнопкой мыши и выберите команду «Добавить в расширение».
  3. Перейдите в дерево метаданных расширения, откройте свойства заимствованного перечисления и убедитесь, что его значение Низкая также заимствовано. В зависимости от версии платформы может потребоваться вручную заимствовать конкретные значения перечисления в расширение.

После этого схема запроса успешно пройдет валидацию, и вы сможете открыть конструктор запроса в расширении.

Способ 2. Использование параметров запроса (лучшая практика)

Заимствование множества перечислений засоряет расширение и усложняет его дальнейшую поддержку при обновлениях основной конфигурации. Профессиональные разработчики рекомендуют полностью отказаться от использования конструкции ЗНАЧЕНИЕ() в запросах динамических списков внутри расширений.

Рассмотрим по шагам этот изящный метод:

  1. В тексте запроса динамического списка замените вызов предопределенного значения на параметр: КОГДА ЗадачиПоИсполнителю.Важность = &ВажностьНизкая
  2. В модуле формы в обработчике ПриСозданииНаСервере программно заполните этот параметр:
    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Установка параметра перечисления
        Список.Параметры.УстановитьЗначениеПараметра("ВажностьНизкая", ПредопределенноеЗначение("Перечисление.ВариантыВажностиЗадачи.Низкая"));
    КонецПроцедуры
    

Поскольку функция ПредопределенноеЗначение вычисляется во время работы приложения (в режиме Предприятия), платформа не требует заимствования самого перечисления в расширение на этапе разработки в конфигураторе.

Часть 2. Ошибка отсутствия таблицы задач: «Таблица не найдена Задача.ЗадачаИсполнителя...»

Следующая серьезная преграда — это ошибка компиляции запроса вида «Таблица не найдена "Задача.ЗадачаИсполнителя.ЗадачиПоИсполнителю"». Разработчики нередко начинают искать реквизит ЗадачаИсполнителя внутри метаданных задачи и заходят в тупик.

Разберем природу этого объекта. Объект Задача.ЗадачаИсполнителя — это полноценный стандартный объект задачи из БСП (Библиотека стандартных подсистем). А конструкция ЗадачиПоИсполнителю — это не физическая таблица в базе данных, а специальная виртуальная таблица, формируемая платформой 1С на лету для реализации механизмов адресации задач.

Виртуальная таблица может существовать только при наличии полной связки метаданных: самой задачи, связанного с ней регистра адресации (например, АдресацияИсполнителей) и реквизитов адресации задачи. В контексте расширения эта цепочка рвется, что и приводит к ошибке «Таблица не найдена».

Для исправления этой ситуации мы можем применить один из двух подходов.

Способ 1. Полное заимствование инфраструктуры адресации

Чтобы платформа смогла инициализировать виртуальную таблицу в конфигураторе расширения, выполните последовательное заимствование:

  1. Добавьте в расширение объект метаданных Задача.ЗадачаИсполнителя.
  2. Найдите регистр сведений, который используется в этой задаче для адресации (обычно это регистр АдресацияИсполнителей), и также заимствуйте его в расширение.
  3. Заимствуйте все реквизиты адресации задачи (такие как Исполнитель, РольИсполнителя и другие, задействованные в логике бизнес-процесса).

Только после восстановления всей цепочки связей в расширении конструктор запроса сможет распознать виртуальную таблицу ЗадачиПоИсполнителю.

Способ 2. Динамическое назначение запроса в коде формы (универсальный обходной путь)

Заимствовать всю цепочку адресации — трудоемкий процесс, который повышает связность расширения с основной конфигурацией. Есть более простой и надежный обходной путь — программная инициализация запроса.

Если мы не заимствуем свойства динамического списка в конфигураторе расширения, а передаем текст запроса динамически в коде, платформа не выполняет строгую валидацию схемы при сохранении конфигурации. В режиме Предприятия метаданные расширения и основной конфигурации объединяются, и виртуальная таблица становится полностью доступной.

Проанализируем пример кода реализации этого метода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Формируем текст запроса динамически
    ТекстЗапросаСписка = 
    "ВЫБРАТЬ
    |	ЗадачиПоИсполнителю.Ссылка КАК Ссылка,
    |	ЗадачиПоИсполнителю.Наименование КАК Наименование,
    |	ЗадачиПоИсполнителю.Дата КАК Дата,
    |	ЗадачиПоИсполнителю.Важность КАК Важность
    |ИЗ
    |	Задача.ЗадачаИсполнителя.ЗадачиПоИсполнителю КАК ЗадачиПоИсполнителю";
    
    // Назначаем текст запроса динамическому списку формы
    Список.ТекстЗапроса = ТекстЗапросаСписка;
    
    // При необходимости устанавливаем параметры
    Список.Параметры.УстановитьЗначениеПараметра("ВажностьНизкая", ПредопределенноеЗначение("Перечисление.ВариантыВажностиЗадачи.Низкая"));
    
КонецПроцедуры

Этот способ позволяет избежать избыточного заимствования тяжелых объектов метаданных и гарантирует стабильную работу формы в пользовательском режиме без усложнения поддержки расширения.

Резюме

При доработке стандартных механизмов задач в расширениях 1С всегда отдавайте предпочтение программным методам настройки динамических списков. Передача параметров вместо жестких конструкций ЗНАЧЕНИЕ() и динамическая установка текста запроса в процедуре ПриСозданииНаСервере сохранят чистоту вашего расширения и избавят от рутинного заимствования десятков связанных объектов метаданных.

← На главную