Как перенести данные между идентичными базами 1С и исправить ошибку «Не уникальный ИНН»?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Рассмотрим подробнее причины возникновения этой проблемы и разберем по шагам доступные варианты её решения.

Выясним причину ошибки при загрузке

Проблема возникает в момент записи элемента справочника Контрагенты при загрузке из XML-файла. Разберем основные факторы, приводящие к сбою:

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

Способ 1. Учет флага режима загрузки и временное отключение проверки ИНН

Если нам требуется разово догрузить документы в копию базы, проще всего отключить или скорректировать подпрограмму проверки уникальности ИНН на время переноса.

Проанализируем ситуацию: при программной загрузке обмена устанавливается флаг ОбменДанными.Загрузка = Истина. Стандартный код конфигурации должен пропускать пользовательские проверки, если данный флаг равен Истина.

Если в конфигурации проверка прописана жестко без учета режима обмена, откроем модуль объекта справочника Контрагенты (или модуль соответствующей подписки на событие) и добавим условие в начале процедуры ПередЗаписью:


Процедура ПередЗаписью(Отказ)
    
    // Если происходит автоматическая загрузка данных, отменяем пользовательские проверки
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Стандартный код проверки уникальности ИНН
    // ...
    
КонецПроцедуры

Если внесение изменений в код нежелательно, можно временно закомментировать вызов функции проверки уникальности ИНН в копии базы на период переноса данных, а после успешной загрузки вернуть исходный код обратно.

Способ 2. Настройка правил в «1С:Конвертации данных»

Если обмен выполняется с помощью правил, сформированных в конфигурации «Конвертация данных» (КД), проанализируем настройки правила конвертации объектов (ПКО) для справочника Контрагенты:

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

Объект.ОбменДанными.Загрузка = Истина;

Способ 3. Использование обработки «ВыгрузкаЗагрузкаДанныхXML»

Для полностью идентичных конфигураций с одинаковой структурой метаданных предпочтительнее использовать специализированную обработку ВыгрузкаЗагрузкаДанныхXML.epf вместо универсального обмена по правилам.

Разберем порядок действий при работе с этой обработкой:

  1. Запустим обработку ВыгрузкаЗагрузкаДанныхXML.epf в базе-источнике.
  2. Выберем необходимые типы документов и зададим период выгрузки.
  3. Снимем лишние галочки выгрузки связанных объектов по ссылке, чтобы избежать затягивания всей истории справочников за предыдущие годы.
  4. Выполним выгрузку в XML-файл.
  5. Запустим эту же обработку в базе-приемнике и выполним загрузку, предварительно отключив жесткие проверки в коде, как описано в первом способе.

Данный подход существенно сокращает время выгрузки за счет отсутствия сложной логики правил конвертации и переносит данные напрямую по УИД объектов.

← На главную