Когда вызывается процедура Печать из модуля менеджера и как настроить отладку на сервере в 1С:УПП 1.3

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

При работе с конфигурацией Управление производственным предприятием (УПП) редакции 1.3 разработчики часто сталкиваются с двойственностью архитектуры. С одной стороны, это классическое "Обычное приложение", где основная логика сосредоточена в модулях объектов и форм. С другой стороны, поздние релизы УПП активно используют элементы Библиотеки стандартных подсистем (БСП) и механизмы "Управляемого приложения", где логика печати выносится в Модуль менеджера. Разберем подробно, почему так происходит, как найти точку вызова и что делать, если отладчик "пролетает" мимо нужного кода.

Различие механизмов печати: Модуль объекта против Модуля менеджера

В типовых решениях 1С старого поколения (к которым относится УПП 1.3) существует два параллельных механизма формирования печатных форм. Проанализируем, какой из них задействуется в конкретных ситуациях:

  1. Печать из обычных форм: Когда пользователь открывает документ в обычном интерфейсе (толстый клиент) и нажимает кнопку "Печать", система чаще всего обращается к процедуре Печать(), расположенной в Модуле объекта. Это классический подход, при котором для формирования макета необходимо сначала считать весь объект из базы данных в память сервера.
  2. Печать через подсистему БСП: В новых подсистемах (например, при печати из списков документов, использовании управляемых форм или в режиме тонкого клиента) используется процедура Печать() из Модуля менеджера. Это позволяет системе формировать печатные формы без создания тяжеловесного объекта (экземпляра документа), что значительно экономит ресурсы сервера, особенно при массовой печати.

Рассмотрим пример того, как может выглядеть регистрация команд печати в модуле менеджера. Именно этот код сообщает системе, какие процедуры нужно вызывать:


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    
    Команда = КомандыПечати.Добавить();
    Команда.МенеджерПечати = "Документ.СчетФактураВыданный";
    Команда.Идентификатор  = "СчетФактура1137";
    Команда.Представление  = НСтр("ru = 'Счет-фактура по Постановлению №1137'");
    Команда.ПроверкаПроведенности = Ложь;
    
КонецПроцедуры

Если вы видите, что изменения в процедурах модуля менеджера (например, в ПечатьКорректировочногоСчетаФактуры1137) не отражаются при печати, скорее всего, ваш интерфейс в данный момент использует "старый" механизм через модуль объекта. Выясним, почему отладка не всегда помогает найти истину.

Проблема отладки серверного кода и ключ -debug

Одной из самых частых проблем является отсутствие реакции конфигуратора на точки останова в модуле менеджера. Проанализируем ситуацию: процедура модуля менеджера всегда выполняется НаСервере. Если сервер приложений 1С запущен в обычном режиме, отладчик будет работать только для кода, исполняемого непосредственно на клиенте.

Для того чтобы отладчик "останавливался" внутри процедур модуля менеджера, необходимо запустить службу сервера 1С:Предприятия с параметром -debug. Разберем по шагам, как это сделать:

  1. Остановите службу 1C:Enterprise 8.3 Server Agent.
  2. Откройте редактор реестра (regedit) и найдите ветку службы.
  3. В параметре ImagePath добавьте в конец строки пробел и -debug.
  4. Запустите службу заново.

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

Влияние режима отладки на производительность базы

Существует мнение, что включение -debug может "положить" рабочую базу. Проанализируем реальные риски:

Как найти вызов через Alt+F12 и поиск ссылок

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

Чтобы понять, как "прилетает" вызов в модуль менеджера, стоит обратить внимание на общие модули, такие как УправлениеПечатью или УправлениеПечатьюБСП. Типовой путь вызова выглядит так:

  1. Нажатие кнопки пользователем в управляемой форме.
  2. Вызов клиентского метода УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.
  3. Переход на сервер в процедуру УправлениеПечатью.СформироватьПечатныеФормы.
  4. Вызов метода модуля менеджера через конструкцию вида МенеджерОбъекта.Печать(...).

Посмотрим на пример кода в общем модуле, который инициирует процесс:


// В общем модуле УправлениеПечатью
МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ПараметрыПечати.Ссылка);
МенеджерОбъекта.Печать(СписокОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);

Заключение

Подводя итог, можно сказать: если вы работаете с Счетом-фактурой в УПП 1.3 и видите код в модуле менеджера, который не срабатывает — проверьте, какой тип формы вы используете (обычную или управляемую). Для внесения изменений, которые гарантированно увидит пользователь в любом режиме, правки часто приходится дублировать или выносить в общий модуль, вызываемый и из модуля объекта, и из модуля менеджера. И никогда не забывайте о ключе -debug, без которого серверный код остается "черным ящиком" для разработчика.

← На главную