Как добавить колонку в динамический список через расширение и что делать, если она не отображается

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

Работа с расширениями в платформе 1С:Предприятие 8.3 открывает широкие возможности для кастомизации типовых конфигураций без изменения основной конфигурации. Одной из самых частых задач является добавление новых колонок в формы списков (динамические списки). Однако программисты часто сталкиваются с ситуацией, когда запрос изменен, поле добавлено, а колонка на форме упорно не появляется. Рассмотрим подробно, как правильно реализовать эту задачу и какие подводные камни могут встретиться на пути.

Механизм добавления поля в динамический список через расширение

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

  1. Добавление формы в расширение. Прежде всего, необходимо найти нужную форму в основной конфигурации, нажать на нее правой кнопкой мыши и выбрать пункт «Добавить в расширение». Вместе с формой в расширение должен попасть и основной реквизит формы — Список (имеющий тип ДинамическийСписок).
  2. Модификация запроса. В свойствах реквизита Список в расширении находим поле «Настройка списка» или «Текст запроса». Если в основной конфигурации флаг «Произвольный запрос» выключен, его следует включить в расширении. После этого мы можем изменить текст запроса, добавив в секцию ВЫБРАТЬ нужные нам поля через ЛЕВОЕ СОЕДИНЕНИЕ или напрямую из основной таблицы.
  3. Вывод поля на форму. После изменения запроса новое поле появится в структуре реквизита Список. Самый надежный способ — просто перетащить это поле мышкой из окна реквизитов на дерево элементов формы.

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

Проблема программного добавления элементов

Иногда разработчики пытаются добавить колонку программно в процедуре ПриСозданииНаСервере. Рассмотрим пример такого кода:


НоваяКолонкаТаблицы = Элементы.Добавить("СписокСНТ", Тип("ПолеФормы"), Элементы.Список);
НоваяКолонкаТаблицы.Заголовок = "СНТ";
НоваяКолонкаТаблицы.Вид = ВидПоляФормы.ПолеНадписи;
НоваяКолонкаТаблицы.ПутьКДанным = "Список.СНТ"; 
НоваяКолонкаТаблицы.Видимость = Истина;

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

Главный виновник: Функциональные опции

Выясним причину, которая чаще всего ставит в тупик даже опытных разработчиков. Это Функциональные опции (ФО). В 1С функциональные опции управляют видимостью объектов метаданных, реквизитов и элементов форм в зависимости от настроек системы.

Если поле, которое вы пытаетесь добавить в динамический список, связано с объектом (например, документом СНТ или определенным реквизитом), который в текущей базе отключен функциональной опцией, то платформа принудительно скроет эту колонку, какие бы настройки видимости вы ни задавали в расширении.

Разберем по шагам, как это проверить:

  1. Проанализируем, к каким функциональным опциям привязан объект или реквизит, данные которого мы выводим. Это можно сделать в конфигураторе, посмотрев вкладку «Состав» у функциональных опций или через контекстное меню реквизита «Поиск ссылок в объекте».
  2. Проверим состояние этой опции в пользовательском режиме. Обычно это флажки в разделах «Настройки», «НСИ и администрирование» или «Параметры системы».
  3. Если вы тестируете расширение на демонстрационной базе, убедитесь, что соответствующие подсистемы включены. Как показывает опыт, в демо-базах многие функции по умолчанию выключены для упрощения интерфейса.

Особенности объединения запросов в расширениях

Важно понимать, что в современных версиях платформы (особенно начиная с 8.3.15) запрос динамического списка в расширении не просто заменяет основной, а объединяется с ним по определенным правилам. Посмотрим на критические моменты:

Влияние версии платформы и режима совместимости

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

  1. При изменении запроса списка, использующего механизм RLS (ограничение доступа на уровне записей), расширение может вести себя нестабильно.
  2. Механизмы расширения текста запроса через конструктор появились в полной мере в более поздних версиях. В старых режимах совместимости иногда приходится полностью копировать текст запроса из основной конфигурации в расширение и модифицировать его там целиком, что усложняет дальнейшую поддержку.

Рекомендации по порядку действий

Чтобы избежать ошибок при добавлении колонок, придерживайтесь следующей последовательности:

Шаг 1. Убедитесь, что реквизит, который вы хотите отобразить, физически существует в базе и заполнен данными. Проверьте функциональные опции, отвечающие за этот реквизит.

Шаг 2. В расширении добавьте форму и основной реквизит Список. В свойствах списка перейдите в «Настройка списка» и добавьте соединение с нужной таблицей или выберите новое поле в основном тексте запроса.

Шаг 3. Перейдите на вкладку «Настройки списка» внутри конструктора и проверьте, появилось ли ваше поле в списке доступных полей. Если его там нет — проблема в синтаксисе запроса.

Шаг 4. Вытяните поле на форму визуально. В свойствах элемента формы проверьте путь к данным — он должен иметь вид Список.ИмяВашегоПоля.

Шаг 5. Если колонка всё еще не видна, проверьте программный код формы в основной конфигурации. Возможно, там присутствует процедура ПриОткрытии или ПриСозданииНаСервере, которая жестко управляет составом колонок (например, через УстановитьНастройкиКомпоновкиДанных), перетирая ваши изменения из расширения.

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

← На главную