При автоматическом обмене данными между различными конфигурациями 1С, например, между 1С:Управление производственным предприятием (УПП) и 1С:Управление нашей фирмой (УНФ), нередко возникает проблема дублирования элементов справочников. Даже при, казалось бы, корректно настроенных правилах конвертации данных (КД) и использовании планов обмена, система может создавать новые элементы вместо того, чтобы находить и обновлять уже существующие. Давайте подробно разберем, почему это происходит и какие шаги необходимо предпринять для решения этой распространенной задачи.
Мы выясним потенциальные причины появления дублей и предложим комплексный подход к диагностике и исправлению ситуации, основываясь на опыте коллег и лучших практиках разработки на платформе 1С:Предприятие.
Прежде чем перейти к конкретным решениям, давайте проанализируем наиболее частые причины, по которым система может создавать дублирующиеся элементы справочников:
ПередЗаписью, ПриЗаписи, ПослеЗаписи), может вмешиваться в процесс записи, изменяя ключевые реквизиты или даже принудительно создавая новый элемент.Давайте подробно рассмотрим, как последовательно выявлять и устранять причины появления дубликатов, особенно когда, как в нашей ситуации, элементы создаются фоновым заданием обмена, а не пользователем вручную.
Это первый и самый важный шаг. Мы должны убедиться, что для каждого объекта справочника, который потенциально может дублироваться, настроены максимально точные правила поиска.
Вы могли настроить поиск по Коду и Группе, как указано в обсуждении. Однако такой поиск может быть недостаточен. Мы знаем, что Код может генерироваться автоматически и отличаться в разных базах, а Группа не всегда уникальна. Критически важно использовать для поиска реквизиты, которые гарантированно уникальны и неизменны для одного и того же логического элемента в обеих базах. Это могут быть:
Если поиск установлен по нескольким реквизитам, помните, что объект будет искаться на полное совпадение всем этим реквизитам (логическое "И").
В правилах конвертации свойств (ПКС) для каждого реквизита, который должен участвовать в поиске, необходимо установить флажок "Поиск". Без этого флажка система не будет использовать данный реквизит для идентификации объекта-приемника.
В ПКО для классификаторов (справочников) рекомендуется использовать комбинированный поиск. Установите следующие флаги:
Этот механизм позволяет корректно сопоставлять объекты, которые могли быть созданы вручную в одной из баз до начала синхронизации, или объекты, у которых по каким-либо причинам изменился внутренний идентификатор, но сохранились ключевые поля.
В сложных случаях, когда стандартных флагов недостаточно, вы можете программно задавать поля поиска в обработчике "Поля поиска" ПКО. Это дает максимальную гибкость.
// Пример кода в обработчике "Поля поиска" ПКО
Если ТипЗнч(ОбъектИсточник) = Тип("СправочникСсылка.Контрагенты") Тогда
ПараметрыПоиска.Вставить("ИНН", ОбъектИсточник.ИНН);
Если Не ПустаяСтрока(ОбъектИсточник.КПП) Тогда
ПараметрыПоиска.Вставить("КПП", ОбъектИсточник.КПП);
КонецЕсли;
ИначеЕсли ТипЗнч(ОбъектИсточник) = Тип("СправочникСсылка.Номенклатура") Тогда
ПараметрыПоиска.Вставить("Артикул", ОбъектИсточник.Артикул);
// Если артикул не уникален, можно добавить другие поля
ПараметрыПоиска.Вставить("Наименование", ОбъектИсточник.Наименование);
КонецЕсли;
В этом примере мы явно указываем, по каким полям искать объект-приемник, в зависимости от его типа.
В сообщении 13 темы форума было указано, что дубликаты создаются фоновым заданием (обменом), а не пользователем. Это критически важная информация, которая сужает круг поиска. В таком случае, мы должны обратить особое внимание на код, выполняющийся в модулях объектов конфигурации 1С:УНФ, особенно в процедурах, срабатывающих при записи.
ПередЗаписью, ПриЗаписи, ПослеЗаписи:
Откройте модуль объекта справочника, который дублируется, в конфигурации 1С:УНФ. Проверьте процедуры ПередЗаписью, ПриЗаписи и ПослеЗаписи (как на сервере, так и при необходимости на клиенте). Иногда в этих процедурах может содержаться логика, которая:
Код, Наименование или другие ключевые реквизиты.ОбменДанными.Загрузка:
При программной загрузке данных через механизмы обмена платформа 1С устанавливает глобальный флаг ОбменДанными.Загрузка в значение Истина. Это позволяет нам в коде модулей объектов различать, записывается ли объект в интерактивном режиме пользователем или в процессе обмена данными. Очень важно, чтобы логика, которая может вмешиваться в процесс записи или идентификации объекта, была заключена в условие проверки этого флага.
Например, если у вас есть код, который генерирует новый Код для элемента или выполняет специфические проверки, он должен выглядеть так:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// ... какой-то основной код ...
// Если не идет загрузка данных через обмен, выполняем специфичную логику
Если НЕ ОбменДанными.Загрузка Тогда
// Пример: если код не заполнен, генерируем новый код
Если ПустаяСтрока(ЭтотОбъект.Код) Тогда
ЭтотОбъект.Код = Справочники.МойСправочник.ПолучитьНовыйКод();
КонецЕсли;
// ... другая логика, специфичная для интерактивной работы ...
Иначе
// Логика, которая должна выполняться только при обмене
// Или просто пропускаем "интерактивную" логику
КонецЕсли;
// ... остальной код ...
КонецПроцедуры
Если такая проверка отсутствует, код, предназначенный для интерактивного создания, может срабатывать и при обмене, что приводит к генерации нового кода, и, как следствие, к созданию дубля, так как система обмена не сможет найти элемент по измененному коду.
Журнал регистрации (ЖР) уже используется автором, но давайте посмотрим, как его использовать более эффективно для поиска алгоритма появления дублей.
В настройках плана обмена или в обработчиках КД можно включить более детальное логирование. Это позволит увидеть, какие объекты были выгружены из УПП, а затем как система обмена УНФ пыталась их загрузить: был ли найден существующий элемент, или создан новый, и по каким причинам.
Обратите внимание на записи в ЖР, связанные с фоновым заданием обмена. Внимательно изучите детали записи, где указано "такие-то данные добавились". Мы ищем конкретный справочник, который дублируется. Важно понять:
Сопоставьте эту информацию с данными из базы-источника (УПП). Возможно, в УПП этот элемент был изменен, и система обмена "решила", что это новый элемент.
Убедитесь, что в УПП нет дубликатов тех же элементов справочников. Если в УПП уже существуют дубли с разными GUID, но схожими кодами, это также приведет к созданию дублей в УНФ при каждом новом обмене.
После выявления и устранения причины появления дубликатов, мы можем использовать встроенную в 1С обработку "Поиск и удаление дублей".
Запустите обработку и настройте поиск дублей для конкретного справочника по ключевым полям (например, по ИНН, КПП, артикулу, полному наименованию). Это поможет выявить все существующие дубликаты.
Обработка позволяет выбрать "оригинальный" элемент и объединить с ним все найденные дубли, перенося на "оригинал" все ссылки, которые вели на дублирующие элементы. Важный нюанс: после объединения дублей в УНФ необходимо убедиться, что идентификаторы объектов в регистре сведений "Публичные идентификаторы синхронизируемых объектов" корректно сопоставлены с элементами из УПП. Иначе при следующем обмене дубли могут появиться снова.
Хотя этот вопрос не является основной причиной дублирования, он был затронут в обсуждении. Автор использует "ИР-ы" (инструменты разработчика) для запуска обмена в УПП, так как "нет возможности прямо в режиме предприятия настроить синхронизацию по сценарию". Это утверждение требует уточнения.
Действительно, в старых версиях УПП на обычных формах не было такой гибкой настройки сценариев обмена, как в управляемых формах. Однако, обычно автоматический запуск обмена на стороне УПП реализуется через:
Создается регламентное задание, которое вызывает соответствующий экспортный метод общей обработки или модуля, отвечающего за запуск обмена. Для этого потребуется доработка конфигурации (создание нового регламентного задания и процедуры, которую оно вызывает).
// Пример процедуры, которую может вызывать регламентное задание в УПП
Процедура ВыполнитьОбменСУНФ() Экспорт
// Получаем план обмена
ПланОбмена = ПланыОбмена.ОбменУППУНФ.ПолучитьСсылку();
// Создаем объект для управления обменом
// Это может быть ОбменДаннымиКлиентСервер.ВыполнитьОбменДаннымиИБ()
// или специализированная обработка обмена
ОбработкаОбмена = Обработки.ОбменДаннымиСУНФ.Создать();
// Предполагаем, что есть такая обработка для обмена
ОбработкаОбмена.НастроитьПараметрыДляАвтоматическогоОбмена(); // Если нужно
ОбработкаОбмена.ВыполнитьОбмен();
Исключение
// Обработка ошибок
ЗаписатьВЖурналРегистрации(
"ОбменСУНФ",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка при выполнении обмена: " + ОписаниеОшибки()
);
КонецПроцедуры
Иногда используют внешние планировщики задач (например, "Планировщик заданий Windows"), которые по расписанию запускают 1С в режиме предприятия с параметрами командной строки. Эти параметры указывают на запуск определенной обработки или выполнение скрипта, который инициирует обмен.
Например, командная строка может выглядеть так:
"C:\Program Files\1cv8\8.3.Х.ХХХХ\bin\1cv8.exe" ENTERPRISE
/F "C:\Базы\УПП"
/N "ПользовательОбмена"
/P "Пароль"
/Execute "C:\Обработки\ОбменСУНФ.epf"
/C "ПараметрыЗапуска"
Где ОбменСУНФ.epf – это внешняя обработка, содержащая логику запуска обмена.
В любом случае, убедитесь, что пользователь, от имени которого запускается регламентное задание или внешний скрипт, обладает достаточными правами для выполнения всех операций по обмену данными.
Проблема дублирования элементов справочников при обмене данными – это комплексная задача, требующая тщательного анализа всех аспектов: от правил конвертации до кода в модулях объектов и способов запуска обмена. Мы рассмотрели основные причины и дали пошаговые рекомендации, которые помогут вам выявить и устранить источник дубликатов. Начните с проверки правил поиска в «Конвертации данных», затем переходите к анализу кода в конфигурации-приемнике и не забывайте про детальное логирование, которое предоставит ценную информацию для диагностики.