Сразу напомню, что внутренние данные лучше не трогать без особой необходимости и понимания, что именно делаешь. База не упадет, но конкретный отчет может перестать открываться, и его придется создавать заново. У меня особая необходимость состоит в том, что много данных экспортируется из внешних систем. В бухгалтерии их просто нет, а вносить вручную достаточно затратно по времени. Плюс сама отчетность на управляемых формах плохо реализована, постоянно происходит передача данных с клиента на сервер. И если в маленькой форме это не проблема, то на форме с множеством дополнительных листов и строк даже переход с одного поля на другое занимает порой несколько десятков секунд.
Я всегда создаю новый регламентированный отчет вручную, чтобы корректно создались и заполнились все внутренние структуры, и только затем лезу в него с ножом своей обработкой, чтобы углубить, расширить и дополнить.
Рассмотрим внутреннюю структуру данных на примере декларации по налогу на прибыль, Лист 3А. С января 2015 года Лист 3А представляет из себя совмещенные два листа, собственно 3А и 3В. Лист 3В это лист с дополнительными строками.
Как выяснили из статьи, нам нужен документ «Регламентированный отчет». Пройдемся по его реквизитам, которые нас могут заинтересовать:
ИсточникОтчета – тип строка. Хранит наименование отчета, в том виде как он задан в конфигураторе. Для нашего примера: «РегламентированныйОтчетПрибыль».
ВыбраннаяФорма – с типом строка. Форма отчетности, для которой заполнены структуры. Как пример: «ФормаОтчета2015Кв1».
В реквизите ДанныеОтчета – хранилище значений, тут непосредственно хранится вся внутренняя информация по регламентированному отчету.
Перед заполнением лучше проверить правильный отчет или нет. Если записать данные в отчет другого типа или старой формы, то он просто перестанет открываться.
Если НЕ (ДокументСсылка.ИсточникОтчета = "РегламентированныйОтчетПрибыль"
И ДокументСсылка.ВыбраннаяФорма = "ФормаОтчета2015Кв1") Тогда
Возврат;
КонецЕсли;
Получаем структуру с данными:
ДанныеОтчета = ДокументСсылка.ДанныеОтчета.Получить();
Особенно нас интересует раздел «ДанныеМногостраничныхразделов». Как видно на рисунке, ДанныеМногостраничныхразделов это структура, в которой ключ – строки, соответствующие листам в отчете и имеющие вид «Лист02», «Раздел1_1» и т.д., а значения – это таблица значений.
Получаем и опционально очищаем данные интересующего листа
ТаблицаСтраницРаздела = ДанныеОтчета.ДанныеМногостраничныхразделов.Лист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;
ЗаписьРегистраСведений.ДатаДобавления = ТекущаяДатаСеанса();
ЗаписьРегистраСведений.Записать();
КонецПроцедуры
Заключение
Естесственно, к каждому отчету нужно подходить индивидуально, но общий принцип у всех один. И наработки по одному отчету можно по аналогии перенести на любой другой.