Как найти код открытия формы и отладить внешнюю обработку в 1С:УТ 10.3

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

В практике разработчика 1С часто возникают ситуации, когда в типовой или сильно доработанной конфигурации (например, Управление торговлей 10.3 на обычных формах) происходит «магия»: при выборе значения в поле табличной части внезапно открывается форма калькулятора или подбора, хотя в модуле формы документа нет явных вызовов ОткрытьФорму(). Рассмотрим подробно, как обнаружить источник вызова, разобраться в механизме работы и эффективно отладить такой функционал.

Анализируем ситуацию: почему код не виден сразу

Разберем причины, по которым поиск (Ctrl+F) по модулю формы не дает результатов. В обычных формах 1С существует несколько механизмов, позволяющих инициировать открытие окон без прямой записи в обработчике события НачалоВыбора. Проанализируем основные из них:

  1. Обработка выбора в табличном поле: Если у колонки установлено свойство РежимВыбораИзСписка, основная логика часто переносится в событие ОбработкаВыбора самого табличного поля. Программисты часто ищут код в НачалоВыбораИзСписка, но там список только формируется, а само действие происходит позже.
  2. Типовой механизм внешних обработок: В УТ 10.3 реализован мощный механизм хранения доработок в справочнике ВнешниеОбработки. Программа может динамически подгружать код из двоичных данных, выгружать его во временный файл и запускать.
  3. Подписки на события: Хотя подписки чаще относятся к модулям объектов, существуют глобальные механизмы перехвата действий пользователя через общие модули.

Метод 1: Использование замера производительности для поиска кода

Если визуальный осмотр модуля не помогает, воспользуемся самым надежным инструментом — замером производительности. Этот метод позволяет зафиксировать каждую исполняемую строку кода в момент открытия формы. Выполним следующие шаги:

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

Проанализируем полученную таблицу. Нам нужно отсортировать строки по колонке «Количество вызовов» или «Чистое время». Ищем вызовы функций из общих модулей, таких как УправлениеВнешнимиОбработками или методы ОткрытьФорму(), ПолучитьФорму(). Замер покажет точное место в коде (имя модуля и номер строки), где инициируется открытие.

Метод 2: Поиск через стек вызовов

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

Если форма является частью внешней обработки, конфигуратор может не дать сразу поставить точку останова в основном дереве. В этом случае используем хитрость: в любой процедуре модуля формы документа, которая выполняется ДО открытия (например, в том же НачалоВыбораИзСписка), ставим точку останова и далее идем по коду клавишей F11 (Шагнуть в), пока не попадем в момент вызова внешней обработки.

Метод 3: Работа со справочником «Внешние обработки»

Выясним причину, по которой форма может отсутствовать в конфигурации. В УТ 10.3 часто используется хранение обработок в справочнике. Проверим это:

  1. Перейдем в меню «Сервис» — «Дополнительные отчеты и обработки» — «Внешние обработки».
  2. Найдем обработку, чье имя совпадает с заголовком открывающегося окна.
  3. Если она там есть, значит, код вызывается примерно так:

// Примерный код вызова из справочника
СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию("КалькуляторПорезки");
ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ИмяФайла);
ФормаОбработки = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
ФормаОбработки.Открыть();

Посмотрим на этот пример: система создает временный файл на диске. Чтобы отладить такую форму, нам необходимо сохранить её из справочника на диск как файл .epf, внести изменения или поставить точки останова, а затем либо запустить её отдельно, либо временно подменить код в документе для вызова файла с диска, а не из хранилища.

Метод 4: Отладка «на лету» через провокацию ошибки

Рассмотрим изящный способ попасть в модуль внешней обработки, которая выгружается во временный каталог. Если вы сохранили обработку на диск, нашли нужную процедуру, но не можете «поймать» момент её выполнения из документа, сделайте следующее:

В коде внешней обработки (в копии) добавьте заведомо ошибочную строку, например: А = 1/0;. Загрузите эту обработку обратно в справочник (или подмените файл). При выполнении кода система выдаст ошибку, и в окне сообщения появится кнопка «Подробно», а затем «Конфигуратор». Нажав её, вы попадете прямиком в код временного файла обработки, где сможете расставить точки останова и посмотреть значения всех переменных в табло.

Механизм возврата значения в табличную часть

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

Если при открытии формы калькулятора в параметрах был передан ЭтаФорма (форма документа) или конкретный элемент управления, то во внешней обработке при закрытии может вызываться код:


// В модуле формы внешней обработки
ОповеститьОВыборе(РезультатРассчета);
// Или прямая запись, если передан владелец
ВладелецФормы.ТекущаяСтрока.РазмерыПорезки = РезультатРассчета;

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

Резюме по шагам

Подведем итог нашему исследованию. Чтобы найти «невидимый» код открытия формы в 1С 8.3 на обычных формах, придерживайтесь следующего алгоритма:

  1. Запустите замер производительности и инициируйте открытие формы.
  2. Проверьте событие ОбработкаВыбора у табличного поля — часто логика скрыта там.
  3. Изучите справочник Внешние обработки — скорее всего, форма хранится там как двоичные данные.
  4. Используйте глобальный поиск по конфигурации (Ctrl+Shift+F) по уникальным текстовым меткам, которые вы видите на форме (заголовки кнопок, надписи).
  5. Для полноценной отладки сохраните обработку на диск и временно измените код вызова в документе, чтобы он обращался к файлу .epf напрямую через ВнешниеОбработки.Создать(ПутьКФайлу).

Такой системный подход позволяет разобраться в самых запутанных доработках, оставленных предыдущими программистами, и успешно провести отладку бизнес-логики пересчета значений.

← На главную