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