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