Как программно вывести колонку табличной части с кнопкой выбора в 1С 8.3 на обычных формах?

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

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

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

Шаг 1: Инициализация и создание колонки

Для начала проанализируем ситуацию. Допустим, у нас есть документ с табличной частью Услуги, в которую мы добавили новый реквизит (например, через расширение или непосредственно в дерево метаданных), но не хотим вручную размещать его на форме. Нам необходимо обратиться к коллекции колонок табличного поля.

Рассмотрим пример кода, который добавляет новую колонку. Важно использовать метод Вставить, если вы хотите поместить колонку в определенное место, а не в самый конец списка.


// Определим место вставки (например, перед колонкой "Сумма")
ИндексКолонки = ЭлементыФормы.Услуги.Колонки.Сумма.Индекс();
НоваяКолонка = ЭлементыФормы.Услуги.Колонки.Вставить(ИндексКолонки, "МойРеквизит");

Обратите внимание, что вторым параметром передается имя колонки. Рекомендуется называть ее так же, как называется реквизит в табличной части метаданных.

Шаг 2: Связь с данными и визуальное оформление

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

Проанализируем необходимые настройки:


НоваяКолонка.Данные = "МойРеквизит"; // Имя реквизита ТЧ
НоваяКолонка.ТекстШапки = "Название колонки";
НоваяКолонка.Ширина = 15;
НоваяКолонка.ИзменениеРазмера = ИзменениеРазмераКолонки.Изменять;

Важный момент: если вы не установите ТекстШапки, в интерфейсе пользователя заголовок будет отображаться техническим именем (например, «МойРеквизит»), что выглядит непрофессионально.

Шаг 3: Настройка элемента управления и кнопки выбора

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

Разберем по шагам, как активировать выбор справочника в ячейке:

  1. Сначала нужно явно указать тип элемента управления для колонки. Для ввода данных это всегда ПолеВвода.
  2. Затем необходимо обратиться к свойству ЭлементУправления этой колонки и включить отображение кнопки.

// Устанавливаем тип элемента управления
НоваяКолонка.УстановитьЭлементУправления(Тип("ПолеВвода"));

// Теперь настраиваем само поле ввода внутри колонки
ПолеВвода = НоваяКолонка.ЭлементУправления;
ПолеВвода.КнопкаВыбора = Истина;
ПолеВвода.ВыбиратьТип = Ложь; // Если тип реквизита не составной

Почему свойство КнопкаВыбора нельзя найти сразу у объекта «Колонка»? В обычных формах архитектура разделяет визуальный контейнер (колонку) и активный элемент (поле ввода), который «включается» только при активации ячейки. Поэтому все настройки интерактивности производятся через ЭлементУправления.

Шаг 4: Обработка событий и типов данных

Если программно добавленная колонка должна не просто отображать данные, но и выполнять какую-то логику при изменении (например, пересчитывать сумму), нам потребуется метод УстановитьДействие. Рассмотрим, как назначить процедуру-обработчик:


НоваяКолонка.ЭлементУправления.УстановитьДействие("ПриИзменении", Новый Действие("ИмяПроцедурыВМодулеФормы"));

Сама процедура должна быть объявлена в модуле формы с соответствующим заголовком:


Процедура ИмяПроцедурыВМодулеФормы(Элемент)
    // СтрокаТаблицы = ЭлементыФормы.Услуги.ТекущиеДанные;
    // Логика обработки...
КонецПроцедуры

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

Почему программный вывод лучше добавления вручную?

Выясним причину, по которой опытные разработчики предпочитают программный метод в БП 2.0:

Резюме решения

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

← На главную