! новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Ограничение прав на запись документа в зависимости от даты

  • Добавить свою публикацию
  • для этого требуется регистрация

 

Для решения подобных задач в типовых конфигурациях предусмотрен механизм подписок на события. Данный механизм хорош тем, добавляется "сбоку" не мешая обновлять типовую конфигурацию.

 

Что делаем?

Создаем в общем модуле процедуру, которая будет вызываться из подписки на событие.

 

Вначале проверяем текущие права пользователя. Если у него есть Роли "ПолныеПрава" или

"ПраваНаЗаписьПутевыхЛистовПосле3РабочегоДня", то процедуру не вызываем и соответсвенно запись документа пользователю доступна всегда.

 

Для всех остальных пользователей получаем 3 день текущего месяца из производственного календаря, сравниваем с текущей датой. Если текущая дата больше 3 рабочего числа, то выдаем сообщение и отменяем проведение.

 

Потом создаем подписку на событие с видом "При записи документа", выбираем наш документ и нашу прошедуру.

 

Код процедуры:

 

Процедура ПроверкаВозможностиЗаписиПутевогоЛистаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
     Если РольДоступна("ПолныеПрава") или РольДоступна("ПраваНаЗаписьПутевыхЛистовПосле3РабочегоДня")      Тогда
          Возврат;
     КонецЕсли;
 
    ДатаТретьегоРабочегоЧисла = ПолучитьТретьеРабочееЧисло(КонецМесяца(Источник.ПериодРегистрации)+1);
          Если ДатаТретьегоРабочегоЧисла < ТекущаяДата() тогда
               Отказ = Истина;
               Сообщить ("Путевые листы можно записывать по 3 рабочий день месяца");
    КонецЕсли;
КонецПроцедуры
 
Функция ПолучитьТретьеРабочееЧисло(ДатаНачалаМесяца)
               Запрос = Новый Запрос;
               Запрос.УстановитьПараметр("ДатаНачалаМесяца",ДатаНачалаМесяца);
               Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 3
                              |             РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК РабочийДень
                              |ИЗ
                              |               РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
                              |ГДЕ
                              |             РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
                              |             И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= &ДатаНачалаМесяца";
               Результат = Запрос.Выполнить().Выгрузить();
               Если Результат.Количество() = 3 тогда
                    Возврат Результат[2].РабочийДень;
               Иначе
                    Возврат КонецМесяца(ДатаНачалаМесяца);
              КонецЕсли;     
КонецФункции             
 
0
≡ к списку статей