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