Как разрешить сохранение элемента справочника с незаполненными обязательными полями для определенных пользователей?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в системе 1С:Предприятие часто возникает задача гибкого управления обязательностью заполнения реквизитов. Стандартное поведение платформы предполагает, что если в метаданных реквизита установлено свойство Проверка заполнения: Выдавать ошибку, то система не позволит записать объект, пока поле не будет заполнено. Однако в реальных бизнес-процессах бывают исключения: например, администраторам или руководителям подразделений может потребоваться сохранить черновик документа или справочника с неполными данными для последующей доработки. Рассмотрим подробно, как реализовать механизм выборочного отключения проверок для заданного круга лиц.

Понимание механизмов проверки в 1С

Прежде чем приступать к коду, проанализируем, как именно 1С выполняет проверку. Существует два уровня, на которых это происходит:

  1. Платформенная проверка: Основана на настройках в конфигураторе. Система автоматически наполняет массив ПроверяемыеРеквизиты теми полями, у которых включена проверка в свойствах.
  2. Программная проверка: Реализуется разработчиком в процедурах ОбработкаПроверкиЗаполнения (в модуле объекта) или ОбработкаПроверкиЗаполненияНаСервере (в модуле формы). Здесь часто проверяются сложные условия, которые невозможно задать в метаданных.

Выясним причину, по которой некоторые реквизиты (например, «Сумма договора») не отображаются в стандартном массиве проверок. Это происходит потому, что разработчик конфигурации мог реализовать проверку вручную с помощью программного кода. Для того чтобы отключить такие проверки, нам придется работать сразу в нескольких местах.

Решение 1: Управление проверками в модуле объекта

Разберем основной метод управления списком обязательных полей. Процедура ОбработкаПроверкиЗаполнения в модуле объекта является универсальной — она срабатывает как при записи из формы, так и при программном создании объекта. Это лучшее место для глобальных правил.

Рассмотрим пример кода, который позволяет очистить список проверяемых реквизитов для пользователей с определенной ролью (например, «ПолныеПрава» или специально созданная роль «РазрешитьЗаписьСПустымиПолями»):


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	// Проверяем наличие роли у текущего пользователя
	Если РольДоступна("ПолныеПрава") Или РольДоступна("АдминистраторСистемы") Тогда
		
		// Если мы хотим полностью отключить платформенную проверку:
		ПроверяемыеРеквизиты.Очистить();
		
	Иначе
		
		// Если нужно исключить только конкретный реквизит, например "ИНН"
		Индекс = ПроверяемыеРеквизиты.Найти("ИНН");
		Если Индекс <> Неопределено Тогда
			ПроверяемыеРеквизиты.Удалить(Индекс);
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры

Важный нюанс: Очистка массива ПроверяемыеРеквизиты убирает только те ошибки, которые генерирует сама платформа. Если в этой же процедуре ниже написан какой-то принудительный код проверки с установкой Отказ = Истина, его также необходимо обернуть в условие проверки прав.

Решение 2: Работа с проверками в модуле формы

Проанализируем ситуацию, описанную в теме форума: когда проверка написана непосредственно в форме (процедура ОбработкаПроверкиЗаполненияНаСервере). Часто это касается реквизитов, которые становятся обязательными только при определенных действиях пользователя на экране.

Если проверка реализована через вызов ОбщегоНазначенияКлиентСервер.СообщитьПользователю, как это часто бывает в типовых конфигурациях, то простой манипуляцией с массивом ПроверяемыеРеквизиты не обойтись. Разберем по шагам, как модифицировать такой код:


&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
    
    // Определяем, нужно ли выполнять проверку для данного пользователя
    ЭтоПривилегированныйПользователь = РольДоступна("РазрешитьЗаписьБезСуммы");
    
    // Программная проверка суммы договора
    Если НЕ ЭтоПривилегированныйПользователь Тогда
        Если Объект.Сумма = 0 Тогда
            
            ТекстОшибки = НСтр("ru = 'Не заполнена сумма договора.'");
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                ТекстОшибки,
                Объект.Ссылка,
                "Объект.Сумма",,
                Отказ);
                
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Использование флага Отказ внутри условий позволяет гибко управлять процессом записи. Если мы не хотим, чтобы процедура вообще выполняла какие-либо проверки для мастера-пользователя, мы можем поставить Возврат в самом начале, но будьте осторожны: это пропустит и стандартные, и дополнительные проверки формы.

Визуальное оформление полей (АвтоОтметкаНезаполненного)

Чтобы пользователь не путался, почему поле подчеркнуто красным пунктиром, но система позволяет записывать объект, рекомендуется управлять свойством АвтоОтметкаНезаполненного. Посмотрим, как это сделать в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если РольДоступна("РазрешитьЗаписьСПустымиПолями") Тогда
        // Убираем визуальное выделение обязательности
        Элементы.СуммаДоговора.АвтоОтметкаНезаполненного = Ложь;
        Элементы.Контрагент.АвтоОтметкаНезаполненного = Ложь;
    КонецЕсли;
    
КонецПроцедуры

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

Итоги и рекомендации

Подводя итог, можно выделить следующую стратегию реализации:

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

← На главную