Разработка отчетов на базе Системы компоновки данных (СКД) в современных конфигурациях, таких как УТ 11, ERP 2.5 или Комплексная автоматизация, часто преподносит сюрпризы. Одна из самых распространенных проблем — игнорирование точек останова в модуле объекта отчета, особенно в процедуре ПриКомпоновкеРезультата — её решает пошаговая отладка кода 1С в пользовательском режиме. Казалось бы, точка стоит, отладка включена, но программа просто пролетает мимо кода. Разберем детально, почему так происходит и как заставить отладчик работать.
В конфигурациях на базе БСП (Библиотеки стандартных подсистем) практически все тяжелые операции выносятся в фоновые задания. Это делается для того, чтобы интерфейс пользователя не «зависал» во время формирования длительного отчета. Когда вы нажимаете кнопку «Сформировать», система порождает новый сеанс (фоновое задание) на сервере, к которому ваш текущий отладчик по умолчанию не подключен.
Проанализируем шаги для исправления этой ситуации:
После этого при запуске формирования отчета конфигуратор автоматически «подцепит» новый серверный процесс, и точка останова в ПриКомпоновкеРезультата сработает. Рассмотрим ситуацию, когда это не помогает: возможно, в настройках самой программы включено принудительное фоновое выполнение. В некоторых версиях можно зайти в НСИ и администрирование — Настройка пользователей и прав — Персональные настройки и временно снять флаг Выполнять отчеты в фоне.
Процедура ПриКомпоновкеРезультата всегда выполняется на стороне сервера. Если ваш сервер 1С:Предприятия запущен без специального ключа -debug, отладка серверного кода будет невозможна в принципе, даже если вы работаете один в локальной базе.
Разберем, как включить серверную отладку (для Windows):
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\1C:Enterprise 8.3 Server Agent.ImagePath.-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
После внесения изменений запустите службу заново. Теперь сервер готов передавать данные отладчику.
Часто программист открывает отчет через Файл — Открыть, но при этом точно такой же отчет (с тем же именем) уже зарегистрирован в справочнике Дополнительные отчеты и обработки. Система БСП может подменить контекст выполнения, используя код из справочника, а не из вашего файла.
Выясним, как гарантированно попасть в нужный код:
_Тест).Проанализируем технический аспект: сервер 1С кэширует скомпилированные версии модулей объектов. Если вы вносите изменения в процедуру ПриКомпоновкеРезультата, но не меняете структуру самого отчета, сервер может продолжать использовать старый образ модуля из оперативной памяти процесса rphost.
Рассмотрим способы принудительного обновления:
%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8.Посмотрим на код самой процедуры — для этого пригодятся инструменты разработчика с консолью СКД. Если вы хотите, чтобы ваш алгоритм управления компоновкой отработал, важно правильно управлять параметром СтандартнаяОбработка. Если в начале процедуры вы не установили его в значение Ложь, но при этом пытаетесь программно выводить результат, может возникнуть конфликт, при котором точка останова «проскакивает» из-за внутренней оптимизации платформы.
Типовой шаблон процедуры должен выглядеть примерно так:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
// Выполняем программную компоновку
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Проанализируем ситуацию, когда в кластере 1С работает несколько рабочих процессов rphost. Отладчик подключается к конкретному процессу. Если ваше фоновое задание по формированию отчета запустится на другом процессе rphost, точка останова не сработает. Для стабильной отладки на время разработки рекомендуется в консоли администрирования сервера 1С временно оставить только один рабочий процесс — для этого подойдёт администрирование кластера и управление сеансами 1С.
Также стоит проверить наличие Расширений конфигурации. Если в расширении перехвачена та же процедура с типом вызова Вместо, то код основного отчета выполняться не будет, и точка останова в нем окажется бесполезной. Всегда проверяйте список активных расширений перед началом отладки.
Подводя итог, для успешного захода в ПриКомпоновкеРезультата выполните три главных действия: включите -debug на сервере, разрешите автоматическое подключение к фоновым заданиям в конфигураторе и убедитесь, что вы отлаживаете именно ту версию отчета, которую открыли (путем смены имени или отключения отчета в справочнике доп. обработок).