При разработке механизмов обмена данными на платформе 1С:Предприятие 8 часто возникает необходимость низкоуровневой записи данных в формат XML. Одной из распространенных ошибок начинающих (а иногда и опытных) разработчиков является использование несуществующих методов объекта ЗаписьXML. В этой статье мы подробно разберем, почему возникает ошибка «Метод объекта не обнаружен (ЗаписатьТекстСтрока)», как её правильно исправить и какие дополнительные нюансы нужно учитывать, чтобы сформированный XML-файл был валидным и легко читался принимающей стороной.
Проанализируем ситуацию: разработчик пытается записать строковое значение (номер телефона) внутрь элемента XML, используя метод ЗаписатьТекстСтрока. Однако встроенный язык 1С не содержит метода с таким именем для объекта ЗаписьXML. Вероятно, это происходит из-за путаницы с именованием методов в других программных интерфейсах или простой опечатки.
Для записи текстового содержимого узла необходимо использовать стандартный метод ЗаписатьТекст. Рассмотрим исправленный пример кода:
// Создаем объект записи
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\Data.xml");
// Начинаем формирование структуры
ЗаписьXML.ЗаписатьНачалоЭлемента("VALUE");
// Получаем данные (например, телефон из контактной информации)
ТелефонОрганизации = Строка(УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации(Документ.Организация));
// Записываем текст (правильный метод)
ЗаписьXML.ЗаписатьТекст(ТелефонОрганизации);
// Закрываем элемент и запись
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
Важно: Метод ЗаписатьТекст ожидает на вход значение типа Строка. Если в переменной содержится число или дата, их необходимо предварительно преобразовать, иначе система выдаст ошибку несоответствия типов.
Простое использование ЗаписатьТекст не всегда является оптимальным решением. Выясним причину: данные в 1С (даты, булевы значения, числа) имеют свое представление, которое может не соответствовать стандартам XML (XSD). Для правильного преобразования значений в формат, понятный любым внешним системам, проанализируем функцию XMLСтрока().
Эта функция выполняет следующие важные задачи:
ГГГГ-ММ-ДДTHH:MM:SS, а булевы значения — в true или false.& превращается в &, а < в <).Посмотрим на пример правильной записи с использованием XMLСтрока:
// Вместо обычного преобразования Строка()
ТекстДляЗаписи = XMLСтрока(ТелефонОрганизации);
ЗаписьXML.ЗаписатьТекст(ТекстДляЗаписи);
Иногда даже при использовании правильного метода запись падает с ошибкой или файл не открывается в браузере. Разберем ситуацию: в строке могут присутствовать управляющие символы (с кодами от 0 до 31), которые попали в базу при копировании из Excel или внешних PDF-файлов. XML-стандарт запрещает большинство таких символов (кроме табуляции и перевода строки).
Рассмотрим, как очистить строку перед записью. Полезно реализовать вспомогательную функцию:
Функция ОчиститьСтрокуДляXML(ВходнаяСтрока)
Результат = ВходнаяСтрока;
// Удаляем символы с кодами 0-8, 11-12, 14-31
Для НомерСимвола = 0 По 31 Цикл
Если НомерСимвола = 9 Или НомерСимвола = 10 Или НомерСимвола = 13 Тогда
Продолжить;
КонецЕсли;
Результат = СтрЗаменить(Результат, Символ(НомерСимвола), "");
КонецЦикла;
Возврат Результат;
КонецФункции
Если в поле (например, в комментарии к организации) может содержаться большой объем текста с кавычками, скобками или даже фрагментами HTML-кода, использование ЗаписатьТекст может привести к тому, что весь текст будет «усыпан» экранированными символами (типа "), что затрудняет чтение. В этом случае проанализируем метод ЗаписатьСекциюCDATA.
Секция CDATA говорит парсеру XML: «Не пытайся анализировать то, что внутри, это просто текст». Это избавляет от необходимости экранировать символы.
ЗаписьXML.ЗаписатьНачалоЭлемента("Comment");
// Записываем как CDATA
ЗаписьXML.ЗаписатьСекциюCDATA(КомментарийОбъекта);
ЗаписьXML.ЗаписатьКонецЭлемента();
Обратите внимание: Для простых полей, таких как номер телефона, использование CDATA избыточно и считается плохим тоном. Применяйте это только для неструктурированных текстовых блоков.
Ручное использование ЗаписьXML (так называемый Low-level API) — это трудоемкий процесс, в котором легко ошибиться в иерархии тегов. Разберем более современный подход, используемый в профессиональной разработке — XDTO (XML Data Transfer Objects).
Если у вас есть готовая схема обмена (XSD), вы можете создать объект XDTO, заполнить его свойства и выгрузить одной командой. Система сама позаботится о названиях тегов, типах данных и кодировках. Посмотрим на упрощенную логику:
// 1. Создаем объект на основе типа из фабрики XDTO
ОбъектДанных = ФабрикаXDTO.Создать(ТипОбъектаИзСхемы);
ОбъектДанных.Phone = ТелефонОрганизации;
// 2. Записываем весь объект целиком
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектДанных);
Этот метод исключает ошибки типа «Метод объекта не обнаружен», так как структура формируется на основе объектной модели 1С.
В исходном вопросе автор получал телефон через УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации. Если вы работаете в конфигурации на базе БСП (Библиотека Стандартных Подсистем), стоит помнить, что в современных версиях контактная информация может храниться в формате JSON.
Вместо того чтобы вручную «выкусывать» лишние символы из строки, рекомендуется использовать методы БСП, которые возвращают структуру с уже разделенными полями: кодом страны, кодом города и «чистым» номером. Это гораздо надежнее, чем использование самописных функций УбратьЛишниеСимволы.
Подводя итог нашему разбору, выделим основные правила работы с ЗаписьXML:
ЗаписатьТекст() вместо выдуманных методов.XMLСтрока() для приведения данных к стандарту.<VALUE type="phone">), используйте метод ЗаписатьАтрибут() строго после начала элемента, но до записи текста.Соблюдение этих правил позволит вам создавать надежные и отказоустойчивые механизмы обмена данными в среде 1С.