Как отследить и трассировать выполнение кода при нажатии стандартных кнопок в 1С?

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

При работе с управляемыми формами в «1С:Предприятие» разработчики часто сталкиваются с ситуацией, когда на стандартных командных панелях располагаются кнопки вроде «Записать», «Провести» или «Провести и закрыть». У этих элементов управления в конфигураторе нет привязанных клиентских команд или обработчиков действия, из-за чего стандартный поиск по коду формы не дает результатов. Выяснить, какая строка кода выполняется первой и в какой последовательности платформа вызывает процедуры, бывает непросто.

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

Точная последовательность вызова событий при записи и проведении

Для того чтобы понимать, где именно устанавливать точки останова, проанализируем стандартный жизненный цикл записи объекта из управляемой формы. Платформа «1С:Предприятие» вызывает обработчики в строго определенной последовательности:

  1. Этап подготовки (на клиенте, до начала транзакции):
    1. ПередЗаписью (в модуле формы) — это клиентское событие. Здесь мы можем задать интерактивный вопрос пользователю или полностью отменить запись, передав параметр Отказ = Истина.
  2. Этап подготовки (на сервере, до начала транзакции):
    1. ПередЗаписьюНаСервере (в модуле формы) — подготовка параметров и данных формы на сервере.
    2. ОбработкаПроверкиЗаполненияНаСервере (в модуле формы) — проверка заполнения реквизитов, специфичных для текущей формы.
    3. ОбработкаПроверкиЗаполнения (в модуле объекта) — системная проверка заполнения реквизитов самого объекта. На этом же этапе срабатывают связанные подписки на событие проверки заполнения.
    4. ПередЗаписью (в модуле объекта) — финальная подготовка данных объекта непосредственно перед их физической фиксацией. Здесь же отрабатывают подписки на событие «Перед записью».
  3. Этап записи (на сервере, внутри транзакции):
    1. ПриЗаписи (в модуле объекта) — физическая запись данных в базу данных. В этот момент выполняются подписки на событие «При записи».
    2. ОбработкаПроведения (в модуле объекта) — вызывается только в том случае, если документ проводится. Здесь формируются движения по регистрам. Параллельно отрабатывают подписки на событие «Обработка проведения».
    3. ПриЗаписиНаСервере (в модуле формы) — обработка данных формы в контексте сервера, выполняемая внутри транзакции.
  4. Этап после записи (вне транзакции):
    1. ПослеЗаписиНаСервере (в модуле формы) — серверные действия, выполняемые после успешного сохранения данных.
    2. ПослеЗаписи (в модуле формы, на клиенте) — клиентские действия после завершения записи (например, оповещение других открытых форм конфигурации).
    3. ПередЗакрытием / ПриЗакрытии (в модуле формы, на клиенте) — вызываются последовательно, если пользователь нажал кнопку «Записать и закрыть» или «Провести и закрыть».

Практические методы трассировки стандартных команд

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

Способ 1. Замер производительности (наиболее надежный метод)

Замер производительности — это самый простой и надежный способ увидеть полную картину вызовов «изнутри». Он фиксирует абсолютно все строки кода встроенного языка, которые были выполнены за время его работы.

Выполним трассировку по шагам:

  1. Запустим сеанс «1С:Предприятие» в режиме отладки.
  2. Откроем нужный документ и подготовим его к записи (заполним необходимые поля).
  3. Перейдем в конфигуратор и выберем в меню: Отладка — Замер производительности (иконка замера останется нажатой).
  4. Вернемся в режим предприятия и нажмем исследуемую стандартную кнопку (например, «Провести»).
  5. Как только документ проведется, сразу перейдем в конфигуратор и отожмем кнопку Замер производительности.

В результате откроется подробный отчет. Отсортировав его по колонке порядка вызова или времени, мы увидим пошаговую трассировку всех процедур и функций (включая общий модуль, подписки на события и расширения), которые были вызваны в процессе выполнения операции.

Способ 2. Использование панели «Стек вызовов»

Если нам нужно отлаживать интерактивный процесс в реальном времени, мы можем использовать точку останова в самом первом гарантированно вызываемом событии:

  1. Установим точку останова в процедуре ПередЗаписью в модуле управляемой формы документа.
  2. Нажмем кнопку записи в режиме предприятия — отладчик остановится на установленной точке.
  3. Откроем панель Стек вызовов (через меню Отладка или сочетанием клавиш).

Стек вызовов покажет всю иерархию системных и пользовательских процедур, приведших к текущему шагу. По мере прохождения кода с помощью клавиши F11 мы сможем наблюдать за переходами платформы.

Способ 3. Программный перехват стека через генерацию исключения

Если логика вызывается неявно, или отладчик по какой-то причине пропускает серверные вызовы, мы можем временно внедрить в подозрительную процедуру искусственный вызов исключения:


Попытка
    ВызватьИсключение "Трассировка";
Исключение
    ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    ЗаписьЖурналаРегистрации("ОтладкаСобытия", УровеньЖурналаРегистрации.Предупреждение, , , ТекстОшибки);
КонецПопытки;

При выполнении этого кода в Журнал регистрации запишется подробный лог со всей цепочкой вызовов методов встроенного языка, предшествовавших ошибке. Это позволит локализовать проблему без использования интерактивного отладчика.

Способ 4. Создание временной дублирующей команды

Если у вас остаются сомнения в поведении стандартной команды, мы можем временно создать в форме свою собственную команду и назначить её кнопкой на форме. В обработчике этой команды программно вызовем метод записи:


&НаКлиенте
Процедура НашаКомандаЗаписать(Команда)
    // Устанавливаем точку останова здесь
    Записать(); 
КонецПроцедуры

Поведение программного метода Записать() полностью идентично нажатию стандартной кнопки формы, но при этом у вас появится явная начальная точка входа для пошагового прохождения отладчиком с самого первого шага.

Важные особенности и ограничения отладки

При выполнении трассировки важно учитывать особенности работы платформы 1С:

  1. Настройка отладки на сервере: Поскольку большая часть транзакционных действий (таких как ПриЗаписи, подписки на события и проведение) происходит на стороне сервера, точки останова в модуле объекта не сработают, если служба сервера «1С:Предприятие» запущена без ключа отладки -debug.
  2. Помехи от фоновых процессов: Использование функции конфигуратора Отладка — Остановить часто прерывает работу сеанса на фоновых процессах (например, на обработчиках ожидания БСП). Поэтому данный способ малоэффективен для перехвата нажатия кнопок — лучше использовать замер производительности.
  3. Механизм расширений: Если в базе установлены расширения конфигурации, они могут неявно внедряться в стандартный поток выполнения через аннотации &Перед, &После и &Вместо. Замер производительности — это единственный способ гарантированно увидеть, внедрялся ли сторонний код расширений в процесс проведения документа.
← На главную