В процессе работы с программами на платформе 1С:Предприятие часто возникает задача регулярной выгрузки отчетности во внешние файлы. Это может быть необходимо для обмена данными с другими информационными системами, отправки отчетов руководству или создания резервных копий ключевых показателей компании. Особый интерес представляет автоматическое сохранение отчетов в формате XML, который является стандартом для обмена структурированными данными.
В этой статье мы подробно разберем, как решить эту задачу в конфигурациях разного поколения. Мы рассмотрим как стандартные возможности современных баз, так и обходные пути для устаревших систем (например, «Бухгалтерия предприятия 2.0» на обычных формах), где отсутствует подсистема БСП (Библиотека стандартных подсистем).
---
Если вы работаете в современной конфигурации (например, «Бухгалтерия предприятия 3.0», «Управление нашей фирмой», «ERP Управление предприятием»), то изобретать велосипед не нужно. В составе БСП уже есть мощный и гибкий механизм, который называется «Рассылка отчетов».
Рассмотрим подробнее возможности этого механизма:
XLSX, PDF, MXL, HTML и другие.Для настройки такой выгрузки достаточно перейти в раздел «Администрирование» — «Печатные формы, отчеты и обработки» — «Рассылки отчетов», создать новый элемент, привязать к нему нужный отчет, указать формат сохранения и задать расписание.
Однако что делать, если ваша база данных сильно доработана, снята с поддержки или работает на старой платформе, где БСП попросту отсутствует? Разберем альтернативные технические сценарии.
---
Этот способ является наиболее быстрым и безопасным для баз данных уровня «1С:Бухгалтерия 2.0». Он позволяет настроить периодическую выгрузку без внесения изменений в конфигурацию и без необходимости снимать ее с поддержки.
Суть метода заключается в создании внешней обработки (файл с расширением .epf), которая будет запускаться операционной системой по расписанию, формировать отчет, сохранять его на диск и автоматически завершать сеанс 1С.
Проанализируем пошагово процесс реализации этого сценария.
Шаг 1. Создание внешней обработки
Создадим внешнюю обработку в конфигураторе. В модуле формы или в модуле объекта (в зависимости от логики вызова) напишем код, который будет выполняться при открытии обработки. Главное правило — в конце алгоритма обязательно должна вызываться команда закрытия программы, иначе сеансы 1С будут накапливаться в системе и блокировать ресурсы.
Пример программного кода для модуля управляемой или обычной формы внешней обработки:
Процедура ПриОткрытии()
// Вызываем процедуру формирования и сохранения отчета
ВыгрузитьОтчетВФайл();
// Принудительно завершаем работу текущего сеанса 1С
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Шаг 2. Настройка планировщика задач Windows (Task Scheduler)
Для автоматизации процесса на сервере или рабочем компьютере, где установлена база, настроим стандартную службу ОС. Создадим новую задачу со следующими параметрами запуска в поле «Программа или сценарий»:
Для файлового варианта информационной базы команда запуска будет выглядеть так:
"C:\Program Files\1cv8\8.3.XX.XXX\bin\1cv8.exe" ENTERPRISE /F "D:\1C_Bases\Accounting" /N "РоботВыгрузки" /P "ПарольРобота" /Execute "D:\1C_Scripts\ExportReport.epf"
Для клиент-серверного варианта базы данных используем параметры подключения к серверу приложений:
"C:\Program Files\1cv8\8.3.XX.XXX\bin\1cv8.exe" ENTERPRISE /S "ServerName\BaseName" /N "РоботВыгрузки" /P "ПарольРобота" /Execute "D:\1C_Scripts\ExportReport.epf"
Важная деталь: Настоятельно рекомендуем создать в базе 1С отдельного пользователя (например, РоботВыгрузки) с минимально необходимыми правами только на чтение данных отчета. Для безопасности можно также использовать авторизацию операционной системы (ключ /WA+), чтобы не хранить пароли в открытом виде в планировщике.
---
Если изменение метаданных конфигурации для вас приемлемо, то более надежным и отказоустойчивым решением будет использование встроенного механизма платформы — Регламентных заданий. Этот метод работает на уровне сервера 1С (в клиент-серверном варианте) и не требует постоянного запуска графического интерфейса пользователя.
Разберем алгоритм создания регламентного задания:
РегламентныеПроцедурыСервер), обязательно установив для него свойства Сервер и Вызов сервера.Пример структуры метода общего модуля:
Процедура ВыполнитьПериодическуюВыгрузкуОтчета() Экспорт
// Инициализируем формирование отчета на стороне сервера
ФормированиеОтчетовСервер.СформироватьИСохранитьОтчетПродаж();
КонецПроцедуры
Стоит отметить нюанс работы регламентных заданий в файловом режиме базы данных. В отличие от клиент-серверного варианта, где за запуск отвечает планировщик кластера серверов 1С, в файловой базе регламентные задания не будут выполняться сами по себе. Для их работы требуется запущенный сеанс пользователя, выполняющий роль обработчика заданий, либо периодический вызов метода ВыполнитьОбработкуЗаданий().
---
Независимо от того, выбрали ли вы регламентное задание или внешнюю обработку, вам понадобится написать код, который программно компонует отчет на базе СКД (Схемы компоновки данных) и записывает результат на диск.
Рассмотрим универсальный шаблон кода, который решает эту задачу:
// Шаг 1. Получаем схему компоновки данных нужного отчета
СхемаКомпоновки = Отчеты.ПродажиКомпании.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Шаг 2. Загружаем настройки по умолчанию
Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;
// При необходимости здесь можно программно установить параметры отчета, например Период:
// ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
// ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
// ПараметрПериод.Использование = Истина;
// Шаг 3. Выполняем компоновку макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки);
// Шаг 4. Инициализируем процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Шаг 5. Выводим результат в объект "Табличный документ"
ТабДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Шаг 6. Сохраняем полученный табличный документ в файл на диске
ПутьКФайлу = "C:\Reports\Sales_Report.xlsx";
ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
---
Перейдем к ключевому пожеланию — сохранению данных в формате XML. Здесь программисты часто совершают ошибку, пытаясь просто сохранить полученный табличный документ методом Записать() с расширением XML. В результате получается тяжелый файл разметки Excel (SpreadsheetML), непригодный для интеграции с внешними IT-системами.
Для решения этой задачи существует два принципиально разных подхода, выбор которых зависит от ваших конечных целей.
Если XML-файл предназначен для импорта в другую программу, оформление отчета (цвета ячеек, шрифты, группировки) не имеет значения. Нам нужны только сырые данные. В этом случае эффективнее всего использовать объект ЗаписьXML напрямую по результатам выполнения запроса отчета, минуя построение табличного документа СКД. Это сэкономит память сервера и ускорит выполнение операции в десятки раз.
Рассмотрим пример реализации такого алгоритма:
// Создаем объект для работы с XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Reports\export_data.xml", "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Записываем корневой элемент документа
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
ЗаписьXML.ЗаписатьНачалоЭлемента("ReportData");
// Выполняем запрос, лежащий в основе нашего отчета
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.ЗакупочнаяЦена КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
// Обходим результат запроса в цикле и пишем данные в XML
Пока Выборка.Следующий() Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Row");
// Записываем данные в виде атрибутов узла
ЗаписьXML.ЗаписатьАтрибут("Code", Строка(Выборка.Код));
// Записываем текстовое значение элемента
ЗаписьXML.ЗаписатьНачалоЭлемента("Name");
ЗаписьXML.ЗаписатьТекст(Выборка.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Name
ЗаписьXML.ЗаписатьНачалоЭлемента("Price");
ЗаписьXML.ЗаписатьТекст(Строка(Выборка.Цена));
ЗаписьXML.ЗаписатьКонецЭлемента(); // Price
ЗаписьXML.ЗаписатьКонецЭлемента(); // Row
КонецЦикла;
// Закрываем все открытые теги и освобождаем файл
ЗаписьXML.ЗаписатьКонецЭлемента(); // ReportData
ЗаписьXML.ЗаписатьКонецЭлемента(); // Root
ЗаписьXML.Закрыть();
Если вам все же требуется сохранить именно визуальную структуру отчета 1С (со всеми шапками, итогами и форматированием ячеек) для последующего открытия, например, в Microsoft Excel, вы можете использовать метод Записать у объекта ТабличныйДокумент:
// Сохранение макета отчета в формате XML Spreadsheet (Excel XML)
ТабДокумент.Записать("C:\Reports\visual_report.xml", ТипФайлаТабличногоДокумента.XLS97);
Резюмируя написанное: Выбор конкретного метода автоматизации зависит от вашей текущей архитектуры. Для быстрых доработок старых версий конфигураций без БСП идеально подходит связка «Внешняя обработка + Планировщик Windows». Для крупных промышленных систем лучше использовать серверные регламентные задания. А для получения корректных XML-файлов обмена всегда отдавайте предпочтение объекту ЗаписьXML в связке с прямым запросом к базе данных.