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

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

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

В этой статье мы подробно проанализируем различные подходы к решению этой задачи: от классического добавления метаданных в конфигураторе до создания гибких динамических подсистем на базе БСП (Библиотеки стандартных подсистем).

Вариант 1. Добавление всех необходимых табличных частей в Конфигураторе с программным управлением видимостью

Это наиболее прагматичный, надежный и простой в поддержке способ решения проблемы. Суть метода заключается в том, что все потенциально необходимые табличные части добавляются непосредственно к объекту метаданных (например, к документу ВнутреннийДокумент в 1С:ДО) в Конфигураторе. На форму документа выводятся все созданные ТЧ, но их видимость динамически управляется в зависимости от выбранного вида документа.

Выясним преимущества этого подхода:

  1. Простота реализации: С задачей справится даже начинающий разработчик, нет необходимости придумывать сложные механизмы сериализации данных.
  2. Производительность: Платформа 1С оптимизирована для работы со стандартными табличными частями. Выборки в запросах, построение отчетов на СКД и вывод в печатные формы работают максимально быстро и прозрачно.
  3. Контроль ссылочной целостности: Платформа автоматически отслеживает связи данных и корректность типов реквизитов в строках ТЧ.

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


&НаСервере
Процедура УправлениеВидимостьюТабличныхЧастей()
    
    // Получаем текущий вид документа
    ТекущийВидДокумента = Объект.ВидДокумента;
    
    // Проверяем соответствие вида документа и настраиваем видимость элементов формы
    Если ТекущийВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Договор Поставки") Тогда
        Элементы.ГруппаСпецификацияДоговора.Видимость = Истина;
        Элементы.ГруппаГрафикПлатежей.Видимость = Ложь;
    ИначеЕсли ТекущийВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Заявка На Расход") Тогда
        Элементы.ГруппаСпецификацияДоговора.Видимость = Ложь;
        Элементы.ГруппаГрафикПлатежей.Видимость = Истина;
    Иначе
        // Скрываем все дополнительные табличные части для остальных видов
        Элементы.ГруппаСпецификацияДоговора.Видимость = Ложь;
        Элементы.ГруппаГрафикПлатежей.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

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

Вариант 2. Использование современных расширений конфигурации (начиная с платформы 8.3.11+)

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

Проанализируем этот процесс:

  1. Создаем новое расширение конфигурации и подключаем его к нашей информационной базе (сняв флажок "Безопасный режим", если требуется работа со структурами данных).
  2. Заимствуем необходимый документ (например, ВнутреннийДокумент) в расширение.
  3. Внутри расширения добавляем к заимствованному документу новую табличную часть со всеми требуемыми реквизитами.
  4. Переносим форму документа в расширение и настраиваем программное отображение ТЧ только для определенных видов документов.

Важное ограничение метода: Помните, что реквизиты табличных частей, добавленные через расширения, имеют некоторые платформенные ограничения (например, на использование определенных типов данных или неограниченной длины строк в некоторых СУБД). Также при масштабном обновлении типовой конфигурации необходимо внимательно следить за тем, чтобы структура заимствованных объектов не изменилась критически.

Вариант 3. Универсальная подсистема на базе Плана видов характеристик (ПВХ) и регистра сведений

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

С архитектурной точки зрения мы построим решение по схеме Entity-Attribute-Value (EAV):

  1. Создаем новый План видов характеристик, который будет определять метаданные наших динамических таблиц (имя таблицы, имя колонки, тип данных колонки).
  2. Создаем подчиненный документ или независимый Регистр сведений (например, ДополнительныеТабличныеЧасти). Измерениями регистра будут: ОбъектСсылка (документ-владелец), ИмяТаблицы (строка), ИндексСтроки (число), Колонка (ПланВидовХарактеристикСсылка). Ресурсом будет выступать универсальный тип данных Значение (Характеристика.Колонка).
  3. На форме документа при открытии программно создаем таблицу значений, считываем данные из регистра сведений и разворачиваем их в привычную сетку на экране. При записи документа производим обратную операцию — сворачиваем измененную таблицу значений формы и записываем строки в регистр сведений.

Посмотрим на пример кода, который выполняет программное конструирование колонок таблицы на форме на основании настроек:


&НаСервере
Процедура СоздатьДинамическуюТабличнуюЧастьНаФорме(ИмяТаблицы)
    
    // 1. Описываем и добавляем реквизит формы типа "ТаблицаЗначений"
    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений")));
    
    // Получаем список колонок из настроек (например, из нашего справочника или ПВХ)
    СписокКолонок = ПолучитьНастройкиКолонокДляТаблицы(ИмяТаблицы);
    Для Каждого ТекущаяКолонка Из СписокКолонок Цикл
        МассивРеквизитов.Добавить(Новый РеквизитФормы(ТекущаяКолонка.Имя, ТекущаяКолонка.ТипДанных, ИмяТаблицы));
    КонецЦикла;
    
    ИзменитьРеквизиты(МассивРеквизитов);
    
    // 2. Создаем элементы управления на форме (визуализацию таблицы)
    ТаблицаФормы = Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"));
    ТаблицаФормы.ПутьКДанным = ИмяТаблицы;
    
    Для Каждого ТекущаяКолонка Из СписокКолонок Цикл
        НоваяКолонка = Элементы.Добавить(ИмяТаблицы + "_" + ТекущаяКолонка.Имя, Тип("ПолеФормы"), ТаблицаФормы);
        НоваяКолонка.ПутьКДанным = ИмяТаблицы + "." + ТекущаяКолонка.Имя;
        НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    КонецЦикла;
    
КонецПроцедуры

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

Вариант 4. Эмуляция табличной части через механизм "Дополнительные реквизиты" БСП

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

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

← На главную