При переходе с обычных форм (например, в решениях на платформе 1С 7.7 или УТ 10.3) на современные управляемые формы в 1С:Управление торговлей 11 разработчики часто сталкиваются с неожиданной проблемой. Открывая форму документа (например, ЗаказКлиента) в конфигураторе, они не обнаруживают привычных кнопок «Печать» или процедур обработки их нажатия. Выясним причину этой архитектурной особенности современной платформы и подробно разберем, где скрыта логика печати и как решить практическую задачу — вывести вес номенклатуры в печатную форму заказа клиента.
Рассмотрим структуру современных типовых решений 1С, построенных на базе БСП (Библиотеки стандартных подсистем). Проанализируем ситуацию: ручное размещение элементов интерфейса для печати на десятках документов привело бы к колоссальным затратам на сопровождение и кастомизацию кода. Для унификации процесса разработчики БСП реализовали механизм динамического подключения команд печати.
Процесс вывода кнопок печати на форму устроен следующим образом:
ПриСозданииНаСервере вызывается специализированный метод общего модуля подсистемы управления печатью.ДобавитьКомандыПечати(КомандыПечати).Именно поэтому в режиме конфигуратора на самой форме документа вы не найдете физической кнопки «Печать» — её просто не существует до момента запуска приложения пользователем.
Разберем, где и как регистрируются команды печати. Откроем конфигуратор, найдем документ ЗаказКлиента и перейдем в его Модуль менеджера. Найдем в нем процедуру ДобавитьКомандыПечати. Примерный код описания команд выглядит так:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Описание команды для печати заказа клиента
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ЗаказКлиента";
КомандаПечати.Представление = НСтр("ru = 'Заказ клиента'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КомандаПечати.Порядок = 10;
КонецПроцедуры
Здесь описываются ключевые параметры команды: её представление в интерфейсе, необходимость проверки проведения документа, а также порядок отображения в меню.
Выясним, где хранятся макеты и исполняемый код для формирования печатной формы «Заказ клиента» в 1С:УТ 11. В целях оптимизации и разгрузки основных объектов конфигурации разработчики вынесли логику формирования многих документов в отдельные общие обработки.
Для заказа клиента вся логика вынесена в специализированную обработку с именем ПечатьЗаказовНаТоварыУслуги. В ней содержатся:
ПФ_MXL_ЗаказКлиента, определяющий внешний вид печатной формы.Печать, которая отвечает за сбор данных из базы, заполнение параметров макета и формирование итогового документа для вывода на экран или принтер.Теперь, когда мы детально изучили архитектуру печати, рассмотрим три практических способа вывода веса номенклатуры в печатную форму «Заказ клиента».
Этот способ является приоритетным, поскольку он позволяет решить задачу без изменения конфигурации. База данных останется на поддержке и сможет обновляться автоматически.
Выполним следующие шаги для создания ВПФ:
ВнешняяПечатнаяФормаЗаказКлиента.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработкеКопированием();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказКлиента");
ПараметрыРегистрации.Наименование = "Заказ клиента с весом (ВПФ)";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Заказ клиента (с весом)";
НоваяКоманда.Идентификатор = "ЗаказКлиентаСВесом";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
НоваяКоманда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
ПФ_MXL_ЗаказКлиента из типовой обработки ПечатьЗаказовНаТоварыУслуги в нашу внешнюю обработку. В макете добавим колонку «Вес» в область строки товара, определим её тип как Параметр и назовем его Вес. Также добавим соответствующую шапку колонки.Печать, в которой модифицируем запрос получения данных, соединив таблицу товаров со справочником номенклатуры для получения веса. Пример фрагмента запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказТовары.Номенклатура КАК Номенклатура,
| ЗаказТовары.Количество КАК Количество,
| ЗаказТовары.Цена КАК Цена,
| ЗаказТовары.Сумма КАК Сумма,
| ЕСТЬNULL(ЗаказТовары.Номенклатура.ВесЧислитель / ЕСТЬNULL(ЗаказТовары.Номенклатура.ВесЗнаменатель, 1), 0) КАК ВесЕдиницы
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ЗаказТовары
|ГДЕ
| ЗаказТовары.Ссылка В(&МассивОбъектов)";
// Пример заполнения параметров строки макета
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Пока ВыборкаСтрок.Следующий() Цикл
ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ВыборкаСтрок);
// Рассчитываем итоговый вес на количество в строке
ОбластьСтрока.Параметры.Вес = ВыборкаСтрок.ВесЕдиницы * ВыборкаСтрок.Количество;
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Если мы хотим интегрировать доработку непосредственно в конфигурацию, не снимая её с поддержки, воспользуемся механизмом расширений.
ПечатьЗаказовНаТоварыУслуги и макет ПФ_MXL_ЗаказКлиента.&ИзменениеИКонтроля переопределим метод сбора данных для печати в модуле менеджера добавленной обработки.Вес.Если ваша конфигурация уже изменена и снята с автоматической поддержки, мы можем отредактировать код напрямую.
ПечатьЗаказовНаТоварыУслуги.ДанныеДляПечатиЗаказов).
ВЫБОР
КОГДА ЗаказТовары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
ТОГДА ЕСТЬNULL(ЗаказТовары.Номенклатура.ВесЧислитель, 0)
ИНАЧЕ ЕСТЬNULL(ЗаказТовары.Упаковка.Вес, 0)
КОНЕЦ КАК ВесЕдиницы
Вес и в коде вывода печатной формы пропишем заполнение этого параметра:
ОбластьСтроки.Параметры.Вес = СтрокаТаблицы.ВесЕдиницы * СтрокаТаблицы.Количество;
Рассмотренные методы позволяют гибко подойти к решению задачи настройки печатных форм в зависимости от текущих требований к обновлению вашей информационной системы.