Как реализовать запрет на печать и сохранение отчета СКД в файл?

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

В процессе разработки корпоративных информационных систем на платформе 1С:Предприятие 8.3 часто возникает задача по защите конфиденциальной информации. Одной из таких задач является ограничение возможностей пользователя по выводу данных из системы: запрет на печать отчета, сохранение его в форматы Excel, PDF или обычное копирование данных в буфер обмена. Рассмотрим подробнее, как реализовать этот механизм для отчетов, построенных на системе компоновки данных (СКД), особенно если конфигурация базируется на Библиотеке стандартных подсистем (БСП).

Использование свойства «Вывод» табличного документа

Основным инструментом для управления правами на экспорт данных в 1С является свойство Вывод (Output). Это свойство относится к типу ИспользованиеВывода и может принимать несколько значений, среди которых наиболее важным для нас является Запретить. Проанализируем, на что именно влияет эта установка:

  1. Печать: Блокируется возможность отправки документа на принтер.
  2. Сохранение: Пункт меню "Файл - Сохранить как" становится недоступным для данного окна.
  3. Буфер обмена: Пользователь не сможет скопировать выделенные ячейки (Ctrl+C).

Важно понимать, что установка этого свойства только для объекта ТабличныйДокумент в памяти (на сервере) не всегда автоматически транслируется на элемент формы. Выясним причину: часто при формировании отчета СКД программно, разработчики забывают, что элемент формы, отображающий результат, имеет собственные настройки.

Реализация запрета через расширение или форму отчета

Если мы хотим быстро внедрить запрет для конкретного отчета, мы можем воспользоваться обработчиком события ПриСозданииНаСервере. Посмотрим на пример кода, который можно разместить в модуле формы отчета или в расширении для общей формы отчетов:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем запрет вывода для элемента формы, в котором отображается отчет
    Элементы.ОтчетТабличныйДокумент.Вывод = ИспользованиеВывода.Запретить;
КонецПроцедуры

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

Решение для конфигураций на базе БСП (современный подход)

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

Сначала нам нужно объявить, что мы хотим перехватить событие создания формы. Для этого используем процедуру ОпределитьНастройкиФормы:


Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры

Затем реализуем саму логику запрета в процедуре ПриСозданииНаСервере, которая теперь будет вызываться ядром БСП автоматически при открытии отчета:


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

Дополнительные меры защиты: Защита и ТолькоПросмотр

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

Проблемы при асинхронном выводе СКД

Проанализируем ситуацию, когда отчет формируется долго и платформа выводит результат частями. В некоторых случаях настройки элемента формы могут сбрасываться при полной перезагрузке схемы компоновки. Чтобы этого избежать, наиболее надежным методом будет установка запрета непосредственно в модуле объекта в процедуре ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Стандартная обработка формирования отчета
    СтандартнаяОбработка = Ложь;
    
    // Настраиваем схему и настройки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    // Устанавливаем запрет на уровне табличного документа до его вывода на экран
    ДокументРезультат.Вывод = ИспользованиеВывода.Запретить;
    ДокументРезультат.Защита = Истина;
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Нюансы работы с почтой и внешними файлами

Выясним еще одну важную деталь. Если в вашей конфигурации включена возможность «Отправить по почте», то БСП может сформировать файл Excel на сервере, даже если на клиенте вывод запрещен. Чтобы закрыть эту «дыру» в безопасности, необходимо программно отключить команду отправки почты для данного отчета. Это делается через коллекцию ПараметрыВывода в СКД или через отключение соответствующей команды в ОпределитьНастройкиФормы.

Подведем итог. Для полноценного запрета вывода отчета необходимо:

  1. Установить Вывод = ИспользованиеВывода.Запретить для элемента формы.
  2. Установить Защита = Истина.
  3. Скрыть визуальные группы команд «Печать» и «Сохранить».
  4. При использовании БСП — использовать переопределяемые методы модуля объекта для чистоты кода.

Эти действия обеспечат надежную защиту данных от несанкционированного копирования и распространения за пределы информационной системы 1С.

← На главную