Почему отладчик не заходит в процедуру ПриКомпоновкеРезультата и как это исправить

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

Разработка отчетов на базе Системы компоновки данных (СКД) в современных конфигурациях, таких как УТ 11, ERP 2.5 или Комплексная автоматизация, часто преподносит сюрпризы. Одна из самых распространенных проблем — игнорирование точек останова в модуле объекта отчета, особенно в процедуре ПриКомпоновкеРезультата — её решает пошаговая отладка кода 1С в пользовательском режиме. Казалось бы, точка стоит, отладка включена, но программа просто пролетает мимо кода. Разберем детально, почему так происходит и как заставить отладчик работать.

Причина 1: Формирование отчета в фоновом задании

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

Проанализируем шаги для исправления этой ситуации:

  1. Откройте конфигуратор и запустите сеанс в режиме отладки.
  2. Перейдите в меню Отладка — Подключение....
  3. В открывшемся окне нажмите кнопку Автоматическое подключение.
  4. Установите флажок напротив пункта Фоновые задания и нажмите ОК.

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

Причина 2: Отсутствие режима отладки на сервере 1С

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

Разберем, как включить серверную отладку (для Windows):

  1. Остановите службу 1C:Enterprise 8.3 Server Agent.
  2. Откройте редактор реестра (regedit) и найдите ветку HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\1C:Enterprise 8.3 Server Agent.
  3. Найдите параметр ImagePath.
  4. Добавьте в конец строки атрибут -debug. Если вы используете современную платформу, рекомендуется также добавить -http для отладки по протоколу HTTP.

Пример исправленной строки запуска:


"C:\Program Files\1cv8\8.3.22.1709\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug -http

После внесения изменений запустите службу заново. Теперь сервер готов передавать данные отладчику.

Причина 3: Конфликт между внешним отчетом и справочником Дополнительные отчеты

Часто программист открывает отчет через Файл — Открыть, но при этом точно такой же отчет (с тем же именем) уже зарегистрирован в справочнике Дополнительные отчеты и обработки. Система БСП может подменить контекст выполнения, используя код из справочника, а не из вашего файла.

Выясним, как гарантированно попасть в нужный код:

  1. В пользовательском режиме найдите ваш отчет в справочнике дополнительных обработок и установите ему статус Отключена или временно удалите его.
  2. Измените Имя (не синоним) отчета в конфигураторе на уникальное (например, добавьте текущую дату или префикс _Тест).
  3. Обязательно очистите кэш или добавьте любой комментарий в модуль объекта, чтобы платформа поняла, что код изменился.

Причина 4: Кэширование скомпилированных модулей и макетов

Проанализируем технический аспект: сервер 1С кэширует скомпилированные версии модулей объектов. Если вы вносите изменения в процедуру ПриКомпоновкеРезультата, но не меняете структуру самого отчета, сервер может продолжать использовать старый образ модуля из оперативной памяти процесса rphost.

Рассмотрим способы принудительного обновления:

Причина 5: Параметр СтандартнаяОбработка

Посмотрим на код самой процедуры — для этого пригодятся инструменты разработчика с консолью СКД. Если вы хотите, чтобы ваш алгоритм управления компоновкой отработал, важно правильно управлять параметром СтандартнаяОбработка. Если в начале процедуры вы не установили его в значение Ложь, но при этом пытаетесь программно выводить результат, может возникнуть конфликт, при котором точка останова «проскакивает» из-за внутренней оптимизации платформы.

Типовой шаблон процедуры должен выглядеть примерно так:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
	
	// Выполняем программную компоновку
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

Дополнительные нюансы отладки в распределенных системах

Проанализируем ситуацию, когда в кластере 1С работает несколько рабочих процессов rphost. Отладчик подключается к конкретному процессу. Если ваше фоновое задание по формированию отчета запустится на другом процессе rphost, точка останова не сработает. Для стабильной отладки на время разработки рекомендуется в консоли администрирования сервера 1С временно оставить только один рабочий процесс — для этого подойдёт администрирование кластера и управление сеансами 1С.

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

Подводя итог, для успешного захода в ПриКомпоновкеРезультата выполните три главных действия: включите -debug на сервере, разрешите автоматическое подключение к фоновым заданиям в конфигураторе и убедитесь, что вы отлаживаете именно ту версию отчета, которую открыли (путем смены имени или отключения отчета в справочнике доп. обработок).

← На главную