При переносе информационных баз 1С:Предприятия 7.7 на современные серверные операционные системы (Windows Server 2008 R2, 2012 R2 и новее) разработчики и администраторы нередко сталкиваются с неожиданным поведением системы прав. Типичная ситуация: в интерфейсе настроен пункт меню, открывающий внешний отчет по относительному пути (например, .\ExtForms\Производство\График монтажей.ert). При первом запуске отчет открывается штатно, однако после формирования другого отчета или выгрузки данных повторная попытка открыть форму из меню завершается сообщением «Недостаточно прав доступа», причем отладчик даже не успевает зайти в модуль отчета.
Разберем детально механику возникновения этой ошибки и рассмотрим надежные способы ее устранения.
Проанализируем логику разграничения прав платформы 1С 7.7. В свойствах набора прав пользователя присутствует флаг «Использование любых Внешних Отчетов и Обработок». Если этот флаг снят, платформа разрешает открывать исключительно «общие» внешние отчеты — те, которые физически располагаются в каталоге базы данных внутри папки ExtForms.
Ключевая проблема кроется во взаимодействии платформы с текущим каталогом операционной системы (Current Working Directory) и механизмах нормализации путей:
.\ExtForms\... разрешается операционной системой не относительно жестко зафиксированного КаталогИБ(), а относительно текущей рабочей директории процесса 1cv7.exe.ФС.ВыбратьФайл()), механизмы сохранения таблиц, OLE/COM-соединения с Excel или внешние компоненты. Начиная с Windows Vista и Windows Server 2008, стандартные диалоги Win32 по умолчанию меняют текущую директорию процесса..\ExtForms\... начинает указывать во внешнюю для базы данных папку. Механизм безопасности 1С определяет, что файл находится вне ExtForms, классифицирует его как произвольный внешний отчет и немедленно блокирует вызов из-за отсутствия прав.ExtForms перестают восприниматься как доверенная зона общих отчетов.Если сбой воспроизводится строго после выполнения определенного действия (формирования промежуточного отчета, экспорта или открытия диалога сохранения), наиболее простым программным решением является возврат процесса в каталог информационной базы. Добавим в процедуры формирования или закрытия проблемного отчета явное переключение рабочей папки с помощью объекта ФС:
// Восстанавливаем рабочий каталог процесса в корень информационной базы
ФС.УстТекКаталог(КаталогИБ());
После вызова метода УстТекКаталог() относительные пути в командах меню вида .\ExtForms\... снова будут успешно разрешаться внутри каталога базы.
Рассмотрим более устойчивый архитектурный подход: полный отказ от относительных путей в конфигураторе пользовательского меню. Вместо прямой команды открытия внешнего файла свяжем пункт меню с вызовом единой процедуры конфигурации или служебной обработки, которая формирует абсолютный путь и выполняет метод ОткрытьФорму().
Пример кода функции для глобального модуля или кнопки вызова:
Процедура глОткрытьОтчетПроизводства(ИмяФайлаОтчета) Экспорт
Перем ПолныйПуть;
// Формируем абсолютный путь к файлу
ПолныйПуть = КаталогИБ() + "ExtForms\Производство\" + СокрЛП(ИмяФайлаОтчета);
Если ФС.СуществуетФайл(ПолныйПуть) = 1 Тогда
ОткрытьФорму("Отчет", , ПолныйПуть);
Иначе
Предупреждение("Файл отчета не найден: " + ПолныйПуть);
КонецЕсли;
КонецПроцедуры
При вызове через ОткрытьФорму() с явно сформированным абсолютным путем платформа 1С корректно сопоставляет путь с каталогом ExtForms, и проверка прав выполняется успешно независимо от того, какой рабочий каталог активен в операционной системе на данный момент.
Если изменять программный код нежелательно, проанализируем структуру файлов. Платформа 1С 7.7 стабильнее всего определяет доверенные общие отчеты, если они лежат непосредственно в корне папки ExtForms без создания подпапок (или если в корне продублирован файл с аналогичным именем). Переместим файл из вложенной папки .\ExtForms\Производство\График монтажей.ert в корень .\ExtForms\График монтажей.ert и перенастроим команду меню конфигурации.
Разберем административный вариант решения. Если конфигурация самописная, а структуру меню и модулей менять трудоемко, можно разрешить платформенную проверку и перенести контроль безопасности на уровень операционной системы:
ExtForms (оставляются только права на чтение и выполнение).