При реализации обмена данными между устаревшей платформой 1С 7.7 и современной 8.3 программисты часто сталкиваются с ограничениями типового функционала «Конвертации данных 2.1» (КД 2.1). Одна из таких задач — необходимость изменить логику загрузки объекта в зависимости от настроек, которые пользователь указал непосредственно в форме обработки УниверсальныйОбменДаннымиXML на стороне приемника. Рассмотрим ситуацию, когда при переносе документов (например, счетов) требуется выполнить перекодировку счетов на лету, используя таблицу соответствия, заполненную пользователем в 8.3.
В стандартных обменах между базами на платформе 8.x мы можем легко добавить параметр в правилах обмена, поставить галочку «Передавать в параметр», и он автоматически станет доступен в базе-приемнике. В случае с 1С 7.7 механизм передачи параметров ограничен. Если нам нужно передать значение, которого нет в реквизитах объекта 7.7, или «протащить» данные для последующей обработки в 8.3, стандартных средств ПКС (Правил конвертации свойств) бывает недостаточно.
Разберем, как решить задачу, когда в 7.7 выгружается код счета (строка), а в 8.3 на форме обработки загрузки есть таблица сопоставления этих кодов с реальными счетами информационной базы 8.3. Наша цель: перехватить данные в процессе загрузки и заменить их на правильные ссылки.
Поскольку мы не можем просто привязать реквизит формы загрузки к ПКС, нам нужно передать исходное значение из 7.7 в виде «фиктивного» свойства или параметра объекта. Проанализируем способ создания «ручного» параметра в XML-файле выгрузки. Для этого в ПКО (Правиле конвертации объекта) на стороне 7.7 в обработчике При выгрузке можно добавить код, который принудительно запишет в файл обмена нужные нам данные.
Однако проще воспользоваться механизмом создания ПКС с пустым источником. В правилах конвертации свойств для нужной табличной части создаем строку:
СтарыйКодСчета).В обработчике Перед выгрузкой этого ПКС в 7.7 пишем код:
Значение = Источник.Счет.Код; // Получаем строковый код из 7.7
Теперь в XML-файле для каждой строки табличной части будет передаваться значение СтарыйКодСчета, но при загрузке в 8.3 оно не будет пытаться записаться в реальный реквизит документа, что избавит нас от ошибок.
Рассмотрим ситуацию в приемнике. Пользователь открыл обработку УниверсальныйОбменДаннымиXML, заполнил на созданной вами вкладке таблицу сопоставления. Теперь нам нужно обратиться к этой таблице из кода правил конвертации. Выясним, как это сделать.
Все реквизиты формы обработки загрузки доступны через объект обработки. В обработчиках КД 2.1 (таких как ПослеЗагрузки) контекстом исполнения обычно является сама обработка или структура, передающая её параметры. Если вы добавили реквизиты в саму обработку загрузки (в файл .epf), обращение к ним в коде 8.3 будет выглядеть так:
// В обработчике ПослеЗагрузки ПКО документа
ТаблицаСопоставления = Параметры.ТаблицаСчетов;
// Если таблица добавлена как параметр конвертации
Если же вы используете глобальные параметры, которые пользователь заполняет на вкладке «Параметры» универсальной обработки, к ним можно обращаться напрямую через коллекцию Параметры.
После того как объект в 8.3 создан в памяти, но еще не записан в базу данных, наступает идеальный момент для трансформации данных. Проанализируем логику работы в обработчике ПКО ПослеЗагрузки.
Нам необходимо обойти табличную часть загруженного документа, извлечь переданный из 7.7 «старый код» и найти соответствующий ему счет в таблице сопоставления с формы. Посмотрим на пример кода:
Для Каждого СтрокаТЧ Из Объект.Состав Цикл
// Пытаемся получить старый код счета, который мы передали как параметр объекта
// Эти данные обычно доступны в структуре ПараметрыОбъекта
СтарыйКод = "";
Если ПараметрыОбъекта <> Неопределено Тогда
// Если мы передавали данные через ПКС с отключенной записью,
// они могут быть доступны в свойствах строки или доп. параметрах
СтарыйКод = СтрокаТЧ.СтарыйКодСчета;
КонецЕсли;
Если ЗначениеЗаполнено(СтарыйКод) Тогда
// Ищем соответствие в таблице, которая находится на форме обработки
// Предположим, Параметры.ТаблицаСопоставления - это ваша ТЧ с формы
СтрокаСоответствия = Параметры.ТаблицаСопоставления.Найти(СтарыйКод, "Код77");
Если СтрокаСоответствия <> Неопределено Тогда
// Устанавливаем реальную ссылку на счет из базы 8.3
СтрокаТЧ.Счет = СтрокаСоответствия.Счет83;
Иначе
// Логика, если соответствие не найдено
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найдено соответствие для кода: " + СтарыйКод);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Разберем еще один метод, который упоминали участники обсуждения. В 1С 7.7 можно программно добавлять узлы в XML. Если вы не хотите плодить фиктивные ПКС, вы можете в обработчике При выгрузке ПКО документа в 7.7 вручную записать параметры для каждой строки. В 8.3 эти параметры попадут в коллекцию ПараметрыОбъекта, которая представляет собой соответствие (ключ-значение).
Важный нюанс: при загрузке данных из 7.7 в 8.3 через ПослеЗагрузки, если объект не был найден и создается новый, важно убедиться, что все вспомогательные данные (те самые «старые коды») еще доступны. Использование временного реквизита в ТЧ документа (даже если он не существует в метаданных, но описан в ПКС) является наиболее надежным способом «пробросить» строковое значение через XML-пакет.
Проанализировав ситуацию, мы пришли к выводу, что наиболее гибким решением является комбинация трех техник:
ПослеЗагрузки для финального «допиливания» объекта: обхода его табличных частей и замены строковых кодов на ссылки, полученные из внешних данных формы.Этот подход позволяет избежать изменения структуры конфигурации 8.3 (не нужно добавлять лишние реквизиты в документы) и обеспечивает высокую точность переноса данных даже в тех случаях, когда автоматическое сопоставление по GUID или коду невозможно.