В практике разработчика 1С часто возникают ситуации, когда в типовой или сильно доработанной конфигурации (например, Управление торговлей 10.3 на обычных формах) происходит «магия»: при выборе значения в поле табличной части внезапно открывается форма калькулятора или подбора, хотя в модуле формы документа нет явных вызовов ОткрытьФорму(). Рассмотрим подробно, как обнаружить источник вызова, разобраться в механизме работы и эффективно отладить такой функционал.
Разберем причины, по которым поиск (Ctrl+F) по модулю формы не дает результатов. В обычных формах 1С существует несколько механизмов, позволяющих инициировать открытие окон без прямой записи в обработчике события НачалоВыбора. Проанализируем основные из них:
РежимВыбораИзСписка, основная логика часто переносится в событие ОбработкаВыбора самого табличного поля. Программисты часто ищут код в НачалоВыбораИзСписка, но там список только формируется, а само действие происходит позже.ВнешниеОбработки. Программа может динамически подгружать код из двоичных данных, выгружать его во временный файл и запускать.Если визуальный осмотр модуля не помогает, воспользуемся самым надежным инструментом — замером производительности. Этот метод позволяет зафиксировать каждую исполняемую строку кода в момент открытия формы. Выполним следующие шаги:
Проанализируем полученную таблицу. Нам нужно отсортировать строки по колонке «Количество вызовов» или «Чистое время». Ищем вызовы функций из общих модулей, таких как УправлениеВнешнимиОбработками или методы ОткрытьФорму(), ПолучитьФорму(). Замер покажет точное место в коде (имя модуля и номер строки), где инициируется открытие.
Рассмотрим ситуацию, когда форма уже открыта, и нам нужно понять, «откуда она пришла». Для этого в режиме отладки можно воспользоваться стеком вызовов. Если в открывшейся форме есть какой-либо программный код (например, в процедуре ПриОткрытии), мы можем установить там точку останова.
Если форма является частью внешней обработки, конфигуратор может не дать сразу поставить точку останова в основном дереве. В этом случае используем хитрость: в любой процедуре модуля формы документа, которая выполняется ДО открытия (например, в том же НачалоВыбораИзСписка), ставим точку останова и далее идем по коду клавишей F11 (Шагнуть в), пока не попадем в момент вызова внешней обработки.
Выясним причину, по которой форма может отсутствовать в конфигурации. В УТ 10.3 часто используется хранение обработок в справочнике. Проверим это:
// Примерный код вызова из справочника
СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию("КалькуляторПорезки");
ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ИмяФайла);
ФормаОбработки = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
ФормаОбработки.Открыть();
Посмотрим на этот пример: система создает временный файл на диске. Чтобы отладить такую форму, нам необходимо сохранить её из справочника на диск как файл .epf, внести изменения или поставить точки останова, а затем либо запустить её отдельно, либо временно подменить код в документе для вызова файла с диска, а не из хранилища.
Рассмотрим изящный способ попасть в модуль внешней обработки, которая выгружается во временный каталог. Если вы сохранили обработку на диск, нашли нужную процедуру, но не можете «поймать» момент её выполнения из документа, сделайте следующее:
В коде внешней обработки (в копии) добавьте заведомо ошибочную строку, например: А = 1/0;. Загрузите эту обработку обратно в справочник (или подмените файл). При выполнении кода система выдаст ошибку, и в окне сообщения появится кнопка «Подробно», а затем «Конфигуратор». Нажав её, вы попадете прямиком в код временного файла обработки, где сможете расставить точки останова и посмотреть значения всех переменных в табло.
Проанализируем, как рассчитанное значение возвращается назад в документ. В обычных формах для этого чаще всего используется механизм владельца формы или оповещения.
Если при открытии формы калькулятора в параметрах был передан ЭтаФорма (форма документа) или конкретный элемент управления, то во внешней обработке при закрытии может вызываться код:
// В модуле формы внешней обработки
ОповеститьОВыборе(РезультатРассчета);
// Или прямая запись, если передан владелец
ВладелецФормы.ТекущаяСтрока.РазмерыПорезки = РезультатРассчета;
Если используется ОповеститьОВыборе, то в модуле формы документа РеализацияТоваровУслуг обязательно должен быть обработчик события ОбработкаВыбора у соответствующего поля или у всей табличной части. Проверьте это событие — именно там происходит окончательная запись данных в строку документа.
Подведем итог нашему исследованию. Чтобы найти «невидимый» код открытия формы в 1С 8.3 на обычных формах, придерживайтесь следующего алгоритма:
ОбработкаВыбора у табличного поля — часто логика скрыта там..epf напрямую через ВнешниеОбработки.Создать(ПутьКФайлу).Такой системный подход позволяет разобраться в самых запутанных доработках, оставленных предыдущими программистами, и успешно провести отладку бизнес-логики пересчета значений.