Как исправить ошибку «Недопустимое значение параметра (УникальныйИдентификатор)» при обмене между УТ и БП?

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

При настройке или обновлении обмена между конфигурациями 1С:Управление торговлей и 1С:Бухгалтерия предприятия (особенно при использовании правил на базе КД 2.0) программисты часто сталкиваются с критической ошибкой при загрузке данных. Процесс прерывается сообщением: Ошибка при вызове конструктора (УникальныйИдентификатор): Недопустимое значение параметра (параметр номер '1'). Разберем подробно, почему это происходит и как восстановить работоспособность обмена.

Анализ причины возникновения ошибки

Ошибка локализуется в модуле объекта обработки КонвертацияОбъектовИнформационныхБаз. В момент загрузки система пытается идентифицировать входящий объект. Для этого она берет строковое представление идентификатора из XML-пакета и передает его в конструктор УникальныйИдентификатор. Проанализируем строку кода, на которой происходит сбой:


СсылкаНаОбъект = СтруктураСвойств.Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СвойствоУникальныйИдентификатор));

Проблема заключается в том, что переменная СвойствоУникальныйИдентификатор оказывается пустой или содержит строку, которая не соответствует формату GUID (36 символов, разделенных дефисами). Платформа 1С в таких случаях не возвращает пустую ссылку, а генерирует исключение, которое полностью останавливает процесс синхронизации.

Как показывает практика, чаще всего это происходит не из-за ошибок в самих выгружаемых данных, а из-за накопленного «мусора» в системных таблицах базы-приемника, которые отвечают за сопоставление объектов.

Пошаговая диагностика проблемы

Если вы столкнулись с подобной ситуацией, пройдем по шагам процесса отладки, чтобы убедиться в источнике проблемы:

  1. Проверка XML-пакета: Откроем файл выгрузки (если обмен идет через файл) или перехватим сообщение обмена в отладчике. Проверим теги, содержащие {УникальныйИдентификатор}. Если все значения в файле заполнены корректно, значит проблема находится на стороне базы-приемника.
  2. Использование отладчика: Установим точку останова в базе-приемнике на строке с ошибкой. Проверим значение переменной СвойствоУникальныйИдентификатор. Если там пустая строка, необходимо подняться выше по стеку вызовов и выяснить, какой объект обрабатывается в данный момент.
  3. Анализ регистра соответствий: Основным подозреваемым является регистр сведений СоответствияОбъектовИнформационныхБаз. Именно в нем хранятся связи между объектами источника и приемника. Если для какого-то объекта запись в регистре создана некорректно (например, ссылка есть, а строковое представление идентификатора источника отсутствует), типовые механизмы обмена могут «спотыкаться» об эту запись.

Способы решения проблемы

Существует несколько вариантов исправления ситуации, от радикальных до точечных.

Способ 1. Полная очистка регистра соответствий (радикальный)

Если база небольшая или обмен настраивается заново, можно очистить регистр СоответствияОбъектовИнформационныхБаз для конкретного узла обмена. Это заставит систему при следующем обмене создать все связи заново на основании полей поиска (ИНН, КПП, Наименование, Номер, Дата).

Способ 2. Точечное удаление проблемных записей (рекомендуемый)

Чтобы не потерять уже установленные вручную или автоматически связи, проанализируем регистр программно. Нам нужно найти записи, где поле УникальныйИдентификаторИсточника (имеющее тип Строка) не заполнено или содержит невалидные данные. Рассмотрим пример кода для поиска таких записей:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Соответствия.СобственныйОбъект,
    |   Соответствия.УзелИнформационнойБазы
    |ИЗ
    |   РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК Соответствия
    |ГДЕ
    |   (Соответствия.УникальныйИдентификаторИсточника = """"
    |   ИЛИ Соответствия.УникальныйИдентификаторИсточника ЕСТЬ NULL)";

Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    // Здесь можно выполнить удаление записи из регистра
    МенеджерЗаписи = РегистрыСведений.СоответствияОбъектовИнформационныхБаз.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.СобственныйОбъект = Результат.СобственныйОбъект;
    МенеджерЗаписи.УзелИнформационнойБазы = Результат.УзелИнформационнойБазы;
    МенеджерЗаписи.Прочитать();
    Если МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.Удалить();
    КонецЕсли;
КонецЦикла;

Способ 3. Тестирование и исправление базы данных

Иногда причиной становятся «битые ссылки» (Объект не найден) в самих измерениях регистра. Выполним стандартную процедуру «Тестирование и исправление» в конфигураторе с включенными опциями:

Дополнительные рекомендации

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

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

← На главную