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

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникают задачи, когда интерфейс формы должен меняться динамически — для этого подойдёт инструментарий разработчика для модификации управляемых форм. Одной из самых трудоемких операций является программное добавление табличной части (ТЧ). В отличие от простых реквизитов, таблица требует настройки целой иерархии элементов: самой таблицы, её колонок и связей с данными. Разберем подробно, как это реализовать, и проанализируем основные подводные камни.

Различие между данными и элементами формы

Перед тем как переходить к коду, нам необходимо четко разделить два понятия: Реквизиты формы (структура данных) и Элементы формы (визуальное отображение). Проанализируем ситуацию: если табличная часть уже создана в метаданных объекта (например, в документе ЗаказПокупателя), то на уровне формы данные уже существуют. Нам остается только создать элементы для их отображения — есть готовая обработка для динамического управления элементами управляемых форм.

Если же вы создаете таблицу, которой нет в конфигураторе, процесс усложняется. Сначала необходимо использовать метод ИзменитьРеквизиты(), чтобы добавить массив новых реквизитов типа ТаблицаЗначений, и только после этого приступать к отрисовке элементов. В данной статье мы сосредоточимся на случае, когда ТЧ уже есть в объекте, но её нужно программно вывести на форму.

Шаг 1. Создание контейнера (группы) для таблицы

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


ИмяГруппы = "СтраницаУслуги";
НоваяГруппа = ЭтаФорма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), Элементы.ГруппаСтраницы);
НоваяГруппа.Вид = ВидГруппыФормы.Страница;
НоваяГруппа.Заголовок = "Услуги";

Здесь Элементы.ГруппаСтраницы — это родительский элемент (например, панель с закладками), внутри которого мы создаем новую вкладку.

Шаг 2. Добавление элемента «ТаблицаФормы»

Теперь добавим саму таблицу. Важно помнить, что в управляемых формах используется тип ТаблицаФормы. Использование устаревшего типа ТабличноеПоле (характерного для обычных форм) приведет к ошибке «Недопустимое значение параметров».

Проанализируем пример добавления таблицы:


// Добавляем таблицу в ранее созданную группу
ТаблицаУслуги = Элементы.Добавить("УСТ_Услуги", Тип("ТаблицаФормы"), НоваяГруппа);
// Указываем путь к данным. Для ТЧ документа это "Объект.ИмяВашейТЧ"
ТаблицаУслуги.ПутьКДанным = "Объект.УСТ_Услуги";

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

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

Просто создать таблицу недостаточно — она будет пустой. Нам нужно добавить в неё колонки, которые являются элементами вида ПолеФормы. Каждое поле должно быть связано с конкретным реквизитом табличной части через свойство ПутьКДанным.

Рассмотрим ручной способ добавления колонки «Номенклатура»:


ЭлементТаблицыФормы = Элементы.Добавить("УСТ_УслугиНоменклатура", Тип("ПолеФормы"), ТаблицаУслуги);
ЭлементТаблицыФормы.Вид = ВидПоляФормы.ПолеВвода;
// Путь к данным строится как: Таблица.Реквизит
ЭлементТаблицыФормы.ПутьКДанным = "Объект.УСТ_Услуги.Номенклатура";

Шаг 4. Автоматизация процесса через метаданные

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


ТЧМетаданные = Метаданные.Документы.ОтчетКомитенту.ТабличныеЧасти.УСТ_Услуги;

Для Каждого РеквизитТЧ Из ТЧМетаданные.Реквизиты Цикл
    ИмяПоля = "УСТ_Услуги" + РеквизитТЧ.Имя;
    НоваяКолонка = Элементы.Добавить(ИмяПоля, Тип("ПолеФормы"), ТаблицаУслуги);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.ПутьКДанным = "Объект.УСТ_Услуги." + РеквизитТЧ.Имя;
КонецЦикла;

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

Разбор типичных ошибок и «страданий» разработчиков

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

  1. Дублирование имен: Элемент с именем УСТ_Услуги уже существует на форме. Перед добавлением всегда проверяйте наличие элемента через Элементы.Найти().
  2. Неверный контекст выполнения: Весь код по изменению структуры элементов формы должен выполняться исключительно на сервере (обычно в процедуре ПриСозданииНаСервере).
  3. Неверный тип родителя: Попытка добавить колонку не в ТаблицаФормы, а в обычную группу или напрямую на форму.

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

Настройка командной панели

По умолчанию у программно созданной таблицы может отсутствовать командная панель с кнопками «Добавить» и «Удалить». Чтобы исправить это, мы можем либо разрешить стандартные команды, либо создать группу вида КоманднаяПанель:


ТаблицаУслуги.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Верх;
// Если нужно ограничить состав команд:
ТаблицаУслуги.СоставКоманднойПанели.Использовать = Истина;

Использование свойства СоставКоманднойПанели позволяет тонко настроить, какие именно кнопки (добавление, копирование, поиск) будут видны пользователю.

Заключение

Мы проанализировали процесс программного создания табличной части на управляемой форме 1С. Основной залог успеха здесь — соблюдение строгой иерархии: Реквизит объекта -> Элемент ТаблицаФормы -> Элементы ПолеФормы. Помните, что программная работа с интерфейсом — это ресурсозатратная операция, поэтому старайтесь выполнять её один раз при инициализации формы. Следуя этим правилам и примерам кода, вы сможете создавать гибкие и динамичные интерфейсы для любых бизнес-задач. Для этой задачи есть конструктор произвольных форм документов без конфигуратора.

← На главную