Как преобразовать данные из произвольного документа 1С в XML-формат «Свод отчетов 2.0» для формы 0503074?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Финансы и профессиональные услуги
← На главную

В практике разработки на платформе 1С:Предприятие часто возникает задача выгрузки данных в специфические форматы обмена. Особенно остро этот вопрос стоит в государственном секторе, где форматы отчетности (например, форма 0503074) жестко регламентированы Федеральным казначейством и системой «Свод отчетов». Ситуация осложняется, когда заказчик просит использовать не стандартный отчет, а собственный документ с уникальным интерфейсом, сохраняя при этом возможность выгрузки в стандартный XML.

В рамках этой статьи мы разберем несколько стратегий решения этой задачи: от самого быстрого и надежного «обходного» пути до глубокой технической реализации через механизмы XDTO и ручную генерацию XML.

Решение 1: Использование регламентированного отчета как «прослойки»

Проанализируем самый эффективный способ, предложенный опытными разработчиками. Вместо того чтобы вручную описывать сложную структуру XML-файла, которая может измениться с очередным обновлением законодательства, мы можем использовать штатные механизмы конфигурации (например, БГУ — Бухгалтерия государственного учреждения).

Суть метода заключается в следующем: мы программно создаем экземпляр стандартного регламентированного отчета, заполняем его данными из нашего самописного документа и вызываем штатную процедуру выгрузки. Рассмотрим этот процесс по шагам:

  1. Создание объекта отчета: Программно инициализируем отчет РегламентированныйОтчет0503074.
  2. Заполнение данных: Переносим показатели из табличных частей нашего документа в структуру данных отчета. Обычно это дерево значений или специальные таблицы показателей.
  3. Вызов выгрузки: Обращаемся к экспортным методам модуля отчета или подсистемы «РегламентированнаяОтчетность» для генерации файла.

Этот метод гарантирует, что сформированный файл будет на 100% соответствовать актуальным требованиям формата «Свод отчетов 2.0», так как 1С обновляет эти механизмы автоматически.

Решение 2: Использование технологии XDTO

Если нам необходимо реализовать выгрузку «напрямую» из документа без создания промежуточных объектов, наиболее правильным архитектурным решением будет использование 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 в пакете изменится, код останется работоспособным, если имена свойств не поменялись.

Решение 3: Ручное формирование XML через «ЗаписьXML»

Рассмотрим ситуацию, когда стандартных XDTO-пакетов нет или формат слишком специфичен. В этом случае мы используем объект ЗаписьXML. Это наиболее трудоемкий процесс, требующий внимательности к деталям.

Проанализируем основные правила при ручном формировании:

Посмотрим на пример реализации заголовка файла для системы «Свод отчетов»:


Запись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 необходимо обратить внимание на следующие критические моменты:

  1. Форматирование чисел: В XML-файлах для отчетности разделителем дробной части всегда должна быть точка. Используйте Формат(Сумма, "ЧГ=0; ЧРД=.") для приведения чисел к нужному виду.
  2. Кодировка: Большинство систем принимают UTF-8. Убедитесь, что при открытии файла или инициализации ЗаписьXML вы указали правильную кодировку, иначе принимающая сторона (Свод отчетов) выдаст ошибку на кириллических символах.
  3. Коды строк и граф: Формат «Свод отчетов 2.0» крайне чувствителен к кодировке строк. Если в вашем документе коды строк отличаются от справочных (например, вместо «010» написано просто «10»), импорт не удастся.

Подведем итог: Для быстрого решения задачи лучше всего использовать Решение 1 (заполнение типового отчета). Если же вы строите сложную систему обмена данными и хотите избежать зависимости от интерфейсных объектов, выбирайте Решение 2 с использованием XDTO. Ручная сборка через ЗаписьXML (Решение 3) оправдана только в исключительных случаях, когда структура файла не поддается описанию через схемы.

← На главную