В практике разработчика 1С часто возникает задача ограничить возможности пользователя по выгрузке данных из системы. Одной из таких задач является внедрение дополнительной проверки (например, ввода пароля) при попытке сохранить печатную форму или отчет в файл. Сложность заключается в том, что в платформе 1С не существует единого события ПриСохраненииТабличногоДокумента. Процесс сохранения зачастую инициируется платформенными механизмами, которые работают «мимо» кода конфигурации.
В этой статье мы подробно разберем, как взять под контроль процесс вывода данных, проанализируем возможности программного интерфейса и выясним, какие механизмы Библиотеки стандартных подсистем (БСП) помогут нам решить задачу максимально элегантно.
Первое, что нам необходимо понять: возможность сохранения, печати и копирования данных в табличном документе регулируется свойством ИспользованиеВывода. Это свойство объекта ТабличныйДокумент, которое может принимать три значения: Разрешить, Запретить или Авто.
Если мы установим это свойство в значение Запретить, платформа автоматически заблокирует для пользователя горячие клавиши (Ctrl+S, Ctrl+P), скроет кнопку сохранения («дискету») и сделает неактивными соответствующие пункты в главном меню «Файл». Рассмотрим, как это применить на практике при формировании печатной формы:
// Пример в процедуре формирования печатной формы
ТабДок = Новый ТабличныйДокумент;
// ... заполнение табличного документа ...
ТабДок.ИспользованиеВывода = ИспользованиеВыводаТабличногоДокумента.Запретить;
// После этого пользователь не сможет сохранить файл стандартными средствами
Важный нюанс: установка этого свойства полностью блокирует «вывод», включая печать на принтер. Если ваша задача — разрешить печать, но запретить сохранение, этот метод в чистом виде не подойдет, так как платформа объединяет эти действия в одно право.
В современных конфигурациях (таких как БП 3.0, УТ 11, ERP) печатные формы практически никогда не выводятся напрямую. Они открываются в специализированной общей форме ПечатьДокументов. Это дает нам отличную точку для входа.
Проанализируем работу модуля УправлениеПечатьюКлиент. Именно здесь сосредоточены обработчики команд печати и сохранения. Для реализации ввода пароля нам потребуется создать Расширение и использовать аннотацию &Перед для процедуры, отвечающей за сохранение.
Чаще всего целевой процедурой является ЗаписатьТабличныйДокументВФайл. Разберем по шагам алгоритм реализации:
УправлениеПечатьюКлиент процедуру сохранения.Примерная схема кода в расширении будет выглядеть следующим образом:
&Перед("ЗаписатьТабличныйДокументВФайл")
Процедура Расш1_ЗаписатьТабличныйДокументВФайл(ТабличныйДокумент, Знач ИмяФайла = "")
ПарольВведен = Ложь;
// Вызываем диалог ввода пароля (модально или через описание оповещения)
// Если пароль неверный, вызываем Исключение или возврат
Если НЕ ПроверитьПарольНаСохранение() Тогда
Отказ = Истина;
Сообщить("У вас нет прав на сохранение данного документа!");
ВызватьИсключение "Доступ запрещен";
КонецЕсли;
КонецПроцедуры
С отчетами ситуация обстоит иначе. В типовых конфигурациях они открываются через форму отчета, которая также является общей. Для управления доступом к сохранению в отчетах мы можем использовать обработчик события ПослеВыбораФорматаСохранения или перехватывать команды в модуле ОтчетыКлиент.
Однако есть и более «штатный» путь внутри настроек самой Системы компоновки данных. Рассмотрим настройки отчета в конфигураторе:
Если установить значение Запретить, то результат отчета будет сформирован с уже установленным свойством ИспользованиеВывода = Запретить. Чтобы сделать это динамически в зависимости от прав или пароля, мы можем изменять этот параметр программно перед компоновкой результата:
// В модуле объекта отчета
Процедура ПриКомпоновкеРезультата(РезультатХод, ДанныеРасшифровки, СтандартнаяОбработка)
ПараметрВывод = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Output"));
Если ПараметрВывод <> Неопределено Тогда
ПараметрВывод.Значение = ИспользованиеВыводаРезультатаКомпоновкиДанных.Запретить;
ПараметрВывод.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Если задача стоит шире — запретить сохранение всем пользователям определенной группы на постоянной основе — лучше всего воспользоваться механизмом ролей. В конфигураторе у каждой роли есть право Вывод. Это право отвечает за:
Если снять эту галочку, платформа сама позаботится о безопасности. Пользователь не сможет извлечь данные из системы стандартными методами. Однако помните, что это право действует на все табличные документы в системе. Если вам нужно выборочное ограничение, используйте методы с программным управлением свойством ИспользованиеВывода, описанные выше.
Самым надежным способом реализации ввода пароля является создание собственной панели инструментов для печатных форм. Проанализируем этот подход:
Процедура КомандаСохранитьСПаролем(Команда)
Если ВвестиПароль() Тогда
// Временно разрешаем вывод
ТабДок.ИспользованиеВывода = ИспользованиеВыводаТабличногоДокумента.Разрешить;
// Вызываем стандартный диалог
ТабДок.ВыбратьФайлИЗаписать();
// Снова запрещаем вывод для безопасности
ТабДок.ИспользованиеВывода = ИспользованиеВыводаТабличногоДокумента.Запретить;
КонецЕсли;
КонецПроцедуры
Этот метод гарантирует, что пользователь не сможет обойти защиту, так как управление свойством ИспользованиеВывода происходит в момент совершения действия под контролем вашего кода. Помните, что никакая программная защита в 1С не защитит от фотографирования экрана или использования сторонних программ для захвата изображения (скриншотов), но от случайного или бесконтрольного копирования файлов данные методы защищают эффективно.