В процессе внедрения и эксплуатации 1С:ERP Управление предприятием часто возникает управленческая задача: ограничить права рядовых сотрудников цеха или исполнителей на изменение статусов документов. Типичный сценарий — разрешить пользователям только создавать документ Этап производства в начальном статусе «Формируется», в то время как перевод в статус «К выполнению», «Завершен» или «Прерван» должен оставаться прерогативой диспетчера или руководителя подразделения.
В рамках данной статьи мы подробно проанализируем, существуют ли типовые инструменты для решения этой задачи, разберем ролевую модель системы и предложим оптимальные способы реализации ограничений с помощью механизмов расширений.
Проанализируем текущую ситуацию в актуальных релизах системы (версии 2.5 и выше). К сожалению, в типовом функционале отсутствует прямая настройка или «галочка» в профилях групп доступа, которая позволяла бы жестко закрепить за пользователем право выбора только конкретного перечня статусов для документа Этап производства.
Логика переходов между статусами в ERP жестко зашита в программном коде и логике бизнес-процесса производства. Тем не менее, рассмотрим, какие косвенные механизмы мы можем использовать:
ДобавлениеИзменениеЭтаповПроизводства. Однако, если у пользователя есть право на изменение документа, система по умолчанию позволяет ему устанавливать любой логически возможный статус.Статус (реквизит, влияющий на проведение и движения по регистрам) и Состояние (вычисляемый реквизит для визуального контроля). Настройка прав на уровне состояний в типовом решении также не предусмотрена.Поскольку типового переключателя «ограничить статус» не существует, наиболее правильным и безопасным методом внедрения такой проверки является использование расширения конфигурации. Это позволит нам сохранить основную конфигурацию на поддержке и реализовать гибкую проверку прав.
Рассмотрим по шагам, как реализовать механизм, запрещающий перевод документа в любой статус, кроме «Формируется», для пользователей без специальных прав.
Для начала создадим в расширении новую роль, например, ПолныйКонтрольСтатусовЭтапов. Эту роль мы будем назначать только диспетчерам. Все остальные пользователи, у которых этой роли нет, будут ограничены в выборе.
Нам необходимо перехватить событие записи документа. Оптимально использовать процедуру ПередЗаписью в модуле объекта документа ЭтапПроизводства. Разберем пример кода, который можно внедрить через расширение:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, является ли объект новым или он уже существует в базе
// Если это новый документ, и статус уже не "Формируется" - проверяем права
// Если документ редактируется, проверяем, не пытается ли пользователь сменить статус
Если ЭтоНовый() Тогда
Если Статус <> Перечисления.СтатусыЭтаповПроизводства.Формируется Тогда
Если Не РольДоступна("ПолныйКонтрольСтатусовЭтапов") Тогда
Сообщить("У вас недостаточно прав для создания этапа в статусе, отличном от 'Формируется'!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Иначе
// Получаем текущее значение статуса из базы данных для сравнения
СтатусВБазе = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Статус");
Если Статус <> СтатусВБазе И Не РольДоступна("ПолныйКонтрольСтатусовЭтапов") Тогда
// Проверяем, не пытается ли обычный пользователь перевести этап из "Формируется" во что-то другое
Если СтатусВБазе = Перечисления.СтатусыЭтаповПроизводства.Формируется
И Статус <> Перечисления.СтатусыЭтаповПроизводства.Формируется Тогда
Сообщить("Перевод этапа из статуса 'Формируется' разрешен только диспетчеру!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию: данный код эффективно блокирует попытку записи документа, если пользователь пытается нарушить бизнес-процесс. При этом система выдает понятное предупреждение.
Некоторые специалисты рассматривают возможность использования RLS для ограничения доступа к документам в определенных статусах. Разберем этот подход подробнее.
Важно: Мы крайне не рекомендуем использовать RLS для контроля бизнес-логики статусов в высоконагруженных системах. В сообщениях форума упоминалось, что объем документов может достигать 250 000 в год. Внедрение произвольных условий RLS на такой объем данных приведет к следующим проблемам:
Выясним причину, почему вопрос статусов так важен при больших оборотах (65–250 тысяч этапов в год). В 1С:ERP этап производства — это основной «двигатель» себестоимости. Каждый перевод в статус «Завершен» инициирует движения по регистрам накопления, отражает выпуск продукции и списание материалов.
Если мы позволим линейному персоналу бесконтрольно менять статусы, мы получим:
Поэтому, помимо программного ограничения через ПередЗаписью, мы рекомендуем настроить формы документов. Вы можете использовать расширение формы, чтобы программно устанавливать свойство ТолькоПросмотр для поля Статус, если у пользователя нет нужной роли. Это улучшит юзабилити: пользователь сразу увидит, что поле заблокировано, и не будет тратить время на заполнение документа, который не сможет провести.
Подводя итог нашему анализу, можно сделать вывод: типового «флажка» в настройках 1С:ERP для ограничения прав на статусы не существует. Однако задача легко решается созданием расширения с проверкой ролей в событии ПередЗаписью. Такой подход является наиболее сбалансированным с точки зрения производительности и удобства поддержки системы, особенно в условиях крупного промышленного производства с десятками тысяч документов в месяц.