При разработке интеграций, обгрузке данных или создании двусторонних обменов в конфигурации 1С:Бухгалтерия государственного учреждения 2.0 (БГУ 2.0) программисты часто сталкиваются с необходимостью программного заполнения нестандартных реквизитов. Одним из таких механизмов являются пользовательские дополнительные табличные части и дополнительные колонки стандартных табличных частей документов.
В отличие от привычных свойств БСП, данный механизм имеет уникальную архитектуру. В этой статье мы подробно разберем, как устроен этот механизм изнутри, и рассмотрим два эффективных программных сценария заполнения данных в зависимости от режима записи документа.
Для начала проанализируем, как БГУ 2.0 хранит информацию о дополнительных табличных частях. Вся подсистема базируется на трех основных объектах метаданных:
ДополнительныеТабличныеЧастиДокументов — содержит метаданные о созданных пользователем табличных частях, привязанных к конкретным типам документов.КолонкиДополнительныхТабличныхЧастей — подчинен первому справочнику, хранит настройки колонок (имя, заголовок, тип данных, связь с реквизитами).ЗначенияКолонокДополнительныхТабличныхЧастей — физическое место хранения всех введенных пользователем данных.Рассмотрим структуру измерений ключевого регистра сведений ЗначенияКолонокДополнительныхТабличныхЧастей:
Объект (ДокументСсылка) — документ-владелец, к которому привязаны данные.ДополнительнаяТабличнаяЧасть (СправочникСсылка.ДополнительныеТабличныеЧастиДокументов) — ссылка на описание доп. ТЧ.КолонкаДополнительнойТабличнойЧасти (СправочникСсылка.КолонкиДополнительныхТабличныхЧастей) — ссылка на описание конкретной колонки.КлючСтроки (Число) — важнейшее измерение. Если дополнительная колонка создана для существующей (стандартной) табличной части документа, то КлючСтроки связывает запись регистра с конкретной строкой оригинальной ТЧ (соответствует индексу строки или специальному реквизиту связи). Если связь настроена неверно, при открытии формы документа данные «съедут» или не отобразятся вовсе.Значение (Характеристика.ЗначенияКолонокДополнительныхТабличныхЧастей) — ресурс, в котором физически сохраняется значение ячейки.Перейдем к практическим вариантам программного заполнения этих данных при импорте или создании документов.
Если создание или загрузка документа происходит в обычном режиме (когда ОбменДанными.Загрузка = Ложь), платформа задействует стандартные подписки на события БГУ. При этом подсистема автосохранения ожидает получить данные дополнительных колонок из дополнительных свойств объекта.
Разберем по шагам, как это реализовать:
ЗначенияКолонокДополнительныхТабличныхЧастей."ДанныеДополнительныхТабЧастей".Посмотрим на практический пример кода:
// Шаг 1. Получаем структуру колонок из регистра сведений
ДополнительнаяТаблица = РегистрыСведений.ЗначенияКолонокДополнительныхТабличныхЧастей.СоздатьНаборЗаписей().ВыгрузитьКолонки();
// Шаг 2. Заполняем строки таблицы значений
НоваяСтрока = ДополнительнаяТаблица.Добавить();
НоваяСтрока.ДополнительнаяТабличнаяЧасть = СсылкаНаДопТаблицу; // СправочникСсылка.ДополнительныеТабличныеЧастиДокументов
НоваяСтрока.КолонкаДополнительнойТабличнойЧасти = СсылкаНаКолонку; // СправочникСсылка.КолонкиДополнительныхТабличныхЧастей
НоваяСтрока.КлючСтроки = НомерСтрокиОригинальнойТЧ; // Например, ИндексСтроки или НомерСтроки
НоваяСтрока.Значение = НужнаяАналитика; // Значение соответствующего типа
// Шаг 3. Передаем подготовленную таблицу в объект документа перед его записью
ДокументОбъект.ДополнительныеСвойства.Вставить("ДанныеДополнительныхТабЧастей", ДополнительнаяТаблица);
// После этого при вызове метода Записать() подписка БГУ автоматически запишет эти данные в регистр
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
При выполнении обменов данными очень часто документы записываются с установленным флагом ОбменДанными.Загрузка = Истина. В этом режиме подписки на события, отвечающие за автоматическое сохранение дополнительных реквизитов, не срабатывают. Соответственно, первый способ работать не будет.
Выясним, как поступить в этой ситуации. Нам потребуется самостоятельно сформировать и записать набор записей в регистр сведений ЗначенияКолонокДополнительныхТабличныхЧастей.
Разберем детальный алгоритм:
ДополнительныеТабличныеЧастиДокументов и КолонкиДополнительныхТабличныхЧастей. Поиск рекомендуется выполнять по имени табличной части и имени колонки, настроенных в системе.Объект (ссылка на наш записанный документ).Посмотрим на пример реализации:
// 1. Поиск метаданных дополнительной ТЧ и колонки
СсылкаНаДопТаблицу = Справочники.ДополнительныеТабличныеЧастиДокументов.НайтиПоРеквизиту("ИмяТабличнойЧасти", "ИмяНашейДопТЧ");
СсылкаНаКолонку = Справочники.КолонкиДополнительныхТабличныхЧастей.НайтиПоРеквизиту("ИмяКолонки", "ИмяНашейКолонки");
Если ЗначениеЗаполнено(СсылкаНаДопТаблицу) И ЗначениеЗаполнено(СсылкаНаКолонку) Тогда
// 2. Создание набора записей с отбором по документу
НаборЗаписей = РегистрыСведений.ЗначенияКолонокДополнительныхТабличныхЧастей.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ДокументСсылка);
// 3. Заполнение данных по строкам оригинальной ТЧ документа
Для Каждого СтрокаТЧ Из ДокументСсылка.Материалы Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = ДокументСсылка;
НоваяЗапись.ДополнительнаяТабличнаяЧасть = СсылкаНаДопТаблицу;
НоваяЗапись.КолонкаДополнительнойТабличнойЧасти = СсылкаНаКолонку;
НоваяЗапись.КлючСтроки = СтрокаТЧ.НомерСтроки; // Связываем по номеру или индексу строки
НоваяЗапись.Значение = ВычислитьЗначениеДляСтроки(СтрокаТЧ);
КонецЦикла;
// Записываем набор в базу данных
НаборЗаписей.Записать(Истина);
КонецЕсли;
Работа с дополнительными табличными частями в БГУ 2.0 имеет несколько критически важных подводных камней, о которых необходимо помнить при проектировании интеграций:
Во-первых, проанализируем взаимосвязь с общим модулем БухгалтерскиеОперацииСервер. Начинающие разработчики часто пытаются использовать его методы для работы с дополнительными колонками. Это ошибочный путь. Функции типа БухгалтерскиеОперацииСервер.ДобавитьДанныеДляПроведения предназначены исключительно для работы с дополнительными реквизитами типовых операций (которые отображаются на синей панели «Бухгалтерская операция» внизу документов). Механизм дополнительных табличных частей является изолированным, и готового высокоуровневого API в общих модулях для него не предусмотрено.
Во-вторых, обратим внимание на проведение документов. В БГУ 2.0 дополнительные табличные части часто выступают источниками данных для генерации бухгалтерских проводок по субсчетам ЕПСБУ (через механизмы настройки схем компоновки данных (СКД) в справочнике ТиповыеОперации). Если вы создаете и проводите документ программно, записи в регистре сведений обязательно должны быть физически записаны в базу данных ДО начала проведения документа. Если попытаться записать их в процессе проведения или после вызова метода проведения, то механизм проведения БГУ 2.0 не сможет извлечь эти данные через СКД типовой операции, в результате чего проводки сформируются некорректно либо документ выдаст ошибку о незаполненной аналитике.
Таким образом, понимание внутренней структуры хранения данных в регистре ЗначенияКолонокДополнительныхТабличныхЧастей и правильный выбор метода записи (через ДополнительныеСвойства или прямое формирование набора записей) позволят вам создавать надежные и стабильно работающие интеграции в БГУ 2.0.