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

02.03.18

Разработка - Универсальные функции

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

Иногда не хочется писать большой блок проверки заполнения полей типа "Если ЗначениеЗаполнено(Реквизит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) сообщение о не выполнении условия проверки содержит в себе имена полей, а не их представления, что не всегда хорошо. Например, для поля "ДоговорКонтрагента" хорошо бы показывать "Договор контрагента".

Вступайте в нашу телеграмм-группу Инфостарт

ПроверкаЗаполнения реквизиты поля проверка заполнения

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5429    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46377    dimanich70    83    

164

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6855    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57453    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8627    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22796    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ice-net 19 05.03.18 09:56 Сейчас в теме
Мне кажется не проще. Обычно сложные условия предполагают несколько ветвей кода, например:

Если перем1 и перем2 Тогда
//...общий блок1
Если перем1 тогда
//..что-то еще
КонецЕсли;
ИначеЕсли Перем1 тогда
//..еще какой-то вариант
Иначе 
//...
конецесли;
Показать

В Вашем случае предполагается только выполнение или не выполнение одного блока.

Да и вопрос еще что сложнее к пониманию, следующим программистам не надо лезть в ДополнительныеФункции и смотреть что же делает эта функция..:
Источник = Новый Структура("Перем1, Перем2, Перем3, Перем4",Истина,Неопределено,ОбщегоНазначения.ОбработатьКакуюНибудьПеременнуюИПолучитьРезультат(Переменная3), -18);
Если НЕ ДополнительныеФункции.ПроверитьЗаполнениеРеквизитов(Источник, "Перем1*Перем2+  ^Перем3 * Перем4", стр) Тогда
//...
КонецЕсли

Или..
Перем1 = ЗначениеЗаполнено(Истина);
Перем2 = ЗначениеЗаполнено(Неопределено);
Перем3 = ЗначениеЗаполнено(ОбщегоНазначения.ОбработатьКакуюНибудьПеременнуюИПолучитьРезультат(Переменная3));
Перем4 = ЗначениеЗаполнено(-18);
Если НЕ (Перем1 И Перем2            ИЛИ       НЕ Перем3  И Перем4) Тогда
//...
КонецЕсли
Показать
2. aleximus 10 05.03.18 13:56 Сейчас в теме
Закралась ошибка в начальный код:
Было
Функция ПроверитьЗаполнениеРеквизитов(Источник, Знач СтрокаУсловия, СтрокаОшибки = "") Экспорт
Изменил на:
Функция ПроверитьЗаполнениеРеквизитов(Знач Источник, Знач СтрокаУсловия, СтрокаОшибки = "") Экспорт

Функция удобна для проверки не только реквизитов структуры, но и формы (для неё и делал изначально), например:
Если НЕ ДополнительныеФункции.ПроверитьЗаполнениеРеквизитов(Объект, "Р1 * Р2 * ... * Рn, стр) Тогда
...
КонецЕсли;
Для отправки сообщения требуется регистрация/авторизация