При настройке обмена данными между устаревшей платформой 1С:Предприятие 7.7 и современной 1С:Предприятие 8.x с помощью конфигурации «Конвертация данных 2.0» (КД 2) программисты часто сталкиваются с необходимостью передать не просто объект (справочник или документ), а некую служебную информацию, которая собирается в процессе всей выгрузки. Это может быть лог выполнения, список определенных кодов или инструкция для приемника, как именно обрабатывать загруженные данные.
В этой статье мы подробно разберем, как реализовать механизм «накопительного» параметра, который заполняется в процессе выгрузки объектов в 7.7, корректно помещается в XML-файл и затем обрабатывается в 8-ке после завершения загрузки.
Представим ситуацию: нам нужно при выгрузке документов в 7.7 собирать значения определенного реквизита в одну длинную строку. После того как все данные выгружены, эту строку нужно передать в приемник. Основная сложность заключается в том, что стандартная обработка выгрузки для 7.7 (V77Exp.ert) работает с параметрами иначе, чем версия для 8-ки. Если в 8-ке достаточно установить значение в структуру Параметры, то в 7.7 часто требуется «ручное» вмешательство в формирование XML-узлов.
Первым делом проанализируем настройки самой конвертации. Нам необходимо завести глобальный параметр, который будет доступен на всех этапах обмена.
ТекстИнструкций.Строка.Теперь разберем, как программно обращаться к этому параметру внутри 7.7. В среде 7.7 параметры хранятся в специальной таблице значений ТаблицаНастройкиПараметров. Чтобы добавить данные в наш параметр при выгрузке каждого объекта (например, в ПКО документа), используем следующий алгоритм:
// 1. Ищем строку с нашим параметром в системной таблице
ИмяПараметра = "ТекстИнструкций";
НомерСтроки = 0;
ТаблицаНастройкиПараметров.НайтиЗначение(ИмяПараметра, НомерСтроки, "Имя");
// 2. Если параметра нет (не инициализирован), создаем его программно
Если НомерСтроки = 0 Тогда
ТаблицаНастройкиПараметров.НоваяСтрока();
НомерСтроки = ТаблицаНастройкиПараметров.КоличествоСтрок();
ТаблицаНастройкиПараметров.ПолучитьСтрокуПоНомеру(НомерСтроки);
ТаблицаНастройкиПараметров.Имя = ИмяПараметра;
ТаблицаНастройкиПараметров.Значение = "";
Иначе
ТаблицаНастройкиПараметров.ПолучитьСтрокуПоНомеру(НомерСтроки);
КонецЕсли;
// 3. Добавляем нужное значение (накапливаем данные)
// Допустим, мы берем значение реквизита "НомерДок" выгружаемого объекта
ТаблицаНастройкиПараметров.Значение = ТаблицаНастройкиПараметров.Значение + Источник.НомерДок + "; ";
Для платформы 7.7 автоматическая передача измененного программно параметра в файл обмена может не сработать (в зависимости от версии V77Exp.ert). Поэтому самым надежным способом будет принудительная запись узла в обработчике конвертации «После выгрузки данных».
Проанализируем код, который гарантированно добавит наш параметр в корень XML-документа:
ИмяПараметра = "ТекстИнструкций";
НомерСтроки = 0;
ТаблицаНастройкиПараметров.НайтиЗначение(ИмяПараметра, НомерСтроки, "Имя");
Если НомерСтроки > 0 Тогда
ТаблицаНастройкиПараметров.ПолучитьСтрокуПоНомеру(НомерСтроки);
// Создаем XML-узел параметра вручную
УзелПарам = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПарам, "Имя", ИмяПараметра);
УстановитьАтрибут(УзелПарам, "Тип", "Строка");
// Записываем накопленное строковое значение
ЗаписатьЭлемент(УзелПарам, "Значение", ТаблицаНастройкиПараметров.Значение);
// Добавляем созданный узел в корень XML (rootNode — это глобальная переменная в 7.7)
ДобавитьПодчиненный(rootNode, УзелПарам);
КонецЕсли;
Важное примечание: При записи строковых данных, содержащих спецсимволы (например, амперсанд или кавычки), стандартные методы 7.7 обычно выполняют экранирование автоматически. Если же вы передаете очень объемные данные, убедитесь, что памяти DOM-модели достаточно для формирования финального дерева документа.
Когда файл загружается в 8-ку, обработка V8Exchan83.epf считывает узел ЗначениеПараметра и автоматически помещает его в структуру Параметры конвертации. Теперь мы можем извлечь эти данные и выполнить необходимые действия.
Лучше всего делать это в обработчике конвертации «После загрузки данных». Рассмотрим пример парсинга нашей накопленной строки:
// Проверяем наличие параметра в структуре
Если Параметры.Свойство("ТекстИнструкций") Тогда
СодержимоеПараметра = СокрЛП(Параметры.ТекстИнструкций);
// Если параметр не пустой, выполняем его разбор (например, разделяем по символу ";")
Если Не ПустаяСтрока(СодержимоеПараметра) Тогда
МассивНомеров = СтрРазделить(СодержимоеПараметра, ";", Ложь);
Для Каждого Номер Из МассивНомеров Цикл
// Здесь пишем логику поиска объектов или регистрации их в планах обмена
// Например: Сообщить("Загружен объект с номером: " + Номер);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Разберем несколько нюансов, которые помогут сделать обмен более стабильным:
Строка. Попытка передать специфические типы 7.7 напрямую может привести к ошибке «Тип не найден» в 8-ке. Лучше передать код или уникальный идентификатор строкой, а в приемнике найти объект через НайтиПоКоду().CDATA, чтобы парсер не воспринял ваш текст как часть разметки файла.При загрузке параметра непосредственно в КД. Оно сработает сразу, как только загрузчик встретит соответствующий узел в файле.Таким образом, мы выяснили причину сложностей передачи данных из 7.7 и нашли надежный способ обхода ограничений платформы. Использование ручного формирования узла в После выгрузки данных — это проверенный метод, который гарантирует доставку программно сформированных параметров в информационную базу 8-й версии.