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