В процессе ведения учета в конфигурациях «1С:Предприятие» (будь то классическая «Управление производственным предприятием 1.3» или современные ERP и КА) часто возникает необходимость жестко контролировать остатки товаров и взаиморасчетов. Стандартный механизм платформы устроен так, что полноценный контроль остатков по регистрам накопления выполняется преимущественно при оперативном проведении. При неоперативном проведении (задним числом) система часто пропускает отрицательные остатки, что ведет к искажению себестоимости и ошибок в учете.
Разберем детально, как решить задачу ограничения пользователей: разрешить им проводить документы только текущей датой и строго оперативно, а также полностью избавиться от назойливого диалогового окна с вопросом «Провести оперативно или неоперативно?».
Самое простое и изящное решение, не требующее написания сложного кода, заключается в правильной настройке ролей пользователей. Платформа «1С:Предприятие 8» предоставляет для этого специализированное право.
Проанализируем, как работает этот механизм по шагам:
ОграничениеПроведенияДокументов).Важная особенность поведения платформы: многие разработчики опасаются, что после снятия этого права пользователю все равно будет докучать стандартное окно выбора режима проведения. На самом деле это не так.
Если у пользователя отсутствует право «Интерактивное проведение неоперативное», а свойство формы документа ИспользоватьРежимПроведения установлено в значение Автоматически (это стандартное поведение платформы по умолчанию):
Если вам требуется реализовать более гибкую логику на клиенте (например, разграничивать доступ динамически без создания множества ролей в конфигураторе), мы можем управлять свойствами формы документа программно.
Рассмотрим пример настройки формы. В модуле формы документа (в обработчике события ПриОткрытии для обычных форм или ПриСозданииНаСервере для управляемых форм) мы можем принудительно задать режим проведения:
Процедура ПриОткрытии()
// Проверяем, входит ли пользователь в группу ограничения
Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("Бухгалтер") Тогда
// Блокируем появление диалогового окна выбора режима
ЭтотОбъект.ИспользоватьРежимПроведения = ИспользованиеРежимаПроведения.Оперативный;
КонецЕсли;
КонецПроцедуры
При такой установке свойства ИспользоватьРежимПроведения платформа будет пытаться провести документ исключительно в оперативном режиме. Если пользователь попытается провести документ за прошедшую дату, система вернет стандартный отказ.
Ограничение интерактивных прав решает проблему только при работе пользователя непосредственно через форму документа. Однако здесь кроется серьезный подводный камень: программный код (например, обработки загрузки данных, проведение на основании, групповое перепроведение документов) игнорирует ограничения с приставкой «Интерактивное...».
Если сторонняя обработка выполнит код ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный), система успешно проведет документ задним числом, несмотря на запреты в ролях.
Чтобы гарантировать стопроцентное соблюдение бизнес-логики, внедрим программную проверку на сервере через подписку на событие. Разберем этот процесс по шагам:
КонтрольРежимаПроведенияПередЗаписью.ДокументОбъект).ПередЗаписью.
Процедура КонтрольРежимаПроведенияПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Нас интересует только непосредственное проведение документа
Если РежимЗаписи <> РежимЗаписиДокумента.Проведение Тогда
Возврат;
КонецЕсли;
// Проверяем попытку неоперативного проведения
Если РежимПроведения = РежимПроведенияДокумента.Неоперативный Тогда
// Проверяем права текущего пользователя программно
Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("РазрешитьНеоперативноеПроведение") Тогда
// Выводим сообщение об ошибке и блокируем запись
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"У вас нет прав на неоперативное проведение документов! Проведение возможно только оперативно (текущим временем).",
Источник
);
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При проектировании системы контроля важно помнить фундаментальные правила работы платформы:
РежимПроведенияДокумента.Оперативный для документа со вчерашней датой вызовет ошибку платформы. Если вчерашний документ нужно сделать оперативным, пользователю сначала придется изменить его дату на текущую.Используя комбинацию из ограничения интерактивных прав роли и серверной подписки на событие, вы настроите надежную и отказоустойчивую систему контроля оперативного проведения документов, исключающую человеческий фактор.