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