Синхронизация данных между конфигурациями 1С:Управление торговлей (УТ) и 1С:Бухгалтерия предприятия (БП) — это стандартная задача, с которой сталкивается практически каждый программист 1С. Однако на практике часто возникает крайне неприятная ситуация: после очередного сеанса интеграции в базе-приемнике (как правило, в БП) начинают лавинообразно плодиться дубликаты справочников. Задваиваются базовые валюты, контрагенты, договоры и позиции номенклатуры.
Обычные попытки исправить ситуацию «на лету» — например, отключить в правилах обмена поиск по уникальному идентификатору (УИД) и настроить сопоставление только по коду — зачастую не приносят желаемого результата. Давайте детально разберем причины этой проблемы, выясним, почему простой поиск по коду дает сбой, и рассмотрим пошаговый алгоритм полного исправления базы данных и настройки надежного обмена.
Рассмотрим ситуацию, когда программист вносит изменения в правила конвертации объектов (ПКО) в программе Конвертация данных 2.1. Он снимает флаг «Искать объект приемника по внутреннему идентификатору источника» и устанавливает поиск исключительно по полю Код. На первый взгляд, это логично: если коды в УТ и БП совпадают, система должна найти существующий объект. Но на практике дубли все равно создаются. Выделим несколько скрытых причин, почему так происходит:
"00-00000001" и строка "000000001" абсолютно не равны. Точный поиск по коду не находит совпадений, и система создает новый элемент.Договоры контрагентов жестко подчинен справочнику Контрагенты. Если сам контрагент из-за различий в идентификаторах или кодах создался как дубликат, то при поиске договора система будет искать его только внутри папки («владельца») этого нового, задублированного контрагента. Естественно, там договора с нужным кодом не окажется, и система создаст дубль договора.Если обмен уже отработал некорректно и в базе БП появились дубликаты, простое изменение правил обмена не поможет. Новые документы будут продолжать ссылаться на новые «неправильные» элементы, а на «правильных» останутся старые обороты. Нам необходимо выполнить процедуру очистки.
Для этого воспользуемся стандартной обработкой «Поиск и удаление дублей», которая доступна в разделе «Администрирование» — «Обслуживание» (или на ИТС). Выполняем следующие действия:
Контрагенты или Номенклатура).Важный нюанс при работе с валютой: Если задублировалась валюта (например, появилось два «рубля»), то обработка слияния также корректно перенесет все движения по счетам на один правильный элемент. Выполнять эту процедуру нужно строго монопольно, предварительно сделав резервную копию базы данных!
После того как в БП остался один корректный элемент, нам нужно сделать так, чтобы при следующем сеансе обмена система снова не создала дубль. Если мы продолжаем использовать обработку Универсальный обмен данными в формате XML, нам жизненно необходимо, чтобы УИД объекта в базе УТ совпадал с УИД объекта в базе БП.
Проанализируем техническое решение этой задачи. Мы можем использовать внешнюю обработку для перезаписи УИД в базе БП, чтобы они стали равны идентификаторам из УТ. Ниже представлен пример кода, демонстрирующий логику сопоставления объектов по ключевому реквизиту (например, ИНН для контрагентов) и принудительной синхронизации их GUID через создание нового объекта с заданным УИД взамен старого:
// Пример переноса УИД контрагента для предотвращения дублирования
Процедура СинхронизироватьУИДКонтрагента(СсылкаНаПриемник, СтрокаУИДИсточника)
НовыйУИД = Новый УникальныйИдентификатор(СтрокаУИДИсточника);
// Проверяем, существует ли уже объект с таким УИД в приемнике
НайденныйОбъект = Справочники.Контрагенты.ПолучитьСсылку(НовыйУИД);
Если НайденныйОбъект.ПолучитьОбъект() = Неопределено Тогда
// Создаем новый элемент с УИД источника, копируя данные старого элемента
НовыйОбъект = Справочники.Контрагенты.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НайденныйОбъект);
ЗаполнитьЗначенияСвойств(НовыйОбъект, СсылкаНаПриемник.ПолучитьОбъект(), "Код,Наименование,ИНН,КПП,ЮридическийАдрес");
НовыйОбъект.Записать();
// Заменяем ссылки в транзакциях со старого элемента на новый с правильным УИД
СсылкаНаПриемник.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
ИнформационнаяБаза.ЗаменитьСсылки(СсылкаНаПриемник, НайденныйОбъект);
КонецЕсли;
КонецПроцедуры
Если мы хотим оставить обмен через XML-файлы, но научить систему корректно сопоставлять контрагентов без жесткой привязки к УИД (например, по связке ИНН + КПП), мы должны использовать обработчики событий в КД 2.1.
Рассмотрим, как настроить сопоставление в ПКО контрагентов. В обработчике события ПоляПоиска напишем следующий алгоритм:
// Алгоритм сопоставления контрагентов по ИНН и КПП при поиске
Если СвойстваПоиска.Свойство("ИНН") И ЗначениеЗаполнено(СвойстваПоиска["ИНН"]) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И Контрагенты.КПП = &КПП
| И НЕ Контрагенты.ПометкаУдаления";
Запрос.УстановитьПараметр("ИНН", СвойстваПоиска["ИНН"]);
Запрос.УстановитьПараметр("КПП", СвойстваПоиска["КПП"]);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
СсылкаНайдена = Выборка.Ссылка;
ПрекратитьПоиск = Истина; // Прерываем стандартный поиск по УИД/коду
КонецЕсли;
КонецЕсли;
Использование этого кода гарантирует, что система сначала попытается найти контрагента по ИНН/КПП, и только если такой не будет найден, создаст нового с УИД базы-источника.
Использование обработки Универсальный обмен данными в формате XML в ручном режиме — это устаревший метод регулярной синхронизации. Он не имеет памяти (состояний) и крайне чувствителен к любым изменениям данных пользователями.
Современным и наиболее надежным решением является переход на типовой механизм синхронизации данных, использующий Планы обмена на базе БСП (Библиотеки Стандартных Подсистем). Разберем по шагам преимущества этого подхода:
СоответствияОбъектовИнформационныхБаз (в некоторых версиях — ПубличныеИдентификаторыСинхронизируемыхОбъектов). В этом регистре жестко фиксируется связь: УИД Источника <-> УИД Приемника.Подводя итог: если вы столкнулись с задвоением, сначала слейте дубли с помощью стандартных обработок в БП, затем откажитесь от ручного обмена через XML-файлы и настройте типовую синхронизацию через планы обмена. Это сбережет ваше время и обеспечит идеальную чистоту и консистентность данных в обеих информационных базах.