При работе с управляемыми формами в «1С:Предприятие» разработчики часто сталкиваются с ситуацией, когда на стандартных командных панелях располагаются кнопки вроде «Записать», «Провести» или «Провести и закрыть». У этих элементов управления в конфигураторе нет привязанных клиентских команд или обработчиков действия, из-за чего стандартный поиск по коду формы не дает результатов. Выяснить, какая строка кода выполняется первой и в какой последовательности платформа вызывает процедуры, бывает непросто.
В этой статье мы подробно разберем, в каком порядке платформа выполняет события при записи и проведении документов, а также рассмотрим практические инструменты для полной трассировки стандартных кнопок.
Для того чтобы понимать, где именно устанавливать точки останова, проанализируем стандартный жизненный цикл записи объекта из управляемой формы. Платформа «1С:Предприятие» вызывает обработчики в строго определенной последовательности:
ПередЗаписью (в модуле формы) — это клиентское событие. Здесь мы можем задать интерактивный вопрос пользователю или полностью отменить запись, передав параметр Отказ = Истина.ПередЗаписьюНаСервере (в модуле формы) — подготовка параметров и данных формы на сервере.ОбработкаПроверкиЗаполненияНаСервере (в модуле формы) — проверка заполнения реквизитов, специфичных для текущей формы.ОбработкаПроверкиЗаполнения (в модуле объекта) — системная проверка заполнения реквизитов самого объекта. На этом же этапе срабатывают связанные подписки на событие проверки заполнения.ПередЗаписью (в модуле объекта) — финальная подготовка данных объекта непосредственно перед их физической фиксацией. Здесь же отрабатывают подписки на событие «Перед записью».ПриЗаписи (в модуле объекта) — физическая запись данных в базу данных. В этот момент выполняются подписки на событие «При записи».ОбработкаПроведения (в модуле объекта) — вызывается только в том случае, если документ проводится. Здесь формируются движения по регистрам. Параллельно отрабатывают подписки на событие «Обработка проведения».ПриЗаписиНаСервере (в модуле формы) — обработка данных формы в контексте сервера, выполняемая внутри транзакции.ПослеЗаписиНаСервере (в модуле формы) — серверные действия, выполняемые после успешного сохранения данных.ПослеЗаписи (в модуле формы, на клиенте) — клиентские действия после завершения записи (например, оповещение других открытых форм конфигурации).ПередЗакрытием / ПриЗакрытии (в модуле формы, на клиенте) — вызываются последовательно, если пользователь нажал кнопку «Записать и закрыть» или «Провести и закрыть».Рассмотрим основные способы, которые позволяют детально отследить выполнение кода без ручного поиска всех возможных процедур в конфигурации.
Замер производительности — это самый простой и надежный способ увидеть полную картину вызовов «изнутри». Он фиксирует абсолютно все строки кода встроенного языка, которые были выполнены за время его работы.
Выполним трассировку по шагам:
В результате откроется подробный отчет. Отсортировав его по колонке порядка вызова или времени, мы увидим пошаговую трассировку всех процедур и функций (включая общий модуль, подписки на события и расширения), которые были вызваны в процессе выполнения операции.
Если нам нужно отлаживать интерактивный процесс в реальном времени, мы можем использовать точку останова в самом первом гарантированно вызываемом событии:
ПередЗаписью в модуле управляемой формы документа.Стек вызовов покажет всю иерархию системных и пользовательских процедур, приведших к текущему шагу. По мере прохождения кода с помощью клавиши F11 мы сможем наблюдать за переходами платформы.
Если логика вызывается неявно, или отладчик по какой-то причине пропускает серверные вызовы, мы можем временно внедрить в подозрительную процедуру искусственный вызов исключения:
Попытка
ВызватьИсключение "Трассировка";
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("ОтладкаСобытия", УровеньЖурналаРегистрации.Предупреждение, , , ТекстОшибки);
КонецПопытки;
При выполнении этого кода в Журнал регистрации запишется подробный лог со всей цепочкой вызовов методов встроенного языка, предшествовавших ошибке. Это позволит локализовать проблему без использования интерактивного отладчика.
Если у вас остаются сомнения в поведении стандартной команды, мы можем временно создать в форме свою собственную команду и назначить её кнопкой на форме. В обработчике этой команды программно вызовем метод записи:
&НаКлиенте
Процедура НашаКомандаЗаписать(Команда)
// Устанавливаем точку останова здесь
Записать();
КонецПроцедуры
Поведение программного метода Записать() полностью идентично нажатию стандартной кнопки формы, но при этом у вас появится явная начальная точка входа для пошагового прохождения отладчиком с самого первого шага.
При выполнении трассировки важно учитывать особенности работы платформы 1С:
ПриЗаписи, подписки на события и проведение) происходит на стороне сервера, точки останова в модуле объекта не сработают, если служба сервера «1С:Предприятие» запущена без ключа отладки -debug.&Перед, &После и &Вместо. Замер производительности — это единственный способ гарантированно увидеть, внедрялся ли сторонний код расширений в процесс проведения документа.