Как найти функции печати на форме документа в 1С:УТ 11 и вывести вес номенклатуры в печатную форму?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При переходе с обычных форм (например, в решениях на платформе 1С 7.7 или УТ 10.3) на современные управляемые формы в 1С:Управление торговлей 11 разработчики часто сталкиваются с неожиданной проблемой. Открывая форму документа (например, ЗаказКлиента) в конфигураторе, они не обнаруживают привычных кнопок «Печать» или процедур обработки их нажатия. Выясним причину этой архитектурной особенности современной платформы и подробно разберем, где скрыта логика печати и как решить практическую задачу — вывести вес номенклатуры в печатную форму заказа клиента.

Почему кнопок печати нет на форме в конфигураторе?

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

Процесс вывода кнопок печати на форму устроен следующим образом:

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

Именно поэтому в режиме конфигуратора на самой форме документа вы не найдете физической кнопки «Печать» — её просто не существует до момента запуска приложения пользователем.

Где формируется список печатных форм?

Разберем, где и как регистрируются команды печати. Откроем конфигуратор, найдем документ ЗаказКлиента и перейдем в его Модуль менеджера. Найдем в нем процедуру ДобавитьКомандыПечати. Примерный код описания команд выглядит так:


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    
    // Описание команды для печати заказа клиента
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ЗаказКлиента";
    КомандаПечати.Представление = НСтр("ru = 'Заказ клиента'");
    КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
    КомандаПечати.Порядок = 10;
    
КонецПроцедуры

Здесь описываются ключевые параметры команды: её представление в интерфейсе, необходимость проверки проведения документа, а также порядок отображения в меню.

Где находится макет и логика печати заказа клиента?

Выясним, где хранятся макеты и исполняемый код для формирования печатной формы «Заказ клиента» в 1С:УТ 11. В целях оптимизации и разгрузки основных объектов конфигурации разработчики вынесли логику формирования многих документов в отдельные общие обработки.

Для заказа клиента вся логика вынесена в специализированную обработку с именем ПечатьЗаказовНаТоварыУслуги. В ней содержатся:

Решение задачи: Вывод веса номенклатуры в печатную форму

Теперь, когда мы детально изучили архитектуру печати, рассмотрим три практических способа вывода веса номенклатуры в печатную форму «Заказ клиента».

Способ 1. Внешняя печатная форма (ВПФ) — Самый безопасный и правильный метод

Этот способ является приоритетным, поскольку он позволяет решить задачу без изменения конфигурации. База данных останется на поддержке и сможет обновляться автоматически.

Выполним следующие шаги для создания ВПФ:

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

Способ 2. Использование расширения конфигурации

Если мы хотим интегрировать доработку непосредственно в конфигурацию, не снимая её с поддержки, воспользуемся механизмом расширений.

  1. Создадим новое расширение конфигурации в конфигураторе.
  2. Добавим в расширение обработку ПечатьЗаказовНаТоварыУслуги и макет ПФ_MXL_ЗаказКлиента.
  3. С помощью аннотации &ИзменениеИКонтроля переопределим метод сбора данных для печати в модуле менеджера добавленной обработки.
  4. Добавим в текст запроса получение веса номенклатуры (аналогично примеру из Способа 1) и скорректируем макет печатной формы внутри расширения, добавив ячейку параметра Вес.

Способ 3. Прямое изменение типовой конфигурации

Если ваша конфигурация уже изменена и снята с автоматической поддержки, мы можем отредактировать код напрямую.

  1. Включим возможность изменения для обработки ПечатьЗаказовНаТоварыУслуги.
  2. Откроем модуль менеджера этой обработки и найдем функцию, которая собирает данные для печати (например, ДанныеДляПечатиЗаказов).
  3. Внесем изменения в текст запроса. Обратите внимание на важный нюанс: в 1С:УТ 11 учет весогабаритных характеристик может вестись с использованием упаковок. Если товар продается в упаковках, вес необходимо получать из справочника упаковок. В запросе логику выбора веса единицы можно реализовать следующим образом:
    
    ВЫБОР
        КОГДА ЗаказТовары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
            ТОГДА ЕСТЬNULL(ЗаказТовары.Номенклатура.ВесЧислитель, 0)
        ИНАЧЕ ЕСТЬNULL(ЗаказТовары.Упаковка.Вес, 0)
    КОНЕЦ КАК ВесЕдиницы
    
  4. Откроем макет обработки, добавим новую колонку, назовем параметр в области строки Вес и в коде вывода печатной формы пропишем заполнение этого параметра:
    
    ОбластьСтроки.Параметры.Вес = СтрокаТаблицы.ВесЕдиницы * СтрокаТаблицы.Количество;
    
  5. Сохраним изменения и обновим конфигурацию базы данных.

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

← На главную