В процессе автоматизации бизнес-процессов на базе конфигурации «1С:Управление торговлей 10.3» часто возникает задача по ограничению прав пользователей на вывод документов на печать. Типичный сценарий: менеджер не должен иметь возможности распечатать накладную (Реализацию товаров и услуг), пока документ не прошел стадию согласования или пока не заполнены обязательные реквизиты (например, «Договор», «Склад» или специфический дополнительный статус). Особую сложность здесь представляет то, что в системе могут использоваться не только встроенные, но и внешние печатные формы (ВПФ), которые стандартные проверки в модуле объекта могут «обходить».
В данной статье мы подробно разберем несколько стратегий реализации такого запрета, проанализируем их надежность и выберем оптимальный вариант для конфигураций на обычных формах.
Это самый очевидный способ. Мы внедрим проверку условий непосредственно в логику формирования печатных форм. Рассмотрим ситуацию, когда нам нужно запретить печать, если не заполнен реквизит Проект.
Проанализируем код внутри модуля объекта документа (например, РеализацияТоваровУслуг). Найдем процедуру Печать. Именно она вызывается при нажатии на стандартные кнопки печати.
Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, Ссылка = Неопределено) Экспорт
// Наша проверка условий
Если НЕ ЗначениеЗаполнено(Проект) Тогда
Предупреждение("Печать запрещена: не заполнен реквизит 'Проект'!");
Возврат;
КонецЕсли;
// Далее идет типовой код формирования макета
// ...
КонецПроцедуры
Важный нюанс: этот метод отлично работает для встроенных макетов, но, как справедливо замечено в обсуждении, внешние печатные формы (ВПФ) часто используют собственную логику вызова. В УТ 10.3 внешние формы регистрируются в справочнике «Внешние обработки» и вызываются через механизмы общего модуля УниверсальныеМеханимы. Поэтому простой правки модуля объекта может быть недостаточно.
Рассмотрим более изящный способ, который предотвращает саму возможность нажатия кнопки пользователем. Если условие печати не выполнено, мы просто удаляем или деактивируем кнопку «Печать» на форме документа.
Разберем реализацию в процедуре ПриОткрытии или в обработчике обновления формы:
Процедура ОбновитьДоступностьПечати()
// Определяем условие (например, статус согласования)
ДокументСогласован = (Статус = Перечисления.СтатусыСогласования.Согласован);
КнопкаПечать = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать;
Если НЕ ДокументСогласован Тогда
// Можно либо отключить доступность
КнопкаПечать.Доступность = Ложь;
// Либо вовсе скрыть кнопку
КнопкаПечать.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Однако помните, что в обычных формах 1С кнопка «Печать» часто является подменю (кнопка с вариантами выбора). В этом случае нужно перебирать подменю или программно очищать список доступных печатных форм. Кроме того, этот метод требует внедрения кода во все формы, где возможна печать: форму документа и форму списка (журнал документов), так как пользователи часто печатают документы прямо из списка.
Чтобы не править каждую внешнюю печатную форму и не «ломать» все формы документов, правильнее всего внедриться в механизм, который отвечает за формирование списка печатных форм глобально. В конфигурации УТ 10.3 за это отвечает общий модуль УниверсальныеМеханимы.
Рассмотрим по шагам, как это реализовать:
УниверсальныеМеханимы процедуру, которая формирует меню печати (обычно это СформироватьСписокПечатныхФорм).Пример логики в общем модуле:
Функция ПолучитьСписокПечатныхФорм(СсылкаНаОбъект) Экспорт
Если ТипЗнч(СсылкаНаОбъект) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
// Проверяем статус документа в базе данных
Если НЕ СсылкаНаОбъект.Согласовано Тогда
Возврат Новый СписокЗначений; // Возвращаем пустой список, печать будет недоступна
КонецЕсли;
КонецЕсли;
// ... стандартная логика получения форм
КонецФункции
Этот метод является наиболее надежным, так как он перекрывает доступ к печати как через кнопку на форме, так и через контекстное меню в списках, независимо от того, встроенная это форма или внешняя.
Проанализируем ситуацию, когда проверка должна осуществляться внутри самой внешней обработки. Чтобы не перечитывать документ из базы данных (что создает лишнюю нагрузку), мы можем использовать коллекцию ДополнительныеСвойства объекта.
В модуле документа перед вызовом печати можно установить флаг:
ЭтотОбъект.ДополнительныеСвойства.Вставить("ЗапретПечати", Истина);
Затем во внешней печатной форме (ВПФ) проверяем это свойство:
Если СсылкаНаОбъект.ДополнительныеСвойства.Свойство("ЗапретПечати")
И СсылкаНаОбъект.ДополнительныеСвойства.ЗапретПечати Тогда
Сообщить("Печать данной формы заблокирована системой контроля!");
Возврат;
КонецЕсли;
Выясним, как предотвратить печать, если форма уже сформирована, но мы хотим запретить ее вывод на принтер. У объекта ТабличныйДокумент существуют свойства Защита и ТолькоПросмотр. Если установить Защита = Истина, пользователь не сможет редактировать документ и, при определенных настройках прав, выводить его на печать.
Однако самым радикальным и правильным методом остается установка свойства ТолькоПросмотр = Истина и очистка параметров печати. Но помните: если пользователь видит сформированный документ на экране, он всегда может попробовать сделать скриншот или обойти защиту. Поэтому лучшая практика — не допускать формирования макета вовсе, выбрасывая исключение или возвращая Отказ в процедуре формирования.
Для реализации полноценного запрета печати в УТ 10.3 мы рекомендуем комбинированный подход:
УниверсальныеМеханимы. Это «золотой стандарт», позволяющий контролировать все виды печатных форм (включая внешние) из одной точки.ПриОткрытии. Это избавит менеджеров от лишних вопросов, так как они сразу будут видеть, что действие недоступно.Печать модуля объекта и убедитесь, что внешние обработки обращаются к этой процедуре или к общим механизмам проверки.Важно помнить, что в УТ 10.3 (обычные формы) нет механизма расширений, поэтому любые изменения вносятся непосредственно в конфигурацию. Тщательно документируйте внесенные изменения, чтобы не возникло сложностей при последующих обновлениях системы на новые релизы.