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