Как отлаживать фоновые задания при обновлении и исправить ошибку типа в Плане видов характеристик

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

При работе с современными типовыми конфигурациями на платформе 1С:Предприятие 8.3, построенными на базе Библиотеки стандартных подсистем (БСП), программисты часто сталкиваются с трудностями при отладке процедур обновления. Основная сложность заключается в том, что обработчики обновления запускаются в фоновых заданиях. Если в процессе возникает ошибка, обычная точка останова не срабатывает, а текст ошибки в журнале регистрации может быть недостаточно информативным. Рассмотрим, как эффективно отлаживать такие процессы и разберем конкретную ошибку: Тип не является подмножеством типа значений плана видов характеристик.

Анализ ситуации и причины «неуловимой» ошибки

Проанализируем типичный сценарий: при выполнении обновления информационной базы система выдает критическую ошибку в одном из общих модулей. Стек вызовов указывает на строку, где происходит попытка присвоения нового ОписаниеТипов объекту ПланВидовХарактеристик. Однако, установив точку останова, мы замечаем, что конфигуратор ее игнорирует, а ошибка продолжает появляться. Выясним причину: современные конфигурации используют многопоточное обновление. Основной сеанс лишь инициирует процесс, а реальную работу выполняют фоновые задания на сервере. Чтобы «поймать» выполнение кода, нам нужно заставить систему работать в одном потоке или правильно настроить подключение отладчика к серверным процессам.

Метод 1: Использование параметра запуска РежимОтладки

Самый простой и надежный способ для конфигураций на базе БСП — использование специального ключа запуска. Разберем по шагам, как это сделать. В БСП предусмотрен механизм, который при наличии определенного параметра в командной строке отключает фоновое выполнение обработчиков обновления и запускает их последовательно в текущем сеансе.

Для активации этого режима выполним следующие действия:

  1. Откроем окно запуска 1С и выберем нужную информационную базу.
  2. Нажмем кнопку Изменить и перейдем на последнюю страницу настроек (Дополнительные параметры запуска).
  3. В поле введем текст: /C РежимОтладки (обратите внимание, что буква C — латинская).
  4. Запустим базу в режиме «Предприятие».

Теперь все процедуры обновления будут выполняться в контексте вашего клиентского сеанса. Это позволит использовать обычные точки останова в конфигураторе без дополнительных манипуляций с настройками сервера.

Метод 2: Настройка отладчика для фоновых заданий

Если по каким-то причинам использование ключа /C невозможно, рассмотрим, как настроить полноценную отладку на сервере. Посмотрим на необходимые условия:

Во-первых, сервер 1С должен быть запущен в режиме отладки. Для этого в строке запуска службы сервера должен присутствовать ключ -debug. Если используется современный протокол HTTP, убедитесь, что настроен ключ -http.

Во-вторых, в конфигураторе необходимо выполнить следующие настройки:

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

Метод 3: Принудительный запуск обновления через внешнюю обработку

Иногда полезно запустить отложенные обработчики обновления вручную, чтобы контролировать процесс. Проанализируем пример кода, который можно выполнить во внешней обработке для инициации обновления в текущем потоке:


// Вызов метода БСП для выполнения отложенного обновления прямо сейчас
ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас();

Этот метод позволяет избежать создания множества фоновых потоков и упрощает отслеживание переменных в стеке вызовов.

Разбор ошибки: Тип не является подмножеством типа значений ПВХ

Теперь выясним причину конкретной ошибки, упомянутой в теме. Ошибка Тип не является подмножеством типа значений плана видов характеристик возникает в момент выполнения кода:

ОбъектПВХ.ТипЗначения = Новый ОписаниеТипов(МассивТипов);

Это означает, что в МассивТипов попал какой-то тип (например, ссылка на новый справочник), который не разрешен в метаданных данного ПланВидовХарактеристик. В 1С ПВХ имеет жестко заданный список типов в свойстве Тип значения. Если вы программно пытаетесь назначить тип, который не отмечен «галочкой» в конфигураторе, платформа выбросит исключение.

Чтобы найти «виновника», разберем по шагам алгоритм диагностики с помощью расширения или модификации кода:


// Пример кода для поиска ошибочного типа
МассивТипов = ПолучитьМассивТиповДляОбновления(); // Ваш исходный массив
МассивТиповНакопительный = Новый Массив;

Для Каждого ТекТип Из МассивТипов Цикл
    МассивТиповНакопительный.Добавить(ТекТип);
    Попытка
        // Пытаемся установить накопительный массив
        ОбъектПВХ.ТипЗначения = Новый ОписаниеТипов(МассивТиповНакопительный);
    Исключение
        // Как только возникла ошибка, мы нашли проблемный тип
        ТекстОшибки = "Ошибка вызвана типом: " + Строка(ТекТип);
        ЗаписьЖурналаРегистрации("ОбновлениеПВХ", УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);
        ВызватьИсключение ТекстОшибки;
    КонецПопытки;
КонецЦикла;

Практические советы по исправлению

Если вы обнаружили, какой именно тип вызывает сбой, рассмотрите два пути решения:

  1. Если база доработанная: Скорее всего, при добавлении новых объектов метаданных забыли обновить состав типов в ПланВидовХарактеристик. Нужно зайти в конфигуратор, найти соответствующий ПВХ и добавить новый тип в список разрешенных.
  2. Если база типовая: Возможно, данные были повреждены или в массив попадает «битая ссылка». В этом случае используйте метод ЗначениеВСтрокуВнутр(), чтобы проанализировать содержимое массива типов в журнале регистрации. Если там встречается объект {"#",...} с идентификатором, которого нет в базе, это признак нарушения логической целостности.

Помните, что при работе с ОписаниеТипов важно также проверять наличие Неопределено или пустых значений в массиве, так как они могут интерпретироваться платформой неоднозначно в контексте ПВХ.

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

← На главную