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