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