В процессе сопровождения систем на базе 1С:Предприятие 8.3 часто возникают ситуации, когда регламентное задание, работавшее годами, начинает выдавать ошибки. Сложность заключается в том, что такие задания выполняются в фоновом режиме, а их программный код может быть рассредоточен между основной конфигурацией, расширениями и даже внешними обработками. Рассмотрим подробно, как локализовать местонахождение кода, настроить отладку и устранить типичную ошибку преобразования типов XDTO.
Первым делом нам необходимо понять, какая именно процедура вызывается регламентным заданием. Для этого проанализируем настройки в пользовательском режиме и конфигураторе:
Если в поле указано нечто вроде ОбменДаннымиСервер.ВыполнитьОбменДаннымиПоРегламентномуЗаданию, это означает, что логика зашита в общем модуле. Однако часто бывает, что стандартный функционал переопределен в Расширениях конфигурации. Проверим наличие расширений в конфигураторе и поищем в них модули с аналогичными именами или префиксами (например, _ДДД_). Помните, что расширение может перехватывать выполнение стандартного метода с помощью аннотаций &Вместо, &Перед или &После.
Если же задание запускает внешнюю обработку, то искать ее следует в справочнике Дополнительные отчеты и обработки. В этом случае код будет находиться внутри присоединенного файла обработки, который нужно выгрузить на диск и открыть отдельно.
Иногда разработчики используют "гибкие" механизмы, где часть алгоритма хранится не в тексте модуля, а в макетах. Рассмотрим ситуацию из практики, когда в общем модуле расширения встречается следующая строка:
Выполнить(_ИмяМакета.Команда);
В данном случае функция Выполнить() исполняет произвольный программный код, который считывается из текстового макета. Чтобы найти этот код, выполним следующие шаги:
_ДДД_).Именно в этом текстовом макете будет содержаться основной алгоритм формирования данных для обмена. Проанализируем его структуру, чтобы понять, какие поля базы данных считываются и как они преобразуются в объекты XDTO.
Поскольку регламентные задания выполняются на сервере в отдельном сеансе, обычная точка останова (F9) в конфигураторе не сработает. Чтобы "поймать" момент ошибки, выполним правильную настройку отладки:
Шаг 1. Проверка параметров сервера. Убедимся, что сервер 1С:Предприятия запущен в режиме отладки. В списке процессов Windows это выглядит как наличие ключа -debug у процесса ragent.exe. Без этого отладка серверного кода невозможна.
Шаг 2. Автоматическое подключение. В конфигураторе перейдем в меню Отладка — Подключение.... В открывшемся окне нажмем кнопку Автоматическое подключение и установим флажок Фоновые задания. Теперь конфигуратор будет автоматически подключаться к любому фоновому процессу, который запускается на сервере.
Шаг 3. Остановка по ошибке. Если задание падает с ошибкой, но не останавливается на точках останова, настроим автоматическую остановку. Перейдем в Отладка — Настройка остановки по ошибке и добавим флажок Останавливаться по ошибке. Это позволит системе замереть ровно в тот момент, когда возникнет исключительная ситуация, даже если код выполняется через Выполнить().
Важное замечание по расширениям: При работе с расширениями убедитесь, что в их свойствах (в конфигураторе) снята галочка Защита от опасных действий. Если она установлена, отладчик может игнорировать код внутри расширения.
Рассмотрим причину возникновения ошибки Ошибка отображения типов: Отображение типа 'Null' в тип '{http://www.w3.org/2001/XMLSchema}string'. Эта проблема типична для интеграционных механизмов.
Выясним причину: В схеме XML (XSD-пакете) поле описано как обязательная строка. Однако при выполнении запроса в 1С для какого-то объекта значение реквизита оказалось не заполнено (вернулся NULL или Неопределено). Механизм XDTO не знает, как превратить "пустоту" в строку, и выбрасывает исключение.
Чтобы решить проблему, проанализируем фрагмент кода, где происходит присвоение значений:
перXDTO.id_external = зн.П3.Значение;
перXDTO.displayname = зн.П5.Значение;
Если в источнике данных зн.П3.Значение окажется равным NULL, мы получим вышеописанную ошибку. Исправим код, добавив проверку на пустое значение. Рекомендуется использовать оператор Строка() или тернарный оператор для подстановки пустой строки вместо NULL:
// Безопасное присвоение строковых значений
перXDTO.id_external = ?(зн.П3.Значение = NULL, "", Строка(зн.П3.Значение));
перXDTO.displayname = ?(зн.П5.Значение = NULL, "", Строка(зн.П5.Значение));
Также проверим заполненность всех полей, которые участвуют в формировании структуры login, workmode и subdiv, так как ошибка может возникать на любом уровне вложенности XDTO-объекта.
Если регламентное задание "нельзя запускать вручную" (выдается соответствующее предупреждение), это обычно означает наличие проверки внутри программного кода на тип сеанса. Чтобы обойти это ограничение и проверить исправления, мы можем воспользоваться одним из способов:
Консоль заданий с ИТС. Она позволяет запустить метод задания напрямую в контексте вашего текущего сеанса, игнорируя расписание.Если Не ПараметрыСеанса.УстановленыПараметрыСеанса...) и временно закомментируем ее.Таким образом, комбинируя методы поиска кода в расширениях, настройку отладки фоновых процессов и корректную обработку пустых значений при формировании XDTO, мы сможем восстановить работоспособность обмена данными в 1С:ЗУП 3.1.