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