Как при переносе данных из УТ 10.3 в Бухгалтерию 3.0 автоматически устанавливать основной договор контрагента?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Торговля и дистрибуция
← На главную

Анализ проблемы и поиск причин возникновения дублей

Рассмотрим ситуацию, с которой сталкиваются многие разработчики: при миграции документов из Управление торговлей 10.3 в Бухгалтерию 3.0 через Конвертацию данных 2.0 возникает необходимость принудительно использовать один конкретный «основной» договор для каждого контрагента. Часто попытки решить это через обработчик После загрузки приводят к тому, что в базе создаются дубли договоров или происходят конфликты при записи объектов.

Разберемся, почему это происходит. Обработчик После загрузки срабатывает уже после того, как объект был записан в базу данных. Если в Правилах конвертации объектов для справочника ДоговорыКонтрагентов не задан четкий поиск, система 1С:Предприятие воспринимает договор из выгружаемого файла как новый элемент. Даже если вы программно меняете ссылку в документе после записи, в справочнике договоров уже успевает появиться «лишний» дубль, что ведет к нарушению целостности данных.

Решение 1: Настройка правил поиска в ПКО

Наиболее корректным способом решения задачи является настройка поиска на стороне ПКО (Правила конвертации объектов) справочника ДоговорыКонтрагентов. Вместо создания записи «по факту», мы должны заставить конвертацию найти нужный нам договор еще до того, как документ будет записан.

  1. Откройте Конвертацию данных 2.0 и перейдите в ПКО для справочника ДоговорыКонтрагентов.
  2. В настройках полей поиска задайте алгоритм, который будет обращаться к Регистру сведений ОсновныеДоговорыКонтрагента.
  3. Если поиск по полям Организация, Контрагент и ВидДоговора возвращает ссылку, система автоматически подставит её в документ, не создавая новый элемент.
  4. Установите флаг «Не создавать новые, если не найдено», если логика диктует жесткую привязку к существующим основным договорам.

Решение 2: Использование типовых функций БП 3.0

Вместо того чтобы вручную записывать данные в Регистры сведений, рекомендуем использовать готовые механизмы Бухгалтерии 3.0. В конфигурации существуют общие модули, которые отвечают за получение основного договора. Рассмотрим пример использования такого подхода:


// В обработчике После загрузки документа 
// Вместо прямого манипулирования записями используем типовой функционал:
Объект.ДоговорКонтрагента = РаботаСДоговорамиКонтрагентовБП.ДоговорКонтрагентаИзОбъекта(Объект);

// Для обработки табличных частей (например, РасшифровкаПлатежа)
// применяем аналогичный подход для каждой строки:
Для Каждого Стр Из Объект.РасшифровкаПлатежа Цикл
    Стр.ДоговорКонтрагента = Объект.ДоговорКонтрагента;
КонецЦикла;

Такой подход позволяет избежать конфликтов, так как типовые функции РаботаСДоговорамиКонтрагентовБП уже учитывают все проверки, принятые в Бухгалтерии 3.0, включая работу с Регистром сведений ОсновныеДоговорыКонтрагента.

Решение 3: Управление через расширения конфигурации

Если задача требует глобального контроля (например, чтобы пользователи или другие обмены также не создавали лишних договоров), мы рекомендуем использовать Расширение конфигурации.

Разберем алгоритм действий:

  1. Создайте расширение для справочника ДоговорыКонтрагентов.
  2. В обработчике события ПриЗаписи добавьте проверку: если создается договор, для которого у данного контрагента уже есть основной, можно либо выдать предупреждение, либо автоматически изменить статус основного договора.
  3. Важно: при работе с ПриЗаписи обязательно проверяйте, что вы не находитесь в цикле бесконечной записи, используя метод ОбменДанными.Загрузка.

// Пример проверки в расширении
Если Не ОбменДанными.Загрузка Тогда
    // Логика проверки на дубли и установка основного договора
КонецЕсли;

Итоги и рекомендации

Чтобы избежать хаоса в справочнике договоров при обмене:

Применяя эти методы, вы добьетесь чистоты данных в Бухгалтерии 3.0 и избавитесь от необходимости ручного удаления дублирующихся элементов справочников после каждого обмена.

← На главную