При разработке и сопровождении систем на платформе 1С часто возникает необходимость отладки кода, который выполняется в фоновых заданиях. Классическая проблема, с которой сталкиваются многие программисты: вы устанавливаете точку останова, запускаете процесс, но отладчик постоянно "сбивается" на параллельно выполняющиеся фоновые процессы, не давая сосредоточиться на нужной задаче. Рассмотрим несколько эффективных способов решения этой проблемы.
Это самый простой и часто самый действенный метод, особенно если ваша конфигурация использует Библиотеку стандартных подсистем (БСП). Большинство типовых конфигураций построены на БСП.
Суть метода: при запуске клиента 1С с этим параметром, фоновые задания, инициированные через механизм длительных операций БСП (ДлительныеОперации.ВыполнитьВФоне), будут выполняться не в отдельном фоновом процессе, а синхронно в том же сеансе, из которого были запущены. Это превращает фоновое задание в обычный последовательный вызов процедуры, который легко отладить.
Как применить:
/TESTMANAGER или, что то же самое, установите флажок "Запускать в режиме отладки". В современных версиях платформы часто используется параметр РежимОтладки, который передается в саму конфигурацию. Например, для БСП можно указать параметр /C"РежимОтладки".После этого запустите отладку. Теперь, когда вы инициируете операцию, которая должна была уйти в фон, она выполнится прямо в вашем сеансе, и отладчик остановится на точке останова без переключений на другие процессы.
Важный момент: этот способ может не подойти, если ошибка проявляется только в условиях реальной многопоточности, то есть когда задание выполняется именно асинхронно. Однако такие случаи встречаются довольно редко, и в 99% ситуаций этот метод отлично справляется с задачей.
Этот метод дает полный контроль над тем, к каким процессам подключается отладчик, и не требует перезапуска клиента с особыми параметрами. Он основан на выборочном подключении к нужным процессам.
Разберем по шагам:
Теперь отладчик будет "слушать" только тот процесс, который вы выбрали, и не будет отвлекаться на другие.
Альтернативный вариант "на лету": если вы забыли отключить автоподключение и отладчик уже остановился где-то не там, можно сделать следующее. Не прекращая отладку, зайдите в окно "Подключение...", выделите все ненужные фоновые задания (можно использовать Shift или Ctrl для множественного выбора) и нажмите "Отключить". Это позволит "очистить" область видимости отладчика и сосредоточиться на главном.
Иногда проще всего — это вообще не запускать задание в фоне, а вызвать его исполняемый код напрямую в интерактивном сеансе. Это гарантирует, что никакой другой процесс не помешает отладке.
Простой случай: если процедура, выполняемая в фоне, не требует сложных параметров, вы можете вызвать ее из внешней обработки или инструмента вроде "Консоли кода". Просто пишете строку вызова процедуры и запускаете ее на выполнение.
Сложный случай с параметрами: часто в фоновое задание передаются сложные структуры, таблицы значений или соответствия, которые вручную воссоздать очень трудно. В этой ситуации поступим хитрее:
ЗначениеВСтрокуВнутр(ИмяПараметра).ЗначениеИзСтрокиВнутр(), чтобы восстановить параметр из скопированной строки.Посмотрим на пример:
Допустим, фоновое задание вызывает процедуру Модуль.ВыполнитьРасчет(ПараметрыРасчета), где ПараметрыРасчета — это структура.
1. В отладчике, остановившись в процедуре, вычисляем: ЗначениеВСтрокуВнутр(ПараметрыРасчета).
2. Копируем полученный результат, например, "{"#",3a82e989-b83c-43f0-a359-c8317a3a992d,...".
3. В своей обработке пишем код:
// Вставляем скопированную строку
СтрокаПараметров = "{""#"",3a82e989-b83c-43f0-a359-c8317a3a992d,...}";
// Восстанавливаем параметр
ВосстановленныеПараметры = ЗначениеИзСтрокиВнутр(СтрокаПараметров);
// Вызываем процедуру с точными параметрами
Модуль.ВыполнитьРасчет(ВосстановленныеПараметры);
Теперь вы можете отлаживать процедуру ВыполнитьРасчет в своем сеансе сколько угодно, имея на входе те же данные, что и в "боевом" фоновом задании.
В дополнение к основным методам, существуют и другие полезные техники, которые могут облегчить жизнь.
ОбрабатываемыйДокумент = Справочники.Номенклатура.НайтиПоКоду("12345"). Отладчик будет останавливаться только тогда, когда это условие выполнится.-debug.JOB, SDBL и других, можно получить подробнейший лог выполнения задания и проанализировать проблему постфактум.Выбирайте метод, который лучше всего подходит для вашей ситуации. Чаще всего, для конфигураций на БСП, параметра РежимОтладки бывает более чем достаточно. Для более сложных или нетиповых случаев пригодятся ручное управление подключениями и интерактивный вызов кода.