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