При разработке в расширениях для типовых конфигураций 1С:Предприятие (таких как ЗУП 3.1, ERP или КА) программисты часто сталкиваются с ситуацией: поле в запрос динамического списка добавлено, элемент формы создан, но при запуске системы колонка просто отсутствует. Причем её нет даже в меню "Изменить форму". Разберем подробно, почему так происходит и как заставить платформу вывести нужные данные.
Проанализируем механику работы современных типовых конфигураций. Основная причина того, что ваши изменения в визуальном конструкторе расширения не работают, заключается в программной перезаписи текста запроса. Рассмотрим основные факторы влияния:
Список.ТекстЗапроса = "ВЫБРАТЬ...", все ваши изменения, сделанные в расширении через конструктор, полностью затираются.ОбщегоНазначения.УстановитьСвойствоТипаДинамическийСписок или специфические методы настройки списков. Они могут пересобирать запрос, основываясь на метаданных основной конфигурации, игнорируя расширение.Как выяснилось в ходе обсуждения, наиболее надежным методом является программное внедрение в текст запроса с помощью объекта СхемаЗапроса. Это позволяет добавить наше поле в уже сформированный типовой запрос, не затирая логику вендора. Рассмотрим пример реализации в расширении для формы списка сотрудников.
Нам необходимо создать в расширении обработчик ПриОткрытии (или ПриСозданииНаСервере, если запрос формируется там) с аннотацией &После. Разберем по шагам, как модифицировать запрос:
&После("ПриОткрытии")
Процедура ИТ_ПриОткрытииПосле(Отказ)
// Получаем текущий текст запроса, который уже мог быть изменен типовым кодом
ТекстЗапросаСписка = Список.ТекстЗапроса;
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(ТекстЗапросаСписка);
// Выбираем первый пакет (обычно в списках он один)
ЗапросВыбора = Схема.ПакетЗапросов[0];
// Проверим, нет ли уже нашего соединения, чтобы избежать дублей
НужнаяТаблица = ЗапросВыбора.Таблицы.НайтиПоИмени("РегистрСведений.РабочиеМестаСотрудниковИнтервальный");
Если НужнаяТаблица = Неопределено Тогда
// Добавляем левое соединение к основной таблице (ДанныеДляПодбора)
ИсточникДанных = ЗапросВыбора.Операторы[0].Источники.НайтиПоПсевдониму("ДанныеДляПодбора");
НовоеСоединение = ЗапросВыбора.Операторы[0].Источники.Добавить("РегистрСведений.РабочиеМестаСотрудниковИнтервальный", "РабочиеМестаСотрудниковДляПодбора");
// Настраиваем условие соединения
Условие = "ДанныеДляПодбора.Сотрудник = РабочиеМестаСотрудниковДляПодбора.Сотрудник";
НовоеСоединение.УсловиеСоединения = Схема.СоздатьВыражение(Условие);
НовоеСоединение.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
КонецЕсли;
// Добавляем само поле в список выбора
Если ЗапросВыбора.ВыбираемыеПоля.НайтиПоПсевдониму("РабочееМесто") = Неопределено Тогда
ЗапросВыбора.ВыбираемыеПоля.Добавить("РабочиеМестаСотрудниковДляПодбора.РабочееМесто", "РабочееМесто");
КонецЕсли;
// Возвращаем модифицированный текст обратно в список
Список.ТекстЗапроса = Схема.ПолучитьТекстЗапроса();
КонецПроцедуры
Использование СхемаЗапроса гарантирует, что мы не нарушим синтаксис, даже если вендор в будущем изменит основную структуру запроса. Мы просто "домешиваем" свои данные в итоговую строку.
Если вы уверены, что текст запроса не перезаписывается программно, но поля всё равно нет, проанализируем настройки самого динамического списка в конфигураторе (в расширении). У каждого поля динамического списка есть свойство "Использовать всегда".
Зачем это нужно? Платформа 1С оптимизирует запросы. Если поле добавлено в текст запроса, но оно не выведено визуально на форму, платформа может исключить его из выборки СУБД для ускорения работы. Если вы планируете обращаться к этому полю программно или хотите, чтобы оно всегда было доступно в настройках "Изменить форму" у пользователя, обязательно установите флаг "Использовать всегда" для этого поля в настройках динамического списка.
Часто программист всё делает правильно, но поле не появляется из-за того, что система запомнила старые настройки формы для конкретного пользователя. Проанализируем ситуацию: вы добавили колонку, но в базе данных уже сохранен «вид» этой формы для вашего аккаунта, в котором этой колонки не было.
Рассмотрим порядок действий для проверки:
Если после этого поле появилось — значит, проблема была в кэшировании пользовательских настроек. При внедрении расширения у клиентов часто приходится массово сбрасывать настройки форм через администрирование, чтобы новые поля стали видимы.
Выясним причину отсутствия поля с точки зрения безопасности. Если вы добавляете в запрос таблицу (например, новый регистр сведений), на которую у текущего пользователя нет прав (даже если у него есть полные права на чтение основной таблицы списка), динамический список может просто молча скрыть "недоступные" колонки.
Важный нюанс: В динамических списках 1С при наличии ограничений RLS (Record Level Security) система старается выполнить запрос в любом случае, просто убирая те данные, к которым нет доступа. Проверьте, включен ли ваш новый объект в роли пользователя и есть ли на него права в самом расширении.
Подводя итог, если поле динамического списка не выводится на форму в расширении, придерживайтесь следующего алгоритма:
Список.ТекстЗапроса программно в модуле формы или общих модулях. Если да — используйте Схему запроса в событии ПриОткрытии.JOIN (соединении) вашего запроса.Наиболее современным и "элегантным" способом для типовых конфигураций на БСП остается программная модификация запроса через СхемаЗапроса, так как она позволяет избежать конфликтов при обновлении конфигурации вендором.