Каждый разработчик 1С рано или поздно сталкивается с загадочным поведением платформы при работе с внешними отчетами или обработками. Представьте ситуацию: вы пишете код во внешнем отчете, ставите точку останова или даже жестко прописываете оператор Возврат;, но система игнорирует эти указания. Более того, при запуске отчета платформа может аварийно завершать работу («вылетать»), а изменения в коде не применяются, даже если вы полностью закомментировали все процедуры. В этой статье мы подробно разберем, почему так происходит и как исправить подобные проблемы по шагам.
В современных конфигурациях 1С, созданных на базе БСП (Библиотеки стандартных подсистем), таких как ERP, КА, УТ или БП, формирование отчетов по умолчанию происходит в фоновом режиме на сервере. Это необходимо, чтобы интерфейс пользователя оставался отзывчивым при построении тяжелых отчетов. Обычный отладчик, подключенный к клиентскому сеансу, просто «не видит» серверный поток фонового задания.
Давайте разберем, как правильно настроить отладку серверных фоновых процессов:
-debug (или -http для HTTP-отладки). Если вы ведете разработку на локальном сервере, убедитесь, что этот режим активен.
/C РежимОтладки
Этот параметр сообщает системе, что длительные операции (включая формирование отчетов) нужно выполнять синхронно непосредственно на клиенте. В этом случае точка останова сработает без лишних настроек сервера.
Очень часто разработчики регистрируют отчет в справочнике Дополнительные отчеты и обработки для тестирования в интерфейсе пользователя, а затем пытаются продолжить его доработку, открывая файл локально через меню Файл — Открыть. Это приводит к конфликту версий.
Когда дополнительный отчет запускается из справочника, БСП выгружает его бинарные данные во временную папку на сервере или клиенте под уникальным внутренним именем. Если у вас открыт локальный отчет с тем же внутренним именем объекта метаданных, платформа 1С может перепутать контексты и запустить уже закэшированную старую версию из временной папки, полностью игнорируя ваш измененный файл на диске.
Для решения этой проблемы мы рекомендуем выполнить следующие действия:
Имя самого отчета в Конфигураторе (например, добавьте суффикс _Отладка). Это гарантирует, что платформа не перепутает его с версиями в кэше.
%userprofile%\AppData\Local\1C\1Cv8
%userprofile%\AppData\Roaming\1C\1Cv8
Также стоит помнить о циклических ссылках в оперативной памяти. Если внутри внешнего отчета или его формы вы создаете переменные, которые ссылаются друг на друга (например, реквизит формы хранит ссылку на объект отчета, а объект отчета вызывает методы этой формы), то при закрытии окна объект не уничтожается в оперативной памяти. При повторном открытии файла платформа просто берет старый зависший экземпляр из ОЗУ. Помогает в этом случае только полный перезапуск клиентского сеанса 1С.
Аварийное завершение работы процесса 1cv8.exe или серверного процесса rphost при попытке открыть или сформировать внешний отчет обычно связано с тремя техническими факторами:
ПриКомпоновкеРезультата и некорректно вызываете метод компоновки, платформа уходит в бесконечный цикл вызова этой же процедуры, что вызывает ошибку Stack Overflow и мгновенное закрытие программы.Давайте рассмотрим пример правильного переопределения стандартного вывода отчета в процедуре ПриКомпоновкеРезультата, исключающий бесконечную рекурсию:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем стандартный вывод, чтобы управлять процессом вручную
СтандартнаяОбработка = Ложь;
// Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Получаем макет компоновки, используя схему и настройки
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных,
КомпоновщикНастроек.ПолучитьНастройки(),
ДанныеРасшифровки
);
// Инициализируем процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Обратите внимание: мы не вызываем метод СкомпоноватьРезультат() самого отчета внутри этой процедуры, так как это привело бы к повторному рекурсивному вызову обработчика ПриКомпоновкеРезультата и падению платформы.
Придерживаясь этих простых правил настройки среды разработки и контроля контекста исполнения, вы сможете быстро и без лишней головной боли отлаживать любые сложные внешние отчеты в среде 1С:Предприятие 8.