Как исправить ошибку при выгрузке ЭСЧФ в XML в 1С 7.7 из-за недопустимых символов

Программист 1С v7.7 Налоговый учет
← На главную

При работе с электронными счетами-фактурами (ЭСЧФ) в среде 1С 7.7 пользователи часто сталкиваются с ситуацией, когда выгрузка документа в формат XML завершается фатальной ошибкой. Примечательно, что проблема может возникать избирательно: для одного контрагента файл формируется корректно, а для другого — система выдает ошибку парсера. В данной статье мы подробно разберем, почему это происходит, как найти "скрытых врагов" в строках данных и как модифицировать программный код для автоматического исправления подобных ситуаций.

Выясним причину возникновения ошибки

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

Проанализируем пять "запретных" символов, которые всегда должны заменяться на специальные последовательности (сущности):

  1. Символ & (амперсанд) — должен заменяться на &
  2. Символ < (меньше) — должен заменяться на &lt;
  3. Символ > (больше) — должен заменяться на &gt;
  4. Символ " (двойная кавычка) — должен заменяться на &quot;
  5. Символ ' (одинарная кавычка) — должен заменяться на &apos;

Если в карточке контрагента, например, указан адрес «ООО "Ромашка" & Ко», то без специальной обработки XML-файл будет содержать кавычки и амперсанд в чистом виде, что и вызовет ошибку при попытке загрузки на портал или открытии парсером.

Разберем правильный алгоритм экранирования в 1С 7.7

Для решения проблемы нам необходимо создать функцию, которая будет "прогонять" через себя каждую строку, записываемую в XML. Рассмотрим пример реализации такой функции на языке 1С 7.7. Обратите внимание на критически важный момент: замена амперсанда должна производиться в первую очередь.

Проанализируем, почему порядок важен. Если мы сначала заменим кавычку на &quot;, а затем заменим все символы & на &amp;, то наша кавычка превратится в &amp;quot;, что является грубой ошибкой разметки. Поэтому сначала экранируем амперсанд, а затем всё остальное.


Функция ПодготовитьСтрокуДляXML(Знач Стр)
    Стр = СокрЛП(Стр);
    
    // 1. Амперсанд заменяем ПЕРВЫМ
    Стр = СтрЗаменить(Стр, Симв(38), "&amp;");
    
    // 2. Остальные спецсимволы
    Стр = СтрЗаменить(Стр, "<", "&lt;");
    Стр = СтрЗаменить(Стр, ">", "&gt;");
    Стр = СтрЗаменить(Стр, Симв(34), "&quot;");
    Стр = СтрЗаменить(Стр, "'", "&apos;");
    
    Возврат Стр;
КонецФункции

Рассмотрим проблему невидимых и "мусорных" символов

Иногда визуально адрес контрагента выглядит абсолютно корректно: нет ни кавычек, ни лишних знаков. Однако ошибка все равно сохраняется. Это происходит из-за попадания в строку непечатных символов ASCII при копировании данных из Excel, PDF-файлов или электронных писем. К таким символам относятся знаки управления с кодами от 0 до 31 (кроме табуляции и перевода строки).

Выясним, какие символы чаще всего "ломают" выгрузку ЭСЧФ:

Дополним нашу функцию блоком очистки от нежелательных кодов:


Функция ОчиститьСтрокуОтМусора(СтрокаДанных)
    Результат = "";
    Для к = 1 По СтрДлина(СтрокаДанных) Цикл
        КодСимвола = КодСимв(Сред(СтрокаДанных, к, 1));
        
        // Оставляем только допустимые символы
        // (коды < 32 являются управляющими, их лучше исключить, кроме 9, 10, 13)
        Если (КодСимвола < 32) И (Найти("9,10,13", Строка(КодСимвола)) = 0) Тогда
            Продолжить;
        ИначеЕсли КодСимвола = 160 Тогда // Заменяем неразрывный пробел
            Результат = Результат + " ";
        ИначеЕсли КодСимвола = 173 Тогда // Игнорируем мягкий перенос
            Продолжить;
        Иначе
            Результат = Результат + Сред(СтрокаДанных, к, 1);
        КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Использование объектной модели MSXML для надежной выгрузки

Вместо того чтобы вручную заниматься заменой каждого символа через СтрЗаменить, мы можем применить более современный и надежный подход — использование объекта MSXML2.DOMDocument. В 1С 7.7 этот объект доступен через механизм OLE. Основное преимущество заключается в том, что при записи значения в свойство text узла, объект самостоятельно выполнит все необходимые преобразования (экранирование).

Посмотрим на пример создания узла с автоматическим экранированием:


// Создаем объект DOMDocument
xmlDoc = СоздатьОбъект("MSXML2.DOMDocument");
// Создаем элемент (например, Адрес)
НовыйУзел = xmlDoc.createElement("address");
// Присваиваем значение напрямую - объект сам заменит <, >, & и т.д.
НовыйУзел.text = "ООО 'Альфа' & Омега <Беларусь>";
// Теперь НовыйУзел.xml будет содержать: <address>ООО &apos;Альфа&apos; &amp; Омега &lt;Беларусь&gt;</address>

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

Инструкция по диагностике проблемного контрагента

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

  1. Откройте карточку "проблемного" контрагента.
  2. Выделите текст в поле "Адрес" или "Наименование" и полностью удалите его.
  3. Введите адрес вручную (не копируйте!). Часто этого достаточно, чтобы избавиться от скрытых символов.
  4. Если ручной ввод не помогает, воспользуйтесь специализированными сервисами (XML Escape/Unescape) или текстовыми редакторами типа Notepad++, включив режим "Отображать все символы".
  5. Обратите внимание на длину строки. Портал ЭСЧФ часто имеет ограничения по длине поля (например, не более 255 или 500 символов). Слишком длинный адрес, даже без спецсимволов, может вызывать ошибку валидации схемы.

Важное примечание для пользователей из Беларуси: портал ЭСЧФ очень чувствителен к кодировке. Убедитесь, что ваш XML формируется в кодировке UTF-8. Если вы используете стандартную запись в файл через Текст.Записать(), помните, что 1С 7.7 пишет файлы в кодировке ANSI (Windows-1251). Для корректной работы с UTF-8 в 7.7 рекомендуется использовать объект ADODB.Stream.

Таким образом, мы выяснили, что стабильность выгрузки ЭСЧФ напрямую зависит от чистоты данных. Использование функции экранирования символов или переход на работу через DOMDocument позволит вам навсегда забыть об ошибках XML при выгрузке документов.

← На главную