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

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

При разработке в расширениях для современных конфигураций 1С (таких как УТ 11, ERP 2, КА 2) программисты часто сталкиваются с ситуацией: в визуальном редакторе расширения колонка добавлена, запрос динамического списка изменен, но в режиме "Предприятие" новая колонка упорно не появляется. Рассмотрим подробнее, почему это происходит и как правильно решить задачу добавления данных из регистра сведений в список справочника.

Выясняем причину проблемы: почему визуальные изменения не работают

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

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

Проблема заключается в том, что программная установка свойства ТекстЗапроса полностью затирает те изменения, которые вы внесли в конструкторе запроса внутри расширения. В итоге ваша колонка просто исчезает из структуры списка еще до того, как форма отобразится пользователю.

Шаг 1: Поиск места программной подмены запроса

Для начала нам необходимо найти код, который управляет поведением списка. Проанализируем модуль формы справочника в основной конфигурации. Нам нужно искать вызовы процедур в событии ПриСозданииНаСервере. Обычно это функции общего назначения или модули менеджера. В УТ 11 часто встречаются конструкции, связанные с ОбщегоНазначенияУТ.УстановитьСвойствоЭлементаФормы или специализированные процедуры настройки списков для конкретного справочника.

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

Шаг 2: Реализация решения в расширении

Когда место подмены найдено, нам нужно внедрить свой код с помощью механизма перехвата методов. Рекомендуется использовать аннотацию &После для процедуры, которая завершает формирование запроса. Посмотрим на пример реализации:


&После("НастроитьСписок")
Процедура Расш1_НастроитьСписок(Форма, ТекстЗапроса)
    
    // Добавляем наше поле и соединение к существующему тексту запроса
    НовыйТекст = ТекстЗапроса + "
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеДанные.СрезПоследних(&Период, ) КАК ДопДанные
    |ПО Список.Ссылка = ДопДанные.Партнер";
    
    // ВАЖНО: Нужно убедиться, что мы не нарушаем структуру исходного запроса
    // Лучше использовать замену текста или дополнение списка полей
    Форма.Список.ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЗ Справочник.Партнеры КАК Список", НовыйТекст);
    
КонецПроцедуры

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

Шаг 3: Настройка свойств компоновщика данных

Даже если запрос теперь верный, колонка может не появиться из-за механизмов оптимизации платформы. Рассмотрим настройку свойства "Использовать всегда". Если вы добавили поле в запрос, но оно не выведено на форму как видимый элемент (например, используется для условного оформления), платформа может исключить его из SQL-запроса для экономии ресурсов.

Чтобы этого избежать, выполните следующие действия:

  1. Откройте настройки динамического списка в расширении.
  2. Перейдите на закладку "Настройки" -> "Поля".
  3. Найдите ваше новое поле и установите для него флаг "Использовать всегда".

Шаг 4: Учет функциональных опций и прав доступа

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

Также не забудьте добавить права на чтение нового регистра сведений в роли вашего расширения. Если у пользователя нет прав на таблицу, участвующую в ЛЕВОМ СОЕДИНЕНИИ, колонка либо будет пустой, либо (в зависимости от настроек списка) вызовет ошибку доступа.

Шаг 5: Сброс пользовательских настроек (Кэш формы)

Иногда код работает идеально, запрос верен, права есть, но колонки все равно нет. Это происходит из-за того, что 1С сохраняет настройки формы для каждого конкретного пользователя. Если пользователь ранее открывал эту форму и настраивал её "под себя", система будет приоритетно использовать его старые настройки, в которых вашей новой колонки еще не существовало.

Проанализируем ситуацию в режиме "Предприятие":

  1. Зайдите в форму списка.
  2. Нажмите кнопку "Ещё" -> "Изменить форму".
  3. В открывшемся окне нажмите "Ещё" -> "Установить стандартные настройки".

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

Подведем итоги

Добавление колонки в список через расширение — задача, требующая комплексного подхода. Мы рассмотрели, что недостаточно просто изменить форму в конструкторе. Необходимо:

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

← На главную