Как правильно вывести команды печати БСП на общую форму

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

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

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

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

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

Обратим внимание на параметр КомандаПечати.СписокФорм. Если вы явно перечисляете в нем имена форм, где должна отображаться команда, то на общей форме она не появится. Для того чтобы команда была доступна везде, где используется ссылка на данный объект, это ограничение лучше снять или расширить.


// В модуле менеджера документа
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "АктПриемки";
    КомандаПечати.Представление = НСтр("ru = 'Акт приемки'");
    // ОШИБКА: Если указать только "ФормаСписка", на общей форме кнопки не будет
    // КомандаПечати.СписокФорм = "ФормаСписка,ФормаДокумента"; 
    
    // ПРАВИЛЬНО: Оставить пустым для отображения во всех формах
    // Или добавить имя вашей общей формы в список через запятую
    КомандаПечати.ПроверкаПроведенности = Истина;
    
КонецПроцедуры

Шаг 2. Регистрация объекта в переопределяемом модуле

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


Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    СписокОбъектов.Добавить(Документы.ПоступлениеТоваровУслуг);
    // Добавьте сюда все объекты, чьи команды печати нужны на общих формах
КонецПроцедуры

Шаг 3. Инициализация команд в модуле общей формы

Теперь перейдем к самой форме. Рассмотрим процедуру ПриСозданииНаСервере. Здесь мы должны инициализировать механизм подключаемых команд. Важно правильно указать источник данных (тип ссылки) и командную панель, куда будут добавлены кнопки.


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

Важный нюанс: Если у вас на форме несколько динамических списков, процедуру ПодключаемыеКоманды.ПриСозданииНаСервере нужно вызвать для каждого списка отдельно, создавая новый экземпляр ПараметрыРазмещения.

Шаг 4. Обработка активации строки и обновления команд

Чтобы кнопки печати становились активными или неактивными в зависимости от выбранного документа (например, если печать разрешена только для проверенных документов), необходимо добавить обработчики событий.

Разберем обязательные процедуры в модуле формы:


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

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

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

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

Шаг 5. Настройка динамического списка и интерфейса

Проанализируем настройки самого элемента ДинамическийСписок в конструкторе формы. Для корректной работы БСП крайне важны два момента:

  1. В свойствах динамического списка (закладка «Данные») должно быть заполнено поле «Основная таблица». Без этого подсистема не сможет определить метаданные объекта.
  2. В поле списка (колонке) Ссылка должен быть установлен признак «Использовать всегда». Это гарантирует, что ссылка на документ всегда будет доступна на клиенте для передачи в параметры печати.

Также стоит обратить внимание на имя группы, которую вы создаете для размещения команд. Выясним причину, почему команды могут «схлопываться» или пропадать. В БСП зарезервировано имя группы ПодменюПечать. Если вы создали свою группу с таким именем вручную и не связали её правильно через ПараметрыРазмещения, может возникнуть конфликт имен. Рекомендуется создавать обычную группу (вид — Группа кнопок) и передавать её в программный код инициализации.

Шаг 6. Использование альтернативного способа (ручной вызов)

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


&НаКлиенте
Процедура МояКомандаПечати(Команда)
    
    ТекущиеДанные = Элементы.СписокПоступлений.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("Источник", ТекущиеДанные.Ссылка);
    ПараметрыОткрытия.Вставить("ПараметрыПечати", Новый Структура);
    
    // Вызов стандартной общей формы печати БСП
    ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
    
КонецПроцедуры

Однако помните, что при таком подходе вам придется вручную обрабатывать доступность кнопок и следить за обновлением состава печатных форм. Использование стандартного метода ПодключаемыеКоманды.ПриСозданииНаСервере является более предпочтительным, так как оно автоматически подтягивает даже внешние печатные формы, подключенные через справочник «Дополнительные отчеты и обработки».

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

← На главную