Как программно изменить запрос динамического списка и добавить новую колонку на форму в 1С?

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

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

Пошаговый алгоритм программного добавления поля и колонки

Разберем процесс внедрения новых данных в динамический список. В отличие от обычных таблиц значений или реквизитов формы, динамический список не требует вызова метода ИзменитьРеквизиты() для добавления новых колонок запроса. Платформа формирует структуру доступных полей динамического списка автоматически на основании секции ВЫБРАТЬ измененного текста запроса.

  1. Модификация текста запроса динамического списка. В процедуре ПриСозданииНаСервере или специализированном обработчике получаем текущий текст запроса свойства ТекстЗапроса, дополняем его левым соединением с нужной таблицей или регистром и выбираем требуемое поле с понятным псевдонимом.
  2. Создание элемента формы (колонки таблицы). Добавляем новый визуальный элемент в коллекцию Элементы, указывая в качестве родителя таблицу формы, отображающую динамический список.
  3. Связывание элемента с данными. Указываем вид поля и прописываем путь к данным в формате ИмяРеквизитаСписка.ИмяПоляЗапроса.

Посмотрим на пример программного кода в обработчике формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Модифицируем текст запроса динамического списка
    ТекстЗапроса = СписокНоменклатура.ТекстЗапроса;
    
    // Дополняем запрос получением ячейки хранения
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, 
        "ВЫБРАТЬ", 
        "ВЫБРАТЬ СпрНоменклатура.ОсновнаяЯчейкаПамяти КАК ОсновнаяЯчейка,");
    
    СписокНоменклатура.ТекстЗапроса = ТекстЗапроса;
    
    // 2. Создаем элемент формы для отображения колонки
    ИмяКолонки = "СписокНоменклатураОсновнаяЯчейка";
    Если Элементы.Найти(ИмяКолонки) = Неопределено Тогда
        НоваяКолонка = Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), Элементы.СписокНоменклатура);
        НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
        НоваяКолонка.ПутьКДанным = "СписокНоменклатура.ОсновнаяЯчейка";
        НоваяКолонка.Заголовок = "Основная ячейка";
        НоваяКолонка.Видимость = Истина;
    КонецЕсли;
    
КонецПроцедуры

Почему колонка не появляется: типичные причины и ошибки

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

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

Нюансы чтения данных через свойство ТекущиеДанные

Рассмотрим важную особенность платформы 1С: в целях оптимизации производительности платформа считывает с сервера только те поля динамического списка, которые выведены в видимые колонки таблицы на форме. Если поле присутствует в запросе, но колонка скрыта или данные нужны только для программной обработки при активизации строки, обращение к Элементы.ТаблицаСписка.ТекущиеДанные.ИмяПоля может вернуть Неопределено.

Чтобы заставить динамический список всегда считывать поле с сервера независимо от видимости колонок на форме, добавим его в выбранные поля компоновщика настроек:


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

Такой подход гарантирует доступность реквизита в структуре ТекущиеДанные на клиенте в любых пользовательских сценариях.

← На главную