В практике разработки на платформе 1С:Предприятие часто возникает задача выгрузки данных в специфические форматы обмена. Особенно остро этот вопрос стоит в государственном секторе, где форматы отчетности (например, форма 0503074) жестко регламентированы Федеральным казначейством и системой «Свод отчетов». Ситуация осложняется, когда заказчик просит использовать не стандартный отчет, а собственный документ с уникальным интерфейсом, сохраняя при этом возможность выгрузки в стандартный XML.
В рамках этой статьи мы разберем несколько стратегий решения этой задачи: от самого быстрого и надежного «обходного» пути до глубокой технической реализации через механизмы XDTO и ручную генерацию XML.
Проанализируем самый эффективный способ, предложенный опытными разработчиками. Вместо того чтобы вручную описывать сложную структуру XML-файла, которая может измениться с очередным обновлением законодательства, мы можем использовать штатные механизмы конфигурации (например, БГУ — Бухгалтерия государственного учреждения).
Суть метода заключается в следующем: мы программно создаем экземпляр стандартного регламентированного отчета, заполняем его данными из нашего самописного документа и вызываем штатную процедуру выгрузки. Рассмотрим этот процесс по шагам:
РегламентированныйОтчет0503074.Этот метод гарантирует, что сформированный файл будет на 100% соответствовать актуальным требованиям формата «Свод отчетов 2.0», так как 1С обновляет эти механизмы автоматически.
Если нам необходимо реализовать выгрузку «напрямую» из документа без создания промежуточных объектов, наиболее правильным архитектурным решением будет использование XDTO-пакетов. Разберем, как это работает.
В типовых решениях 1С уже существуют готовые пакеты XDTO, описывающие структуру большинства отчетных форм. Выясним, как применить их в коде:
// Получаем фабрику XDTO и тип объекта из пакета
ТипОбъекта = ФабрикаXDTO.Тип("http://www.v8.1c.ru/reports/svod", "Ф0503074");
НовыйОтчетXML = ФабрикаXDTO.Создать(ТипОбъекта);
// Заполняем реквизиты заголовка
НовыйОтчетXML.ИНН = Объект.Организация.ИНН;
НовыйОтчетXML.КПП = Объект.Организация.КПП;
НовыйОтчетXML.Период = Формат(Объект.Дата, "ДФ=yyyy-MM-dd");
// Заполняем разделы формы через циклы по табличным частям документа
Для Каждого СтрокаТЧ Из Объект.ДанныеРаздела1 Цикл
СтрокаXML = ФабрикаXDTO.Создать(ТипОбъекта.Свойства.Получить("СтрокаРаздела1").Тип);
СтрокаXML.КодСтроки = СтрокаТЧ.КодСтроки;
СтрокаXML.Сумма = СтрокаТЧ.Сумма;
НовыйОтчетXML.Раздел1.Добавить(СтрокаXML);
КонецЦикла;
// Сериализация в файл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Reports\Report0503074.xml");
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, НовыйОтчетXML);
ЗаписьXML.Закрыть();
Преимущества этого метода: 1С сама следит за типами данных (например, чтобы даты и числа были в нужном формате) и порядком следования тегов. Если структура XML в пакете изменится, код останется работоспособным, если имена свойств не поменялись.
Рассмотрим ситуацию, когда стандартных XDTO-пакетов нет или формат слишком специфичен. В этом случае мы используем объект ЗаписьXML. Это наиболее трудоемкий процесс, требующий внимательности к деталям.
Проанализируем основные правила при ручном формировании:
ЗаписатьОбъявлениеXML() в начале файла.ЗаписатьНачалоЭлемента() должен иметь парный ЗаписатьКонецЭлемента().770277000) используйте метод ЗаписатьАтрибут().Посмотрим на пример реализации заголовка файла для системы «Свод отчетов»:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьНастройки(Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь));
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Файл");
ЗаписьXML.ЗаписатьАтрибут("ИдФайл", "К0503074_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd"));
ЗаписьXML.ЗаписатьНачалоЭлемента("Заголовок");
ЗаписьXML.ЗаписатьАтрибут("Отправитель", "770277000");
// ... запись других атрибутов организации
ЗаписьXML.ЗаписатьКонецЭлемента(); // Конец Заголовка
ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
ЗаписьXML.ЗаписатьНачалоЭлемента("Раздел1");
// Цикл по данным документа
ЗаписьXML.ЗаписатьКонецЭлемента(); // Раздел1
ЗаписьXML.ЗаписатьКонецЭлемента(); // Данные
ЗаписьXML.ЗаписатьКонецЭлемента(); // Файл
ЗаписьXML.Закрыть();
При выгрузке данных в формат 0503074 необходимо обратить внимание на следующие критические моменты:
Формат(Сумма, "ЧГ=0; ЧРД=.") для приведения чисел к нужному виду.ЗаписьXML вы указали правильную кодировку, иначе принимающая сторона (Свод отчетов) выдаст ошибку на кириллических символах.Подведем итог: Для быстрого решения задачи лучше всего использовать Решение 1 (заполнение типового отчета). Если же вы строите сложную систему обмена данными и хотите избежать зависимости от интерфейсных объектов, выбирайте Решение 2 с использованием XDTO. Ручная сборка через ЗаписьXML (Решение 3) оправдана только в исключительных случаях, когда структура файла не поддается описанию через схемы.