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

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

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

Постановка задачи и базовые принципы

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

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

Создание элемента «Таблица формы»

Для начала проанализируем процесс добавления самого контейнера таблицы. Мы используем коллекцию Элементы и метод Добавить. Разберем пример кода, который инициализирует таблицу и связывает её с данными объекта:


// Добавляем таблицу на форму
ЭлементТаблица = Элементы.Добавить("Расш_ТабЧасть", Тип("ТаблицаФормы"));
ЭлементТаблица.ПутьКДанным = "Объект.Расш_ТабЧасть";
ЭлементТаблица.Заголовок = "Дополнительные данные";

В данном примере Объект.Расш_ТабЧасть — это путь к данным табличной части, которую мы добавили в документ через расширение. Крайне важно использовать уникальные префиксы (например, Расш_) для имен элементов, чтобы избежать совпадения имен с элементами основной конфигурации, которые могут появиться в будущем.

Программное создание колонок таблицы

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


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

Здесь третьим параметром в методе Добавить мы указываем родительский элемент — нашу созданную таблицу ЭлементТаблица. Путь к данным для колонки всегда строится по принципу: ПутьКДаннымТаблицы.ИмяРеквизитаТЧ.

Оптимизация создания колонок методом СоздатьКолонки()

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


ЭлементТаблица = Элементы.Добавить("Расш_ТабЧасть", Тип("ТаблицаФормы"));
ЭлементТаблица.ПутьКДанным = "Объект.Расш_ТабЧасть";
// Автоматическое создание всех колонок на основе метаданных
ЭлементТаблица.СоздатьКолонки();

Этот метод автоматически создаст поля формы для всех реквизитов табличной части, которые доступны в текущем контексте. Это значительно сокращает объем кода и минимизирует риск опечаток в путях к данным. Для практической реализации подойдёт пример программного создания колонок в табличной части документа.

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

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

Рассмотрим порядок действий для исправления этой ситуации:

  1. Перейдем в расширение и создадим в нем новую Роль.
  2. В настройках роли найдем наш заимствованный документ и добавленную в него табличную часть.
  3. Установим права «Чтение» и «Просмотр» для табличной части и всех её реквизитов.
  4. Назначим эту роль пользователю (или добавим её в профиль групп доступа).

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

Работа с функциональными опциями

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

Добавление командной панели

Просто вывести таблицу недостаточно — пользователю нужно иметь возможность добавлять и удалять строки. При программном создании таблицы стандартные кнопки могут не появиться автоматически. Разберем, как включить командную панель:


// Включаем отображение командной панели таблицы
ЭлементТаблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Верх;

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

ЭлементПоле.УстановитьДействие("ПриИзменении", "Расш_ПриИзмененииНоменклатуры");

Сама процедура Расш_ПриИзмененииНоменклатуры должна быть описана в модуле формы с директивой &НаКлиенте. Для упрощения и стандартизации добавления элементов и команд на форму можно использовать общий модуль для программного изменения форм.

Использование метода ИзменитьРеквизиты

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

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

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

Подводя итог, можно составить краткий чек-лист для успешного программного добавления ТЧ в форму через расширение:

  1. Убедитесь, что табличная часть добавлена в объект в расширении и имеет корректные типы данных.
  2. Проверьте права доступа: в расширении должна быть роль, дающая права на новую ТЧ.
  3. Используйте ПриСозданииНаСервере для программного кода.
  4. Связывайте таблицу с данными через Объект.ИмяВашейТЧ.
  5. Не забывайте про метод СоздатьКолонки() для упрощения работы.
  6. Если элементы не видны, проверьте функциональные опции и видимость родительских групп формы.

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

← На главную