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