Часто перед разработчиком встает задача динамического расширения интерфейса формы. Если с обычными табличными частями, принадлежащими объекту (например, Объект.Товары), работа через метод ИзменитьРеквизиты выглядит стандартно, то при работе с динамическими списками (ДинамическийСписок) или независимыми таблицами значений возникают нюансы. Рассмотрим подробно, как правильно добавить новые колонки в таблицу, если она не связана напрямую с реквизитами объекта, на примере формы «Текущие дела по ЭДО» в типовых конфигурациях.
Разберем типичную ситуацию: программист пытается применить код для добавления реквизитов формы, указывая в качестве пути Объект.Комплектация. Однако, если таблица на форме является динамическим списком или просто независимым реквизитом формы типа ТаблицаЗначений, такой путь будет ошибочным. Выясним причину: метод ИзменитьРеквизиты создает описание данных в структуре формы, но для отображения их пользователю необходимо также создать элемент формы и правильно связать его с этими данными через свойство ПутьКДанным.
Если мы работаем с динамическим списком, то данные уже «существуют» в рамках его схемы компоновки или текста запроса. В этом случае добавление нового реквизита формы через ИзменитьРеквизиты часто оказывается избыточным или вовсе неэффективным.
Проанализируем работу с динамическим списком. Прежде чем колонка появится на экране, она должна присутствовать в выборке запроса. Если нужного поля (например, СостояниеЭдо или ВидДокумента) нет в текущем запросе списка, нам необходимо его туда добавить. Рассмотрим, как программно изменить текст запроса в процедуре ПриСозданииНаСервере:
// Получаем текущую схему запроса или текст
ТекстЗапроса = Список.ТекстЗапроса;
// Добавляем необходимые поля через левое соединение или выборку из основной таблицы
// Важно: следите за псевдонимами полей, чтобы не было конфликтов
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ ПакетыЭД.СостояниеЭДО КАК СостояниеЭДО,");
// Устанавливаем обновленный текст запроса обратно в динамический список
Список.ТекстЗапроса = ТекстЗапроса;
При изменении текста запроса крайне важно следить за сохранением основной таблицы. Если свойство ОсновнаяТаблица будет сброшено, перестанут работать стандартные функции списка: отборы, поиск и сортировка. Поэтому старайтесь модифицировать строку запроса аккуратно, сохраняя структуру ГДЕ и СГРУППИРОВАТЬ ПО.
После того как данные появились в источнике (в запросе динамического списка), нам нужно визуализировать их. Посмотрим на алгоритм добавления элемента формы. В отличие от реквизитов объекта, здесь путь к данным будет строиться по принципу ИмяРеквизитаСписка.ИмяПоляЗапроса.
Рассмотрим пример добавления колонки в таблицу ПакетыЭД:
// Определим родительский элемент - саму таблицу на форме
Родитель = Элементы.ПакетыЭД;
// Добавляем новый элемент формы типа ПолеФормы
НоваяКолонка = Элементы.Добавить("ПакетыЭД_СостояниеЭДО", Тип("ПолеФормы"), Родитель);
// Указываем путь к данным. ПакетыЭД - имя реквизита формы (ДинамическийСписок)
НоваяКолонка.ПутьКДанным = "ПакетыЭД.СостояниеЭДО";
// Устанавливаем вид поля - Поле ввода или Поле надписи
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
// Опционально: задаем заголовок и видимость
НоваяКолонка.Заголовок = "Состояние ЭДО";
НоваяКолонка.Видимость = Истина;
Обратите внимание: если поле уже есть в основной таблице динамического списка, платформа позволяет обращаться к нему через точку даже без явного указания в ТекстЗапроса (разыменовывание ссылок), однако для оптимизации производительности (особенно в тяжелых формах ЭДО) лучше явно прописывать поля в запросе и использовать функцию ВЫРАЗИТЬ для типизации.
Проанализируем ситуацию, когда новую колонку нужно поставить не в самый конец, а в определенное место. По умолчанию метод Добавить помещает элемент в конец коллекции. Чтобы изменить порядок, воспользуемся методом Переместить:
// Переместим новую колонку перед стандартной колонкой "Дата"
Элементы.Переместить(НоваяКолонка, Родитель, Элементы.ПакетыЭДДата);
Также важно помнить об условном оформлении. Если добавленное поле (например, статус документа) должно подсвечиваться в зависимости от значения, нам придется программно добавить правила в коллекцию УсловноеОформление формы. Разберем небольшой пример:
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ОсобыйТекст);
Условие = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПакетыЭД.СостояниеЭДО");
Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Условие.ПравоеЗначение = Перечисления.СостоянияЭДО.ТребуетсяПодписание;
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ПакетыЭД_СостояниеЭДО");
В сложных формах, таких как «Текущие дела по ЭДО», интерфейс часто строится динамически при помощи общих модулей. Выясним, на что обратить внимание в таких случаях:
Видимость = Истина и, при необходимости, программно сбросили настройки формы.ПриСозданииНаСервере, убедитесь, что механизмы стандартного обновления не удаляют динамически созданные элементы.ВЫБОР КОГДА...), обязательно используйте функцию ВЫРАЗИТЬ(Поле КАК Тип) в тексте SQL-запроса. Это поможет платформе корректно определить тип элемента формы и предоставить пользователю правильную маску ввода или выбор из справочника.Подведем итог: для успешного добавления колонки в динамическую таблицу формы нужно сначала убедиться в наличии данных в источнике (реквизите формы), а затем создать соответствующий элемент интерфейса, связав его через ПутьКДанным с правильным префиксом. Этот метод позволяет гибко настраивать рабочие места пользователей без изменения метаданных конфигурации.