Как программно контролировать или ограничить сохранение печатных форм и отчетов в 1С

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

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

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

Метод 1. Использование свойства ИспользованиеВывода

Первое, что нам необходимо понять: возможность сохранения, печати и копирования данных в табличном документе регулируется свойством ИспользованиеВывода. Это свойство объекта ТабличныйДокумент, которое может принимать три значения: Разрешить, Запретить или Авто.

Если мы установим это свойство в значение Запретить, платформа автоматически заблокирует для пользователя горячие клавиши (Ctrl+S, Ctrl+P), скроет кнопку сохранения («дискету») и сделает неактивными соответствующие пункты в главном меню «Файл». Рассмотрим, как это применить на практике при формировании печатной формы:


// Пример в процедуре формирования печатной формы
ТабДок = Новый ТабличныйДокумент;
// ... заполнение табличного документа ...
ТабДок.ИспользованиеВывода = ИспользованиеВыводаТабличногоДокумента.Запретить;
// После этого пользователь не сможет сохранить файл стандартными средствами

Важный нюанс: установка этого свойства полностью блокирует «вывод», включая печать на принтер. Если ваша задача — разрешить печать, но запретить сохранение, этот метод в чистом виде не подойдет, так как платформа объединяет эти действия в одно право.

Метод 2. Перехват в общих формах печати (БСП)

В современных конфигурациях (таких как БП 3.0, УТ 11, ERP) печатные формы практически никогда не выводятся напрямую. Они открываются в специализированной общей форме ПечатьДокументов. Это дает нам отличную точку для входа.

Проанализируем работу модуля УправлениеПечатьюКлиент. Именно здесь сосредоточены обработчики команд печати и сохранения. Для реализации ввода пароля нам потребуется создать Расширение и использовать аннотацию &Перед для процедуры, отвечающей за сохранение.

Чаще всего целевой процедурой является ЗаписатьТабличныйДокументВФайл. Разберем по шагам алгоритм реализации:

  1. Создаем расширение для конфигурации.
  2. Находим в общем модуле УправлениеПечатьюКлиент процедуру сохранения.
  3. Добавляем в расширение обработчик, который будет вызывать форму ввода пароля.
  4. В случае успеха вызываем стандартную обработку, в случае неудачи — прерываем выполнение.

Примерная схема кода в расширении будет выглядеть следующим образом:


&Перед("ЗаписатьТабличныйДокументВФайл")
Процедура Расш1_ЗаписатьТабличныйДокументВФайл(ТабличныйДокумент, Знач ИмяФайла = "")
    ПарольВведен = Ложь;
    // Вызываем диалог ввода пароля (модально или через описание оповещения)
    // Если пароль неверный, вызываем Исключение или возврат
    Если НЕ ПроверитьПарольНаСохранение() Тогда
        Отказ = Истина;
        Сообщить("У вас нет прав на сохранение данного документа!");
        ВызватьИсключение "Доступ запрещен";
    КонецЕсли;
КонецПроцедуры

Метод 3. Контроль в отчетах на базе СКД

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

Однако есть и более «штатный» путь внутри настроек самой Системы компоновки данных. Рассмотрим настройки отчета в конфигураторе:

  1. Переходим на вкладку Настройки.
  2. Выбираем Другие настройки.
  3. Находим параметр Вывод.

Если установить значение Запретить, то результат отчета будет сформирован с уже установленным свойством ИспользованиеВывода = Запретить. Чтобы сделать это динамически в зависимости от прав или пароля, мы можем изменять этот параметр программно перед компоновкой результата:


// В модуле объекта отчета
Процедура ПриКомпоновкеРезультата(РезультатХод, ДанныеРасшифровки, СтандартнаяОбработка)
    ПараметрВывод = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Output"));
    Если ПараметрВывод <> Неопределено Тогда
        ПараметрВывод.Значение = ИспользованиеВыводаРезультатаКомпоновкиДанных.Запретить;
        ПараметрВывод.Использование = Истина;
    КонецЕсли;
КонецПроцедуры

Метод 4. Глобальное ограничение через Роли

Если задача стоит шире — запретить сохранение всем пользователям определенной группы на постоянной основе — лучше всего воспользоваться механизмом ролей. В конфигураторе у каждой роли есть право Вывод. Это право отвечает за:

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

Реализация кастомной кнопки сохранения

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

  1. Мы полностью скрываем стандартную командную панель табличного документа.
  2. Добавляем свою кнопку «Сохранить».
  3. При нажатии на кнопку вызываем функцию проверки пароля.
  4. При успешной проверке программно вызываем диалог сохранения:

Процедура КомандаСохранитьСПаролем(Команда)
    Если ВвестиПароль() Тогда
        // Временно разрешаем вывод
        ТабДок.ИспользованиеВывода = ИспользованиеВыводаТабличногоДокумента.Разрешить;
        // Вызываем стандартный диалог
        ТабДок.ВыбратьФайлИЗаписать();
        // Снова запрещаем вывод для безопасности
        ТабДок.ИспользованиеВывода = ИспользованиеВыводаТабличногоДокумента.Запретить;
    КонецЕсли;
КонецПроцедуры

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

← На главную