Перенос данных из устаревших конфигураций на платформе 1С:Предприятие 7.7 в современные базы на платформе 1С:Предприятие 8.3 (например, в 1С:Управление торговлей 11) — задача весьма распространенная, но часто сопровождающаяся трудностями. В процессе настройки правил конвертации и непосредственного обмена через универсальный формат XML программисты часто сталкиваются с неявным поведением системы: обработка загрузки аварийно завершает работу, а сам процесс чтения файла обмена может "тихо" прерываться без вывода сообщений об ошибках.
В этой статье мы подробно разберем две ключевые проблемы, возникающие при использовании обработки V8Exchan83.epf (или MD83Exp.epf) на современных версиях платформы 1С 8.3, выясним причины их возникновения и найдем эффективные способы их решения.
При запуске внешней обработки выгрузки/загрузки данных «Универсальный обмен данными в формате XML» (V8Exchan83.epf) на платформе 1С:Предприятие 8.3 современных релизов может возникать критическая ошибка. Программа завершает работу аварийно, ссылаясь на невозможность применить право удаления к определенным объектам метаданных (чаще всего это регистры сведений).
Почему это происходит?
Причина кроется в изменении поведения самой платформы 1С:Предприятие, начиная с версии 8.3.10. В более ранних версиях платформы при вызове метода ПравоДоступа() для проверки права, которое в принципе неприменимо к проверяемому объекту метаданных (например, право "Удаление" для регистра сведений, так как записи регистра можно только изменять, но не удалять как самостоятельный объект конфигурации), метод просто возвращал значение Ложь. Система продолжала работать в штатном режиме.
Однако в новых версиях платформы 8.3 (при отключенном режиме совместимости) вызов метода ПравоДоступа("Удаление", ОбъектМД) для недопустимых типов метаданных вызывает **критическое исключение** (Runtime Error), что приводит к моментальной остановке работы программного кода.
В коде внешней обработки V8Exchan83.epf в процедуре ЗаполнитьСписокТиповДоступныхДляУдаления() выполняется циклический обход всех объектов конфигурации. Код выглядит следующим образом:
// Проблемный участок оригинального кода обработки V8Exchan83.epf
Если Не ПравоДоступа("Удаление", ОбъектМД) Тогда
Продолжить;
КонецЕсли;
Когда очередь доходит до регистра сведений, платформа генерирует системное исключение, и обработка прекращает свою работу.
Способы решения проблемы:
Способ 1. Использование безопасного блока "Попытка - Исключение" (Рекомендуемый)
Для того чтобы обойти это ограничение платформы и сделать обработку универсальной для любых релизов, нам необходимо модифицировать данный участок кода. Откроем обработку в конфигураторе, найдем процедуру ЗаполнитьСписокТиповДоступныхДляУдаления() и заменим проверку на безопасный вариант:
// Безопасный вариант проверки прав доступа
ДоступноУдаление = Ложь;
Попытка
ДоступноУдаление = ПравоДоступа("Удаление", ОбъектМД);
Исключение
// Если право неприменимо к объекту, платформа вызовет ошибку, которую мы перехватим
ДоступноУдаление = Ложь;
КонецПопытки;
Если Не ДоступноУдаление Тогда
Продолжить;
КонецЕсли;
При таком подходе обработка не будет "падать" при встрече с регистрами сведений или другими объектами конфигурации, для которых право удаления не предусмотрено структурой метаданных.
Способ 2. Замена параметра проверки в коде
Если вам требуется быстрое решение "здесь и сейчас", можно заменить проверяемое право "Удаление" на универсальное право "Изменение", которое применимо к регистрам сведений:
// Быстрое исправление в коде обработки
Если Не ПравоДоступа("Изменение", ОбъектМД) Тогда
Продолжить;
КонецЕсли;
Это позволит обработке успешно запуститься, однако помните, что логика заполнения списка объектов для удаления при этом может незначительно измениться.
Способ 3. Использование встроенной обработки конфигурации
Самый простой путь, не требующий изменения кода программных файлов — запуск встроенной в конфигурацию "Управление торговлей 11" обработки обмена. Разработчики 1С своевременно адаптируют встроенные инструменты под изменения платформы. Открыть ее можно через меню "Функции для технического специалиста" (ранее "Все функции"), найдя в списке обработок элемент "Универсальный обмен данными в формате XML".
Вторая частая проблема заключается в том, что при попытке начать чтение файла обмена в базе-приемнике (УТ 11) процесс мгновенно завершается. Отладчик показывает, что цикл Пока ФайлОбмена.Прочитать() Цикл просто не срабатывает — управление сразу переходит на конец попытки, при этом никаких явных сообщений об ошибках на экран не выводится.
Почему это происходит?
Рассмотрим структуру загрузчика данных. Код, отвечающий за чтение XML-файла, устроен следующим образом:
Попытка
// Инициализация и начало чтения
Пока ФайлОбмена.Прочитать() Цикл
// Обработка узлов XML и создание объектов в базе данных
КонецЦикла;
Исключение
// Перехват любых критических ошибок парсера
// Если здесь нет вывода сообщения в журнал регистрации или на экран,
// загрузка прерывается без объяснения причин
КонецПопытки;
Любая низкоуровневая ошибка парсера XML приводит к возникновению исключения внутри блока Попытка. Платформа перехватывает его, выполнение цикла прерывается, а пользователь видит лишь завершение процесса без какого-либо результата.
Проанализируем основные причины сбоя чтения XML-файлов при выгрузке из 1С:Предприятия 7.7:
V77Exp.ert записывает их в XML-файл "как есть". При чтении такого файла в 1С 8.3 штатный XML-парсер спотыкается на первом же недопустимом символе, генерирует исключение, и чтение завершается.UTF-8, а фактически текстовый файл был сохранен в кодировке Windows-1251 (или без сигнатуры BOM), парсер платформы 1С 8.3 не сможет прочесть символы кириллицы и прервет чтение на первом же слове.v7plus.dll. Если данная библиотека устарела, не зарегистрирована в операционной системе или заблокирована контролем учетных записей (UAC), сформированный XML-файл может оказаться поврежденным, пустым или оборванным посередине.
Выясним, как локализовать и устранить ошибки парсинга файла XML шаг за шагом:
Шаг 1. Проверка структуры XML-файла во внешнем приложении
Прежде чем запускать загрузку в 1С, попробуем открыть полученный файл обмена в любом современном веб-браузере (например, Google Chrome или Яндекс.Браузер) либо в специализированном редакторе (Notepad++, XML Notepad). Если файл поврежден или содержит недопустимые символы, браузер мгновенно выдаст ошибку с указанием точной строки и номера символа, на котором разбор документа стал невозможен. Это позволит быстро понять, какой именно объект из 1С 7.7 вызывает сбой.
Шаг 2. Настройка логирования и протоколирования обмена
В окне обработки «Универсальный обмен данными в формате XML» на вкладке «Параметры загрузки» обязательно установим флаг «Записывать ошибки в протокол» и укажем путь к текстовому файлу. В случае падения загрузчика вся техническая информация о вызвавшем сбой исключении будет сохранена в этом файле, что позволит увидеть реальную причину ошибки, скрытую блоком Попытка... Исключение.
Шаг 3. Очистка базы данных 1С 7.7 от нечитаемых символов
Если диагностика указала на наличие недопустимых символов в наименованиях номенклатуры или справочниках контрагентов, нам потребуется провести очистку базы-источника. На стороне 1С 7.7 можно воспользоваться обработкой поиска и замены недопустимых символов. Код функции очистки строк в 1С 7.7 может выглядеть следующим образом:
// Пример функции очистки строки от недопустимых символов в 1С 7.7
Функция ОчиститьСтрокуОтБитыхСимволов(ВходнаяСтрока)
ВыходнаяСтрока = "";
Для Ном = 1 По СтрДлина(ВходнаяСтрока) Цикл
Симв = Сред(ВходнаяСтрока, Ном, 1);
КодСимв = КодСимв(Симв);
// Оставляем только печатные символы (код > 31)
Если (КодСимв > 31) Или (КодСимв = 10) Или (КодСимв = 13) Тогда
ВыходнаяСтрока = ВыходнаяСтрока + Симв;
КонецЕсли;
КонецЦикла;
Возврат ВыходнаяСтрока;
КонецФункции
Запуск подобной очистки перед выгрузкой позволит гарантировать, что сформированный XML-файл будет полностью соответствовать международным стандартам разметки данных и без проблем прочитается платформой 1С 8.3.
Шаг 4. Проверка и перерегистрация компоненты v7plus.dll
Убедимся, что на компьютере, где производится выгрузка из 1С 7.7, установлена актуальная версия компоненты v7plus.dll. Рекомендуется поместить файлы v7plus.dll и v7plus.als в каталог установки платформы 1С 7.7 (папка BIN) или непосредственно в каталог базы данных. Также запустим командную строку от имени администратора и выполним принудительную регистрацию библиотеки:
regsvr32 "C:\PathToYourFolder\v7plus.dll"
Использование этих простых, но эффективных шагов позволит полностью контролировать процесс переноса данных, быстро находить "узкие места" в выгрузках и успешно завершить загрузку всей необходимой номенклатуры и документов в базу 1С:Управление торговлей 11.