Как исправить дублирование справочника «Валюты» и ошибку неуникальности кода при обмене в «Конвертации данных 2.1»?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При настройке обмена данными между конфигурациями 1С (например, между «Управление торговлей» и «Бухгалтерия предприятия 3.0») разработчики часто сталкиваются с неприятной ситуацией. При загрузке данных система выдает критическую ошибку: «Значение поля "Код" не уникально» для справочника Валюты. При этом правила обмена кажутся настроенными корректно, а в самом правиле конвертации объектов (ПКО) для валют прописан поиск по коду.

В этой статье мы подробно разберем, почему возникает подобное поведение платформы, как функционирует механизм поиска по умолчанию в «Конвертации данных 2.1» (КД 2.1), и как быстро локализовать и устранить ошибку дублирования элементов при выгрузке по ссылке.

Почему возникает дублирование и ошибка неуникальности кода?

Справочник Валюты (как и многие другие классификаторы, например, КлассификаторЕдиницИзмерения или СтраныМира) имеет важную особенность. Элементы этого справочника в разных базах создаются независимо — либо вручную пользователями, либо загрузкой из общего классификатора 1С. Из-за этого одна и та же валюта (например, Рубль с кодом 643 или Доллар с кодом 840) в базе-источнике и базе-приемнике будет иметь разные уникальные идентификаторы (UUID / GUID), несмотря на абсолютно идентичные коды и наименования.

Посмотрим, как стандартный алгоритм КД 2.1 обрабатывает поиск таких объектов при загрузке:

  1. Если в ПКО установлен флаг «Искать объект приемника по внутреннему идентификатору», система в первую очередь пытается найти элемент в базе-приемнике по UUID, пришедшему из источника.
  2. Так как UUID в базах различаются, поиск по идентификатору завершается неудачей.
  3. Если при этом включен поиск по полям поиска (по коду), система должна перейти к следующему шагу. Однако, если настройки поиска пересекаются или правила конвертации свойств (ПКС) настроены некорректно, система решает, что перед ней абсолютно новый объект.
  4. Платформа инициирует создание нового элемента справочника Валюты. При попытке записать новую карточку с кодом «643» СУБД блокирует транзакцию, так как элемент с таким кодом уже существует в базе-приемнике. Возникает системная ошибка нарушения уникальности.

Рассмотрим по шагам, как исправить эту логику и заставить систему работать корректно.

Шаг 1. Корректная настройка ПКО для справочника «Валюты»

Для правильного сопоставления элементов классификаторов необходимо полностью исключить поиск по внутреннему идентификатору. Проанализируем настройки ПКО в КД 2.1:

  1. Откройте вашу конфигурацию «Конвертация данных 2.1» и перейдите в список ПКО.
  2. Найдите правило конвертации для справочника Валюты.
  3. На вкладке «Настройки» снимите флаг «Искать объект приемника по внутреннему идентификатору».
  4. Обратите внимание, что флаг «Продолжить поиск по полям поиска, если по идентификатору не найден» после этого станет недоступным. Это корректное поведение системы — теперь поиск будет осуществляться только по ключевым реквизитам.
  5. В табличной части ПКС для реквизита Код установите флаг «Поиск».

Также для справочников-классификаторов крайне рекомендуется устанавливать флаг «Не создавать новый объект в приемнике, если он НЕ найден». Предполагается, что все необходимые валюты уже заведены в вашей рабочей базе-приемнике. Если по какой-то причине валюта из источника не сопоставится, система не будет пытаться создать дубль, а просто пропустит заполнение этого реквизита, не прерывая процесс загрузки остальных данных.

Шаг 2. Локализация скрытой проблемы (Выгрузка по ссылке)

Часто разработчики сталкиваются с ситуацией: при выгрузке непосредственно справочника Валюты всё проходит без ошибок, но при переносе документов (например, ПоступлениеТоваровУслуг или ПриходныйКассовыйОрдер) ошибка неуникальности кода возвращается. Это говорит о том, что при выгрузке документа ссылка на валюту обрабатывается не тем правилом конвертации, которое мы настроили на Шаге 1.

Выясним причину этой проблемы. При автоматической генерации правил КД 2.1 могла создать несколько ПКО для одного и того же объекта-приемника или привязать свойства документов к некорректному ПКО. Чтобы быстро найти проблемное правило, используем несколько методов.

Метод 1. Анализ XML-файла выгрузки

Это самый быстрый ручной способ, не требующий запуска конфигуратора.

  1. Сформируйте небольшой файл выгрузки (достаточно выгрузить один документ, при проведении которого возникает ошибка).
  2. Откройте полученный XML-файл в текстовом редакторе (например, Notepad++).
  3. Выполните поиск по коду валюты, на который ругается система (например, 643 или 810).
  4. Найдите узел <Ссылка>, описывающий данную валюту. Он будет выглядеть примерно так:

<Ссылка Текст="643">
    <Свойство Имя="Код" Тип="Строка">
        <Значение>643</Значение>
    </Свойство>
</Ссылка>

Внимательно изучите атрибуты этого узла. Найдите параметр ИмяПравила="...". Если там указано другое имя ПКО (не то, которое вы настраивали) или имя правила вовсе отсутствует, значит, в правилах конвертации свойств ваших документов допущена ошибка.

Метод 2. Глобальная проверка ПКС в Конвертации Данных

Для исправления привязки правил выполним следующие действия внутри КД 2.1:

  1. Перейдите к списку ПКО и сделайте отбор по объекту-приемнику СправочникСсылка.Валюты. Убедитесь, что у вас существует ровно одно активное правило для этого справочника. Если их несколько, удалите лишние или проверьте их приоритеты.
  2. Перейдите к правилам конвертации свойств (ПКС) для документов, у которых есть реквизиты с типом СправочникСсылка.Валюты (например, реквизиты «Валюта», «ВалютаДокумента», «ВалютаВзаиморасчетов»).
  3. Проверьте, чтобы в колонке «Правило конвертации» для каждого такого свойства было явно указано ваше настроенное ПКО для валют. Если поле оставлено пустым, КД 2.1 попытается определить правило автоматически во время выгрузки, что часто приводит к использованию неверных алгоритмов поиска.

Шаг 3. Использование обработчика «Поля поиска»

Если автоматический поиск по полям всё равно сбоит, мы можем жестко переопределить поведение платформы с помощью перегрузки обработчика событий в ПКО Валюты.

  1. Откройте ПКО Валюты.
  2. Перейдите на вкладку «Обработчики событий» и найдите событие «Поля поиска».
  3. Пропишем код, который принудительно заставит систему производить сопоставление исключительно по коду валюты:

Если СвойстваПоиска.Свойство("Код") <> Неопределено Тогда
    СтрокаИменСвойствПоиска = "Код";
КонецЕсли;

Этот простой скрипт указывает платформе игнорировать любые другие сопоставления (например, по наименованию) и выполнять поиск элемента строго по его трехзначному коду.

Шаг 4. Отладка загрузки с помощью внешнего модуля

Если визуальный анализ правил не дает результатов, применим встроенный механизм отладки загрузки КД 2.1. Разберем этот процесс по шагам:

  1. Откройте обработку УниверсальныйОбменДаннымиXML в базе-приемнике в режиме «1С:Предприятие».
  2. Перейдите на вкладку «Параметры отладки».
  3. Установите флаг «Режим отладки загрузки». Система предложит вам выгрузить код обработчиков во внешний модуль (текстовый файл или обработку). Выполните это действие.
  4. Откройте базу-приемник в режиме Конфигуратора, откройте сохраненный файл отладки и установите точку останова в событии ПоляПоиска для справочника Валюты.
  5. Запустите загрузку данных. При остановке конфигуратора проанализируйте содержимое коллекции СвойстваПоиска и значение переменной ИмяПКО. Это позволит со 100% точностью увидеть, из какого именно объекта пришел запрос на поиск валюты и какие параметры поиска были переданы.

Применение этих комплексных мер гарантирует успешную синхронизацию справочника валют и исключает появление ошибок дублирования кодов в вашей базе данных 1С.

← На главную