Где найти код добавления команд печати в типовых конфигурациях 1С на БСП?

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

При работе с крупными типовыми решениями фирмы «1С» (такими как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей) разработчики часто сталкиваются с ситуацией, когда привычные механизмы платформы работают неочевидным образом. Типичный пример — поиск кода, отвечающего за регистрацию и формирование стандартных печатных форм (например, ТОРГ-12, УПД, Счет-фактура) для документов продажи.

Открыв модуль менеджера документа (например, Документ.РеализацияТоваровУслуг), мы ожидаем увидеть заполнение команд печати в стандартной процедуре ДобавитьКомандыПечати(КомандыПечати). Однако часто этой команды там попросту нет, а при попытке отладить процесс система перенаправляет выполнение в общую обработку Обработка.ПечатьОбщихФорм, при этом стек вызовов отладчика выглядит неполным. Выясним причину такого поведения системы, подробно разберем архитектуру локализации БСП (Библиотеки стандартных подсистем) и научимся правильно находить и отлаживать этот код.

1. Архитектурный смысл модулей с постфиксом «Локализация»

В современных версиях ERP и КА разработчики «1С» придерживаются строгих стандартов разделения кода на так называемое «ядро» (международную версию) и «национальную специфику» (локализацию под законодательство конкретной страны).

Согласно этой концепции, сам документ РеализацияТоваровУслуг должен содержать только универсальную бизнес-логику, которая применима в любой точке мира. Такие печатные формы, как российская товарная накладная ТОРГ-12 или УПД, являются исключительно спецификой законодательства РФ. Если бы этот код находился непосредственно в модуле менеджера документа, то при поставке конфигурации в другие страны пришлось бы вручную вырезать или скрывать эти команды.

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

  1. Пользователь открывает форму документа или список документов, и система инициализирует меню «Печать».
  2. БСП обращается к экспортной процедуре модуля менеджера документа:
    
    Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
        
        // Здесь регистрируются только общие (международные) команды печати
        
        // Далее вызывается специализированный модуль локализации:
        РеализацияТоваровУслугЛокализация.ДобавитьКомандыПечати(КомандыПечати);
        
    КонецПроцедуры
    
  3. Внутри общего модуля РеализацияТоваровУслугЛокализация в аналогичной процедуре происходит непосредственное добавление команды ТОРГ-12 в общую коллекцию:
    
    Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
        
        КомандаПечати = КомандыПечати.Добавить();
        КомандаПечати.Идентификатор = "ТОРГ12";
        КомандаПечати.Представление = NStr("ru = 'ТОРГ-12 (Товарная накладная)'");
        КомандаПечати.МенеджерПечати = "Обработка.ПечатьОбщихФорм";
        
    КонецПроцедуры
    

Таким образом, чтобы найти первоначальную инициализацию команды печати, всегда проверяйте наличие вызовов модулей локализации с постфиксом ...Локализация внутри основной процедуры ДобавитьКомандыПечати.

2. Почему печать уходит в «Обработку.ПечатьОбщихФорм»?

Многих разработчиков удивляет, почему при выборе команды печати управление передается не в модуль менеджера самого документа, а в стороннюю обработку Обработка.ПечатьОбщихФорм. Это важная оптимизация, заложенная в БСП.

Такие регламентированные формы, как ТОРГ-12 или М-15, могут формироваться из абсолютно разных документов (Реализация товаров и услуг, Передача сырья переработчику, Возврат товаров поставщику и т.д.). Чтобы не дублировать макеты печатных форм и сложную логику запросов по сбору данных в модулях менеджеров десятков различных документов, эта логика централизована.

В БСП за это отвечает свойство команды МенеджерПечати. Рассмотрим подробнее:

3. Особенности отладки: почему стек вызовов кажется «пустым»?

Часто при попытке отладить печатную форму разработчик ставит точку останова в процедуре печати, но при остановке обнаруживает, что стек вызовов пуст или не содержит логической цепочки от нажатия кнопки на клиенте. Выясним причины этой особенности БСП.

Причина первая: Динамический вызов методов.
БСП строит меню печати и обрабатывает нажатия динамически. При вызове серверного метода печати система считывает имя менеджера из кэша и вызывает его экспортный метод с помощью платформенного механизма выполнения по имени. Из-за этого сквозная пошаговая отладка (клавиша F11 в Конфигураторе) на стыке перехода от общего модуля БСП к конкретному менеджеру печати может "проскакивать" мимо цели.

Причина вторая: Фоновое формирование печатных форм.
В современных версиях БСП формирование тяжелых печатных документов по умолчанию выполняется асинхронно в фоновом задании на сервере. Это сделано для того, чтобы интерфейс пользователя не «зависал» во время ожидания сборки макета. Если в вашем Конфигураторе не настроена отладка фоновых заданий, отладчик просто проигнорирует выполнение кода внутри фонового процесса, и точка останова в модуле менеджера ПечатьОбщихФорм не сработает.

Для того чтобы решить эту проблему, обязательно выполните следующие настройки в Конфигураторе перед началом отладки:

  1. Откройте меню Отладка -> Подключение...
  2. В открывшемся окне нажмите кнопку Автоматическое подключение.
  3. Установите флажок напротив пункта Фоновые задания и нажмите ОК.

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

4. Пошаговый алгоритм поиска и модификации кода печатной формы

Проанализируем оптимальный путь для разработчика, которому необходимо кастомизировать или изучить логику формирования печатной формы в типовом решении:

  1. Откройте модуль менеджера вашего документа и найдите процедуру ДобавитьКомандыПечати(КомандыПечати).
  2. Если в ней нет интересующей вас команды, обратите внимание на вызовы процедур из сопутствующих модулей (ищите вызов со словом Локализация в имени модуля). Перейдите в этот модуль.
  3. Найдите строку добавления команды и посмотрите на свойства Идентификатор и МенеджерПечати. Например:
    
    Идентификатор = "ТОРГ12";
    МенеджерПечати = "Обработка.ПечатьОбщихФорм";
    
  4. Перейдите в модуль менеджера указанного менеджера печати (в нашем примере это Обработка.ПечатьОбщихФорм.МодульМенеджера).
  5. Найдите там экспортную процедуру Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода).
  6. Внутри этой процедуры найдите условие, проверяющее необходимость печати конкретного макета по его идентификатору:
    
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ТОРГ12") Тогда
        // Здесь вызывается процедура формирования табличного документа
        СформироватьПечатнуюФормуТОРГ12(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати);
    КонецЕсли;
    
  7. Установите точку останова внутри процедуры формирования (например, в СформироватьПечатнуюФормуТОРГ12) и запустите сеанс отладки с включенным автоматическим подключением фоновых заданий.

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

← На главную