IE 2016

Внутренности регламентированной отчетности

Опубликовал defender в раздел Программирование - Практика программирования

Публикация по мотивам статьи http://infostart.ru/public/418967/. В комментариях задавали вопросы о внутренней структуре, что, собственно, и сподвигло оформить наработки в виде отдельной статьи.

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

Я всегда создаю новый регламентированный отчет вручную, чтобы корректно создались и заполнились все внутренние структуры, и только затем лезу в него с ножом своей обработкой, чтобы углубить, расширить и дополнить.

Рассмотрим внутреннюю структуру данных на примере декларации по налогу на прибыль, Лист 3А. С января 2015 года Лист 3А представляет из себя совмещенные два листа, собственно 3А и 3В. Лист 3В это лист с дополнительными строками.

 

Как выяснили из статьи, нам нужен документ «Регламентированный отчет». Пройдемся по его реквизитам, которые нас могут заинтересовать:

ИсточникОтчета – тип строка. Хранит наименование отчета, в том виде как он задан в конфигураторе. Для нашего примера: «РегламентированныйОтчетПрибыль».

ВыбраннаяФорма – с типом строка. Форма отчетности, для которой заполнены структуры. Как пример: «ФормаОтчета2015Кв1».

 

В реквизите ДанныеОтчета – хранилище значений, тут непосредственно хранится вся внутренняя информация по регламентированному отчету.

 

Перед заполнением лучше проверить правильный отчет или нет. Если записать данные в отчет другого типа или старой формы, то он просто перестанет открываться.

Если НЕ (ДокументСсылка.ИсточникОтчета = "РегламентированныйОтчетПрибыль"
     И ДокументСсылка.ВыбраннаяФорма = "ФормаОтчета2015Кв1") Тогда
Возврат;
КонецЕсли;

Получаем структуру с данными:

ДанныеОтчета = ДокументСсылка.ДанныеОтчета.Получить();

 

Особенно нас интересует раздел «ДанныеМногостраничныхразделов». Как видно на рисунке, ДанныеМногостраничныхразделов это структура, в которой ключ – строки, соответствующие листам в отчете и имеющие вид «Лист02», «Раздел1_1» и т.д., а значения – это таблица значений.

ДанныеОтчета

Получаем и опционально очищаем данные интересующего листа

ТаблицаСтраницРаздела = ДанныеОтчета.ДанныеМногостраничныхразделов.Лист03А;
ТаблицаСтраницРаздела.Очистить();

Таблица значений имеет следующие колонки:

Представление – строка с номером и наименованием листа.

Данные – структура, в ней хранится вся информация по листу.

ДанныеДопСтрок – таблица значений с данными по дополнительным строкам

Список листов на форме отчета

Список листов во внутренней структуре

 Лист03А Листы в отчете ДанныеМногостраничныхразделов Лист03А

 

 

Структура «Данные» представляет из себя ключ, равный номеру ячейки из макета отчета и значение, так, как нам его нужно заполнить.

 

ДанныеМногостраничныхРазделов

 

Добавляем новую страницу и заполняем

НоваяСтраница = ТаблицаСтраницРаздела.Добавить();
НоваяСтраница.Представление = "Лист " + Н + " (" + ВыборкаЭмитент.Эмитент + ")";
НоваяСтраница.АктивнаяСтраница = Ложь;
НоваяСтраница.АвтоматическоеПредставление = Истина;
ПоляРаздела = Новый Структура;
ПоляРаздела.Вставить("П000310000100", "2");   // Категория налогового агента
ПоляРаздела.Вставить("П000310000200", ВыборкаЭмитент.ЭмитентИНН);  // ИНН организации - эмитента ценных бумаг
ПоляРаздела.Вставить("П000310000300", ВыборкаЭмитент.ВидДивидендов); // Вид дивидендов

 

Данные дополнительных строк

С дополнительными строками все несколько запутанней. Они хранятся сразу в двух местах: в таблице значений ДанныеДопСтрок и структуре Данные.

Таблица состоит из колонок, имена которых, соответствуют именам ячеек в макете, но без символов «_1». Каждая строчка таблицы это отдельная дополнительная строка в отчете.

 ДанныеДопСтрок 

Создаем таблицу значений, обязательно типизированную. Типы значений нужно брать так же из макета.

ДанныеДопСтрок = Новый ТаблицаЗначений;
ДанныеДопСтрок.Колонки.Добавить("П000330000503", Новый ОписаниеТипов("Строка",,,, New StringQualifiers(10)));   //  ИНН получателя
ДанныеДопСтрок.Колонки.Добавить("П000330000504", Новый ОписаниеТипов("Строка",,,, New StringQualifiers(9)));    //  КПП
ДанныеДопСтрок.Колонки.Добавить("П000330000505", Новый ОписаниеТипов("Строка",,,, New StringQualifiers(2)));    // Тип 00 - первичная

Заполняем

сДопСтрока = ДанныеДопСтрок.Добавить();
сДопСтрока.П000330000503 = ВыборкаДетали.ИНН; //  ИНН получателя
сДопСтрока.П000330000504 = ВыборкаДетали.КПП;  //  КПП
сДопСтрока.П000330000505 = "00";      // Тип 00 - первичная

 Данные дополнительных строк также дублируются в структуре Данные. В формате: П000330000503_1 – первая строка, П000330000503_2 – вторая и т.д.

сНом = "_"+Формат(Ном, "ЧДЦ=; ЧГ=0");
ПоляРаздела.Вставить("П000330000503"+сНом, ВыборкаДетали.ИНН);  //  ИНН получателя
ПоляРаздела.Вставить("П000330000504"+сНом, ВыборкаДетали.КПП);  //  КПП
ПоляРаздела.Вставить("П000330000505"+сНом, "00");               // Тип 00 - первичная

 

После заполнения записываем получившиеся структуры данных в документ, а сам документ в базу:

НоваяСтраница.Данные = ПоляРаздела;
Попыка НоваяСтраница.ДанныеДопСтрок = ДанныеДопСтрок;
Исключение
КонецПопытки;

ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДокументОбъект.ДанныеОтчета = Новый ХранилищеЗначения(ДанныеОтчета);
Попытка
	ДокументОбъект.Записать();
Исключение
	Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
 

Печатные формы в регламентированной отчетности

Есть небольшой нюанс, в хранении отчетности. Некоторые отчеты хранят не форму для редактирования, а сразу готовую печатную форму в формате mxl. Например, «Регламентированный отчет НДС» именно так хранит формы книги покупок и продаж в базе данных. Как это реализовано?

Для хранения печатных форм используется регистр сведений  «Дополнительные файлы регламентированных отчетов». Выглядит он вот так:

ДополнительныеФайлыРегламентированныхОтчетов

Каким образом его правильно готовить?

Измерения:

РегламентированныйОтчет – ссылка на документ.

ВидДополнительногоФайла – текстовая строка. Как правило тут хранится наименование печатной формы. Для отчета «Регламентированный отчет НДС» имеет значения «ДанныеХХХ» и «ТабличныйДокументХХХ», где ХХХ – имя раздела, например: «Раздел8». Вид дополнительного файла зависит от отчета, так что

Единственный ресурс – СодержимоеФайла, с типом – хранилище значения. Здесь непосредственно хранится сам файл.

Реквизиты: собственно, ничего интересного, чисто техническая информация по файлу. Имя, размер, даты добавления и изменения.

 

Пример записи:

Процедура СохранитьСведенияНДС(ИмяРаздела, ДокСсылка, АдресДанных, АдресТабличногоДокумента=Неопределено)
                ЗаписьРегистраСведений = РегистрыСведений.ДополнительныеФайлыРегламентированныхОтчетов.СоздатьМенеджерЗаписи();
                ЗаписьРегистраСведений.РегламентированныйОтчет = ДокСсылка;
                ЗаписьРегистраСведений.ВидДополнительногоФайла = "ТабличныйДокумент" + ИмяРаздела;
                ЗаписьРегистраСведений.СодержимоеФайла = Новый ХранилищеЗначения(АдресТабличногоДокумента);
                ЗаписьРегистраСведений.ИмяФайла = ИмяРаздела + ".mxl";
                ЗаписьРегистраСведений.Размер = 1;
                ЗаписьРегистраСведений.ДатаДобавления = ТекущаяДатаСеанса();
                ЗаписьРегистраСведений.Записать();
КонецПроцедуры

Заключение

Естесственно, к каждому отчету нужно подходить индивидуально, но общий принцип у всех один. И наработки по одному отчету можно по аналогии перенести на любой другой.

См. также

Комментарии

1. klinval 15.12.2015 10:22
Судя по вашей публикации вы уже грузили данные с внешних источников в отчёты. Мне сейчас это тоже предстоит. Оказывается новые отчеты "РегламентированныйОтчетРеестрНДСПриложение<Число от 1 до 14>" также как и "Декларация по НДС" держит отдельно данные (в виде структуры, где основное место занимает дерево значений) и табличный документ (в РС «ДополнительныеФайлыРегламентированныхОтчетов»).

Как я обычно воспринимал табличный документ - это печатная форма. Т.е. первичнее данные и из данных получается табличный документ. Тут наоборот: сначала ты заполняешь табличный документ, он сохраняется, из него вырываются и сохраняются данные (в виде дерева). Потом тебе надо что-то изменить: загружается ранее сохранённый табличный документ, его заполняешь, сохраняешь и только потом из него данные попадают в дерево значений. Дальше выгрузка в xml идёт из дерева значений. Т.е. получается, что из ДЗ и ТД первичнее ТД, из которого потом идёт ДЗ…

Мне интересно: в других отчётах, как я понимаю, не используется РС «ДополнительныеФайлыРегламентированныхОтчетов», значит там всё сохраняется в структуру (точнее в ДанныеОтчета – хранилище значений, не суть) и при открытии отчёта из структуры данные идут в ТД?
Ответили: (2)
# Ответить
2. defender 15.12.2015 13:22
(1) klinval, да регистр ДополнительныеФайлыРегламентированныхОтчетов используется в трех-четырех регламентированных отчетах. А остальные хранят только данные, и при открытии рег. отчета заполняют ими форму (табличный документ).
Ответили: (3)
# Ответить
3. klinval 15.12.2015 16:03
(2) defender,
А остальные хранят только данные, и при открытии рег. отчета заполняют ими форму (табличный документ).

Эх, мне похоже неповезло, т.к. в моём отчёте при открытии восстанавливается ранее сохраненный ТД, а не заполняется из данных... Хорошо хоть из ТД данные переходят в "ДанныеОтчета", а то в "декларации по НДС": ТД и данные, откуда потом берётся выгрузка в xml, вообще никак не связаны.
# Ответить
4. fomix 25.01.2016 12:03
При переходе с БП 2.0 на БП 3.0 программа ругалась на не уникальность записей в указаном в статье регистре сведений «Дополнительные файлы регламентированных отчетов». Пришлось зайти в необновленную базу БП 2.0, удалить все записи в данном регистре (благо их там было не так уж и много!), после чего обновился на БП 3.0.
Вопрос: в таком случае что-то нарушилось в "стройной" схеме 1С-ки и можно ли жить до следующего отчетного периода спокойно?
Ответили: (5)
# Ответить
5. klinval 25.01.2016 13:22
(4) fomix, в РС указано к каким документам (регламентированным отчетам) относятся эти файлы. Если зайдёте в эти отчёты в БП 3.0 скорее что-то работать не будет: либо выгрузка в Xml, либо вообще отчёт не откроется (если табличный документ загружался из этих файлов).
Если опираться на то что я знаю: на новые отчёты скорее всего не повлияет... Хотя там схема такая, что я не удивлюсь если повлияет и на новые!
# Ответить
6. bsturtle 17.05.2016 16:56
Спасибо огромное. у меня тоже все получилось с Вашей помощью
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016