При выполнении регулярного обмена данными между конфигурациями «Торговля и Склад 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 при попытке прочитать элемент прерывает работу с ошибкой исполнения метода.
Разберем последовательность действий для локализации сбойного фрагмента данных:
FS, SOH, NUL, ESC).Контрагенты и Номенклатура), созданных за выгружаемый период.Рассмотрим варианты исправления ситуации — от экстренного разового восстановления файла до системной защиты конфигурации.
Если сбойный объект найден, найдем его в конфигурации «Торговля и Склад». Полностью сотрем значение проблемного поля (например, телефон, расчетный счет, наименование) и введем текст заново вручную без использования копирования через буфер обмена. После этого повторим выгрузку.
Для предотвращения повторения подобных сбоев добавим в модуль выгрузки или глобальный модуль конфигурации-источника функцию фильтрации управляющих символов по их ASCII-кодам:
Функция ОчиститьСтрокуДляXML(Знач ВходнаяСтрока) Экспорт
Перем СтрРез, Ном, Симв, Код;
СтрРез = "";
Для Ном = 1 По СтрДлина(ВходнаяСтрока) Цикл
Симв = Сред(ВходнаяСтрока, Ном, 1);
Код = КодСимв(Симв);
// Разрешаем только печатные символы и стандартные пробельные знаки (коды 9, 10, 13)
Если (Код >= 32 И Код <> 127) Или (Код = 9) Или (Код = 10) Или (Код = 13) Тогда
СтрРез = СтрРез + Симв;
Иначе
// Недопустимый управляющий символ заменяем пробелом
СтрРез = СтрРез + " ";
КонецЕсли;
КонецЦикла;
Возврат СтрРез;
КонецФункции
Пропустим через данную функцию значения строковых реквизитов в правилах конвертации (обработчики событий «Перед выгрузкой» или процедуры формирования атрибутов XML).
Для быстрой обработки больших объемов текста в 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:
V77.Application / V77S.Application): Написание прямой обработки переноса документов исключает промежуточную сериализацию в текстовый формат XML и полностью избавляет от проблем с парсером v7plus.dll. Документы переносятся объектно и могут загружаться поштучно.ПриЗаписи() модулей форм справочников исключит сохранение пользователями некорректных байтов еще на этапе заполнения карточек объектов.