При настройке обмена данными между конфигурациями 1С (например, между «Управление торговлей» и «Бухгалтерия предприятия 3.0») разработчики часто сталкиваются с неприятной ситуацией. При загрузке данных система выдает критическую ошибку: «Значение поля "Код" не уникально» для справочника Валюты. При этом правила обмена кажутся настроенными корректно, а в самом правиле конвертации объектов (ПКО) для валют прописан поиск по коду.
В этой статье мы подробно разберем, почему возникает подобное поведение платформы, как функционирует механизм поиска по умолчанию в «Конвертации данных 2.1» (КД 2.1), и как быстро локализовать и устранить ошибку дублирования элементов при выгрузке по ссылке.
Справочник Валюты (как и многие другие классификаторы, например, КлассификаторЕдиницИзмерения или СтраныМира) имеет важную особенность. Элементы этого справочника в разных базах создаются независимо — либо вручную пользователями, либо загрузкой из общего классификатора 1С. Из-за этого одна и та же валюта (например, Рубль с кодом 643 или Доллар с кодом 840) в базе-источнике и базе-приемнике будет иметь разные уникальные идентификаторы (UUID / GUID), несмотря на абсолютно идентичные коды и наименования.
Посмотрим, как стандартный алгоритм КД 2.1 обрабатывает поиск таких объектов при загрузке:
Валюты. При попытке записать новую карточку с кодом «643» СУБД блокирует транзакцию, так как элемент с таким кодом уже существует в базе-приемнике. Возникает системная ошибка нарушения уникальности.Рассмотрим по шагам, как исправить эту логику и заставить систему работать корректно.
Для правильного сопоставления элементов классификаторов необходимо полностью исключить поиск по внутреннему идентификатору. Проанализируем настройки ПКО в КД 2.1:
Валюты.Код установите флаг «Поиск».Также для справочников-классификаторов крайне рекомендуется устанавливать флаг «Не создавать новый объект в приемнике, если он НЕ найден». Предполагается, что все необходимые валюты уже заведены в вашей рабочей базе-приемнике. Если по какой-то причине валюта из источника не сопоставится, система не будет пытаться создать дубль, а просто пропустит заполнение этого реквизита, не прерывая процесс загрузки остальных данных.
Часто разработчики сталкиваются с ситуацией: при выгрузке непосредственно справочника Валюты всё проходит без ошибок, но при переносе документов (например, ПоступлениеТоваровУслуг или ПриходныйКассовыйОрдер) ошибка неуникальности кода возвращается. Это говорит о том, что при выгрузке документа ссылка на валюту обрабатывается не тем правилом конвертации, которое мы настроили на Шаге 1.
Выясним причину этой проблемы. При автоматической генерации правил КД 2.1 могла создать несколько ПКО для одного и того же объекта-приемника или привязать свойства документов к некорректному ПКО. Чтобы быстро найти проблемное правило, используем несколько методов.
Это самый быстрый ручной способ, не требующий запуска конфигуратора.
643 или 810).<Ссылка>, описывающий данную валюту. Он будет выглядеть примерно так:
<Ссылка Текст="643">
<Свойство Имя="Код" Тип="Строка">
<Значение>643</Значение>
</Свойство>
</Ссылка>
Внимательно изучите атрибуты этого узла. Найдите параметр ИмяПравила="...". Если там указано другое имя ПКО (не то, которое вы настраивали) или имя правила вовсе отсутствует, значит, в правилах конвертации свойств ваших документов допущена ошибка.
Для исправления привязки правил выполним следующие действия внутри КД 2.1:
СправочникСсылка.Валюты. Убедитесь, что у вас существует ровно одно активное правило для этого справочника. Если их несколько, удалите лишние или проверьте их приоритеты.СправочникСсылка.Валюты (например, реквизиты «Валюта», «ВалютаДокумента», «ВалютаВзаиморасчетов»).Если автоматический поиск по полям всё равно сбоит, мы можем жестко переопределить поведение платформы с помощью перегрузки обработчика событий в ПКО Валюты.
Валюты.
Если СвойстваПоиска.Свойство("Код") <> Неопределено Тогда
СтрокаИменСвойствПоиска = "Код";
КонецЕсли;
Этот простой скрипт указывает платформе игнорировать любые другие сопоставления (например, по наименованию) и выполнять поиск элемента строго по его трехзначному коду.
Если визуальный анализ правил не дает результатов, применим встроенный механизм отладки загрузки КД 2.1. Разберем этот процесс по шагам:
УниверсальныйОбменДаннымиXML в базе-приемнике в режиме «1С:Предприятие».ПоляПоиска для справочника Валюты.СвойстваПоиска и значение переменной ИмяПКО. Это позволит со 100% точностью увидеть, из какого именно объекта пришел запрос на поиск валюты и какие параметры поиска были переданы.Применение этих комплексных мер гарантирует успешную синхронизацию справочника валют и исключает появление ошибок дублирования кодов в вашей базе данных 1С.