В практике разработчика 1С часто возникают задачи по автоматизации формирования отчетности. Одной из таких задач является циклическое формирование стандартного отчета Карточка счета с определенными фильтрами (например, по списку номенклатуры) и последующим сохранением результата в файл (PDF или Excel). В типовой конфигурации «Бухгалтерия предприятия 3.0» (особенно в версии КОРП) этот процесс имеет свои особенности, связанные с использованием универсальных механизмов формирования бухгалтерской отчетности.
Разберем подробно, как реализовать этот алгоритм программно, используя штатные возможности системы.
Типовые отчеты в БП 3.0 строятся с использованием общего модуля БухгалтерскиеОтчетыВызовСервера, описание которого можно найти в справочнике методов Бухгалтерии предприятия 3.0. Этот подход является наиболее «правильным», так как он задействует все стандартные проверки и настройки конфигурации. Проанализируем основные шаги реализации.
Для начала нам необходимо подготовить структуру параметров. Рассмотрим пример кода, который инициализирует отчет с нужными нам данными:
ПараметрыОтчета = Новый Структура;
ПараметрыОтчета.Вставить("Отчет", "КарточкаСчета");
ПараметрыОтчета.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыОтчета.Вставить("НачалоПериода", НачалоМесяца(ТекущаяДата()));
ПараметрыОтчета.Вставить("КонецПериода", КонецМесяца(ТекущаяДата()));
ПараметрыОтчета.Вставить("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладах); // Счет 10
ПараметрыОтчета.Вставить("ВключатьОбособленныеПодразделения", Ложь);
Теперь выясним, как добавить отбор по конкретной номенклатуре. В структуре параметров за это отвечает ключ Отбор. Мы можем передать туда соответствие или структуру с нужным субконто. Посмотрим на пример добавления фильтра:
Отборы = Новый Структура;
Отборы.Вставить("Субконто1", ВыбраннаяНоменклатура); // Для счета 10 первое субконто — это Номенклатура
ПараметрыОтчета.Вставить("Отбор", Отборы);
После подготовки параметров мы можем вызвать функцию формирования. Важно помнить, что в КОРП-версии отчеты часто формируются в фоновом режиме. Чтобы получить результат синхронно, проанализируем использование метода СформироватьОтчет.
Если нам требуется более тонкая настройка или мы хотим избежать лишних вызовов серверных модулей, можно работать напрямую с объектом отчета. Хотя Карточка счета имеет сложный макет, в ее основе лежит СКД (см. пример применения отбора компоновки данных к тексту запроса). Рассмотрим этот путь по шагам:
ОтчетОбъект = Отчеты.КарточкаСчета.Создать();.ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ОтчетОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);.ОтчетОбъект.КомпоновщикНастроек.Settings.Filter.Посмотрим, как выглядит программная установка отбора в коде:
ЭлементОтбора = ОтчетОбъект.КомпоновщикНастроек.Settings.Filter.Items.Add(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Субконто1");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ТекущаяНоменклатура;
ЭлементОтбора.Использование = Истина;
После настройки компоновщика вызываем метод СкомпоноватьРезультат(РезультатТабличныйДокумент). Этот метод заполнит переданный табличный документ данными отчета.
В конфигурации реализован мощный функционал Рассылка отчетов (часть Библиотеки Стандартных Подсистем). Проанализируем ситуацию: этот механизм уже умеет формировать отчеты по расписанию, подставлять параметры и сохранять их в файлы. Для решения нашей задачи полезно изучить код модуля РассылкаОтчетов и механизмы выгрузки внешних отчетов и поиска в них ошибок.
В частности, обратим внимание на то, как система формирует настройки для каждого получателя. Это поможет понять, как правильно упаковывать параметры для метода БухгалтерскиеОтчетыВызовСервера.ПодготовитьОтчет. Также в модуле МобильнаяБухгалтерияОтчеты в функции СформироватьОтчет можно найти множество готовых примеров формирования стандартных отчетов для разных сценариев.
Когда мы получили сформированный ТабличныйДокумент, нам остается сохранить его на диск. Рассмотрим, как это сделать внутри цикла по списку номенклатуры, чтобы файлы имели уникальные имена.
Для Каждого ТекущаяНоменклатура Из СписокНоменклатуры Цикл
// 1. Устанавливаем параметры отчета (как описано выше)
// 2. Формируем отчет в ТабличныйДокумент
ИмяФайла = "C:\Reports\Карточка_" + ТекущаяНоменклатура.Артикул + ".pdf";
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
КонецЦикла;
Важные моменты при работе в цикле:
Таким образом, мы проанализировали три основных подхода к программному запуску отчета Карточка счета. Наиболее эффективным для автоматизации является использование серверных процедур модуля БухгалтерскиеОтчетыВызовСервера, так как это гарантирует идентичность программно сформированного отчета тому, который бухгалтер видит в пользовательском интерфейсе.