Как исправить ошибку «Тип не определен» при синхронизации УТ и БП?

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

При выполнении обмена данными между конфигурациями «Управление торговлей» и «Бухгалтерия предприятия» после обновления одной из баз нередко возникает критический сбой. В журнале регистрации или в окне сообщений появляется ошибка следующего вида: Ошибка при загрузке данных: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(12639)}: Тип не определен (СправочникСсылка.ВидыАлкогольнойПродукции). Выясним причину этой неполадки и подробно разберем все способы её устранения.

Почему возникает ошибка: анализируем механизм платформы

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


Пока ФайлОбмена.Прочитать() Цикл
    ИмяУзла = ФайлОбмена.ЛокальноеИмя;
    Если ИмяУзла = "ТипДанных" Тогда
        ИмяТипа = одАтрибут(ФайлОбмена, ТипСтрока, "Имя");
        СоответствиеТипа = Новый Соответствие;
        СоответствиеТиповДанныхДляЗагрузки.Вставить(Тип(ИмяТипа), СоответствиеТипа);
        ЗагрузитьСоответствиеТиповДляОдногоТипа(ФайлОбмена, СоответствиеТипа);
    ИначеЕсли (ИмяУзла = "ИнформацияОТипахДанных") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда
        Прервать;
    КонецЕсли;
КонецЦикла;

Рассмотрим детально, как работают механизмы платформы 1С:Предприятие в этой точке:

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

Способ 1. Корректировка правил конвертации вручную или через «Конвертацию данных»

Разберем самый быстрый способ исправления, если правила обмена уже выгружены в файл формата XML.

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

Способ 2. Использование штатных правил из каталога обновления

Если конфигурация-источник типовая или в ней не дорабатывались переносимые объекты, воспользуемся готовыми правилами от разработчиков «1С»:

  1. Перейдем в каталог шаблонов обновлений конфигурации (обычно это путь вида tmplts\1c\Accounting\<номер_релиза>\Обмены Данными\...).
  2. Найдем готовый протестированный файл правил (например, ПравилаОбмена_УТ10_БП30.xml или аналогичный для вашей пары релизов).
  3. В базе откроем форму параметров синхронизации данных и загрузим комплект правил из файла. Это гарантирует совпадение всех имен метаданных с актуальным релизом конфигурации-приемника.

Способ 3. Программная доработка модуля загрузки через обработку исключений

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


Пока ФайлОбмена.Прочитать() Цикл
    ИмяУзла = ФайлОбмена.ЛокальноеИмя;
    Если ИмяУзла = "ТипДанных" Тогда
        ИмяТипа = одАтрибут(ФайлОбмена, ТипСтрока, "Имя");
        СоответствиеТипа = Новый Соответствие;
        
        Попытка
            СоответствиеТиповДанныхДляЗагрузки.Вставить(Тип(ИмяТипа), СоответствиеТипа);
            ЗагрузитьСоответствиеТиповДляОдногоТипа(ФайлОбмена, СоответствиеТипа);
        Исключение
            // Тип не найден в метаданных текущей конфигурации — пропускаем его инициализацию
            Продолжить;
        КонецПопытки;
        
    ИначеЕсли (ИмяУзла = "ИнформацияОТипахДанных") И (ФайлОбмена.ТипУзла = ТипУзлаXMLКонецЭлемента) Тогда
        Прервать;
    КонецЕсли;
КонецЦикла;

Такая доработка позволяет базе-приемнику игнорировать отсутствующие типы в заголовке файла обмена и продолжать загрузку остальных документов и справочников.

Способ 4. Отключение использования оптимизированного формата

Рассмотрим вариант обхода инициализации блока типов. В настройках выгрузки правил конвертации данных (в обработке выгрузки или на вкладке параметров в «Конвертации данных») снимем флаг Использовать оптимизированный формат.

В этом случае секция ИнформацияОТипахДанных не будет формироваться при выгрузке пакета. Платформа станет определять типы объектов непосредственно в момент их чтения. Если конкретные элементы удаленного справочника фактически не передаются, ошибка вовсе не возникнет.

Что делать, если после исправления обмена задваиваются группы номенклатуры?

Нередко после восстановления правил пользователи сталкиваются с тем, что папки (группы) справочника «Номенклатура» создаются повторно. Разберем, как устранить эту проблему:

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