Как проверить заполнение реквизитов в форме 1С перед выполнением операций

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

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

Различие между визуальной отметкой и логической проверкой

Рассмотрим ситуацию, с которой сталкиваются многие начинающие разработчики. У реквизита в свойствах можно установить флаг АвтоОтметкаНезаполненного. Это полезная функция, которая подчеркивает поле красным пунктиром, если оно не заполнено, тем самым подсказывая пользователю о необходимости ввода данных. Однако важно понимать: это свойство носит исключительно декоративный характер. Оно не вызывает автоматическую остановку выполнения процедур при нажатии на кнопку «Сформировать» или «Выполнить».

Для того чтобы система действительно контролировала наличие данных, необходимо использовать свойство реквизита Проверка заполнения, установив его в значение Выдавать ошибку. Только в этом случае встроенный метод платформы ПроверитьЗаполнение() будет учитывать данное поле.

Использование метода ПроверитьЗаполнение в коде формы

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

Посмотрим на пример реализации кода:


&НаКлиенте
Процедура Сформировать(Команда)
    
    // Вызываем стандартную проверку. 
    // Если есть незаполненные обязательные поля, система выдаст сообщения и вернет Ложь.
    Если Не ПроверитьЗаполнение() Тогда
        Возврат; // Прекращаем выполнение процедуры
    КонецЕсли;
    
    // Если проверка пройдена, переходим к основной логике
    СоздатьДокументыНаСервере();
    
КонецПроцедуры

Метод ПроверитьЗаполнение() является функцией, которая возвращает Истина, если все обязательные реквизиты заполнены, и Ложь, если обнаружены ошибки. При обнаружении пустых полей платформа автоматически сформирует сообщения пользователю и привяжет их к соответствующим элементам формы.

Программное управление списком проверяемых реквизитов

Иногда логика проверки должна быть гибкой. Например, реквизит «Склад» обязателен только в том случае, если выбрана определенная хозяйственная операция. Для реализации такой логики используется серверное событие объекта или формы ОбработкаПроверкиЗаполнения.

Рассмотрим, как проанализировать ситуацию и программно исключить или добавить реквизиты в список проверки:


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

В данном обработчике параметр ПроверяемыеРеквизиты представляет собой массив строк, содержащий пути к данным, которые платформа собирается проверить. Мы можем манипулировать этим массивом, добавляя в него новые элементы или удаляя существующие.

Проверка реквизитов, созданных только на форме

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

Пример добавления реквизита формы в проверку:


&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
    
    // Добавляем реквизит формы, который не связан с данными объекта
    ПроверяемыеРеквизиты.Добавить("ДатаНачалаПериода");
    ПроверяемыеРеквизиты.Добавить("ДатаОкончанияПериода");
    
КонецПроцедуры

Ручная генерация сообщений об ошибках

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

Проанализируем ситуацию с проверкой табличной части:


Для Индекс = 0 По Объект.Товары.Количество() - 1 Цикл
    СтрокаТовара = Объект.Товары[Индекс];
    
    Если СтрокаТовара.Количество <= 0 Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Количество в строке " + (Индекс + 1) + " должно быть больше нуля!";
        // Указываем путь к конкретной ячейке в таблице
        Сообщение.Поле = "Объект.Товары[" + Индекс + "].Количество";
        Сообщение.УстановитьДанные(Объект);
        Сообщение.Сообщить();
        
        Отказ = Истина; // Устанавливаем флаг ошибки
    КонецЕсли;
КонецЦикла;

Использование метода УстановитьДанные(Объект) позволяет платформе сопоставить сообщение с данными формы, благодаря чему пользователь сможет кликнуть по сообщению и автоматически перейти к ошибочному полю.

Развитие платформы: новые возможности (8.3.22+)

Начиная с версии платформы 8.3.22, разработчики получили еще более удобные инструменты для работы с таблицами. Теперь для колонок таблиц в форме можно напрямую настраивать свойство Проверка заполнения. Это избавляет от необходимости писать циклы обхода строк в ОбработкаПроверкиЗаполнения, так как платформа берет эту задачу на себя. Также расширены возможности визуализации ошибок — сообщения могут выводиться не только общим списком, но и в виде всплывающих подсказок непосредственно у элементов управления.

Краткий чек-лист для реализации проверки:

  1. В свойствах реквизита в конфигураторе или в редакторе формы установите Проверка заполнения — Выдавать ошибку.
  2. В процедуре обработки команды (на клиенте) перед основным кодом вставьте условие: Если Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли;.
  3. Если нужно проверять реквизиты формы, добавьте их в массив ПроверяемыеРеквизиты в событии ОбработкаПроверкиЗаполненияНаСервере.
  4. Если требуется сложная логика, используйте объект СообщениеПользователю с обязательным указанием пути к данным.

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

← На главную