Как добавить кнопку печати в новый документ в УТ 11 и разобраться с кнопкой «Места использования»

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

При разработке новых объектов в конфигурациях, основанных на Библиотеке стандартных подсистем (БСП), таких как «Управление торговлей 11», «ERP» или «Комплексная автоматизация», программисты часто сталкиваются с тем, что обычного добавления команды в форму недостаточно. Подсистема печати в современных конфигурациях является динамической и требует строгого соблюдения определенных протоколов взаимодействия между формой, модулем менеджера и общими модулями системы. Рассмотрим подробно, как правильно интегрировать печать в новый документ и почему в командной панели могут появляться «лишние» кнопки.

Шаг 1. Подготовка модуля формы документа

Для того чтобы документ «увидел» подключаемые команды (в том числе команду печати), нам необходимо подготовить форму. Подсистема подключаемых команд требует наличия определенных обработчиков. Разберем программный код, который должен быть размещен в модуле формы.

Прежде всего, нам нужно инициализировать команды при создании формы на сервере. Проанализируем процедуру ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Инициализация механизма подключаемых команд
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    
КонецПроцедуры

Однако инициализации недостаточно. Нам нужно обеспечить обновление состава команд при чтении объекта и управлении состоянием формы. Добавим обработчики событий ПриЧтенииНаСервере и ПриОткрытии на клиенте:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // Обновление команд при перечитывании данных
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Динамическое обновление команд при открытии формы
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
КонецПроцедуры

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


&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    // Основной обработчик для большинства подключаемых команд
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
    // Обработка серверной части команды (если требуется)
    ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
    // Специализированный обработчик именно для печати
    УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтотОбъект, Объект);
КонецПроцедуры

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

Шаг 2. Настройка модуля менеджера документа

Теперь перейдем к «мозгу» нашей печатной формы. В модуле менеджера нового документа необходимо описать, какие именно команды печати мы предоставляем системе. Для этого используется экспортная процедура ДобавитьКомандыПечати. Рассмотрим пример формирования команды для формы М-2:


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

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

Шаг 3. Регистрация документа в глобальных механизмах

Проанализируем ситуацию: мы добавили код в форму и менеджер, но кнопка все еще может не появиться. Почему? В БСП существует общий список объектов, поддерживающих печать. Нам нужно зайти в общий модуль УправлениеПечатьюПереопределяемый и найти процедуру ПриОпределенииОбъектовСКомандамиПечати.

Разберем, как добавить наш документ в этот список:


Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    
    СписокОбъектов.Добавить(Документы.ВашНовыйДокумент);
    
КонецПроцедуры

Без этой регистрации система не будет опрашивать модуль менеджера вашего документа на предмет наличия в нем процедур печати.

Шаг 4. Откуда берется кнопка «Места использования»?

Многие разработчики пугаются, когда вместо ожидаемой «Печати» видят кнопку «Места использования», которая ведет к отчету по ссылкам на объект. Выясним причину этого поведения.

Это не баг и не ошибка кода. В БСП существует подсистема «Анализ ссылок». В этой подсистеме зарегистрированы команды, которые имеют тип параметра ЛюбаяСсылка. Как только вы добавляете в форму код для работы подключаемых команд (Шаг 1), система начинает автоматически подтягивать все глобальные команды, подходящие для вашего типа объекта.

Почему это происходит:

  1. Команда «Места использования» определена для типа ЛюбаяСсылка.
  2. Ваш новый документ — это ссылка.
  3. Подсистема подключаемых команд «честно» выводит всё, что ей разрешено.

Если вы хотите скрыть эту или другие системные кнопки, это можно сделать программно в процедуре ПриОпределенииКомандПодключенныхКОбъекту в модуле менеджера, удалив ненужные элементы из массива команд, однако в типовых решениях (как УТ 11) эта кнопка считается полезным стандартом интерфейса.

Шаг 5. Реализация логики формирования печатной формы

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


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Проверяем, нужно ли печатать нашу форму
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ДоверенностьМ2") Тогда
        
        // Формируем табличный документ (логика формирования выносится в отдельную функцию)
        ТабДок = СформироватьПечатнуюФормуМ2(МассивОбъектов, ОбъектыПечати);
        
        // Регистрируем результат в коллекции
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм,
            "ДоверенностьМ2",
            "Доверенность (М-2)",
            ТабДок);
            
    КонецЕсли;
    
КонецПроцедуры

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

← На главную