В конфигурации «Управление торговлей», редакция 10.3, границы запрета изменения данных хранятся в специальном регистре сведений ГраницыЗапретаИзмененияДанных. Разберем по шагам, как правильно организовывать программную установку и изменение этих дат, какие ошибки часто допускают разработчики и как гарантировать, что новые ограничения применятся без перезапуска сеанса пользователя.
Рассмотрим пример кода, в котором выполняется сплошной перебор записей регистра сведений с изменением границ запрета по наименованиям пользователей или групп:
Выборка = РегистрыСведений.ГраницыЗапретаИзмененияДанных.Выбрать();
Пока Выборка.Следующий() Цикл
МенеджерЗаписи = Выборка.ПолучитьМенеджерЗаписи();
МенеджерЗаписи.Прочитать();
Если Выборка.Пользователь.Наименование = "Менеджеры" Тогда
МенеджерЗаписи.ГраницаЗапретаИзменений = ТекущаяДата() - 86400;
ИначеЕсли Выборка.Пользователь.Наименование = "Бухгалтера" Тогда
МенеджерЗаписи.ГраницаЗапретаИзменений = ТекущаяДата() - (86400 * 30);
ИначеЕсли Выборка.Пользователь.Наименование = "Обмен данными" Тогда
МенеджерЗаписи.ГраницаЗапретаИзменений = ТекущаяДата() - (86400 * 14);
КонецЕсли;
МенеджерЗаписи.Записать();
КонецЦикла;
Проанализируем ситуацию и выясним, с какими проблемами можно столкнуться при использовании такого алгоритма:
ПараметрыСеанса.ГраницыЗапретаИзмененияДанных. Запись в регистр не обновляет параметр в запущенных сеансах пользователей автоматически. До перезапуска программы ограничения не вступят в силу.Выборка.Пользователь.Наименование = "Бухгалтера" крайне ненадёжен. Если администратор переименует группу или допустит опечатку, условие перестанет срабатывать. Правильнее использовать предопределенные элементы, поиск по коду или прямые ссылки.Выбрать() и создание ПолучитьМенеджерЗаписи() на каждой итерации создают ненужную нагрузку на СУБД и могут спровоцировать блокировки.ГраницыЗапретаИзмененияДанных содержит не только измерение Пользователь, но и измерение Организация. Если границы устанавливаются в разрезе организаций, это нужно обязательно учитывать при записи.Для точечной установки границы запрета конкретному пользователю или группе рекомендуется использовать СоздатьНаборЗаписей() с установкой отбора по измерениям, а сразу после записи принудительно обновлять параметры сеанса текущего пользователя.
Рассмотрим пример кода для записи даты запрета конкретному пользователю или группе пользователей:
// Устанавливаем границу запрета для конкретного пользователя или группы
НаборЗаписей = РегистрыСведений.ГраницыЗапретаИзмененияДанных.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(СсылкаНаПользователяИлиГруппу);
// Если граница устанавливается в целом (без разреза по организациям)
НаборЗаписей.Отбор.Организация.Установить(Справочники.Организации.ПустаяСсылка());
Запись = НаборЗаписей.Добавить();
Запись.Пользователь = СсылкаНаПользователяИлиГруппу;
Запись.Организация = Справочники.Организации.ПустаяСсылка();
Запись.ГраницаЗапретаИзменений = ТекущаяДата() - 86400; // Например, вчерашний день
НаборЗаписей.Записать();
// Обязательно обновляем параметры сеанса
ПолныеПрава.УстановитьПараметрГраницыЗапретаИзмененияДанных();
Вызов процедуры ПолныеПрава.УстановитьПараметрГраницыЗапретаИзмененияДанных() пересчитывает актуальные границы и записывает их в ПараметрыСеанса.ГраницыЗапретаИзмененияДанных, благодаря чему изменения применяются мгновенно.
В зависимости от архитектурных требований задачи можно выбрать один из следующих подходов:
ПриНачалеРаботыСистемы модулей системы. В этом случае граница будет актуализироваться каждый раз при входе пользователя в базу.ГруппыПользователей (например, «Менеджеры», «Бухгалтерия»). Для изменения прав отдельного сотрудника достаточно включить его в соответствующую группу программно или через интерфейс, не меняя сам регистр сведений.ДокументОбъект.ОбменДанными.Загрузка = Истина.