Как найти программный код регламентного задания и исправить ошибку XDTO в 1С:ЗУП 3.1?

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

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

Определяем местонахождение программного кода

Первым делом нам необходимо понять, какая именно процедура вызывается регламентным заданием. Для этого проанализируем настройки в пользовательском режиме и конфигураторе:

  1. Перейдем в раздел Администрирование — Обслуживание — Регламентные и фоновые задания.
  2. Найдем в списке интересующее нас задание (в нашем случае — связанное с синхронизацией данных).
  3. Откроем карточку задания и обратим внимание на поле Имя метода.

Если в поле указано нечто вроде ОбменДаннымиСервер.ВыполнитьОбменДаннымиПоРегламентномуЗаданию, это означает, что логика зашита в общем модуле. Однако часто бывает, что стандартный функционал переопределен в Расширениях конфигурации. Проверим наличие расширений в конфигураторе и поищем в них модули с аналогичными именами или префиксами (например, _ДДД_). Помните, что расширение может перехватывать выполнение стандартного метода с помощью аннотаций &Вместо, &Перед или &После.

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

Анализ динамического кода и макетов

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

Выполнить(_ИмяМакета.Команда);

В данном случае функция Выполнить() исполняет произвольный программный код, который считывается из текстового макета. Чтобы найти этот код, выполним следующие шаги:

  1. В конфигураторе найдем общий модуль, указанный в стеке ошибки (например, _ДДД_).
  2. Найдем переменную или реквизит, из которого извлекается макет.
  3. Перейдем в ветку Макеты соответствующего объекта (общего модуля или справочника настроек) и откроем текстовый документ.

Именно в этом текстовом макете будет содержаться основной алгоритм формирования данных для обмена. Проанализируем его структуру, чтобы понять, какие поля базы данных считываются и как они преобразуются в объекты XDTO.

Настройка отладки для регламентных заданий

Поскольку регламентные задания выполняются на сервере в отдельном сеансе, обычная точка останова (F9) в конфигураторе не сработает. Чтобы "поймать" момент ошибки, выполним правильную настройку отладки:

Шаг 1. Проверка параметров сервера. Убедимся, что сервер 1С:Предприятия запущен в режиме отладки. В списке процессов Windows это выглядит как наличие ключа -debug у процесса ragent.exe. Без этого отладка серверного кода невозможна.

Шаг 2. Автоматическое подключение. В конфигураторе перейдем в меню Отладка — Подключение.... В открывшемся окне нажмем кнопку Автоматическое подключение и установим флажок Фоновые задания. Теперь конфигуратор будет автоматически подключаться к любому фоновому процессу, который запускается на сервере.

Шаг 3. Остановка по ошибке. Если задание падает с ошибкой, но не останавливается на точках останова, настроим автоматическую остановку. Перейдем в Отладка — Настройка остановки по ошибке и добавим флажок Останавливаться по ошибке. Это позволит системе замереть ровно в тот момент, когда возникнет исключительная ситуация, даже если код выполняется через Выполнить().

Важное замечание по расширениям: При работе с расширениями убедитесь, что в их свойствах (в конфигураторе) снята галочка Защита от опасных действий. Если она установлена, отладчик может игнорировать код внутри расширения.

Исправление ошибки отображения типов XDTO

Рассмотрим причину возникновения ошибки Ошибка отображения типов: Отображение типа '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.

← На главную