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