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

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

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

Подготовка метаданных: что нужно сделать до работы с формой

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

Если вы работаете с документом, проверьте наличие табличной части в его структуре через конфигуратор: Объект → Документы → [ВашДокумент] → Табличные части. Для справочников путь аналогичный. Если табличной части нет — создайте её с нужными колонками (реквизитами).

  • 📌 Тип данных: Убедитесь, что тип табличной части соответствует задаче (например, ДокументСсылка.Товары для документа реализации).
  • 🔄 Связи: Проверьте, что табличная часть корректно связана с основным объектом (через реквизит Ссылка или аналогичный).
  • 🔒 Права доступа: Настройте права ролей на чтение/запись табличной части, иначе пользователи не увидят данные.

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

📊 Какой тип табличной части вы чаще используете?
Стандартную (из метаданных)
Динамический список
Таблицу значений
Не знаю, в чем разница
⚠️ Внимание: Если вы изменяете структуру табличной части в работающей базе, обязательно обновите конфигурацию на клиентских местах. В противном случае пользователи увидят ошибку "Не найден реквизит табличной части" при открытии формы.

Способы добавления табличной части на форму: сравнение подходов

В 1С 8.3 есть три основных способа добавить табличную часть на управляемую форму. Каждый имеет свои плюсы и минусы в зависимости от задачи:

Способ Когда использовать Плюсы Минусы
Через конструктор форм Для быстрого прототипирования Не требует кода, визуальная настройка Ограниченная гибкость, сложно кастомизировать
Программно в модуле формы Для динамических таблиц или сложной логики Полный контроль над поведением Требует знания языка
Через расширение конфигурации Для модификации типовых решений Не затрагивает оригинальную конфигурацию Сложно отлаживать, ограничения по функционалу

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

Для добавления таблицы программно используйте метод ЭлементыФормы.Добавить() в модуле формы (обычно в процедуре ПриСозданииНаСервере()). Пример базового кода:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ТабличнаяЧасть = ЭлементыФормы.Добавить("ТабличнаяЧастьТовары",

Тип("ПолеТабличнойЧасти"),

Истина,

Истина);

ТабличнаяЧасть.ИсточникДанных = Новый ИсточникДанныхСписок("Товары");

КонецПроцедуры

Здесь "Товары" — это имя табличной части в метаданных документа или справочника. Если вы работаете с ТаблицейЗначений, источник данных настраивается иначе.

💡

Всегда проверяйте существование табличной части в метаданных перед добавлением на форму. Используйте конструкцию Метаданные.Документы.[ИмяДокумента].ТабличныеЧасти.Найти("ИмяТаблицы"), чтобы избежать ошибок.

Пошаговая инструкция: добавляем табличную часть программно

Разберем процесс на примере добавления табличной части "Товары" к документу "ЗаказПокупателя". Следуйте этому алгоритму, чтобы избежать типичных ошибок:

Создать табличную часть в метаданных документа|Открыть модуль управляемой формы|Добавить процедуру ПриСозданииНаСервере|Проверить права доступа к объекту-->

Шаг 1. Создание табличной части в метаданных

Откройте конфигуратор, найдите документ ЗаказПокупателя и добавьте табличную часть с именем Товары. В ней создайте колонки: Номенклатура (тип СправочникСсылка.Номенклатура), Количество (тип Число), Цена (тип Число), Сумма (тип Число).

Шаг 2. Настройка модуля формы

Откройте управляемую форму документа и перейдите в её модуль. Добавьте процедуру ПриСозданииНаСервере (если её нет). Внутри неё разместите код создания табличной части:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Создаем элемент формы

ТабличнаяЧастьТовары = ЭлементыФормы.Добавить("ТабличнаяЧастьТовары",

Тип("ПолеТабличнойЧасти"),

Истина);

// Настраиваем источник данных

ТабличнаяЧастьТовары.ИсточникДанных = Новый ИсточникДанныхСписок("Товары");

// Добавляем команды для работы с таблицей

Команды = ЭлементыФормы.ДобавитьКоманду("ДобавитьСтроку",

Тип("КомандаФормы"),

"Добавить строку");

Команды.Действие = "ДобавитьСтрокуТовары";

// Настраиваем отображение

ТабличнаяЧастьТовары.Высота = 200;

ТабличнаяЧастьТовары.ПоказыватьЗаголовок = Истина;

ТабличнаяЧастьТовары.ПоказыватьИтоги = Истина;

КонецПроцедуры

Шаг 3. Реализация команд

Добавьте обработчики для команд (например, добавления строки). Это можно сделать в модуле формы:

Процедура ДобавитьСтрокуТовары(Команда)

Объект.Товары.Добавить();

КонецПроцедуры

Шаг 4. Настройка отображения колонок

По умолчанию все колонки табличной части отобразятся на форме. Чтобы управлять их видимостью, используйте свойство Колонки:

ТабличнаяЧастьТовары.Колонки.Номенклатура.Видимость = Истина;

ТабличнаяЧастьТовары.Колонки.Сумма.ТолькоПросмотр = Истина;

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

Динамическое управление табличной частью: продвинутые техники

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

1. Условное отображение колонок

Допустим, колонка "Скидка" должна показываться только для пользователей с ролью "Менеджер". Реализуем это в процедуре ПриОткрытии():

Процедура ПриОткрытии(Отказ)

Если НЕ ГлобальныйКонтекст.Пользователь.Роли.Найти("Менеджер") Тогда

ЭлементыФормы.ТабличнаяЧастьТовары.Колонки.Скидка.Видимость = Ложь;

КонецЕсли;

КонецПроцедуры

2. Динамическое добавление строк при изменении реквизита

Если в документе есть реквизит "ТипЗаказа", и для значения "Опт" нужно автоматически добавлять 5 строк в табличную часть, используйте обработчик события:

Процедура ТипЗаказаПриИзменении(Элемент)

Если Объект.ТипЗаказа = Перечисление.ТипыЗаказов.Опт Тогда

Для Сч = 1 По 5 Цикл

Объект.Товары.Добавить();

КонецЦикла;

КонецЕсли;

КонецПроцедуры

3. Изменение источника данных на лету

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

Процедура ПриИзмененииФильтра(Элемент)

Фильтр = Новый Структура("Категория", ЗначениеФильтра);

ИсточникДанных = Новый ИсточникДанныхСписок("Товары");

ИсточникДанных.УстановитьФильтр(Фильтр);

ЭлементыФормы.ТабличнаяЧастьТовары.ИсточникДанных = ИсточникДанных;

КонецПроцедуры

4. Работа с таблицей значений вместо табличной части

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

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Номенклатура");

Таблица.Колонки.Добавить("Количество");

ЭлементыФормы.Добавить("ДинамическаяТаблица",

Тип("ПолеТабличногоДокумента"),

Истина);

ЭлементыФормы.ДинамическаяТаблица.Значение = Таблица;

КонецПроцедуры

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

Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при работе с табличными частями. Вот самые распространенные ошибки и способы их решения:

  • 🚫 Таблица не отображается на форме: Проверьте, что элемент добавлен в правильном модуле (ПриСозданииНаСервере, а не ПриОткрытии). Также убедитесь, что имя табличной части в коде совпадает с именем в метаданных.
  • 🔄 Данные не сохраняются: Частая причина — отсутствие привязки к источнику данных. Убедитесь, что свойство ИсточникДанных заполнено корректно, например: Новый ИсточникДанныхСписок("Товары").
  • 🔒 Ошибка "Не найден реквизит": Возникает, если в коде вы обращаетесь к колонке, которой нет в табличной части. Всегда проверяйте существование колонок перед работой с ними.
  • Форма подвисает при большом количестве строк: Для таблиц с тысячами строк используйте ОтображатьТолькоТекущуюСтроку = Истина или настройте постраничный вывод.

Ещё одна распространенная проблема — дублирование строк при программном добавлении. Это происходит, если вы добавляете строки и в модуле формы, и в модуле объекта. Решение: centralized логику добавления в одном месте (обычно в модуле объекта).

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

Почему табличная часть не обновляется после изменения данных?

Это происходит из-за кэширования данных на клиенте. Чтобы принудительно обновить отображение, используйте метод Обновить() для элемента формы или всего объекта. Например:

ЭлементыФормы.ТабличнаяЧастьТовары.Обновить();

Если это не помогает, проверьте, что изменения данных происходят на сервере (в серверных процедурах), а не на клиенте.

Оптимизация производительности: работа с большими таблицами

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

1. Постраничный вывод

Настройте отображение данных порциями. Это снизит нагрузку на клиентскую часть:

ТабличнаяЧасть.ПостраничныйВывод = Истина;

ТабличнаяЧасть.КоличествоСтрокНаСтранице = 50;

2. Отключение ненужных функций

Если не требуется редактирование прямо в таблице, отключите его:

ТабличнаяЧасть.РежимРедактирования = РежимРедактированияТаблицы.ТолькоПросмотр;

3. Использование динамических списков

Для больших объемов данных замените стандартную табличную часть на ДинамическийСписок. Он грузит данные по мере прокрутки:

ЭлементыФормы.Добавить("ДинамическийСписокТоваров",

Тип("ПолеДинамическогоСписка"),

Истина);

ЭлементыФормы.ДинамическийСписокТоваров.ИсточникДанных =

Новый ИсточникДанныхДинамическийСписок("Товары");

4. Кэширование данных

Если таблица часто используется, но редко меняется, кэшируйте её данные в переменной формы:

Перем ДанныеТоваров;

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ДанныеТоваров = Объект.Товары.Выгрузить();

ТабличнаяЧасть.Значение = ДанныеТоваров;

КонецПроцедуры

5. Оптимизация колонок

Скрывайте неиспользуемые колонки и настраивайте ширину видимых:

ТабличнаяЧасть.Колонки.Номенклатура.Ширина = 300;

ТабличнаяЧасть.Колонки.Описание.Видимость = Ложь;

⚠️ Внимание: При работе с большими таблицами избегайте использования ОбойтиСтроки() в клиентских процедурах. Этот метод блокирует интерфейс до завершения обхода. Для длительных операций используйте серверные функции с прогресс-баром.

Примеры реальных задач: от теории к практике

Разберем несколько практических сценариев, с которыми часто сталкиваются разработчики . Эти примеры помогут адаптировать общие принципы под конкретные бизнес-задачи.

Задача 1: Таблица с вложенными табличными частями

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

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Основная таблица

ТабличнаяЧастьТовары = ЭлементыФормы.Добавить("Товары", Тип("ПолеТабличнойЧасти"));

// Настройка вложенной таблицы для каждой строки

ТабличнаяЧастьТовары.СписокСтрок.ПриАктивизацииСтроки =

"ПриАктивизацииСтрокиТовары";

КонецПроцедуры

Процедура ПриАктивизацииСтрокиТовары(Элемент, Строка, СтандартнаяОбработка)

Если ЭлементыФормы.Свойство("ВложеннаяТаблица") Тогда

ЭлементыФормы.Удалить("ВложеннаяТаблица");

КонецЕсли;

ВложеннаяТаблица = ЭлементыФормы.Добавить("ВложеннаяТаблица",

Тип("ПолеТабличнойЧасти"));

ВложеннаяТаблица.ИсточникДанных =

Новый ИсточникДанныхСписок("Характеристики", Строка);

КонецПроцедуры

Задача 2: Таблица с вычисляемыми колонками

Если нужно добавить колонку "ИтоговаяСумма", которая рассчитывается как Цена Количество (1 - Скидка), используйте обработчик события ПриИзменении:

Процедура ТоварыЦенаПриИзменении(Элемент, Строка)

Строка.Сумма = Строка.Цена Строка.Количество (1 - ?(Строка.Скидка = 0, 0, Строка.Скидка));

КонецПроцедуры

Задача 3: Экспорт таблицы в Excel

Чтобы дать пользователю возможность выгрузить табличную часть в Excel, добавьте команду и обработчик:

Процедура ВыгрузитьВExcel(Команда)

ТабличныйДокумент = Новый ТабличныйДокумент;

ТабличныйДокумент.Вывести(Объект.Товары);

Экспорт = Новый ЭкспортТабличногоДокумента;

Экспорт.Экспортировать(ТабличныйДокумент, "", ТипФайлаТабличногоДокумента.Excel);

КонецПроцедуры

Задача 4: Цветовое выделение строк

Чтобы строки с нулевым количеством подсвечивались красным, используйте обработчик ПриОформленииСтроки:

Процедура ТоварыПриОформленииСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

Если ДанныеСтроки.Количество = 0 Тогда

ОформлениеСтроки.ЦветФона = WebЦвета.Красный;

ОформлениеСтроки.ЦветТекста = WebЦвета.Белый;

КонецЕсли;

КонецПроцедуры

Эти примеры показывают, как гибко можно настраивать табличные части под конкретные бизнес-требования. Не бойтесь экспериментировать с комбинациями свойств и событий — предоставляет широкие возможности для кастомизации.

FAQ: Ответы на частые вопросы

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

Процесс аналогичный, но в модуле формы справочника. Главное отличие — источник данных должен ссылаться на табличную часть справочника, например: Новый ИсточникДанныхСписок("Контакты"), где "Контакты" — имя табличной части в метаданных справочника.

Можно ли добавить табличную часть на форму отчета?

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

Как сделать, чтобы табличная часть автоматически сортировалась по колонке?

Используйте свойство ПорядокСортировки источника данных. Пример:

ИсточникДанных = Новый ИсточникДанныхСписок("Товары");

ИсточникДанных.ПорядокСортировки.Добавить("Номенклатура.Наименование", НаправлениеСортировки.ПоВозрастанию);

Также можно настроить интерактивную сортировку, разрешив пользователю кликать по заголовкам колонок: ТабличнаяЧасть.ИнтерактивнаяСортировка = Истина;

Почему при добавлении строки в табличную часть форма тормозит?

Это типичная проблема при работе с большими таблицами (1000+ строк). Решения:

  1. Используйте Обновить() только для видимой области, а не всей таблицы.
  2. Отключите автоматическое обновление: ТабличнаяЧасть.АвтоОбновление = Ложь; и вызывайте Обновить() вручную.
  3. Для массового добавления строк используйте НачатьИзменение() и ЗакончитьИзменение().

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

Объект.Товары.НачатьИзменение();

Для Сч = 1 По 1000 Цикл

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = ...;

КонецЦикла;

Объект.Товары.ЗакончитьИзменение();

Как запретить пользователю удалять строки из табличной части?

Есть несколько способов:

  1. Скрыть команду удаления: ЭлементыФормы.Удалить("УдалитьСтроку");
  2. Отменить действие в обработчике:
    Процедура ПередУдалениемСтрокиТовары(Элемент, Строка, Отказ)
    

    Отказ = Истина;

    ПоказатьПредупреждение("Удаление строк запрещено!");

    КонецПроцедуры

  3. Настроить права доступа на уровне ролей (рекомендуется для сложных систем).