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