Как добавить новую колонку в динамический список на управляемой форме?

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

В процессе доработки конфигураций 1С часто возникает задача вывести в список документов или справочников дополнительную информацию, которой нет в основной таблице. Например, отобразить актуальную цену для товара или остаток на складе. Эта задача решается добавлением новой колонки в динамический список. Разберем по шагам, как это сделать правильно, рассмотрев как декларативный способ через Конфигуратор, так и программный метод для более гибкой настройки.

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

Способ 1: Декларативная настройка в Конфигураторе

Это самый простой и распространенный метод, который подходит для большинства случаев, когда структура списка постоянна. Весь процесс выполняется в режиме Конфигуратора без написания кода.

Рассмотрим на примере: нам нужно в список номенклатуры добавить колонку с ее последней установленной ценой из регистра сведений "Цены номенклатуры".

  1. Открытие формы и свойств динамического списка.

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

  2. Включение произвольного запроса.

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

  3. Редактирование текста запроса.

    Нажмите на кнопку "..." в свойстве Текст запроса, чтобы открыть Настройку списка, а в ней — Конструктор запроса. Здесь мы и будем модифицировать наш запрос.

    • Перейдите на вкладку "Таблицы". Здесь уже будет основная таблица нашего списка (например, Справочник.Номенклатура).
    • Перетащите из левой части (база данных) в правую (таблицы) виртуальную таблицу среза последних регистра сведений, где хранятся цены. Например, РегистрСведений.ЦеныНоменклатуры.СрезПоследних.
    • Платформа автоматически предложит настроить связь между таблицами. Установите связь по общему полю, в нашем случае это номенклатура. Например: Справочник.Номенклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура. Тип соединения установите ЛЕВОЕ СОЕДИНЕНИЕ. Это важно, чтобы в список попадала вся номенклатура, даже та, для которой цена не установлена.
  4. Добавление поля в выборку.

    Перейдите на вкладку "Поля". В левой части найдите присоединенную таблицу (ЦеныНоменклатурыСрезПоследних), раскройте ее и перетащите поле Цена в правую часть (выбранные поля). Нажмите "ОК", чтобы сохранить изменения в запросе.

  5. Вывод колонки на форму — ключевой шаг!

    После сохранения запроса новое поле "Цена" появилось в списке доступных полей нашего динамического списка. Это можно увидеть, если в панели "Реквизиты" раскрыть реквизит "Список". Однако на самой форме колонка еще не появилась. Это частая ошибка начинающих разработчиков.

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

    • Перейдите в панель "Элементы" (где находится дерево элементов формы).
    • В панели "Реквизиты" найдите наше новое поле (Список.Цена).
    • Перетащите это поле мышкой из панели "Реквизиты" в дерево элементов формы, внутрь элемента "Таблица", который соответствует нашему динамическому списку.

    После этого в дереве элементов появится новый элемент типа "Поле", и на предпросмотре формы вы увидите новую колонку "Цена". Для этой колонки можно настроить заголовок, ширину, формат и другие свойства.

  6. Настройка свойства "Использовать всегда".

    Чтобы гарантировать, что поле всегда будет получаться с сервера, даже если пользователь скроет колонку в своих настройках, вернитесь в свойства динамического списка ("Список"), откройте "Настройку списка", перейдите на вкладку "Настройка" и для поля "Цена" установите флаг "Использовать всегда".

Способ 2: Программное добавление колонки

Этот метод применяется, когда состав колонок должен меняться динамически в зависимости от условий: настроек программы, прав пользователя и т.д. Вся логика описывается в модуле формы на сервере, обычно в обработчике события ПриСозданииНаСервере.

Процесс также состоит из двух шагов: изменение текста запроса и программное добавление элемента формы.

Шаг 1. Модификация текста запроса.

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

Шаг 2. Программное создание колонки на форме.

После изменения запроса нужно создать сам визуальный элемент (колонку) в таблице на форме. Для этого используется метод Элементы.Добавить(). Самое важное — правильно указать свойство ПутьКДанным, которое связывает новый элемент формы с новым полем в запросе.

Посмотрим на пример. Добавим в список колонку-флажок с произвольным названием.


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

В этом примере мы сначала добавили в запрос статическое поле ИСТИНА КАК ДопПоле, а затем создали на форме новый элемент типа ПолеФормы, установили ему вид флажка и, что самое главное, связали его с данными через ПутьКДанным = "Список.ДопПоле". Без этой связки колонка была бы пустой.

Итоги и рекомендации

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

← На главную