Почему не отображается созданное поле динамического списка на форме и как это исправить

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

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

Выясняем причину: почему поле "исчезает"?

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

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

Способ 1. Использование схемы запроса (Рекомендуемый)

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

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


&После("ПриОткрытии")
Процедура ИТ_ПриОткрытииПосле(Отказ)
    
    // Получаем текущий текст запроса, который уже мог быть изменен типовым кодом
    ТекстЗапросаСписка = Список.ТекстЗапроса;
    
    Схема = Новый СхемаЗапроса;
    Схема.УстановитьТекстЗапроса(ТекстЗапросаСписка);
    
    // Выбираем первый пакет (обычно в списках он один)
    ЗапросВыбора = Схема.ПакетЗапросов[0];
    
    // Проверим, нет ли уже нашего соединения, чтобы избежать дублей
    НужнаяТаблица = ЗапросВыбора.Таблицы.НайтиПоИмени("РегистрСведений.РабочиеМестаСотрудниковИнтервальный");
    
    Если НужнаяТаблица = Неопределено Тогда
        // Добавляем левое соединение к основной таблице (ДанныеДляПодбора)
        ИсточникДанных = ЗапросВыбора.Операторы[0].Источники.НайтиПоПсевдониму("ДанныеДляПодбора");
        НовоеСоединение = ЗапросВыбора.Операторы[0].Источники.Добавить("РегистрСведений.РабочиеМестаСотрудниковИнтервальный", "РабочиеМестаСотрудниковДляПодбора");
        
        // Настраиваем условие соединения
        Условие = "ДанныеДляПодбора.Сотрудник = РабочиеМестаСотрудниковДляПодбора.Сотрудник";
        НовоеСоединение.УсловиеСоединения = Схема.СоздатьВыражение(Условие);
        НовоеСоединение.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
    КонецЕсли;
    
    // Добавляем само поле в список выбора
    Если ЗапросВыбора.ВыбираемыеПоля.НайтиПоПсевдониму("РабочееМесто") = Неопределено Тогда
        ЗапросВыбора.ВыбираемыеПоля.Добавить("РабочиеМестаСотрудниковДляПодбора.РабочееМесто", "РабочееМесто");
    КонецЕсли;
    
    // Возвращаем модифицированный текст обратно в список
    Список.ТекстЗапроса = Схема.ПолучитьТекстЗапроса();
    
КонецПроцедуры

Использование СхемаЗапроса гарантирует, что мы не нарушим синтаксис, даже если вендор в будущем изменит основную структуру запроса. Мы просто "домешиваем" свои данные в итоговую строку.

Способ 2. Проверка свойства "Использовать всегда"

Если вы уверены, что текст запроса не перезаписывается программно, но поля всё равно нет, проанализируем настройки самого динамического списка в конфигураторе (в расширении). У каждого поля динамического списка есть свойство "Использовать всегда".

Зачем это нужно? Платформа 1С оптимизирует запросы. Если поле добавлено в текст запроса, но оно не выведено визуально на форму, платформа может исключить его из выборки СУБД для ускорения работы. Если вы планируете обращаться к этому полю программно или хотите, чтобы оно всегда было доступно в настройках "Изменить форму" у пользователя, обязательно установите флаг "Использовать всегда" для этого поля в настройках динамического списка.

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

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

Рассмотрим порядок действий для проверки:

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

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

Способ 4. Проверка прав доступа (RLS)

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

Важный нюанс: В динамических списках 1С при наличии ограничений RLS (Record Level Security) система старается выполнить запрос в любом случае, просто убирая те данные, к которым нет доступа. Проверьте, включен ли ваш новый объект в роли пользователя и есть ли на него права в самом расширении.

Резюме по решению проблемы

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

Наиболее современным и "элегантным" способом для типовых конфигураций на БСП остается программная модификация запроса через СхемаЗапроса, так как она позволяет избежать конфликтов при обновлении конфигурации вендором.

← На главную