Почему внешняя печатная форма в 1С работает только под полными правами и как это исправить?

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

Каждый разработчик 1С рано или поздно сталкивается с классической проблемой: внешняя печатная форма (ВПФ) отлично печатается под учетной записью администратора с полными правами, но при попытке запуска обычным пользователем (например, менеджером по продажам или бухгалтером) система выдает ошибку: «Не удалось сформировать внешнюю печатную форму! Ошибка при вызове метода контекста (Создать): Нарушение прав доступа!».

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

Выясняем причину: почему прав на «Интерактивное открытие» недостаточно?

Часто системные администраторы и начинающие программисты совершают одну и ту же ошибку — они дают пользователю роли с правами Интерактивное открытие внешних отчетов и Интерактивное открытие внешних обработок в надежде, что это решит проблему. Однако это не помогает.

Давайте выясним, почему так происходит:

  1. Программное создание вместо интерактивного. Когда пользователь нажимает кнопку «Печать», система не открывает форму интерактивно через меню «Файл — Открыть». Механизм регистрации ВПФ (особенно в БСП или типовых конфигурациях на обычных формах) считывает двоичные данные файла из справочника и программно инициализирует объект на сервере с помощью метода ВнешниеОбработки.Создать() или ВнешниеОбработки.Подключить(). На эти программные действия право интерактивного открытия не распространяется.
  2. Ограничения безопасного режима (Safe Mode). По умолчанию при регистрации внешней обработки в системе часто устанавливается признак Безопасный режим = Истина. В этом режиме платформа жестко блокирует любые потенциально опасные операции: работу с файловой системой на сервере, COM-соединения, вызовы некоторых серверных методов и, главное, переход в привилегированный режим.
  3. Недостаток прав на чтение метаданных. Сама печатная форма в процессе своей работы может обращаться к константам, регистрам сведений или общим модулям конфигурации, права на чтение которых у рядового пользователя отсутствуют.

Анализируем исходный код внешней печатной формы

Рассмотрим предметно код модуля внешней обработки, представленный в обсуждении темы. В самом конце модуля мы видим следующую строку инициализации переменной:


мВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить;

А в начале функции ПечатьРеализация происходит другое обращение к константам:

ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить;

Проанализируем эту ситуацию. Константы ВалютаРегламентированногоУчета и ДополнительнаяКолонкаПечатныхФормДокументов — это полноценные объекты базы данных. Если у пользователя настроена узкоспециализированная роль (например, только выписка накладных), у него в правах этой роли может банально отсутствовать галочка на право Чтение для данных констант. В результате при попытке системы инициализировать обработку или выполнить функцию формирования печатного листа платформа мгновенно выбрасывает исключение «Нарушение прав доступа».

Помимо констант, в теле функции происходят вызовы функций различных общих модулей конфигурации:

Если хотя бы к одному из этих общих модулей (или к объектам метаданных, к которым они обращаются внутри себя) у пользователя нет прав на чтение или использование, внешняя печатная форма откажется работать.

Пошаговое руководство по решению проблемы

Рассмотрим несколько вариантов решения проблемы в зависимости от архитектуры вашей конфигурации и требований к безопасности.

Шаг 1. Локализация ошибки через Журнал регистрации

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

  1. Попросим пользователя воспроизвести ошибку (нажать кнопку печати).
  2. Зайдем в базу под полными правами и откроем Журнал регистрации (меню «Сервис» — «Журнал регистрации» или через функции для технического специалиста).
  3. Установим фильтр по колонке «Пользователь» и по событию «Доступ. Отказ в доступе».
  4. Проанализируем колонку «Данные». Там будет четко указано системное имя заблокированного объекта. Например: Константа.ВалютаРегламентированногоУчета или РегистрСведений.СуммаДокументовВВалютеРегл.

Шаг 2. Настройка прав доступа в Конфигураторе

Если журнал регистрации показал, что пользователю не хватает прав на чтение определенной константы или регистра, наиболее правильным с точки зрения безопасности решением будет добавление этого права в его роли:

  1. Откроем базу в режиме Конфигуратора.
  2. Найдем роль, назначенную данному пользователю (или создадим для этих целей новую дополнительную роль, например, ДополнительныеПраваДляПечатныхФорм).
  3. В дереве объектов роли перейдем к разделу Константы, найдем нужную константу (например, ВалютаРегламентированногоУчета) и установим галочки напротив прав Чтение и Просмотр.
  4. Сохраним конфигурацию базы данных и обновим права пользователя.

Шаг 3. Использование Привилегированного режима в коде ВПФ

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

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

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

Рассмотрим пример обхода ограничений при получении параметров:


// В начале экспортной функции переходим в привилегированный режим
УстановитьПривилегированныйРежим(Истина);

// Теперь чтение констант выполнится без проверки прав текущего пользователя
мВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить();
ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить();

// После выполнения критичных операций обязательно отключаем привилегированный режим
УстановитьПривилегированныйРежим(Ложь);

Шаг 4. Отключение безопасного режима при регистрации ВПФ

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

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

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

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

← На главную