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