При работе с файлами XML в среде 1С:Предприятие начинающие разработчики часто сталкиваются с ошибками типизации. В процессе отладки возникает закономерный вопрос: откуда платформа знает о типе реквизита и почему она иногда «ругается» на передаваемые данные? Давайте разберемся в этом вопросе вместе.
Для начала проанализируем ситуацию: существует два принципиально разных подхода к работе с XML в 1С. Понимание разницы между ними — это ключ к решению большинства ошибок.
XMLЗапись. Здесь платформа не «знает» заранее структуру данных. Методы типа ЗаписатьАтрибут или ЗаписатьТекст ожидают на вход строку. Если вы попытаетесь передать число, дату или ссылку, платформа попробует неявно привести их к строке. Ошибка возникает, когда это приведение невозможно или нарушается логика формирования XML.XDTO-пакеты. В конфигураторе, в ветке Общие -> XDTO-пакеты, вы описываете структуру XML-схемы. В этом режиме 1С строго контролирует типы. Если схема ожидает дату, а вы передаете строку с некорректным форматом, вы неизбежно получите ошибку типизации.Чаще всего проблема кроется в том, что разработчик пытается передать сложный объект там, где метод ожидает простую строку. Рассмотрим методы, которые вызывают вопросы:
В синтаксис-помощнике для метода ЗаписатьАтрибут(ИмяАтрибута, ЗначениеАтрибута) четко указано: ЗначениеАтрибута должно быть строкой или иметь возможность неявного приведения к строке. Если вы передаете Ссылка на объект или Булево, 1С не всегда может самостоятельно правильно конвертировать их в текст, подходящий для XML.
Рассмотрим шаги, которые помогут вам локализовать и устранить проблему:
Строка(): Если вы используете XMLЗапись, попробуйте принудительно преобразовать значение перед записью:
ЗаписьXML.ЗаписатьАтрибут("Реквизит", Строка(Значение));
Если Строка(Значение) выдает ошибку или пустой результат, значит, само значение не может быть представлено в виде строки XML.XDTO-пакеты, обязательно проверьте настройки типов в конфигураторе. Возможно, поле в XML-схеме жестко определено как xs:decimal, а вы пытаетесь записать туда текстовое значение.ПустаяСсылка, платформа может интерпретировать её как неопределенное значение. Всегда проверяйте данные на заполненность перед записью:
Если ЗначениеЗаполнено(Реквизит) Тогда
ЗаписьXML.ЗаписатьТекст(Строка(Реквизит));
Иначе
ЗаписьXML.ЗаписатьТекст("");
КонецЕсли;
Для успешной работы с XML в 1С всегда задавайте себе вопрос: «Я сейчас пишу «голый» XML или использую модель данных XDTO?». Если вы работаете с XDTO, ищите схему в Общие -> XDTO-пакеты. Именно там описаны правила игры: какие типы данных разрешены и какие структуры обязательны.
Если же вы используете низкоуровневую запись, помните, что вы несете ответственность за корректное приведение всех типов к строке. Относитесь к этому как к подготовке данных для текстового файла: каждый объект должен быть представлен в понятном для XML виде. Надеемся, что эти советы помогут вам избежать «загадочных» ошибок в отладчике и сделать ваш код стабильным!