В конфигурациях 1С на обычных формах в справочнике ВнешниеОбработки существовала табличная часть ПринадлежностьПечатнойФормы. Она позволяла администратору в пользовательском режиме задавать произвольный отбор (например, по значению реквизита Организация), и команда печати отображалась только у подходящих документов. Перейдя на управляемые формы и Библиотеку стандартных подсистем (БСП), многие разработчики сталкиваются с отсутствием такой табличной части. Выясним причину этого изменения и разберем все рабочие способы решения задачи.
Проанализируем архитектуру подсистемы печати БСП. В управляемом интерфейсе внешние печатные формы (ВПФ) регистрируются на уровне типов метаданных, а не отдельных экземпляров документов. Функция СведенияОВнешнейОбработке() передает список объектов назначения (например, ДокументСсылка.РеализацияТоваровУслуг), но не предоставляет интерфейса для динамической фильтрации по конкретным значениям полей прямо в карточке справочника ДополнительныеОтчетыИОбработки.
Команды формируются динамически при открытии формы или генерации подменю «Печать». Поэтому управлять доступностью печатной формы можно несколькими способами в зависимости от поставленных требований.
Рассмотрим самый простой и надежный способ, который не требует внесения изменений в конфигурацию и работает в режиме подключения внешней обработки через справочник ДополнительныеОтчетыИОбработки.
В процедуре Печать() модуля объекта внешней обработки выполняется проверка реквизита Организация для каждого документа из переданного массива. Если организация не совпадает с целевой, пользователю выводится предупреждение, а печать прерывается.
Посмотрим на пример реализации обработки коллекции объектов:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыПечати = Новый Структура;
// Получаем описание нужной команды из коллекции
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "МояВнешняяПечатнаяФорма");
Если ПечатнаяФорма = Неопределено Тогда
Возврат;
КонецЕсли;
// Формируем список документов только для нужной организации
МассивРазрешенных = Новый Массив;
НужнаяОрганизация = Справочники.Организации.НайтиПоНаименованию("ООО Рога и Копыта");
Для Каждого ДокументСсылка Из МассивОбъектов Цикл
Если ДокументСсылка.Организация = НужнаяОрганизация Тогда
МассивРазрешенных.Добавить(ДокументСсылка);
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Печатная форма доступна только для организации ""%1"". Документ %2 пропущен.'"),
НужнаяОрганизация,
ДокументСсылка
)
);
КонецЕсли;
КонецЦикла;
Если МассивРазрешенных.Количество() > 0 Тогда
ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивРазрешенных, ОбъектыПечати);
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует, что менеджер не сможет вывести на печать форму от чужого юридического лица, а при групповой печати обработка не завершится аварийно.
Если требуется полностью скрыть пункт из подменю «Печать», когда в документе выбрана другая организация, воспользуемся штатным механизмом динамической видимости команд БСП. Данный функционал можно реализовать, перенеся печатную форму в расширение конфигурации.
Разберем по шагам, как настроить условие видимости команды:
ДобавитьКомандыПечати() объявляем команду.УправлениеПечатью.ДобавитьУсловиеВидимостиКоманды(), передав имя реквизита формы и требуемое значение.Посмотрим на пример кода в модуле менеджера документа:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "АктСпецОрганизация";
КомандаПечати.Представление = НСтр("ru = 'Акт (Спец. организация)'");
КомандаПечати.Обработчик = "УправлениеПечатьюКлиент.ВыполнитьКомандуПечати";
КомандаПечати.СписокФорм = "ФормаДокумента,ФормаСписка";
// Накладываем условие видимости по реквизиту формы "Организация"
ЦелеваяОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701234567");
УправлениеПечатью.ДобавитьУсловиеВидимостиКоманды(
КомандаПечати,
"Организация",
ЦелеваяОрганизация,
ВидСравнения.Равно
);
КонецПроцедуры
При таком подходе платформа автоматически отслеживает изменение поля Организация на форме документа и динамически скрывает или показывает команду в меню без перезагрузки формы.
Если сотрудники жестко разделены по организациям (например, менеджеры первой организации не работают с документами второй), задачу можно решить стандартными средствами БСП без программирования:
Для пользователей, не входящих в список быстрого доступа, команда будет доступна только через общее окно дополнительных обработок либо скрыта полностью (при отсутствии прав на дополнительную обработку).
Если печатная форма подключается как внешняя, но требуется динамически скрывать сгенерированную кнопку на форме, можно перехватить событие формы в расширении конфигурации.
Проанализируем пример кода в модуле формы документа:
&НаСервере
Процедура Расш_ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ОбновитьВидимостьПечатныхФорм();
КонецПроцедуры
&НаСервере
Процедура ОбновитьВидимостьПечатныхФорм()
НужнаяОрганизация = Справочники.Организации.НайтиПоНаименованию("ООО Рога и Копыта");
КнопкаПечати = Элементы.Найти("ФормаПодменюПечать_МояВнешняяПечатнаяФорма");
Если КнопкаПечати <> Неопределено Тогда
КнопкаПечати.Видимость = (Объект.Организация = НужнаяОрганизация);
КонецЕсли;
КонецПроцедуры
Данный вариант позволяет гибко управлять интерфейсом без изменения исходного типового кода конфигурации.