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

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

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

Почему нельзя просто «нажать кнопку» и добавить колонку?

Проанализируем механику работы платформы. Когда у динамического списка свойство ПроизвольныйЗапрос выключено, а свойство ОсновнаяТаблица заполнено, система сама генерирует SQL-запрос к базе данных. В этом случае список полей определяется автоматически на основе реквизитов таблицы. Поскольку текста запроса «физически» нет в метаданных формы, разработчику некуда дописать свое поле. Платформа просто не знает, откуда брать данные для новой колонки, если ее нет в исходной таблице документа или справочника.

Способ 1. Переход к произвольному запросу с сохранением основной таблицы

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

Рассмотрим пошагово, как это сделать:

  1. Откройте свойства динамического списка на форме.
  2. Установите галочку Произвольный запрос.
  3. Нажмите кнопку Открыть рядом с текстом запроса.
  4. В появившемся окне конструктора добавьте необходимые поля. Если вам нужно просто пустое поле для программного заполнения, можно написать что-то вроде "" КАК МоеПроизвольноеПоле.
  5. Важно: Убедитесь, что в поле Основная таблица (находится под текстом запроса) по-прежнему выбран ваш объект (например, Документ.РеализацияТоваровУслуг).

Теперь новая колонка появится в списке доступных полей, и вы сможете вынести ее на форму. Это самый стабильный и рекомендуемый платформой способ.

Способ 2. Использование расширений конфигурации

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

Разберем алгоритм действий в расширении:

  1. Добавьте форму списка в расширение.
  2. Зайдите в свойства динамического списка.
  3. Аналогично первому способу, переведите список в режим произвольного запроса.
  4. Добавьте нужные поля (через ЛЕВОЕ СОЕДИНЕНИЕ с другими таблицами или как вычислимые поля).
  5. Вынесите добавленное поле в элементы формы.

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

Способ 3. Программное добавление колонки и обработка данных

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Добавляем новый элемент формы - поле надписи в таблицу списка
    НоваяКолонка = Элементы.Добавить("КолонкаСтатус", Тип("ПолеФормы"), Элементы.Список);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
    НоваяКолонка.Заголовок = "Статус обработки";
    
КонецПроцедуры

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


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

Важный нюанс: Колонки, добавленные таким способом (без наличия поля в самом запросе динамического списка), нельзя будет отсортировать или отфильтровать средствами платформы, так как этих данных нет в SQL-запросе. Они существуют только в визуальном оформлении строк.

Способ 4. Программное изменение текста запроса

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

Рассмотрим пример изменения текста запроса:


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

КонецПроцедуры

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

Резюме и рекомендации

Подведем итоги нашего анализа. Выбор метода зависит от ваших целей:

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

← На главную