При работе в современных конфигурациях на базе 1С:Предприятие 8.3, таких как «Управление торговлей 11», «ERP Управление предприятием» или «Комплексная автоматизация», разработчики и администраторы часто сталкиваются с досадной проблемой. Пользователь с ограниченными правами (например, менеджер по продажам) пытается распечатать внешнюю печатную форму (ВПФ) для документа «Реализация товаров и услуг» или «Счет-фактура», но вместо печатного листа получает системное сообщение об ошибке доступа к таблице РегистрСведений.СуммыДокументовВВалютеРегл.
В этой статье мы подробно разберем, почему возникает эта ошибка, как работает механизм безопасности в 1С и какими способами можно вернуть пользователям возможность печатать документы без предоставления им избыточных прав администратора.
Для начала проанализируем ситуацию и поймем роль регистра СуммыДокументовВВалютеРегл. Этот регистр является служебным и используется системой для хранения сумм документов, пересчитанных в валюту регламентированного учета. Это необходимо, когда сам документ оформлен, например, в долларах, а печатные формы «ТОРГ-12» или «Счет-фактура» по закону должны выводиться в рублях.
Типовые роли (например, «Менеджер по продажам») часто не имеют прямого права на чтение этого регистра, так как он относится к финансовому контуру. Однако встроенные (типовые) печатные формы работают без ошибок. Почему так происходит? Дело в том, что в типовом коде печать выполняется на стороне сервера в так называемом привилегированном режиме. В этом режиме система игнорирует проверку прав доступа текущего пользователя, полагаясь на логику кода, написанного разработчиками фирмы «1С».
Когда же мы запускаем внешнюю печатную форму, ситуация меняется. Рассмотрим основные механизмы, которые приводят к блокировке доступа.
Это самое частое и быстрое решение, которое помогает в 90% случаев. Рассмотрим подробнее, как это работает. По умолчанию все внешние обработки и печатные формы в 1С подключаются в безопасном режиме. В этом режиме системе запрещены любые операции, которые могут нанести вред: работа с файловой системой, запуск внешних приложений и, что самое важное в нашем случае, переход в привилегированный режим.
Если внешняя печатная форма обращается к общим модулям системы для формирования сумм, а те пытаются прочитать данные из защищенного регистра, безопасный режим блокирует это действие, и пользователь получает ошибку.
Чтобы решить проблему, нам необходимо внести изменения в модуль объекта внешней печатной формы. Найдем функцию СведенияОВнешнейОбработке и проанализируем параметры регистрации. Нам нужно убедиться, что параметру БезопасныйРежим присвоено значение Ложь.
Разберем пример кода функции регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Наименование = "Внешняя печатная форма ТОРГ-12";
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
// Именно эта строка решает проблему доступа:
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
// Остальной код регистрации команд...
Возврат ПараметрыРегистрации;
КонецФункции
После внесения изменений обработку необходимо перезагрузить в справочнике «Дополнительные отчеты и обработки». Важный нюанс: в последних версиях БСП (Библиотеки стандартных подсистем) после установки этого флага администратор должен вручную подтвердить разрешение в пользовательском интерфейсе 1С, так как система выдаст предупреждение о небезопасности данной формы.
Если по каким-то причинам вы не можете или не хотите отключать безопасный режим, проанализируем код запросов внутри самой печатной формы. Часто внешние формы создаются путем копирования кода из типовых конфигураций. Если в типовом коде предполагалось, что запрос всегда выполняется в привилегированном режиме, там может отсутствовать ограничение выборки.
Посмотрим на пример запроса, который может вызывать ошибку:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Суммы.СуммаРегл,
| Суммы.НДСРегл
|ИЗ
| РегистрСведений.СуммыДокументовВВалютеРегл КАК Суммы
|ГДЕ
| Суммы.Регистратор = &Ссылка";
Если у пользователя нет прав на этот регистр, такой запрос вызовет «падение» системы. Чтобы этого избежать (или хотя бы позволить форме сформироваться без данных этого регистра), добавим ключевое слово РАЗРЕШЕННЫЕ. Рассмотрим исправленный вариант:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Суммы.СуммаРегл,
| Суммы.НДСРегл
|ИЗ
| РегистрСведений.СуммыДокументовВВалютеРегл КАК Суммы
|ГДЕ
| Суммы.Регистратор = &Ссылка";
Внимание: этот способ лишь убирает ошибку доступа. Если прав на чтение регистра действительно нет, запрос вернет пустой результат, и в вашей печатной форме вместо сумм в рублях могут отобразиться нули. Поэтому данный метод лучше комбинировать с настройкой прав доступа.
Иногда проблема кроется глубже — в настройках самой информационной базы. Если вы используете облачное решение или кластер серверов с включенными профилями безопасности, то даже установка БезопасныйРежим = Ложь в коде может не сработать. В этом случае сервер 1С на уровне операционной системы запрещает выполнение «небезопасного» кода.
Рассмотрим шаги для системного администратора:
РегистрСведений.СуммыДокументовВВалютеРегл. Если такой роли в типовом наборе нет, ее можно создать через расширение конфигурации.Мы проанализировали ситуацию с ошибкой доступа и выяснили, что наиболее эффективным решением является программное отключение безопасного режима во внешней обработке. Однако стоит помнить о безопасности: используйте только проверенные внешние формы, так как отключение безопасного режима дает обработке полный доступ к данным системы в рамках прав пользователя.
Основные выводы:
БезопасныйРежим = Ложь в функции СведенияОВнешнейОбработке.Используя эти методы, вы сможете быстро восстановить работоспособность печатных форм и обеспечить комфортную работу пользователям в 1С.