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