Содержание статьи:
Как хранится регламентированная отчетность
В этой статье я постараюсь описать устроение и принцип работы регламентированного отчета, постараюсь передать суть. Если после прочтения останутся или возникнут вопросы – задавайте в комментариях, постараемся разобраться вместе.
Итак, начнем.
В устроении регламентированного отчета можно выделить три основные части:
- Формы отчета – Формы отчета используются для каждого варианта (редакции) отчета. Например, "ФормаОтчета2009Кв4" и "ФормаОтчета2015Кв1". Сами формы по внешнему виду не сильно отличаются друг от друга. Но в модуле формы содержатся процедуры, описывающие поведение формы и ее взаимодействие с другими составляющими регламентированного отчета. Также именно в форме описываются процедуры, обрабатывающие расчет авторасчитываемых и взаимосвязанных ячеек. Здесь же описывается обработка проверки контрольных соотношений. Формы одинаковые для всех конфигураций.
- Макеты – Это основная и самая важная часть регламентированного отчета. В макетах хранится всё, начиная от бланка отчета до схемы выгрузки. Макеты также разделяются по редакциям отчета, то есть для каждого нового варианта отчета будет использован свой комплект макетов. Например, "ФормаОтчета2009Кв4_Титульный" и "ФормаОтчета2015Кв1_Титульный". Макеты также одинаковые для всех конфигураций.
- Механизм автозаполнения – Сам принцип заполнения регламентированных отчетов един, но данные в каждой конфигурации могут браться из разных источников.
Рассмотрим подробнее каждую часть на примере отчета “Бухгалтерский баланс” в конфигурации "Бухгалтерия предприятия 3.0.42" (Отчеты.РегламентированныйОтчетБухОтчетность)
Формы отчета:
- Основная форма – это форма выбора варианта отчета, организации и периода. Именно она открывается при создании нового отчета и именно в ней определяется, какую редакцию формы необходимо открыть:
- ФормаОтчета2011Кв1, ФормаОтчета2011Кв3, ФормаОтчета2011Кв4 – это формы, соответствующие редакциям отчетов, утвержденных Минфином России. В них отображаются бланки отчетности и содержатся описания алгоритмов заполнения показателей
- Описание и применение этих форм можно посмотреть в модуле менеджера отчета в функции ТаблицаФормОтчета()
-
- Для каждой формы используется свой механизм автозаполнения. Описывается он в общем модуле "РегламентированнаяОтчетностьПереопределяемый" в процедурах "ПолучитьСведенияОПоказателяхОтчета()" и “ЗаполнитьОтчет()”
"ВыборПечатнойФормы", "КонтрольныеСоотношения", "НастройкиОтчета" - это служебные формы. В принципе, названия форм говорит об их сути, поэтому не будем останавливаться на них подробнее.
Макеты регламентированной отчетности.
Это самая важная часть отчета. Каждый отчет имеется множество макетов. Например, в бухгалтерском балансе их 56, а в Декларации по НДС - 77
Все макеты можно условно разбить на две группы:
- Макеты бланков отчетности. Эти макеты содержат в себе бланки регламентированной отчетности. Именно то, что видит пользователь, когда открывает тот или иной отчет. Каждый макет соответствует варианту отчета и конкретному разделу. К этим макетам также можно отнести и макеты, которые используются для отображения печатных форм регламентированной отчетности.
- Служебные макеты для описания структуры отчета и правил выгрузки. Эти макеты пользователь никогда не увидит, в них описываются составы показателей, схемы выгрузки и прочее.
Разберем подробнее макеты бланков отчетности.
Имена макетов и имена форм отчетов связаны, и связь эта осуществляется по имени формы.
Например, для формы “ФормаОтчета2011Кв4” связанные макеты будут следующие:
"ФормаОтчета2011Кв4_Баланс_2012Кв4_3", "ФормаОтчета2011Кв4_БалансНКО_2012Кв4_3" и так далее.
Как упоминалось выше, каждый макет соответствует какому-то разделу отчета.
Рассмотрим устроение и описание ячеек такого макета на примере "ФормаОтчета2011Кв4Баланс"
В самом макете находится непосредственно бланк отчета, который выводится пользователю в форме отчета. Именно здесь в новых версиях регламентированной отчетности добавляются элементы управления в виде команд “Добавить строку”, “Настройка состава строк” и прочее. Каждая строка имеет своё уникальное имя области. Это нужно для того, чтобы отображать дополнительные строки, выбранные пользователем. В целом принцип вывода этого отчета не отличается от вывода обычной печатной формы.
Особое внимание стоит обратить на имена ячеек (имена областей показателей). Они используются при заполнении отчетности, а также описываются в служебных макетах.
Если планируете изменять регламентированный отчет, то лучше придерживаться данного алгоритма формирования имени показателя, потому что процедуры заполнения отчетности серьезно завязаны на эти имена.
Разберем алгоритм формирования имени ячейки:
Имя первой ячейки - П000100111004, его можно условно разбить на три составляющие П00010 | 01110 | 04.
В процедурах заполнения отчетности используется следующий алгоритм:
ИмяОбластиПоказателя = "П00010" + НомерСтроки + Графа;
Где:
- Первая группа - это общий идентификатор (он используется во всех макетах регламентированной отчетности).
- Вторая группа - это номер строки (у нас это 1110 и плюс добавлен лидирующий ноль).
- Третья группа - это номер графы (колонка макета по порядку, то есть если мы посмотрим на шапку таблицы, то увидим, что "Пояснения" - это первая колонка, "Наименование показателя" – вторая и “Код” - третья) Следующие графы соответствуют различным периодам (04 – текущий период, 05 – аналогичный период за прошлый год, 06 – аналогичный период два года назад).
Дальше разберем служебные макеты:
Оставшиеся макеты можно условно разбить на две группы: связанные конкретно с данным вариантом отчета и общие для всех вариантов.
Эти макеты объявляются в модуле формы в событии "ПриСозданииНаСервере":
// Имена вспомогательных макетов и форм.
НастройкиФормы = Новый Структура;
НастройкиФормы.Вставить("МакетСоставаПоказателей", "СоставПоказателей2011Кв4");
НастройкиФормы.Вставить("МакетНастройкиСоставаПоказателей", "НастройкаСоставаПоказателей2011Кв4");
НастройкиФормы.Вставить("МакетСтруктурыМногострочныхЧастей", "СтруктураМногострочныхЧастей2011Кв4");
Рассмотрим каждый макет подробнее:
1) СоставПоказателей2011Кв4
В макете перечислены все показатели, которые используются в основных макетах регламентированной отчетности. В колонке "Код показателя по составу" указаны имена областей из основного макета Баланса. Причем указаны колонки не только числовые, но и строковые. Как отмечалось ранее, графы 04, 05, 06 используются непосредственно для вывода показателей и имеют числовой тип данных (Тип данных - Е), а графы 01, 02, 03 - это графы со строковым типом данных (Тип данных - С).
Колонка "Вариант заполнения" отвечает за то, как будет заполняться конкретная ячейка и как она будет окрашена. Желтые ячейки (0) – только ручное заполнение, Зеленые (4) – автоматически рассчитываемые ячейки, исходя из данных формы (авторасчет запускается автоматически при изменении связанных ячеек), Болотные (3) – ручное и автоматическое заполнение по данным ИБ (автозаполнение таких ячеек запускается по кнопке "Заполнить").
2) НастройкаСоставаПоказателей2011Кв4
Макет отвечает за дополнительные строки в отчетности. На основании него заполняется форма отчета "НастройкаРасшифровкиОтдельныхПоказателей", где мы указываем, какие дополнительные строки мы хотим видеть в нашем бланке отчетности. Важным в этом отчете является колонка “Имя области дополнительной строки”, так как именно по этим именам ищется области в основном макете.
Сначала формируется бланк отчетности, затем пользователь может выбрать какие дополнительные строки он хочет видеть, и отчет просто выводит эти строки без перерисовки основного бланка макета
3) СтруктураМногострочныхЧастей2011Кв4
Макет непосредственно связан с макетом СоставПоказателей2011Кв4, где указываются какие строки являются многострочными. В этом макете описываются показатели подчиненных строк.
Эти макеты используются для выгрузки отчета в электронном варианте. Макеты описывают схему XMLдокумента, который отправляется в налоговую и в Росстат. Группировка в макете соответствует узлу XML. Одинаковые узлы просто дублируются, а не ссылаются друг на друга.
Механизм автозаполнения
Заполнение регламентированного отчета вызывается с помощью команды “Заполнить” – “Все отчеты / Текущий отчет”.
В форме отчета готовятся служебные структуры с периодом, организацией, описанием дополнительных строк и информацией, которая соответствует именно этому отчету. Заполненные структуры передаются в общий модуль “ЗаполнениеБухгалтерскойОтчетности”, в котором происходит заполнение значений показателей.
Сам процесс заполнения можно разделить на несколько уровней:
1. Верхний уровень - Заполнение конкретной графы.Бухгалтерский баланс имеет три графы (колонки) со значениями.
Эти графы отличаются только периодом, алгоритм заполнения и источники данных в них одинаковые. Поэтому в процедуру заполнения мы передаем структуру, в которой храним “Графу”, “Период” и “Заголовок”:
КонтекстИсполнения.Вставить("СоставДополнительныхСтрокБаланс", ПараметрыОтчета.СоставДополнительныхСтрокБаланс);
КонтекстИсполнения.Вставить("Графа", "04");
КонтекстИсполнения.Вставить("ЗаголовокГрафы", "На " + Формат(ДатаКонцаПериодаОтчета, "ДФ = 'дд ММММ гггг'")+ " г.");
КонтекстИсполнения.Вставить("НачалоПериодаОтчета", ДатаНачалаПериодаОтчета);
КонтекстИсполнения.Вставить("КонецПериодаОтчета", ДатаКонцаПериодаОтчета);
ЗаполнитьФормаОтчета2011Кв4_БалансПоГрафе(КонтекстИсполнения);
Если ЗаполнятьПредыдущиеПериоды Тогда
КонтекстИсполнения.Вставить("Графа", "05");
КонтекстИсполнения.Вставить("ЗаголовокГрафы", "На " + Формат(ДатаКонцаПредыдущегоГода, "ДФ = 'дд ММММ гггг'")+ " г.");
КонтекстИсполнения.Вставить("НачалоПериодаОтчета", ДатаНачалаПредыдущегоГода);
КонтекстИсполнения.Вставить("КонецПериодаОтчета", ДатаКонцаПредыдущегоГода);
ЗаполнитьФормаОтчета2011Кв4_БалансПоГрафе(КонтекстИсполнения);
КонтекстИсполнения.Вставить("Графа", "06");
КонтекстИсполнения.Вставить("ЗаголовокГрафы", "На " + Формат(ДатаКонцаГодаПредшествующегоПредыдущему, "ДФ = 'дд ММММ гггг'")+ " г.");
КонтекстИсполнения.Вставить("НачалоПериодаОтчета", ДатаНачалаГодаПредшествующегоПредыдущему);
КонтекстИсполнения.Вставить("КонецПериодаОтчета", ДатаКонцаГодаПредшествующегоПредыдущему);
ЗаполнитьФормаОтчета2011Кв4_БалансПоГрафе(КонтекстИсполнения);
КонецЕсли;
2. Средний уровень - Заполнение разделов бухгалтерского учета:
К разделам относятся непосредственно части бухгалтерского баланса “Внеоборотные активы”, “Оборотные активы”, “Капиталы и резервы” и так далее.
Для каждого раздела вызывается своя процедура:
Упрощенно это выглядит так:
Если ИдентификаторАвтозаполнения = "Баланс_2011Кв4" Тогда
ЗаполнитьФормаОтчета2011Кв4_БалансПоГрафеРаздел1_2011Кв4(КонтекстИсполнения);
ЗаполнитьФормаОтчета2011Кв4_БалансПоГрафеРаздел2(КонтекстИсполнения);
ЗаполнитьФормаОтчета2011Кв4_БалансПоГрафеРаздел3(КонтекстИсполнения);
КонецЕсли;
3. Нижний уровень - Заполнение строк раздела.
Рассмотрим на примере строки 1110 Нематериальные активы. Код заполнения:
НомерСтроки = "1110";
НаименованиеСтроки = "Нематериальные активы";
ИмяОбластиПоказателя = "П000100" + НомерСтроки + Графа;
НаименованиеРасшифровки = "Строка " + НомерСтроки + " """ + НаименованиеСтроки + """, графа """ + ЗаголовокГрафы + """";
СКД_04_01 = ЗаполнениеБухгалтерскойОтчетностиИтоги.СКД("04.01", СальдоИОборотыПоСчетам);
СКК_05 = ЗаполнениеБухгалтерскойОтчетностиИтоги.СКК("05", СальдоИОборотыПоСчетам);
СКД_08_05 = ЗаполнениеБухгалтерскойОтчетностиИтоги.СКД("08.05", СальдоИОборотыПоСчетам);
ЗначениеПоказателя = СКД_04_01 - СКК_05 + СКД_08_05;
Контейнер.Баланс[ИмяОбластиПоказателя] = ЗначениеПоказателя;
-
Описывается строка, которую будем заполнять.
- Рассчитываем значения бухгалтерских итогов и помещаем их в переменные СКД_04_01, СКК_05, СКД_08_05. (Процедуры получения бухгалтерских итогов и их имена рассмотрим чуть ниже).
- Получаем общее значение показателя и устанавливаем его в табличный документ.
- Заполняем расшифровку:
ДобавитьСтрокуРасшифровки(ТаблицаРасшифровки, ИмяОбластиПоказателя, НаименованиеРасшифровки, "+","!СКД " + Счет("04.01").Код, СКД_04_01, ИмяРаздела, НастройкиОСВПоСчету(ОбщиеПараметрыРасшифровки, Счет("04.01")));
ДобавитьСтрокуРасшифровки(ТаблицаРасшифровки, ИмяОбластиПоказателя, "", "-", "!СКК " + Счет("05").Код, -СКК_05 ,ИмяРаздела, НастройкиОСВПоСчету(ОбщиеПараметрыРасшифровки, Счет("05")));
ДобавитьСтрокуРасшифровки(ТаблицаРасшифровки, ИмяОбластиПоказателя, "", "+", "!СКД " + Счет("08.05").Код, СКД_08_05, ИмяРаздела, НастройкиОСВПоСчету(ОбщиеПараметрыРасшифровки, Счет("08.05")));
Результат выполнения данного кода представлен на картинке:
Для того чтобы описать расшифровку, мы просто последовательно помещаем в таблицу значения переменных и описание, как получилась эта цифра.
Таким образом заполняется каждая строка каждого раздела каждого отчета.
Как хранится регламентированная отчетность.
Внутреннее устройство регламентированной отчетности описано в этой статье.
Служебные процедуры
Считаю нужным описать служебные процедуры, которые используются во всех регламентированных отчетах. Они находятся в общем модуле “ЗаполнениеБухгалтерскойОтчетностиИтоги”.
Рассмотрим некоторые из них:
- Счет() - функция возвращает ссылку на счет по переданному коду. Для поиска используется конструкция "Если Иначе":
Если УсловныйКодСчета = "01" Тогда Результат = ПС.ОсновныеСредства; ИначеЕсли УсловныйКодСчета = "01.01" Тогда Результат = ПС.ОСвОрганизации; ИначеЕсли УсловныйКодСчета = "01.03" Тогда Результат = ПС.АрендованноеИмущество; ИначеЕсли УсловныйКодСчета = "01.08" Тогда Результат = ПС.ОСБезГосРегистрации; ИначеЕсли УсловныйКодСчета = "01.09" Тогда Результат = ПС.ВыбытиеОС; ИначеЕсли УсловныйКодСчета = "02" Тогда Результат = ПС.АмортизацияОсновныхСредств; ИначеЕсли УсловныйКодСчета = "02.01" Тогда Результат = ПС.АмортизацияОС_01; ИначеЕсли УсловныйКодСчета = "02.02" Тогда Результат = ПС.АмортизацияОС_03; ИначеЕсли УсловныйКодСчета = "02.03" Тогда Результат = ПС.АмортизацияАрендованногоИмущества; ИначеЕсли УсловныйКодСчета = "03" Тогда Результат = ПС.ДоходныеВложенияВ_МЦ; ИначеЕсли УсловныйКодСчета = "03.01" Тогда Результат = ПС.МЦвОрганизации; КонецЕсли
- СКК() - Сальдо конечное кредитовое. Возвращает итог по Кт по переданному счету
- СКД() - Сальдо конечное дебетовое. Возвращает итог по Дт по переданному счету.
- СККР() - Сальдо конечное кредитовое развернутое. Возвращает развернутое сальдо по Кт по переданному счету
- СКДР() - Сальдо конечное дебетовое развернутое. Возвращает развернутое сальдо по Дт по переданному счету