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