При работе с конфигурацией Управление производственным предприятием (УПП) редакции 1.3 разработчики часто сталкиваются с двойственностью архитектуры. С одной стороны, это классическое "Обычное приложение", где основная логика сосредоточена в модулях объектов и форм. С другой стороны, поздние релизы УПП активно используют элементы Библиотеки стандартных подсистем (БСП) и механизмы "Управляемого приложения", где логика печати выносится в Модуль менеджера. Разберем подробно, почему так происходит, как найти точку вызова и что делать, если отладчик "пролетает" мимо нужного кода.
В типовых решениях 1С старого поколения (к которым относится УПП 1.3) существует два параллельных механизма формирования печатных форм. Проанализируем, какой из них задействуется в конкретных ситуациях:
Печать(), расположенной в Модуле объекта. Это классический подход, при котором для формирования макета необходимо сначала считать весь объект из базы данных в память сервера.Печать() из Модуля менеджера. Это позволяет системе формировать печатные формы без создания тяжеловесного объекта (экземпляра документа), что значительно экономит ресурсы сервера, особенно при массовой печати.Рассмотрим пример того, как может выглядеть регистрация команд печати в модуле менеджера. Именно этот код сообщает системе, какие процедуры нужно вызывать:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
Команда = КомандыПечати.Добавить();
Команда.МенеджерПечати = "Документ.СчетФактураВыданный";
Команда.Идентификатор = "СчетФактура1137";
Команда.Представление = НСтр("ru = 'Счет-фактура по Постановлению №1137'");
Команда.ПроверкаПроведенности = Ложь;
КонецПроцедуры
Если вы видите, что изменения в процедурах модуля менеджера (например, в ПечатьКорректировочногоСчетаФактуры1137) не отражаются при печати, скорее всего, ваш интерфейс в данный момент использует "старый" механизм через модуль объекта. Выясним, почему отладка не всегда помогает найти истину.
Одной из самых частых проблем является отсутствие реакции конфигуратора на точки останова в модуле менеджера. Проанализируем ситуацию: процедура модуля менеджера всегда выполняется НаСервере. Если сервер приложений 1С запущен в обычном режиме, отладчик будет работать только для кода, исполняемого непосредственно на клиенте.
Для того чтобы отладчик "останавливался" внутри процедур модуля менеджера, необходимо запустить службу сервера 1С:Предприятия с параметром -debug. Разберем по шагам, как это сделать:
1C:Enterprise 8.3 Server Agent.ImagePath добавьте в конец строки пробел и -debug.Важный нюанс: без этого ключа весь стек вызовов, уходящий на сервер (например, из процедуры управляемой формы ПриСозданииНаСервере в модуль менеджера), будет выполнен "молча". Отладчик вернет управление только тогда, когда выполнение кода снова вернется на сторону клиента.
Существует мнение, что включение -debug может "положить" рабочую базу. Проанализируем реальные риски:
Стандартный поиск ссылок (Alt+F12) в 1С часто оказывается бессилен перед механизмами БСП. Выясним причину: вызов процедуры Печать в модуле менеджера происходит неявно. Платформа или общие модули подсистемы печати формируют имя вызываемой процедуры динамически, передавая его как строку.
Чтобы понять, как "прилетает" вызов в модуль менеджера, стоит обратить внимание на общие модули, такие как УправлениеПечатью или УправлениеПечатьюБСП. Типовой путь вызова выглядит так:
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.УправлениеПечатью.СформироватьПечатныеФормы.МенеджерОбъекта.Печать(...).Посмотрим на пример кода в общем модуле, который инициирует процесс:
// В общем модуле УправлениеПечатью
МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ПараметрыПечати.Ссылка);
МенеджерОбъекта.Печать(СписокОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Подводя итог, можно сказать: если вы работаете с Счетом-фактурой в УПП 1.3 и видите код в модуле менеджера, который не срабатывает — проверьте, какой тип формы вы используете (обычную или управляемую). Для внесения изменений, которые гарантированно увидит пользователь в любом режиме, правки часто приходится дублировать или выносить в общий модуль, вызываемый и из модуля объекта, и из модуля менеджера. И никогда не забывайте о ключе -debug, без которого серверный код остается "черным ящиком" для разработчика.