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