Синхронизация данных между конфигурациями «1С:Бухгалтерия предприятия 3.0» (БП 3.0) и «1С:Зарплата и управление персоналом 3.1» (ЗУП 3.1) — один из наиболее часто используемых механизмов в экосистеме 1С. Однако администраторы и программисты нередко сталкиваются с ситуацией, когда после очередного сеанса обмена в базе-приемнике (чаще всего в ЗУП) появляется дубликат карточки организации.
Попытки исправить ситуацию стандартной обработкой «Поиск и удаление дублей» часто заканчиваются неудачей: процесс слияния зависает или аварийно завершается со сложными техническими ошибками СУБД. В этой статье мы подробно рассмотрим, почему возникает эта проблема, проанализируем причины сбоев при объединении дублей и разберем несколько эффективных способов решения — от простых пользовательских настроек до низкоуровневых манипуляций с уникальными идентификаторами (GUID).
Прежде чем приступать к активным действиям, проанализируем ситуацию и поймем, по какому принципу механизмы синхронизации сопоставляют организации. В современных конфигурациях 1С обмен по умолчанию происходит по технологии EnterpriseData. При первом обмене система пытается сопоставить ключевые поля справочника Организации. К ним относятся:
Если хотя бы один символ в этих полях не совпадает, система считает, что это разные контрагенты/организации, и автоматически создает новый элемент в базе-приемнике. Рассмотрим подробнее неочевидные факторы, которые приводят к созданию дублей:
Часто при попытке объединить дублирующие карточки организаций стандартная обработка «Поиск и удаление дублей» останавливается с ошибкой СУБД, ссылаясь на один из регистров сведений. Разберем по шагам, почему это происходит.
Справочник Организации связан со множеством периодических регистров сведений (например, УчетнаяПолитикаОрганизаций, ИсторияРегистрацийВНалоговомОргане, ОтветственныеЛица). В этих регистрах хранятся настройки для каждого юридического лица с привязкой к дате (периоду).
Когда обработка пытается заменить дублирующуюся организацию на оригинальную, она перезаписывает ссылку на организацию во всех связанных объектах. Если для обеих организаций в регистре сведений уже существуют записи на одну и ту же дату (например, задана учетная политика на 01.01.2024 для «Оригинала» и для «Дубля»), то при попытке замены ссылок СУБД попытается записать две абсолютно идентичные строки с одинаковым периодом и ключевыми полями. Это вызывает ошибку уникальности индекса СУБД (в SQL — Violation of PRIMARY KEY constraint).
Как решить проблему слияния: перед запуском обработки слияния необходимо зайти в указанный в ошибке регистр сведений, найти записи, принадлежащие удаляемой (дублирующей) организации, и вручную удалить их. После очистки конфликтующих записей в периодических регистрах стандартное объединение пройдет успешно. Для полной очистки сведений и документов по лишней организации можно использовать обработку для удаления данных по организации в БП 3.0 и ЗУП 3.1.
Многие пользователи считают, что для устранения дублей обязательно нужно удалять и заново настраивать синхронизацию. Однако можно воспользоваться штатным механизмом интерактивного сопоставления данных. Посмотрим, как это сделать:
Организации.При использовании современного формата обмена EnterpriseData информация о сопоставлении объектов по внутренним уникальным идентификаторам больше не хранится в старом регистре СоответствияОбъектовИнформационныхБаз (именно поэтому он часто оказывается пустым). Теперь за это отвечает регистр сведений ПубличныеИдентификаторыСинхронизируемыхОбъектов.
Если автоматическое сопоставление не срабатывает, мы можем прописать связь между объектами напрямую в этот регистр. Для этого выполните следующие действия:
ПубличныеИдентификаторыСинхронизируемыхОбъектов.Организации в текущей базе, а в поле «Идентификатор» (в формате GUID) вставьте скопированный уникальный идентификатор из БП.Этот способ мгновенно и навсегда связывает объекты между базами без необходимости запуска тяжелых процедур сопоставления.
Если вы хотите решить проблему радикально на уровне базы данных, но опасаетесь «битых ссылок» (объектов вида <Объект не найден>), мы можем применить продвинутую методику безопасной подмены GUID. Напрямую менять GUID у элемента, по которому уже проведены сотни документов, крайне опасно. Поэтому рассмотрим более изящный алгоритм. Для устранения уже возникших повреждений ссылочной структуры можно использовать инструмент для восстановления битых ссылок.
Посмотрим на пример программного создания элемента с предопределенным GUID. Мы напишем небольшую внешнюю обработку, которая создаст в ЗУП 3.1 пустую карточку организации, но присвоит ей GUID организации из БП 3.0.
Сначала получим GUID организации из БП 3.0 (код выполняется в контексте БП):
СсылкаНаОрг = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701010101");
Если НЕ СсылкаНаОрг.Пустая() Тогда
УникальныйИдентификаторБП = Строка(СсылкаНаОрг.УникальныйИдентификатор());
Сообщить("GUID организации в БП: " + УникальныйИдентификаторБП);
КонецЕсли;
Теперь в базе ЗУП 3.1 выполним код, который создаст временную организацию-заготовку с точно таким же GUID:
// Вставьте полученный из БП GUID в строку ниже
СтрокаGUID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
// Проверим, нет ли уже объекта с таким идентификатором в ЗУП
СсылкаНаСуществующий = Справочники.Организации.ПолучитьСсылка(НовыйGUID);
// Если объект не существует, создаем его программно
НоваяОрганизация = Справочники.Организации.СоздатьЭлемент();
НоваяОрганизация.УстановитьСсылкуНового(СсылкаНаСуществующий);
НоваяОрганизация.Наименование = "Временная Организация (Синхронизация)";
НоваяОрганизация.ИНН = "7701010101";
НоваяОрганизация.КПП = "770101001";
НоваяОрганизация.Записать();
Сообщить("Временный элемент успешно создан с GUID базы БП!");
После выполнения этого кода в ЗУП 3.1 у нас появятся две организации:
Теперь нам остается лишь запустить стандартную обработку «Поиск и удаление дублей». В качестве Оригинала мы принудительно выбираем только что созданную временную организацию (так как у нее правильный GUID для будущих обменов), а в качестве Дубля — старую рабочую организацию. Обработка перенесет все документы, регистры и настройки со старой организации на новую. После завершения слияния синхронизация будет проходить идеально, так как GUID совпадут на 100%.
Если база данных работает в файловом режиме или у вас нет возможности запускать программный код, разберем по шагам классический и надежный метод полной перенастройки синхронизации с ручным сопоставлением:
Организации в обеих базах (предварительно перенеся ссылки на оригиналы).Организации.Мы подробно разобрали все возможные варианты борьбы с дублированием организаций при интеграции БП 3.0 и ЗУП 3.1. Выберите подходящий вам метод в зависимости от уровня доступа к базе данных и масштаба накопившихся ошибок.