Как избежать дублирования элементов справочников при обмене данными между 1С:УПП и 1С:УНФ?

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

При автоматическом обмене данными между различными конфигурациями 1С, например, между 1С:Управление производственным предприятием (УПП) и 1С:Управление нашей фирмой (УНФ), нередко возникает проблема дублирования элементов справочников. Даже при, казалось бы, корректно настроенных правилах конвертации данных (КД) и использовании планов обмена, система может создавать новые элементы вместо того, чтобы находить и обновлять уже существующие. Давайте подробно разберем, почему это происходит и какие шаги необходимо предпринять для решения этой распространенной задачи.

Мы выясним потенциальные причины появления дублей и предложим комплексный подход к диагностике и исправлению ситуации, основываясь на опыте коллег и лучших практиках разработки на платформе 1С:Предприятие.

Основные причины возникновения дубликатов

Прежде чем перейти к конкретным решениям, давайте проанализируем наиболее частые причины, по которым система может создавать дублирующиеся элементы справочников:

  1. Недостаточно точные правила поиска объектов в «Конвертации данных». Если правила поиска объектов-приемников не обеспечивают уникальной идентификации, система не сможет найти существующий элемент и создаст новый.
  2. Особенности поиска по Уникальному Идентификатору (GUID) и его комбинации с поиском по полям. Механизмы обмена 1С в первую очередь пытаются сопоставить объекты по внутренним идентификаторам. Если объект в базе-приемнике был создан другим способом (например, вручную) до первой синхронизации с базой-источником, его GUID будет отличаться.
  3. Влияние обработчиков событий объекта в конфигурации-приемнике. Код, выполняющийся при записи объекта (например, в процедурах ПередЗаписью, ПриЗаписи, ПослеЗаписи), может вмешиваться в процесс записи, изменяя ключевые реквизиты или даже принудительно создавая новый элемент.
  4. Некорректная настройка "флажков поиска" в правилах конвертации свойств. Если для ключевых реквизитов, по которым должен производиться поиск, не установлен соответствующий флажок в «Конвертации данных», поиск по ним осуществляться не будет.
  5. "Человеческий фактор" и ручное создание элементов. Пользователи могли создать элементы в базе-приемнике вручную до того, как эти элементы были переданы из базы-источника через обмен. В результате коды или наименования могут отличаться, и система обмена не сможет их сопоставить.
  6. Нестабильность обмена или частичные выгрузки/загрузки. Ошибки в процессе обмена могут привести к неполной передаче данных или некорректной отработке логики сопоставления.
  7. Различия в конфигурациях или версиях платформы. Иногда специфические особенности релизов конфигураций УПП и УНФ, а также версии платформы 1С:Предприятие, могут влиять на поведение обмена и механизмы поиска.

Шаги по диагностике и устранению дубликатов

Давайте подробно рассмотрим, как последовательно выявлять и устранять причины появления дубликатов, особенно когда, как в нашей ситуации, элементы создаются фоновым заданием обмена, а не пользователем вручную.

1. Тщательная проверка правил конвертации объектов (ПКО) и правил конвертации свойств (ПКС)

Это первый и самый важный шаг. Мы должны убедиться, что для каждого объекта справочника, который потенциально может дублироваться, настроены максимально точные правила поиска.

  1. Анализ полей поиска:

    Вы могли настроить поиск по Коду и Группе, как указано в обсуждении. Однако такой поиск может быть недостаточен. Мы знаем, что Код может генерироваться автоматически и отличаться в разных базах, а Группа не всегда уникальна. Критически важно использовать для поиска реквизиты, которые гарантированно уникальны и неизменны для одного и того же логического элемента в обеих базах. Это могут быть:

    • ИНН, КПП для контрагентов.
    • Артикул для номенклатуры.
    • Полное наименование или комбинация наименования и других уникальных характеристик.

    Если поиск установлен по нескольким реквизитам, помните, что объект будет искаться на полное совпадение всем этим реквизитам (логическое "И").

  2. Использование флагов поиска:

    В правилах конвертации свойств (ПКС) для каждого реквизита, который должен участвовать в поиске, необходимо установить флажок "Поиск". Без этого флажка система не будет использовать данный реквизит для идентификации объекта-приемника.

  3. Поиск по GUID и продолжение поиска по полям:

    В ПКО для классификаторов (справочников) рекомендуется использовать комбинированный поиск. Установите следующие флаги:

    • "Искать объект приемника по внутреннему идентификатору объекта источника": Это позволяет системе сначала попытаться найти объект по его GUID, который хранится в регистре сведений "Публичные идентификаторы синхронизируемых объектов".
    • "Продолжить поиск по полям поиска, если по идентификатору объект приемник не найден": Этот флаг критичен. Он указывает системе, что если объект не был найден по GUID, то следует продолжить поиск по дополнительным полям, которые мы настроили в ПКС (например, по ИНН, КПП, артикулу и т.д.). Без этого флага при несовпадении GUID будет сразу создаваться новый элемент, если не найдено прямое соответствие по внутреннему идентификатору.

    Этот механизм позволяет корректно сопоставлять объекты, которые могли быть созданы вручную в одной из баз до начала синхронизации, или объекты, у которых по каким-либо причинам изменился внутренний идентификатор, но сохранились ключевые поля.

  4. Обработчик "Поля поиска" в ПКО:

    В сложных случаях, когда стандартных флагов недостаточно, вы можете программно задавать поля поиска в обработчике "Поля поиска" ПКО. Это дает максимальную гибкость.

    
    // Пример кода в обработчике "Поля поиска" ПКО
    Если ТипЗнч(ОбъектИсточник) = Тип("СправочникСсылка.Контрагенты") Тогда
        ПараметрыПоиска.Вставить("ИНН", ОбъектИсточник.ИНН);
        Если Не ПустаяСтрока(ОбъектИсточник.КПП) Тогда
            ПараметрыПоиска.Вставить("КПП", ОбъектИсточник.КПП);
        КонецЕсли;
    ИначеЕсли ТипЗнч(ОбъектИсточник) = Тип("СправочникСсылка.Номенклатура") Тогда
        ПараметрыПоиска.Вставить("Артикул", ОбъектИсточник.Артикул);
        // Если артикул не уникален, можно добавить другие поля
        ПараметрыПоиска.Вставить("Наименование", ОбъектИсточник.Наименование);
    КонецЕсли;
    

    В этом примере мы явно указываем, по каким полям искать объект-приемник, в зависимости от его типа.

2. Анализ обработчиков событий модуля объекта в УНФ

В сообщении 13 темы форума было указано, что дубликаты создаются фоновым заданием (обменом), а не пользователем. Это критически важная информация, которая сужает круг поиска. В таком случае, мы должны обратить особое внимание на код, выполняющийся в модулях объектов конфигурации 1С:УНФ, особенно в процедурах, срабатывающих при записи.

  1. Процедуры ПередЗаписью, ПриЗаписи, ПослеЗаписи:

    Откройте модуль объекта справочника, который дублируется, в конфигурации 1С:УНФ. Проверьте процедуры ПередЗаписью, ПриЗаписи и ПослеЗаписи (как на сервере, так и при необходимости на клиенте). Иногда в этих процедурах может содержаться логика, которая:

    • Переопределяет Код, Наименование или другие ключевые реквизиты.
    • Вызывает создание нового элемента при определенных условиях.
    • Изменяет состав полей, по которым должен производиться поиск.
  2. Проверка флага ОбменДанными.Загрузка:

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

    Например, если у вас есть код, который генерирует новый Код для элемента или выполняет специфические проверки, он должен выглядеть так:

    
    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
        // ... какой-то основной код ...
    
        // Если не идет загрузка данных через обмен, выполняем специфичную логику
        Если НЕ ОбменДанными.Загрузка Тогда
            // Пример: если код не заполнен, генерируем новый код
            Если ПустаяСтрока(ЭтотОбъект.Код) Тогда
                ЭтотОбъект.Код = Справочники.МойСправочник.ПолучитьНовыйКод();
            КонецЕсли;
            // ... другая логика, специфичная для интерактивной работы ...
        Иначе
            // Логика, которая должна выполняться только при обмене
            // Или просто пропускаем "интерактивную" логику
        КонецЕсли;
    
        // ... остальной код ...
    КонецПроцедуры
    

    Если такая проверка отсутствует, код, предназначенный для интерактивного создания, может срабатывать и при обмене, что приводит к генерации нового кода, и, как следствие, к созданию дубля, так как система обмена не сможет найти элемент по измененному коду.

3. Анализ истории обмена и журнала регистрации

Журнал регистрации (ЖР) уже используется автором, но давайте посмотрим, как его использовать более эффективно для поиска алгоритма появления дублей.

  1. Детальное логирование обмена:

    В настройках плана обмена или в обработчиках КД можно включить более детальное логирование. Это позволит увидеть, какие объекты были выгружены из УПП, а затем как система обмена УНФ пыталась их загрузить: был ли найден существующий элемент, или создан новый, и по каким причинам.

  2. Анализ записей ЖР:

    Обратите внимание на записи в ЖР, связанные с фоновым заданием обмена. Внимательно изучите детали записи, где указано "такие-то данные добавились". Мы ищем конкретный справочник, который дублируется. Важно понять:

    • В какое время был создан дубль?
    • Какие поля (код, наименование) были присвоены новому элементу?
    • Отличаются ли эти поля от уже существующего дубликата?

    Сопоставьте эту информацию с данными из базы-источника (УПП). Возможно, в УПП этот элемент был изменен, и система обмена "решила", что это новый элемент.

  3. Проверка уникальности на стороне УПП:

    Убедитесь, что в УПП нет дубликатов тех же элементов справочников. Если в УПП уже существуют дубли с разными GUID, но схожими кодами, это также приведет к созданию дублей в УНФ при каждом новом обмене.

4. Использование типовой обработки "Поиск и удаление дублей"

После выявления и устранения причины появления дубликатов, мы можем использовать встроенную в 1С обработку "Поиск и удаление дублей".

  1. Поиск дублей:

    Запустите обработку и настройте поиск дублей для конкретного справочника по ключевым полям (например, по ИНН, КПП, артикулу, полному наименованию). Это поможет выявить все существующие дубликаты.

  2. Объединение дублей:

    Обработка позволяет выбрать "оригинальный" элемент и объединить с ним все найденные дубли, перенося на "оригинал" все ссылки, которые вели на дублирующие элементы. Важный нюанс: после объединения дублей в УНФ необходимо убедиться, что идентификаторы объектов в регистре сведений "Публичные идентификаторы синхронизируемых объектов" корректно сопоставлены с элементами из УПП. Иначе при следующем обмене дубли могут появиться снова.

5. Автоматический запуск обмена в УПП (обычные формы)

Хотя этот вопрос не является основной причиной дублирования, он был затронут в обсуждении. Автор использует "ИР-ы" (инструменты разработчика) для запуска обмена в УПП, так как "нет возможности прямо в режиме предприятия настроить синхронизацию по сценарию". Это утверждение требует уточнения.

Действительно, в старых версиях УПП на обычных формах не было такой гибкой настройки сценариев обмена, как в управляемых формах. Однако, обычно автоматический запуск обмена на стороне УПП реализуется через:

  1. Регламентные задания:

    Создается регламентное задание, которое вызывает соответствующий экспортный метод общей обработки или модуля, отвечающего за запуск обмена. Для этого потребуется доработка конфигурации (создание нового регламентного задания и процедуры, которую оно вызывает).

    
    // Пример процедуры, которую может вызывать регламентное задание в УПП
    Процедура ВыполнитьОбменСУНФ() Экспорт
        // Получаем план обмена
        ПланОбмена = ПланыОбмена.ОбменУППУНФ.ПолучитьСсылку();
    
        // Создаем объект для управления обменом
        // Это может быть ОбменДаннымиКлиентСервер.ВыполнитьОбменДаннымиИБ()
        // или специализированная обработка обмена
        ОбработкаОбмена = Обработки.ОбменДаннымиСУНФ.Создать(); 
        // Предполагаем, что есть такая обработка для обмена
                
        ОбработкаОбмена.НастроитьПараметрыДляАвтоматическогоОбмена(); // Если нужно
        ОбработкаОбмена.ВыполнитьОбмен();
                
    Исключение
        // Обработка ошибок
        ЗаписатьВЖурналРегистрации(
            "ОбменСУНФ",
            УровеньЖурналаРегистрации.Ошибка,
            ,
            ,
            "Ошибка при выполнении обмена: " + ОписаниеОшибки()
        );
    КонецПроцедуры
    
  2. Внешние планировщики и bat-файлы:

    Иногда используют внешние планировщики задач (например, "Планировщик заданий Windows"), которые по расписанию запускают 1С в режиме предприятия с параметрами командной строки. Эти параметры указывают на запуск определенной обработки или выполнение скрипта, который инициирует обмен.

    Например, командная строка может выглядеть так:

    
    "C:\Program Files\1cv8\8.3.Х.ХХХХ\bin\1cv8.exe" ENTERPRISE
    /F "C:\Базы\УПП"
    /N "ПользовательОбмена"
    /P "Пароль"
    /Execute "C:\Обработки\ОбменСУНФ.epf"
    /C "ПараметрыЗапуска"
    

    Где ОбменСУНФ.epf – это внешняя обработка, содержащая логику запуска обмена.

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

Заключение

Проблема дублирования элементов справочников при обмене данными – это комплексная задача, требующая тщательного анализа всех аспектов: от правил конвертации до кода в модулях объектов и способов запуска обмена. Мы рассмотрели основные причины и дали пошаговые рекомендации, которые помогут вам выявить и устранить источник дубликатов. Начните с проверки правил поиска в «Конвертации данных», затем переходите к анализу кода в конфигурации-приемнике и не забывайте про детальное логирование, которое предоставит ценную информацию для диагностики.

← На главную