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