Как выгрузить документ реализации товаров из 1С в XML или Excel для налогового сайта?

Программист 1С v8.3 (Управляемые формы) Налоговый учет IT и автоматизация бизнеса
← На главную

При интеграции систем 1С с внешними сайтами, государственными порталами или личными кабинетами налоговых органов часто возникает задача выгрузки документов (в частности, Реализации товаров и услуг). Внешние площадки обычно предъявляют жесткие требования к форматам импорта данных. Чаще всего используются форматы XML, Excel (XLS/XLSX) или CSV.

В рамках этой статьи мы подробно разберем, как решить задачу выгрузки табличной части товаров из документа реализации, проанализируем различные технические подходы (от ручной генерации XML до использования встроенных механизмов платформы 1С) и выясним, какой метод оптимален в зависимости от требований принимающей стороны.

Постановка задачи и выбор стратегии

Перед началом разработки необходимо ответить на ключевой вопрос: каковы требования принимающего сайта к структуре файла?

В зависимости от этого мы можем пойти одним из четырех путей:

  1. Формирование XML вручную по заданной схеме — если сайт требует простую, но специфическую структуру XML-файла.
  2. Техническая сериализация XDTO — быстрый способ выгрузить объект 1С «как есть», но он подходит только в том случае, если принимающая система умеет распознавать структуру метаданных 1С.
  3. Выгрузка официального XML-формата ФНС (УПД) — единственный верный путь, если сайт является официальным государственным порталом (или оператором ЭДО), требующим жесткого соблюдения приказов налоговой службы.
  4. Выгрузка в формат Excel или CSV — самый простой в реализации альтернативный вариант, который часто поддерживается коммерческими веб-площадками.

Рассмотрим каждый из этих вариантов подробнее.

---

Вариант 1. Ручное формирование XML-файла по произвольной структуре

Если внешний сайт ожидает XML-файл с уникальной (нетиповой) структурой, то лучшим решением будет использование объекта ЗаписьXML. Этот объект позволяет последовательно записывать элементы, атрибуты и текстовые узлы непосредственно в файл, полностью контролируя его структуру.

Рассмотрим практический пример кода. Предположим, нам нужно выгрузить из документа реализации (ссылка на который находится в переменной ДОКУМ) шапку документа и табличную часть товаров.

Реализуем алгоритм выгрузки:


// Определяем путь для сохранения файла
ПутьКФайлу = ПолучитьИмяВременногоФайла("xml");

// Инициализируем объект записи XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");

// Записываем стандартное объявление XML (<?xml version="1.0" encoding="UTF-8"?>)
ЗаписьXML.ЗаписатьОбъявлениеXML();

// Записываем корневой элемент документа
ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
ЗаписьXML.ЗаписатьАтрибут("Номер", ДОКУМ.Номер);
ЗаписьXML.ЗаписатьАтрибут("Дата", XMLСтрока(ДОКУМ.Дата));

// Открываем секцию для табличной части товаров
ЗаписьXML.ЗаписатьНачалоЭлемента("Товары");

// Обходим строки табличной части документа
Для каждого СтрокаТовар Из ДОКУМ.Товары Цикл
    
    // Начинаем элемент отдельного товара
    ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
    
    // Записываем свойства товара в виде атрибутов
    ЗаписьXML.ЗаписатьАтрибут("Номенклатура", СтрокаТовар.Номенклатура.Наименование);
    ЗаписьXML.ЗаписатьАтрибут("Количество", Строка(СтрокаТовар.Количество));
    ЗаписьXML.ЗаписатьАтрибут("Цена", Строка(СтрокаТовар.Цена));
    ЗаписьXML.ЗаписатьАтрибут("Сумма", Строка(СтрокаТовар.Сумма));
    
    // Закрываем элемент "Товар"
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
КонецЦикла;

// Закрываем секцию "Товары"
ЗаписьXML.ЗаписатьКонецЭлемента();

// Закрываем корневой элемент "Документ"
ЗаписьXML.ЗаписатьКонецЭлемента();

// Завершаем работу с файлом
ЗаписьXML.Закрыть();

// Выводим путь к файлу пользователю или отправляем его на сервер
Предупреждение("Файл успешно сформирован: " + ПутьКФайлу);

Преимущества метода:

Недостатки: Если схема XML-документа огромная и содержит сотни вложенных тегов (как официальный УПД ФНС), писать и отлаживать такой код вручную становится крайне трудозатратно.

---

Вариант 2. Стандартная сериализация объекта 1С через XDTO

Платформа 1С:Предприятие 8 поддерживает автоматическую сериализацию любых ссылочных объектов (документов, справочников) в XML с помощью встроенной фабрики XDTO. Этот способ привлекает своей простотой: нам не нужно знать структуру документа и писать обход по табличным частям.

Посмотрим, как выглядит программный код для такой выгрузки:


// Получаем объект документа по ссылке
ДОКУМЕНТОБЪЕКТ = СсылкаНаДокумент.ПолучитьОбъект();

// Путь к файлу выгрузки
ПутьКФайлу = ПолучитьИмяВременногоФайла("xml");

// Выполняем автоматическую сериализацию объекта в формат XDTO
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ДОКУМЕНТОБЪЕКТ);

// Записываем полученный объект XDTO в XML-файл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
ЗаписьXML.Закрыть();

Важное предостережение:

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

---

Вариант 3. Выгрузка официального XML-формата ФНС (УПД) без программирования

Если сайт, на который вы загружаете документ, связан с налоговой системой (например, это личный кабинет ФНС, ГИС «Маркировка», система прослеживаемости или оператор ЭДО), он гарантированно принимает только строго регламентированный формат XML. На территории РФ таким форматом является Универсальный передаточный документ (УПД), утвержденный актуальными приказами ФНС (например, Приказ № ЕД-7-26/970@ или ЕД-7-26/1032@).

Пытаться собрать такой файл вручную по коду из Варианта 1 не имеет практического смысла, так как схема УПД включает в себя сотни обязательных параметров (ИНН, КПП, адреса по ФИАС, ставки НДС, коды маркировки, сведения о цепочках прослеживаемости импорта и т.д.). Любая ошибка в структуре приведет к отклонению файла при проверке XSD-схемы.

Вместо написания собственного кода мы можем использовать штатный функционал конфигураций 1С (Бухгалтерия предприятия, Управление торговлей, ERP, Комплексная автоматизация), который позволяет сохранить официальный XML-файл УПД на диск:

  1. Перейдите в список документов «Реализация (акты, накладные, УПД)» и откройте нужный документ.
  2. В верхней панели документа (или в меню кнопки «Еще») найдите пункт «ЭДО».
  3. Выберите команду «Выгрузить документ в файл».
  4. В открывшемся окне выберите вариант сохранения «На диск» (также можно выбрать «В буфер обмена») и укажите папку на вашем компьютере.
  5. Программа сформирует архив, внутри которого будет находиться XML-файл. Имя этого файла будет автоматически сформировано по стандарту ФНС (например, начнется с префикса ON_NSCH... или ON_SCHFDT...).

Полученный файл полностью легитимен, соответствует всем требованиям налогового законодательства и готов для ручной или автоматической загрузки на сайт налогового органа или в личный кабинет любого оператора ЭДО.

---

Вариант 4. Выгрузка в Excel или CSV как альтернативный путь

Если принимающий сайт поддерживает загрузку не только в формате XML, но и через файлы электронных таблиц (Excel / CSV), это может существенно упростить разработку. Формирование таблицы Excel из 1С не требует жестких XSD-схем и легко настраивается под изменения структуры.

Для создания файла Excel из 1С можно воспользоваться объектом ТабличныйДокумент. Рассмотрим пример выгрузки товаров:


// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;

// Заполняем шапку таблицы
ТабДок.Область("R1C1").Текст = "КодТовара";
ТабДок.Область("R1C2").Текст = "Наименование";
ТабДок.Область("R1C3").Текст = "Количество";
ТабДок.Область("R1C4").Текст = "Цена";
ТабДок.Область("R1C5").Текст = "Сумма";

НомерСтроки = 2;
Для каждого СтрокаТовар Из ДОКУМ.Товары Цикл
    
    ТабДок.Область("R" + НомерСтроки + "C1").Текст = СтрокаТовар.Номенклатура.Код;
    ТабДок.Область("R" + НомерСтроки + "C2").Текст = СтрокаТовар.Номенклатура.Наименование;
    ТабДок.Область("R" + НомерСтроки + "C3").Текст = Строка(СтрокаТовар.Количество);
    ТабДок.Область("R" + НомерСтроки + "C4").Текст = Строка(СтрокаТовар.Цена);
    ТабДок.Область("R" + НомерСтроки + "C5").Текст = Строка(СтрокаТовар.Сумма);
    
    НомерСтроки = НомерСтроки + 1;
КонецЦикла;

// Сохраняем табличный документ в формате Excel XLSX
ПутьКФайлу = "C:\Выгрузка\Реализация_" + ДОКУМ.Номер + ".xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Также хорошей альтернативой является формат CSV (Comma-Separated Values). Он весит значительно меньше Excel и легко читается любыми скриптами на стороне веб-сервера без необходимости использования COM-объектов или тяжелых библиотек парсинга.

Резюме и рекомендации

Выбор оптимального метода выгрузки зависит от конечной цели интеграции:

← На главную