При настройке обмена данными между 1С:Управление нашей фирмой (УНФ) 1.6 и 1С:Бухгалтерия предприятия (БП) 3.0 пользователи часто сталкиваются с ошибкой синхронизации. Программа сообщает, что у одного контрагента обнаружено два юридических адреса. Эта ситуация кажется парадоксальной, так как в карточке контрагента визуально может отображаться только одна строка. В этой статье мы разберем, почему так происходит, где именно «спрятаны» лишние данные и как их корректно вычистить.
Для начала проанализируем, почему возникает конфликт. В конфигурации 1С:Бухгалтерия предприятия 3.0 контактная информация (адреса, телефоны, email) хранится в отдельном объекте — РегистрСведений.КонтактнаяИнформация. Этот регистр имеет жесткую структуру, где сочетание «Объект + Тип + Вид» должно быть уникальным. Проще говоря, у одного контрагента не может быть двух записей с видом Юридический адрес.
В то же время в 1С:УНФ 1.6 разработчики применили иной подход. Здесь контактная информация хранится непосредственно внутри справочника Контрагенты, в его табличной части, которая так и называется — КонтактнаяИнформация. В отличие от регистра сведений, табличная часть позволяет добавить сколько угодно строк с одинаковым видом адреса. Именно это различие становится «камнем преткновения»: при попытке синхронизации БП получает две строки там, где ожидает одну, и выдает ошибку.
Многие пользователи пытаются найти проблему, просто открывая форму контрагента. Однако в Управляемых формах 1С:УНФ 1.6 логика отображения адресов программно ограничена. При открытии карточки система считывает табличную часть и выводит на экран только первую найденную запись для каждого вида (Юридический, Фактический и т.д.). Вторая, третья и последующие записи того же вида остаются «под капотом», они физически существуют в базе данных, но не отображаются в интерфейсе. Рассмотрим подробнее способы, как «вытащить» эти невидимые строки и удалить их.
Прежде чем что-то удалять, нам нужно понять масштаб проблемы и найти список всех контрагентов с дублями. Для этого мы воспользуемся стандартным инструментом Универсальный отчет. Разберем настройку по шагам:
Справочник.Контрагенты.Контактная информация.Ссылка (это будет наш контрагент) и поле Вид.Количество.Количество больше 1.После формирования такого отчета мы увидим четкий список контрагентов, у которых количество записей одного вида превышает норму. Это наши кандидаты на «лечение».
Если контрагентов много, открывать каждого вручную утомительно. Посмотрим, как можно использовать обработку Групповое изменение реквизитов. Будьте осторожны: этот инструмент требует внимательности, так как неправильные действия могут привести к потере всех адресов.
Проанализируем алгоритм действий:
Контрагенты.Контактная информация.Важное замечание: Прямое удаление строк через эту обработку доступно не всегда. Чаще всего программисты используют ее для того, чтобы пометить лишние строки специальным признаком или изменить их вид на «Прочее», чтобы они перестали мешать синхронизации как «Юридические адреса».
Самый надежный и быстрый способ для тех, кто имеет доступ к консоли кода или может создать внешнюю обработку. Мы напишем небольшой скрипт, который переберет табличную часть контрагента, найдет дубли и оставит только одну, наиболее полную запись.
Рассмотрим пример кода:
// Выбираем контрагента, у которого есть дубли
Объект = КонтрагентСсылка.ПолучитьОбъект();
КоличествоАдресов = 0;
МассивСтрокНаУдаление = Новый Массив;
// Проходим по табличной части "КонтактнаяИнформация"
Для Каждого СтрокаКИ Из Объект.КонтактнаяИнформация Цикл
// Проверяем именно юридический адрес
Если СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
КоличествоАдресов = КоличествоАдресов + 1;
// Если это вторая и далее запись одного и того же вида
Если КоличествоАдресов > 1 Тогда
МассивСтрокНаУдаление.Добавить(СтрокаКИ);
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Удаляем лишние строки
Для Каждого СтрокаДляУдаления Из МассивСтрокНаУдаление Цикл
Объект.КонтактнаяИнформация.Удалить(СтрокаДляУдаления);
КонецЦикла;
// Записываем объект, если были изменения
Если МассивСтрокНаУдаление.Количество() > 0 Тогда
Объект.Записать();
Сообщить("Дубли адресов удалены для: " + Объект.Наименование);
КонецЕсли;
В данном коде мы используем объектную модель 1С. Сначала мы идентифицируем все строки, относящиеся к юридическому адресу, а затем, начиная со второй найденной строки, добавляем их в массив для удаления. Это гарантирует, что одна (первая) запись всегда останется в базе.
Разберем еще один важный нюанс, который часто упускают. В табличной части КонтактнаяИнформация адрес может храниться в двух форматах одновременно: как простая строка текста (поле Представление) и как структурированные данные XML/JSON (поле ЗначенияПолей).
При очистке дублей обязательно проверьте, какую именно строку вы оставляете. Синхронизация с БП 3.0 крайне чувствительна к качеству данных. Если в одной строке адрес заполнен просто текстом «Москва, ул. Ленина», а во второй он разобран по полям (индекс, город, улица), то оставить нужно именно вторую строку. В формате XDTO (структурированном) информация гораздо важнее для корректного формирования отчетности в Бухгалтерии.
Иногда причина кроется глубже. Выясним, не задублированы ли сами Виды контактной информации. Перейдите в этот справочник и убедитесь, что в группе «Контрагенты» существует только один элемент с названием «Юридический адрес» и он является предопределенным (отмечен желтым шариком в списке). Если вы обнаружите два элемента с одинаковым названием, один из которых создан пользователем, это и будет причиной постоянного появления дублей. В этом случае нужно перенести все данные на предопределенный вид и удалить дубль самого элемента справочника.
Мы проанализировали проблему дублей адресов в 1С:УНФ 1.6 и выяснили, что основной причиной является архитектурное решение хранения данных в табличной части. Для успешного решения задачи мы:
После удаления лишних строк из табличной части справочника Контрагенты, регистрация изменений для синхронизации должна пройти успешно, и ошибка в 1С:Бухгалтерии исчезнет. Рекомендуется выполнять подобные операции на копии базы данных и после завершения очистки запустить полное тестирование и исправление информационной базы.