Как выгрузить реквизиты документа в XML-файл: пошаговое руководство

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

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

Различие контекстов: почему не работает «ЭтотОбъект» или «Объект»

Первая проблема, с которой часто сталкиваются программисты, — это непонимание того, в каком модуле пишется код. Проанализируем ситуацию: если вы создаете команду непосредственно в дереве конфигурации внутри объекта (например, документа), то код обработчика пишется в Модуле команды. В этом контексте переменная Объект (характерная для форм) или ЭтотОбъект (характерная для серверных модулей объекта) не определена.

Рассмотрим, как правильно получить ссылку на документ в модуле команды. В процедуру ОбработкаКоманды платформа автоматически передает первый параметр — ПараметрКоманды. Именно в нем содержится Ссылка на тот документ, из которого была нажата кнопка. Поэтому для получения доступа к реквизитам следует обращаться именно к нему.


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    // ПараметрКоманды — это ссылка на наш документ
    НомерДокумента = ПараметрКоманды.Номер;
    ДатаДокумента = ПараметрКоманды.Дата;
    // Если нужно обратиться к пользовательскому реквизиту:
    НомерТТН = ПараметрКоманды.НомерТТН;
КонецПроцедуры

Ручное формирование XML-структуры

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


&НаКлиенте
Процедура ВыгрузитьВXML(ПараметрКоманды)
    
    Запись = Новый ЗаписьXML;
    // Указываем путь к файлу. 
    // Внимание: запись напрямую в корень диска D:\ может быть запрещена правами доступа!
    Запись.ОткрытьФайл("D:\document.xml");
    
    // Записываем стандартный заголовок <?xml version="1.0" encoding="UTF-8"?>
    Запись.ЗаписатьОбъявлениеXML();
    
    // Открываем корневой элемент
    Запись.ЗаписатьНачалоЭлемента("ДанныеВзвешивания");
    
    // Записываем атрибут для идентификации типа документа
    Запись.ЗаписатьАтрибут("Тип", "Взвешивание");
    
    // Записываем реквизит НомерТТН
    Запись.ЗаписатьНачалоЭлемента("НомерТТН");
    Запись.ЗаписатьТекст(Строка(ПараметрКоманды.НомерТТН));
    Запись.ЗаписатьКонецЭлемента();
    
    // Закрываем корневой элемент и файл
    Запись.ЗаписатьКонецЭлемента();
    Запись.Закрыть();
    
КонецПроцедуры

Решение проблемы несоответствия типов (ошибка с Датой)

Часто при попытке записать реквизит типа Дата или Число возникает ошибка: «Несоответствие типов (параметр номер '1')» в методе ЗаписатьТекст. Выясним причину: метод ЗаписатьТекст ожидает на вход исключительно значение типа Строка. Платформа 1С не выполняет автоматическое преобразование типов внутри этого метода.

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

  1. Для Даты: преобразует дату в международный стандарт ISO 8601 (ГГГГ-ММ-ДДTЧЧ:ММ:СС). Обычная Строка() выдаст дату с точками и временем в локальном формате, что может привести к ошибкам при чтении файла другой программой.
  2. Для Числа: убирает неразрывные пробелы (разделители групп разрядов). Вместо «1 500,00» вы получите «1500.00», что является стандартом для числовых данных в XML.

Исправим наш код с использованием XMLСтрока:


// Вместо Запись.ЗаписатьТекст(ПараметрКоманды.Дата);
// Используем:
Запись.ЗаписатьНачалоЭлемента("ДатаДокумента");
Запись.ЗаписатьТекст(XMLСтрока(ПараметрКоманды.Дата));
Запись.ЗаписатьКонецЭлемента();

Профессиональный подход: Сериализатор XDTO

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


&НаСервере
Процедура ВыгрузитьВесьОбъектНаСервере(СсылкаНаДокумент)
    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл("D:\full_document.xml");
    
    // Сериализатор автоматически создаст структуру XML на основе метаданных документа
    СериализаторXDTO.ЗаписатьXML(Запись, СсылкаНаДокумент.ПолучитьОбъект());
    
    Запись.Закрыть();
КонецПроцедуры

Важные рекомендации по хранению файлов и кодировке

Рассмотрим еще несколько важных технических нюансов, которые сделают вашу выгрузку надежнее:

  1. Пути к файлам: Использование жестко прописанных путей вроде D:\document.xml — плохая практика. Программа может запуститься в веб-клиенте или у пользователя не будет прав на запись в корень диска. Правильнее использовать КаталогВременныхФайлов() или диалог выбора файла.
  2. Читаемость XML: По умолчанию ЗаписьXML формирует файл в одну строку. Чтобы файл был «красивым» (с отступами), используйте настройки:
    
    ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);
    Запись.ОткрытьФайл(ПутьКФайлу, ПараметрыЗаписи);
    
  3. Клиент-серверное взаимодействие: Выгрузку больших объемов данных (например, табличных частей с сотнями строк) лучше выполнять на сервере (&НаСервере). Обращение к ПараметрКоманды.Товары на клиенте вызовет множество неявных обращений к базе данных, что существенно замедлит работу системы.

Подводя итог, можно сказать, что выгрузка в XML в 1С — это гибкий процесс. Для простых задач достаточно метода ЗаписатьТекст с обязательным использованием XMLСтрока, а для сложных интеграций стоит освоить механизмы XDTO. Всегда следите за типами данных и контекстом исполнения кода, чтобы избежать досадных ошибок на этапе разработки.

← На главную