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