Как программно заполнить дополнительные реквизиты и колонки табличных частей в 1С:БГУ 2.0?

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

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

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

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

Для начала проанализируем, как БГУ 2.0 хранит информацию о дополнительных табличных частях. Вся подсистема базируется на трех основных объектах метаданных:

  1. Справочник ДополнительныеТабличныеЧастиДокументов — содержит метаданные о созданных пользователем табличных частях, привязанных к конкретным типам документов.
  2. Справочник КолонкиДополнительныхТабличныхЧастей — подчинен первому справочнику, хранит настройки колонок (имя, заголовок, тип данных, связь с реквизитами).
  3. Регистр сведений ЗначенияКолонокДополнительныхТабличныхЧастей — физическое место хранения всех введенных пользователем данных.

Рассмотрим структуру измерений ключевого регистра сведений ЗначенияКолонокДополнительныхТабличныхЧастей:

Перейдем к практическим вариантам программного заполнения этих данных при импорте или создании документов.

Сценарий №1. Программное заполнение через ДополнительныеСвойства (обычный режим записи)

Если создание или загрузка документа происходит в обычном режиме (когда ОбменДанными.Загрузка = Ложь), платформа задействует стандартные подписки на события БГУ. При этом подсистема автосохранения ожидает получить данные дополнительных колонок из дополнительных свойств объекта.

Разберем по шагам, как это реализовать:

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

Посмотрим на практический пример кода:


// Шаг 1. Получаем структуру колонок из регистра сведений
ДополнительнаяТаблица = РегистрыСведений.ЗначенияКолонокДополнительныхТабличныхЧастей.СоздатьНаборЗаписей().ВыгрузитьКолонки();

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

// Шаг 3. Передаем подготовленную таблицу в объект документа перед его записью
ДокументОбъект.ДополнительныеСвойства.Вставить("ДанныеДополнительныхТабЧастей", ДополнительнаяТаблица);

// После этого при вызове метода Записать() подписка БГУ автоматически запишет эти данные в регистр
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Сценарий №2. Прямая запись в регистр сведений (при ОбменДанными.Загрузка = Истина)

При выполнении обменов данными очень часто документы записываются с установленным флагом ОбменДанными.Загрузка = Истина. В этом режиме подписки на события, отвечающие за автоматическое сохранение дополнительных реквизитов, не срабатывают. Соответственно, первый способ работать не будет.

Выясним, как поступить в этой ситуации. Нам потребуется самостоятельно сформировать и записать набор записей в регистр сведений ЗначенияКолонокДополнительныхТабличныхЧастей.

Разберем детальный алгоритм:

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

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


// 1. Поиск метаданных дополнительной ТЧ и колонки
СсылкаНаДопТаблицу = Справочники.ДополнительныеТабличныеЧастиДокументов.НайтиПоРеквизиту("ИмяТабличнойЧасти", "ИмяНашейДопТЧ");
СсылкаНаКолонку = Справочники.КолонкиДополнительныхТабличныхЧастей.НайтиПоРеквизиту("ИмяКолонки", "ИмяНашейКолонки");

Если ЗначениеЗаполнено(СсылкаНаДопТаблицу) И ЗначениеЗаполнено(СсылкаНаКолонку) Тогда

    // 2. Создание набора записей с отбором по документу
    НаборЗаписей = РегистрыСведений.ЗначенияКолонокДополнительныхТабличныхЧастей.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(ДокументСсылка);
    
    // 3. Заполнение данных по строкам оригинальной ТЧ документа
    Для Каждого СтрокаТЧ Из ДокументСсылка.Материалы Цикл
        
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Объект = ДокументСсылка;
        НоваяЗапись.ДополнительнаяТабличнаяЧасть = СсылкаНаДопТаблицу;
        НоваяЗапись.КолонкаДополнительнойТабличнойЧасти = СсылкаНаКолонку;
        НоваяЗапись.КлючСтроки = СтрокаТЧ.НомерСтроки; // Связываем по номеру или индексу строки
        НоваяЗапись.Значение = ВычислитьЗначениеДляСтроки(СтрокаТЧ);
        
    КонецЦикла;
    
    // Записываем набор в базу данных
    НаборЗаписей.Записать(Истина);

КонецЕсли;

Важные архитектурные нюансы и проведение документов

Работа с дополнительными табличными частями в БГУ 2.0 имеет несколько критически важных подводных камней, о которых необходимо помнить при проектировании интеграций:

Во-первых, проанализируем взаимосвязь с общим модулем БухгалтерскиеОперацииСервер. Начинающие разработчики часто пытаются использовать его методы для работы с дополнительными колонками. Это ошибочный путь. Функции типа БухгалтерскиеОперацииСервер.ДобавитьДанныеДляПроведения предназначены исключительно для работы с дополнительными реквизитами типовых операций (которые отображаются на синей панели «Бухгалтерская операция» внизу документов). Механизм дополнительных табличных частей является изолированным, и готового высокоуровневого API в общих модулях для него не предусмотрено.

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

Таким образом, понимание внутренней структуры хранения данных в регистре ЗначенияКолонокДополнительныхТабличныхЧастей и правильный выбор метода записи (через ДополнительныеСвойства или прямое формирование набора записей) позволят вам создавать надежные и стабильно работающие интеграции в БГУ 2.0.

← На главную