В процессе работы с типовыми конфигурациями на платформе 1С:Предприятие 8.3 (такими как БП 3.0 или ЗУП 3.1) разработчики иногда сталкиваются с крайне неприятной ситуацией: метод ФабрикаXDTO.Тип() внезапно начинает возвращать Неопределено для стандартных пакетов, которые точно присутствуют в конфигурации. Проблема может проявляться бессистемно, в отдельных сеансах или фоновых заданиях, что затрудняет диагностику. В этой статье мы подробно разберем причины такого поведения платформы и рассмотрим пошаговые инструкции по устранению данной ошибки.
Первым делом проанализируем ситуацию: почему глобальная ФабрикаXDTO, которая должна инициализироваться при старте сеанса всеми метаданными конфигурации, вдруг "теряет" часть типов? Выясним основные причины, которые приводят к такому состоянию системы:
rphost, внутренние таблицы метаданных в памяти сервера могут обновиться некорректно. "Призраки" старых метаданных мешают корректному построению дерева типов XDTO.snccntx и config) может содержать неактуальные или поврежденные данные о схемах XDTO, что приводит к тому, что метод Тип() не находит соответствия.Рассмотрим самый простой и эффективный метод "лечения" — выполнение полного структурного обновления конфигурации. Это позволяет системе заново переиндексировать все объекты метаданных и пересобрать фабрику XDTO.
Для этого выполним следующие действия:
.cf, а затем загрузим её обратно через меню "Конфигурация — Загрузить конфигурацию из файла". Это принудительно обновит всю структуру метаданных.Если структурное обновление не помогает, проанализируем состояние серверного кэша. Проблема часто локализована именно на стороне рабочих процессов сервера 1С. Разберем шаги по очистке кэша:
Важно: Данная операция требует остановки службы 1C:Enterprise 8.3 Server Agent.
C:\Program Files\1cv8\srvinfo или %ProgramData%\1C\1cv8).reg_1541).snccntx (кэш сеансовых данных) и config.Посмотрим на пример кода, который поможет нам понять, видит ли система пакет в принципе, или проблема только в методе Тип(). Если стандартный вызов не срабатывает, попробуем выполнить поиск типа через перебор всех доступных пакетов фабрики:
// Попытка получить тип стандартным способом
ТипОбъекта = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Номенклатура");
Если ТипОбъекта = Неопределено Тогда
// Если стандартный метод подвел, проверим наличие пакета в коллекции
Для Каждого ТекущийПакет Из ФабрикаXDTO.Пакеты Цикл
Если ТекущийПакет.URIПространстваИмен = "http://v8.1c.ru/8.1/data/enterprise/current-config" Тогда
// Пакет найден, пытаемся получить тип напрямую из него
ТипОбъекта = ТекущийПакет.Получить("CatalogObject.Номенклатура");
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ТипОбъекта = Неопределено Тогда
Сообщить("Критическая ошибка: Тип XDTO не обнаружен даже после перебора пакетов!");
КонецЕсли;
Проанализируем ситуацию: если через перебор ФабрикаXDTO.Пакеты тип находится, значит проблема в индексации типов внутри фабрики. Если же пакета нет вовсе — это признак того, что платформа исключила целую ветку метаданных из текущего сеанса.
Для того чтобы минимизировать риск возникновения подобных сбоев в будущем, рекомендуем придерживаться следующих правил:
Таким образом, мы выяснили, что "невидимость" пакетов XDTO — это чаще всего следствие нарушения целостности серверного кэша или результат некорректного динамического обновления. Использование структурного обновления и регулярная очистка кэша позволяют полностью устранить эту проблему.