Каталог решений - Проверка заполнения полей одной строкой

Проверка заполнения полей одной строкой

Проверка заполнения полей одной строкой

В наличии

Функция для проверки заполнения полей.

Категория:

Описание

Иногда не хочется писать большой блок проверки заполнения полей типа "Если ЗначениеЗаполнено(Реквизит1) и ЗначениеЗаполнено(Реквизит2) ИЛИ ЗначениеЗаполнено(Реквизит3) И НЕ ЗначениеЗаполнено(Реквизит4) и т.д. Тогда …". Данная портянка усложняет читаемость кода.

Поэтому я решил сделать инструмент для упрощения сложной проверки заполнения (и/или незаполнения) реквизитов://Источник — источник, к которому можно обратиться через "." для получения реквизитов, указанных в строке условия

//СтрокаУсловия — строка условия, н-р: "(Контрагент + Организация) * ^Договор"

//СтрокаОшибки — если неправильно написано условие или условие не выполнилось, то здесь будет текст ошибки

// "*" — логическое "И", "+" — логическое "ИЛИ", "^" — Логическое "НЕ".
 

Функция ПроверитьЗаполнениеРеквизитов(Знач Источник, Знач СтрокаУсловия, СтрокаОшибки = "") Экспорт
    СтрокаУсловия = СтрЗаменить(СтрокаУсловия, " ", "");
    
    RegExp = Новый COMОбъект("VBScript.RegExp");// создаем объект для работы с регулярными выражениями
    RegExp.MultiLine = Истина;  // истина — текст многострочный, ложь — одна строка
    RegExp.Global = Истина;     // истина — поиск по всей строке, ложь — до первого совпадения
    RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
    Шаблон = "[\wа-яА-ЯёЁ]+";
    RegExp.Pattern = Шаблон;
    ПроверкаСоответствияШаблону = RegExp.test(СтрокаУсловия);
    Если НЕ ПроверкаСоответствияШаблону Тогда
        СтрокаОшибки = "Некорректно задано условие проверки заполнения полей";
        Возврат Ложь;
    КонецЕсли;
    СтрокаРезультат = RegExp.Replace(СтрокаУсловия, "(ЗначениеЗаполнено(Источник.$&))"); //формируем код условия
    СтрокаРезультат = СтрЗаменить(СтрокаРезультат, "*", " И ");
    СтрокаРезультат = СтрЗаменить(СтрокаРезультат, "+", " ИЛИ ");
    СтрокаРезультат = СтрЗаменить(СтрокаРезультат, "^", " НЕ ");
    РезультатПроверки = ЛОЖЬ;
    Попытка
        Выполнить("РезультатПроверки = " + СтрокаРезультат);
    Исключение
        СтрокаОшибки = "Некорректно задано условие проверки заполнения полей";
        Возврат Ложь;
    КонецПопытки;
    Если НЕ РезультатПроверки Тогда 
        //Если условие не выполнилось
        КоллекцияНайденныхПодстрок = RegExp.Execute(СтрокаУсловия);
        СтрокаОшибки = "Нарушены условия заполнения полей:" + Символы.ПС;
        Для Счетчик = 0 По КоллекцияНайденныхПодстрок.count - 1 Цикл
            СтрокаОшибки = СтрокаОшибки + КоллекцияНайденныхПодстрок.Item(Счетчик).Value + ", ";
        КонецЦикла;
        СтрокаОшибки = Лев(СтрокаОшибки, СтрДлина(СтрокаОшибки) - 2);
    КонецЕсли;
    Возврат РезультатПроверки;
КонецФункции

Примеры использования инструмента:

1)

стр = "";
Источник = Новый Структура("аа, бб, вв", 1,,3);

Если НЕ ДополнительныеФункции.ПроверитьЗаполнениеРеквизитов(Источник, "аа*бб +  ^вв   ", стр) Тогда
   сообщить(стр);
   //Ещё кусок кода
КонецЕсли;

В результате появится сообщение:

"Нарушены условия заполнения полей:
аа, бб, вв".

2) 

стр = "";
Источник = Новый Структура("аа, бб, вв", 1,,3);
Если НЕ ДополнительныеФункции.ПроверитьЗаполнениеРеквизитов(Источник, "аа + ^бб ", стр) Тогда
   сообщить(стр);
   //Ещё кусок кода
КонецЕсли;

В результате ничего не появится, так как проверка прошла успешно.

Минусы инструмента:

1) в случае сложной какой-нибудь проверки — неполноценная формулировка по поводу заполнения полей (выводится общая фраза с перечислением всех полей)

2) сообщение о не выполнении условия проверки содержит в себе имена полей, а не их представления, что не всегда хорошо. Например, для поля "ДоговорКонтрагента" хорошо бы показывать "Договор контрагента".

has been added to your cart:
Оформление заказа