При работе с современными типовыми конфигурациями на платформе 1С:Предприятие 8.3, построенными на базе Библиотеки стандартных подсистем (БСП), программисты часто сталкиваются с трудностями при отладке процедур обновления. Основная сложность заключается в том, что обработчики обновления запускаются в фоновых заданиях. Если в процессе возникает ошибка, обычная точка останова не срабатывает, а текст ошибки в журнале регистрации может быть недостаточно информативным. Рассмотрим, как эффективно отлаживать такие процессы и разберем конкретную ошибку: Тип не является подмножеством типа значений плана видов характеристик.
Проанализируем типичный сценарий: при выполнении обновления информационной базы система выдает критическую ошибку в одном из общих модулей. Стек вызовов указывает на строку, где происходит попытка присвоения нового ОписаниеТипов объекту ПланВидовХарактеристик. Однако, установив точку останова, мы замечаем, что конфигуратор ее игнорирует, а ошибка продолжает появляться. Выясним причину: современные конфигурации используют многопоточное обновление. Основной сеанс лишь инициирует процесс, а реальную работу выполняют фоновые задания на сервере. Чтобы «поймать» выполнение кода, нам нужно заставить систему работать в одном потоке или правильно настроить подключение отладчика к серверным процессам.
Самый простой и надежный способ для конфигураций на базе БСП — использование специального ключа запуска. Разберем по шагам, как это сделать. В БСП предусмотрен механизм, который при наличии определенного параметра в командной строке отключает фоновое выполнение обработчиков обновления и запускает их последовательно в текущем сеансе.
Для активации этого режима выполним следующие действия:
/C РежимОтладки (обратите внимание, что буква C — латинская).Теперь все процедуры обновления будут выполняться в контексте вашего клиентского сеанса. Это позволит использовать обычные точки останова в конфигураторе без дополнительных манипуляций с настройками сервера.
Если по каким-то причинам использование ключа /C невозможно, рассмотрим, как настроить полноценную отладку на сервере. Посмотрим на необходимые условия:
Во-первых, сервер 1С должен быть запущен в режиме отладки. Для этого в строке запуска службы сервера должен присутствовать ключ -debug. Если используется современный протокол HTTP, убедитесь, что настроен ключ -http.
Во-вторых, в конфигураторе необходимо выполнить следующие настройки:
После этого, как только фоновое задание дойдет до проблемного участка кода, конфигуратор автоматически «подцепится» к нему и прервет выполнение на точке останова или в момент возникновения исключения.
Иногда полезно запустить отложенные обработчики обновления вручную, чтобы контролировать процесс. Проанализируем пример кода, который можно выполнить во внешней обработке для инициации обновления в текущем потоке:
// Вызов метода БСП для выполнения отложенного обновления прямо сейчас
ОбновлениеИнформационнойБазыСлужебный.ВыполнитьОтложенноеОбновлениеСейчас();
Этот метод позволяет избежать создания множества фоновых потоков и упрощает отслеживание переменных в стеке вызовов.
Теперь выясним причину конкретной ошибки, упомянутой в теме. Ошибка Тип не является подмножеством типа значений плана видов характеристик возникает в момент выполнения кода:
ОбъектПВХ.ТипЗначения = Новый ОписаниеТипов(МассивТипов);
Это означает, что в МассивТипов попал какой-то тип (например, ссылка на новый справочник), который не разрешен в метаданных данного ПланВидовХарактеристик. В 1С ПВХ имеет жестко заданный список типов в свойстве Тип значения. Если вы программно пытаетесь назначить тип, который не отмечен «галочкой» в конфигураторе, платформа выбросит исключение.
Чтобы найти «виновника», разберем по шагам алгоритм диагностики с помощью расширения или модификации кода:
// Пример кода для поиска ошибочного типа
МассивТипов = ПолучитьМассивТиповДляОбновления(); // Ваш исходный массив
МассивТиповНакопительный = Новый Массив;
Для Каждого ТекТип Из МассивТипов Цикл
МассивТиповНакопительный.Добавить(ТекТип);
Попытка
// Пытаемся установить накопительный массив
ОбъектПВХ.ТипЗначения = Новый ОписаниеТипов(МассивТиповНакопительный);
Исключение
// Как только возникла ошибка, мы нашли проблемный тип
ТекстОшибки = "Ошибка вызвана типом: " + Строка(ТекТип);
ЗаписьЖурналаРегистрации("ОбновлениеПВХ", УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
КонецЦикла;
Если вы обнаружили, какой именно тип вызывает сбой, рассмотрите два пути решения:
ПланВидовХарактеристик. Нужно зайти в конфигуратор, найти соответствующий ПВХ и добавить новый тип в список разрешенных.ЗначениеВСтрокуВнутр(), чтобы проанализировать содержимое массива типов в журнале регистрации. Если там встречается объект {"#",...} с идентификатором, которого нет в базе, это признак нарушения логической целостности.Помните, что при работе с ОписаниеТипов важно также проверять наличие Неопределено или пустых значений в массиве, так как они могут интерпретироваться платформой неоднозначно в контексте ПВХ.
Используя комплексный подход — от правильной настройки протоколов отладки (HTTP/TCP) до детального анализа типов через Попытка...Исключение, мы можем решить любую проблему в механизмах обновления современных конфигураций 1С.