При настройке прав доступа в конфигурации 1С:Управление торговлей, редакция 11.4 часто возникает задача: ограничить возможности менеджеров так, чтобы они могли создавать и сохранять документы РеализацияТоваровУслуг, но не имели права их проводить. Это необходимо для того, чтобы окончательный контроль отгрузки оставался за кладовщиком или финансовым контролером. Однако при создании новой роли в расширении разработчики часто сталкиваются с тем, что форма документа становится недоступной для редактирования («Только просмотр»), даже если права на изменение установлены. Рассмотрим подробно, как решить эту проблему и какие механизмы 1С задействованы в данном процессе.
Проанализируем основную техническую причину, по которой форма документа может блокироваться. В платформе 1С существует механизм наследования прав, управляемый флагом Независимые права подчиненных объектов. В основной конфигурации, если мы даем право на изменение документа, права на его реквизиты могут подтягиваться автоматически. Однако в расширениях этот механизм часто ведет себя непредсказуемо.
Выясним причину блокировки: даже если в роли расширения для документа РеализацияТоваровУслуг проставлены галочки «Чтение», «Добавление» и «Изменение», форма может открыться в режиме только для просмотра, если не проставлены права на конкретные реквизиты. Разберем по шагам, что нужно сделать в расширении:
РеализацияТоваровУслуг.Дата, Номер, Проведен, ПометкаУдаления) — без прав на них форма также может блокироваться.Как показывает практика, явное указание прав на подчиненные объекты в расширении — это самый надежный способ избежать «серой» формы документа.
Рассмотрим более сложную ситуацию: менеджеру разрешено проводить реализации по одному складу (где он выступает и кладовщиком), но запрещено по остальным. В УТ 11.4 права доступа часто завязаны на RLS (Record Level Security).
Для программного определения списка разрешенных складов и управления возможностью проведения проанализируем ситуацию в коде. Вместо создания множества ролей, можно использовать проверку в модуле объекта (через расширение) в процедуре ПередЗаписью. Это позволит более гибко управлять логикой, не ограничивая пользователя в правах на запись документа.
Посмотрим на пример кода, который можно внедрить в расширение:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
// Проверяем, есть ли у пользователя специальная роль на проведение
Если Не РольДоступна("РазрешитьПроведениеРеализаций") Тогда
// Если роли нет, проверяем конкретный склад
МассивРазрешенныхСкладов = УправлениеДоступом.РазрешенныеЗначения(Тип("СправочникСсылка.Склады"));
Если МассивРазрешенныхСкладов.Найти(ЭтотОбъект.Склад) = Неопределено Тогда
РежимЗаписи = РежимЗаписиДокумента.Запись;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У вас недостаточно прав для проведения реализации по складу " + ЭтотОбъект.Склад);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он не вызывает критическую ошибку транзакции, а просто принудительно меняет режим записи с «Проведение» на «Запись», позволяя менеджеру сохранить черновик документа.
Часто возникает вопрос: как получить список складов, с которых пользователю разрешена отгрузка? В УТ 11.4, построенной на базе Библиотеки стандартных подсистем (БСП), для этого не нужно писать сложные запросы к таблицам прав. Проанализируем возможности функции УправлениеДоступом.РазрешенныеЗначения.
Данная функция возвращает массив ссылок на объекты, к которым у текущего пользователя есть права. Мы можем использовать её для фильтрации логики в документах:
// Получаем список всех складов, к которым есть доступ на изменение
СписокСкладов = УправлениеДоступом.РазрешенныеЗначения(Тип("СправочникСсылка.Склады"));
// Проверяем склад документа
Если СписокСкладов.Найти(Объект.Склад) <> Неопределено Тогда
// Логика разрешенного действия
КонецЕсли;
Также стоит учитывать Параметры сеанса. В актуальных версиях платформы 8.3 права RLS кэшируются. Информацию о доступных значениях можно извлечь из параметра сеанса ДоступныеЗначенияПравДоступа, что работает значительно быстрее прямых запросов в циклах.
Разберем еще один важный аспект: если менеджер все же смог провести документ (или это сделал за него другой сотрудник), форма может заблокироваться из-за статуса. В УТ 11.4 реализации имеют статусы: К предоплате, К отгрузке, Отгружено.
Если документ находится в статусе Отгружено, система включает жесткую блокировку полей. Проанализируем необходимые права для редактирования в этом случае:
Выясним разницу между правом Проведение и Интерактивное проведение в метаданных роли. Это ключевой момент для решения задачи «создавать, но не проводить»:
Если мы хотим, чтобы менеджеры могли записывать документ, но кнопка проведения выдавала ошибку доступа, следует оставить право Проведение, но снять флаг Интерактивное проведение. Однако помните, что типовые формы УТ 11.4 часто скрывают элементы управления целиком, если система видит отсутствие прав на интерактивные действия. Поэтому вариант с подменой РежимЗаписи в процедуре ПередЗаписью (рассмотренный выше) является более «дружелюбным» для интерфейса пользователя.
Подводя итог, можно сказать, что решение проблемы с правами в расширениях УТ 11.4 требует комплексного подхода. Рассмотрим краткое резюме наших действий:
УправлениеДоступом.РазрешенныеЗначения.ПередЗаписью, чтобы информировать пользователя и сохранять документ как черновик.Соблюдение этих правил позволит вам гибко настроить бизнес-процесс отгрузки, сохранив при этом стабильность работы интерфейса и корректность ведения учета в системе.