Почему не загружаются документы из 1С:ТиС в 1С:Бухгалтерию 7.7 и как исправить ошибку исполнения метода при чтении XML?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При выполнении регулярного обмена данными между конфигурациями «Торговля и Склад 7.7» и «Бухгалтерия 7.7» с помощью типовых правил и внешней компоненты v7plus.dll нередко возникает ситуация, когда процесс загрузки внезапно прерывается ошибкой. Сообщение «Ошибка исполнения метода!» обычно указывает на строку модуля обработки загрузки, где вызывается метод парсера XML. Разберем по шагам, почему возникает эта ошибка, как локализовать сбойный элемент и как предотвратить подобные инциденты в будущем.

Анализ проблемы и диагностика места сбоя

Рассмотрим типовую ситуацию: процедура загрузки падает на строке чтения очередного узла файла обмена:


Процедура ЗагрузитьОбъектСправочника()
    Перем Вид;
    Перем ИдПараметровЗагрузки;
    Перем ОбъектМД;
    
    Объект = гФайл.ТекущийЭлементВВидеОбъекта();
КонецПроцедуры

Поскольку прерывание происходит непосредственно на чтении объекта через интерфейс анализатора XML (гФайл = гXMLАнализатор.СоздатьПоследовательноСчитываемыйДокумент()), обработчики событий самой базы-приемника (например, процедура ПриЗаписи() в справочнике Контрагенты или документе СтрокаВыпискиПриход) даже не успевают вызваться. Это означает, что ошибка кроется не в логике проведения или записи данных в 1С, а в нарушении структуры или синтаксиса самого XML-документа.

Выясним причину такого поведения. Спецификация стандарта XML 1.0 строго запрещает наличие управляющих символов ASCII с шестнадцатеричными кодами от 0x00 до 0x1F (за исключением разрешенных переводов строк 0x0A, возвратов каретки 0x0D и символов табуляции 0x09), а также символа 0x7F (DEL). При случайном нажатии комбинаций клавиш пользователями (например, Ctrl+\, генерирующей байт 0x1C — File Separator) непечатный управляющий символ сохраняется в базе источника (в наименовании, номере расчетного счета, адресе или телефоне контрагента). Компонента выгрузки помещает такой символ в файл без преобразования, а строгий парсер MSXML при попытке прочитать элемент прерывает работу с ошибкой исполнения метода.

Пошаговый поиск проблемного объекта

Разберем последовательность действий для локализации сбойного фрагмента данных:

  1. Локализация интервала выгрузки: Если выгрузка за большой период (квартал, месяц) падает, разобьем интервал на более мелкие порции (по дням или неделям). Это позволит точно определить день, в котором присутствует проблемный документ или справочник.
  2. Просмотр файла в продвинутом редакторе: Стандартный блокнот Windows не отображает непечатные управляющие коды. Откроем полученный файл XML в специализированном редакторе (например, Notepad++) и включим отображение всех скрытых символов. Управляющие коды отображаются в виде специальных контрастных блоков (например, FS, SOH, NUL, ESC).
  3. Поиск некорректных тегов: Обратим внимание на узлы новых элементов справочников (в первую очередь Контрагенты и Номенклатура), созданных за выгружаемый период.

Способы решения и исправления ошибки

Рассмотрим варианты исправления ситуации — от экстренного разового восстановления файла до системной защиты конфигурации.

Решение 1. Очистка реквизитов в базе-источнике

Если сбойный объект найден, найдем его в конфигурации «Торговля и Склад». Полностью сотрем значение проблемного поля (например, телефон, расчетный счет, наименование) и введем текст заново вручную без использования копирования через буфер обмена. После этого повторим выгрузку.

Решение 2. Программная очистка недопустимых символов перед выгрузкой

Для предотвращения повторения подобных сбоев добавим в модуль выгрузки или глобальный модуль конфигурации-источника функцию фильтрации управляющих символов по их ASCII-кодам:


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

Пропустим через данную функцию значения строковых реквизитов в правилах конвертации (обработчики событий «Перед выгрузкой» или процедуры формирования атрибутов XML).

Решение 3. Использование регулярных выражений для быстрой очистки

Для быстрой обработки больших объемов текста в 1С 7.7 можно применить COM-объект VBScript.RegExp:


Функция ОчиститьТекстРегВыр(Текст) Экспорт
    Перем Рег;
    Если ПустаяСтрока(Текст) = 1 Тогда
        Возврат "";
    КонецЕсли;
    Рег = СоздатьОбъект("VBScript.RegExp");
    Рег.Global = 1;
    Рег.IgnoreCase = 1;
    // Диапазоны управляющих символов ASCII 0-8, 11-12, 14-31 и 127
    Рег.Pattern = "[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]";
    Возврат Рег.Replace(Текст, " ");
КонецФункции

Альтернативные подходы к организации обмена

Проанализируем другие способы повышения надежности обмена между базами 1С 7.7:

  1. Прямой обмен через OLE/COM (V77.Application / V77S.Application): Написание прямой обработки переноса документов исключает промежуточную сериализацию в текстовый формат XML и полностью избавляет от проблем с парсером v7plus.dll. Документы переносятся объектно и могут загружаться поштучно.
  2. Использование плоских файлов (CSV, DBF): Обмен через формат DBF обеспечивает высокую скорость работы и стабильность при переносе десятков тысяч строк без перегрузки оперативной памяти.
  3. Валидация при вводе данных: Размещение проверок в процедуре ПриЗаписи() модулей форм справочников исключит сохранение пользователями некорректных байтов еще на этапе заполнения карточек объектов.
← На главную