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