Довольно часто в практике разработчика 1С случается неприятная ситуация: физический файл правил обмена (созданный в «Конвертации данных») бесследно исчезает с диска, но при этом сама выгрузка продолжает работать у конкретного пользователя. Это происходит потому, что обработка УниверсальныйОбменДаннымиXML умеет кэшировать правила в сохраненных настройках. В этой статье мы подробно разберем, как «вытащить» эти правила обратно в файл XML, используя отладчик, программный код и системные папки.
Это самый простой и доступный способ, не требующий глубоких навыков программирования. Если выгрузка проходит успешно, значит, правила считываются из памяти и, согласно алгоритмам стандартной обработки, помещаются в заголовок файла данных. Давайте проанализируем, как их оттуда достать:
УниверсальныйОбменДаннымиXML у того пользователя, у которого настройки работают.<ПравилаОбмена>. Всё содержимое, которое находится между этим тегом и закрывающим тегом </ПравилаОбмена>, — это и есть ваши правила..xml.
<?xml version="1.0" encoding="UTF-8"?>
После этого убедитесь, что корневым элементом файла является именно <ПравилаОбмена>. Теперь этот файл можно пробовать загружать в «Конвертацию данных» или использовать как самостоятельный файл правил.
Если метод с файлом выгрузки не помогает (например, правила в файле отличаются или повреждены), мы можем перехватить их непосредственно в оперативной памяти в момент работы программы. Разберем этот процесс по шагам:
Во-первых, нам нужно найти точку входа. Откройте конфигуратор, найдите обработку УниверсальныйОбменДаннымиXML и перейдите в Модуль объекта. Нас интересует процедура, которая инициирует процесс — чаще всего это ВыполнитьВыгрузку() или ЗагрузитьПравилаОбмена().
Во-вторых, установите точку остановки (F9) на строке, где переменная мПравилаОбмена (или аналогичная, содержащая дерево или строку XML) уже заполнена. Проанализируем типичный фрагмент кода:
// В модуле объекта ищем место, где правила уже в памяти
Если ТипЗнч(Источник) = Тип("Строка") Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Источник);
// Здесь ставим точку остановки!
КонецЕсли;
В режиме отладки откройте табло (Ctrl+Alt+W) и вычислите значение переменной, содержащей текст правил. Если это объект типа ДеревоЗначений, вам придется программно выгрузить его обратно в XML, но чаще всего в параметрах настройки хранится именно строка XML или путь к временному файлу.
Если форма обработки закрыта, но вы знаете, что настройки сохранены, мы можем извлечь их программно. Настройки форм в платформе 8.3 сохраняются в системных таблицах. Рассмотрим пример кода для внешней обработки, который поможет нам достать данные:
Процедура ИзвлечьПравилаИзНастроек(ИмяПользователя)
// Настройки сохраняются в ХранилищеОбщихНастроек
КлючОбъекта = "Обработка.УниверсальныйОбменДаннымиXML/НастройкиСохраненные";
Настройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, , , ИмяПользователя);
Если ТипЗнч(Настройки) = Тип("Структура") Тогда
// Ищем ключ, отвечающий за правила. Обычно это "ПравилаОбмена"
Если Настройки.Свойство("ПравилаОбмена") Тогда
ТекстПравил = Настройки.ПравилаОбмена;
// Сохраняем текст в файл
Текст = Новый ЗаписьТекста("C:\Rules_Recovered.xml", КодировкаТекста.UTF8);
Текст.Записать(ТекстПравил);
Текст.Закрыть();
Сообщить("Правила успешно извлечены!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот метод особенно хорош тем, что позволяет администратору вытащить правила любого пользователя, не заходя под его учетной записью в режиме 1С:Предприятие.
Выясним причину, по которой правила могут «жить» в системе. При открытии сохраненной настройки 1С часто распаковывает данные во временную директорию операционной системы. Посмотрим, где их искать:
%TEMP% (обычно это C:\Users\Имя\AppData\Local\Temp)..tmp или .xml с именами вида v8_XXXX.xml.ЧтениеXML.Будьте внимательны к версиям: Если при попытке загрузить восстановленные правила в обработку вы получаете ошибку Поле объекта не обнаружено (ПередВыгрузкойДокумента), это означает конфликт версий. Скорее всего, правила были написаны для формата 2.0.18, а ваша текущая обработка ожидает формат 2.1.7 (или наоборот). В этом случае правила нужно сначала загрузить в конфигурацию «Конвертация данных» и выполнить «Обновить конфигурацию свойств», а затем выгрузить заново с корректными параметрами.
Проанализировав все способы, можно сделать вывод: если обмен работает хотя бы у одного человека, правила не потеряны окончательно. Самым надежным способом остается перехват переменной в отладчике в модуле объекта обработки, так как это гарантирует получение именно того текста, который исполняется программой в данный момент.