При настройке обмена данными между конфигурациями 1С с помощью инструмента «1С:Конвертация данных 2.1» разработчики часто сталкиваются с необходимостью передать во входящий объект дополнительные сведения, которые не являются реквизитами самого объекта, но необходимы для логики обработки (например, данные для создания связанных записей или дополнительные флаги управления). Для этих целей в правилах конвертации свойств (ПКС) предусмотрен флаг «Передавать данные в параметр». Однако при попытке передать туда сложный объект, такой как Структура или Соответствие, программисты часто обнаруживают, что на стороне приемника в обработчике После загрузки коллекция ПараметрыОбъекта пуста или содержит Неопределено.
В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько способов ее решения — от простых «костылей» до архитектурно правильных методов сериализации данных. Для запуска регулярной синхронизации по готовым правилам можно автоматизировать регулярный обмен данными по расписанию без изменения самих конфигураций.
Проанализируем ситуацию: когда мы устанавливаем в ПКС признак передачи в параметр, движок конвертации ожидает, что передаваемое значение будет записано непосредственно в XML-файл обмена. Механизм выгрузки 1С:Конвертации данных спроектирован так, что в атрибуты или простые текстовые узлы XML могут быть записаны только значения примитивных типов (строка, число, дата, булево). Если мы пытаемся присвоить переменной Значение в обработчике Перед выгрузкой объект типа Структура, система не может автоматически «превратить» его в понятный для XML вид, и данные либо не записываются вовсе, либо записываются некорректно.
Выясним причину, по которой ПараметрыОбъекта в ПКО приемника могут быть недоступны. Параметры, передаваемые через ПКС, становятся доступны только после того, как все свойства объекта будут считаны из файла. Если вы пытаетесь обратиться к ним в обработчиках, которые выполняются до завершения чтения блока свойств (например, Перед загрузкой), вы неизбежно получите Неопределено.
Рассмотрим самый быстрый и часто используемый способ, предложенный участниками обсуждения. Он заключается в принудительном преобразовании сложной структуры в специальный строковый формат 1С.
Шаг 1. Настройка в базе-источнике
В правилах конвертации свойств (ПКС) для нужного параметра (например, ЗначениеЕдиницыХранения) в обработчике Перед выгрузкой мы формируем нашу структуру и упаковываем ее в строку:
// Создаем структуру с необходимыми данными
ПередаваемаяСтруктура = Новый Структура;
ПередаваемаяСтруктура.Вставить("НайденаЕХ", Истина);
ПередаваемаяСтруктура.Вставить("УчетПоСерийным Номерам", Источник.ИспользоватьСерийныеНомера);
ПередаваемаяСтруктура.Вставить("Склад", Источник.Склад);
// Сериализуем структуру во внутреннюю строку 1С
Значение = ЗначениеВСтрокуВнутр(ПередаваемаяСтруктура);
Шаг 2. Настройка в базе-приемнике
В правилах конвертации объекта (ПКО) в обработчике После загрузки мы выполняем обратное преобразование. Важно использовать именно После загрузки, так как именно в этот момент параметры уже гарантированно считаны из XML.
// Проверяем наличие параметра в коллекции
Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта.Свойство("ЗначениеЕдиницыХранения") Тогда
// Восстанавливаем структуру из строки
ПереданныеПараметры = ЗначениеИзСтрокиВнутр(ПараметрыОбъекта["ЗначениеЕдиницыХранения"]);
// Теперь мы можем обращаться к данным
Если ПереданныеПараметры.НайденаЕХ Тогда
// Ваша логика обработки объекта
Сообщить("Данные успешно получены!");
КонецЕсли;
КонецЕсли;
Важное замечание: Метод ЗначениеВСтрокуВнутр чувствителен к версиям платформы и метаданным. Если вы передаете в структуре ссылки на объекты (например, конкретный Склад), убедитесь, что GUID этих объектов идентичны в обеих базах, иначе ссылка может не восстановиться корректно.
Разберем более «чистый» способ. В 1С:Конвертации данных 2.1 можно указать конкретное правило конвертации объекта (ПКО) даже для параметров. Это позволяет системе использовать штатные механизмы сериализации объектов.
Перед выгрузкой мы просто присваиваем переменной Значение сам объект (например, ссылку на справочник), а система сама выгрузит его по указанному правилу.ПараметрыОбъекта придет уже готовая ссылка или объект, соответствующий правилам приемника.Этот метод позволяет избежать проблем с типами данных и делает код более читаемым и поддерживаемым. Для точечной миграции объектов между базами со схожей структурой можно выполнить перенос данных между похожими конфигурациями 1С с использованием произвольных полей поиска.
Посмотрим на ситуацию, когда через параметры нужно передать картинку, сертификат или файл (тип ДвоичныеДанные). Прямая передача или использование ЗначениеВСтрокуВнутр здесь часто дают сбой, так как XML-парсер может «споткнуться» о нетекстовые символы.
Проанализируем правильный алгоритм работы с бинарными данными в параметрах:
Выгрузка (Источник):
// Преобразуем двоичные данные в строку Base64
Если ТипЗнч(Источник.ДанныеФайла) = Тип("ДвоичныеДанные") Тогда
Значение = Base64Строка(Источник.ДанныеФайла);
КонецЕсли;
Загрузка (Приемник):
// Восстанавливаем двоичные данные из строки Base64
Если ПараметрыОбъекта.Свойство("Файл") Тогда
ДвоичныеДанные = Base64Значение(ПараметрыОбъекта["Файл"]);
// Далее записываем их в реквизит или ХранилищеЗначений
Объект.Данные = Новый ХранилищеЗначений(ДвоичныеДанные);
КонецЕсли;
Для наиболее сложных случаев, когда обмен идет между существенно разными конфигурациями, мы рекомендуем использовать XDTO. Это современный стандарт 1С для представления данных в виде XML/JSON. Он гораздо надежнее, чем ЗначениеВСтрокуВнутр, так как формат XDTO строго детерминирован.
Пример выгрузки структуры через XDTO:
// В ПКС Перед выгрузкой
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXDTO(ЗаписьXML, ПередаваемаяСтруктура);
Значение = ЗаписьXML.Закрыть();
Пример загрузки через XDTO:
// В ПКО После загрузки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ПараметрыОбъекта["МояСтруктура"]);
Результат = СериализаторXDTO.ПрочитатьXDTO(ЧтениеXML);
Подводя итог, проанализируем основные правила успешной передачи параметров через ПКС:
ПараметрыОбъекта корректно.ЗначениеВСтрокуВнутр или XDTO для структур).Если ПараметрыОбъекта <> Неопределено, чтобы избежать аварийного завершения работы обмена при отсутствии параметров в файле.Используя эти подходы, вы сможете передавать любые объемы сопутствующей информации между базами 1С, обеспечивая гибкость и надежность ваших механизмов интеграции. Чтобы проконтролировать качество переноса, удобно автоматически сравнить бухгалтерские и налоговые проводки между базами с помощью специальной обработки.