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