Почему не переносятся колонки табличной части на форму обработки и чем она отличается от таблицы значений

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

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

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

Выясняем причину: почему не переносились колонки табличной части?

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

Давайте проанализируем, что происходит, когда мы пытаемся перетащить табличную часть из дерева метаданных (из левого окна конфигуратора) напрямую на форму. Платформа блокирует это действие или переносит объект некорректно, поскольку сама управляемая форма «не знает» о структуре этого объекта. Чтобы форма могла работать с данными обработки, эти данные должны быть объявлены внутри формы в качестве её реквизитов.

Почему же с таблицей значений всё получилось сразу? Когда вы создаете таблицу значений непосредственно в редакторе формы на вкладке «Реквизиты», вы создаете локальный реквизит формы. Форма изначально владеет этим реквизитом, знает его структуру, типы колонок и поэтому без проблем позволяет визуализировать его на экране.

Разберем по шагам: как правильно вывести табличную часть на форму

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

  1. Откроем редактор управляемой формы нашей обработки.
  2. В правом верхнем углу перейдем на вкладку «Реквизиты».
  3. Если в списке реквизитов отсутствует реквизит с именем Объект (или аналогичный, имеющий тип значения вашей обработки), нам необходимо его создать. Нажмем кнопку «Добавить реквизит».
  4. Назовем созданный реквизит, например, Объект. В поле «Тип» выберем тип данных нашей обработки — ОбработкаОбъект.ИмяВашейОбработки.
  5. Это критически важно: нажмем на созданном реквизите Объект правой кнопкой мыши и выберем пункт «Установить как основной реквизит». Имя реквизита после этого выделится жирным шрифтом. Это действие сообщает платформе, что форма теперь жестко связана с логикой и структурой нашей обработки.
  6. Теперь развернем структуру реквизита Объект, нажав на плюс рядом с ним. Мы увидим нашу табличную часть и все подчиненные ей колонки.
  7. Зажмем левую кнопку мыши на табличной части внутри реквизита Объект и перетащим её в левое окно — в область «Элементы» формы.
  8. Платформа автоматически создаст элемент формы типа «Таблица» и заполнит его всеми необходимыми колонками, привязанными к путям данных нашей табличной части.

Принципиальные различия: Табличная часть vs Таблица значений

Хотя на форме для конечного пользователя оба эти объекта выглядят абсолютно одинаково (в виде табличной сетки со строками и колонками), с точки зрения архитектуры платформы «1С:Предприятие 8» — это принципиально разные сущности.

Рассмотрим подробнее их ключевые отличия по трем основным критериям:

1. Архитектура и хранение данных

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

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

2. Ограничения работы в контексте «Клиент-Сервер»

В управляемом приложении 1С действует строгое разграничение выполнения кода на клиенте и на сервере. Это накладывает серьезные ограничения на использование данных объектов:

Таблица значений (ТЗ) не существует на клиенте. Объект типа ТаблицаЗначений физически не может быть передан на сторону тонкого или веб-клиента, так как он слишком «тяжелый» для передачи по сети. Попытка передать ТЗ в клиентскую процедуру вызовет ошибку выполнения.

Для отображения табличных данных на форме платформа использует специальный промежуточный тип данных — ДанныеФормыКоллекция. Когда мы размещаем таблицу значений на форме, платформа автоматически преобразует её в этот тип. На клиенте мы работаем именно с коллекцией данных формы. Если нам нужно выполнить сложные расчеты с использованием методов ТЗ, нам придется передать данные на сервер, преобразовать их в «чистую» ТЗ, обработать и вернуть обратно на форму.

Посмотрим на пример того, как выполняется такое преобразование на сервере:


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

3. Программный функционал и встроенные методы

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

Преимущества программных методов Таблицы Значений (ТЗ):

Ограничения Табличной части (ТЧ):

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

Посмотрим на пример реализации такого алгоритма:


&НаСервере
Процедура СгруппироватьТоварыВТабличнойЧасти()
    // Получаем объект обработки из реквизита формы
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    
    // Выгружаем данные табличной части "Товары" в Таблицу Значений
    ТаблицаВременная = ОбъектОбработки.Товары.Выгрузить();
    
    // Сворачиваем строки по номенклатуре, суммируя количество и сумму
    ТаблицаВременная.Свернуть("Номенклатура", "Количество, Сумма");
    
    // Загружаем сгруппированные данные обратно в табличную часть объекта
    ОбъектОбработки.Товары.Загрузить(ТаблицаВременная);
    
    // Синхронизируем изменения объекта с формой
    ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
КонецПроцедуры

Резюме: когда и что правильнее использовать?

Для эффективной разработки важно четко понимать архитектурные границы применимости обоих объектов:

← На главную