Как восстановить утерянный файл правил обмена XML в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Довольно часто в практике разработчика 1С случается неприятная ситуация: физический файл правил обмена (созданный в «Конвертации данных») бесследно исчезает с диска, но при этом сама выгрузка продолжает работать у конкретного пользователя. Это происходит потому, что обработка УниверсальныйОбменДаннымиXML умеет кэшировать правила в сохраненных настройках. В этой статье мы подробно разберем, как «вытащить» эти правила обратно в файл XML, используя отладчик, программный код и системные папки.

Метод 1: Извлечение правил из файла выгрузки данных

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

  1. Запустите обработку УниверсальныйОбменДаннымиXML у того пользователя, у которого настройки работают.
  2. Выполните выгрузку любого небольшого объема данных (например, одного документа или элемента справочника) в файл.
  3. Откройте полученный XML-файл любым текстовым редактором (лучше всего использовать Notepad++ или VS Code).
  4. Найдите тег <ПравилаОбмена>. Всё содержимое, которое находится между этим тегом и закрывающим тегом </ПравилаОбмена>, — это и есть ваши правила.
  5. Скопируйте этот блок целиком.
  6. Создайте новый текстовый файл с расширением .xml.
  7. Вставьте скопированный текст. Важный нюанс: в начало файла обязательно добавьте стандартную XML-шапку:

<?xml version="1.0" encoding="UTF-8"?>

После этого убедитесь, что корневым элементом файла является именно <ПравилаОбмена>. Теперь этот файл можно пробовать загружать в «Конвертацию данных» или использовать как самостоятельный файл правил.

Метод 2: Использование отладчика для захвата текста правил

Если метод с файлом выгрузки не помогает (например, правила в файле отличаются или повреждены), мы можем перехватить их непосредственно в оперативной памяти в момент работы программы. Разберем этот процесс по шагам:

Во-первых, нам нужно найти точку входа. Откройте конфигуратор, найдите обработку УниверсальныйОбменДаннымиXML и перейдите в Модуль объекта. Нас интересует процедура, которая инициирует процесс — чаще всего это ВыполнитьВыгрузку() или ЗагрузитьПравилаОбмена().

Во-вторых, установите точку остановки (F9) на строке, где переменная мПравилаОбмена (или аналогичная, содержащая дерево или строку XML) уже заполнена. Проанализируем типичный фрагмент кода:


// В модуле объекта ищем место, где правила уже в памяти
Если ТипЗнч(Источник) = Тип("Строка") Тогда
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(Источник);
    // Здесь ставим точку остановки!
КонецЕсли;

В режиме отладки откройте табло (Ctrl+Alt+W) и вычислите значение переменной, содержащей текст правил. Если это объект типа ДеревоЗначений, вам придется программно выгрузить его обратно в XML, но чаще всего в параметрах настройки хранится именно строка XML или путь к временному файлу.

Метод 3: Программное извлечение из хранилища общих настроек

Если форма обработки закрыта, но вы знаете, что настройки сохранены, мы можем извлечь их программно. Настройки форм в платформе 8.3 сохраняются в системных таблицах. Рассмотрим пример кода для внешней обработки, который поможет нам достать данные:


Процедура ИзвлечьПравилаИзНастроек(ИмяПользователя)
    // Настройки сохраняются в ХранилищеОбщихНастроек
    КлючОбъекта = "Обработка.УниверсальныйОбменДаннымиXML/НастройкиСохраненные";
    Настройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, , , ИмяПользователя);
    
    Если ТипЗнч(Настройки) = Тип("Структура") Тогда
        // Ищем ключ, отвечающий за правила. Обычно это "ПравилаОбмена"
        Если Настройки.Свойство("ПравилаОбмена") Тогда
            ТекстПравил = Настройки.ПравилаОбмена;
            // Сохраняем текст в файл
            Текст = Новый ЗаписьТекста("C:\Rules_Recovered.xml", КодировкаТекста.UTF8);
            Текст.Записать(ТекстПравил);
            Текст.Закрыть();
            Сообщить("Правила успешно извлечены!");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Этот метод особенно хорош тем, что позволяет администратору вытащить правила любого пользователя, не заходя под его учетной записью в режиме 1С:Предприятие.

Метод 4: Поиск в кэше временных файлов

Выясним причину, по которой правила могут «жить» в системе. При открытии сохраненной настройки 1С часто распаковывает данные во временную директорию операционной системы. Посмотрим, где их искать:

  1. Перейдите в папку временных файлов пользователя: %TEMP% (обычно это C:\Users\Имя\AppData\Local\Temp).
  2. Отсортируйте файлы по дате изменения.
  3. Запустите обработку обмена и нажмите кнопку «Выгрузить».
  4. В момент начала выгрузки в папке могут появиться файлы с расширением .tmp или .xml с именами вида v8_XXXX.xml.
  5. Попробуйте скопировать эти файлы и открыть их в текстовом редакторе. Часто это и есть те самые правила, которые система временно записала на диск для чтения встроенными механизмами ЧтениеXML.

Важные рекомендации при восстановлении

Будьте внимательны к версиям: Если при попытке загрузить восстановленные правила в обработку вы получаете ошибку Поле объекта не обнаружено (ПередВыгрузкойДокумента), это означает конфликт версий. Скорее всего, правила были написаны для формата 2.0.18, а ваша текущая обработка ожидает формат 2.1.7 (или наоборот). В этом случае правила нужно сначала загрузить в конфигурацию «Конвертация данных» и выполнить «Обновить конфигурацию свойств», а затем выгрузить заново с корректными параметрами.

Проанализировав все способы, можно сделать вывод: если обмен работает хотя бы у одного человека, правила не потеряны окончательно. Самым надежным способом остается перехват переменной в отладчике в модуле объекта обработки, так как это гарантирует получение именно того текста, который исполняется программой в данный момент.

← На главную