1с проверить текст на соответствие шаблону
Как вызвать стандартную проверку заполнения реквизитов?
Код 1C v 8.2 УП
Возвращаемое значение:
Тип: Булево. Истина - ошибок не обнаружено, Ложь - в противном случае.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
Код 1C v 8.2 УП
У прикладных объектов на платформе 1С Предприятие 8.2 появился новый обработчик события ОбработкаПроверкиЗаполнения, где теперь рекомендуется делать все проверки на заполненность реквизитов объекта. Рассмотрим работу с этим обработчиком. Обработчик должен быть расположен в модуле объекта (для констант в модуле менеджера значений) и имеет следующий синтаксис:
Код 1C v 8.2 УП
Здесь параметр Отказ (тип Булево) отвечает за возможность дальнейшей работы программы после проверки заполнения, а в параметре ПроверяемыеРеквизиты(тип Массив) содержатся реквизиты объекта, которые система будет проверять на заполненность. Напомним, что в версии 1С Предприятие 8.2 появилось возможность на уровне свойств реквизитов объекта устанавливать свойство Проверка заполнения. Так вот в массив ПроверяемыеРеквизиты по умолчанию система помещает реквизиты с установленным свойством «Выдавать ошибку». Однако разработчик может сам некоторые реквизиты добавить в массив или удалить из него в зависимости от каких-либо условий:
Код 1C v 8.2 УП
Как видно из примера в качестве элементов массива выступают строковые наименование реквизитов, как они заданы в конфигураторе. Для того чтобы полностью отказаться от системной проверки, необходимо очистить массив. При этом разработчик может проводить проверку реквизитов по произвольным алгоритмам, система же проверяет только на заполненность/незаполненность:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Код 1C v 8.2 УП
Далее рассмотрим, когда вызывается данный обработчик. Это зависит от типа объекта и его свойств. Так для, например, для справочника обработчик вызывается перед записью объекта; для документа: если разрешено проведение - при проведении, иначе при записи; для обработки : при вызове стандартных команд "OK", Да". Подробно это описано во встроенной справке. Но также есть возможность вызвать данный обработчик в произвольный момент, используя метод объекта ПроверитьЗаполнение(). Например, определить команду Проверить в форме документа:
Код 1C v 8.2 УП
Автор: Борис Захаров
Код 1C v 8.х
Код 1C v 8.х
Похожие FAQ
Еще в этой же категории
Программное создание таблицы значений с условным оформлением 12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора
Заполнение списка значений в элементе поле выбора на форме 10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип - Произвольный, Использование - Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Поле выбора
Как ограничить список выбора? 8
Ограничим список элементов, установив отбор в открываемой форме //Пример 1 Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка) ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент); ЭлементОтбораВидПДР = Форма Реквизит
Как активизировать, перевести фокус на необходимый элемент на форме? 6
//Текущему Элементу формы присваиваем элемент котровый необходимо активизировать ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличноеПоле; Посмотреть все в категории Работа с Формой (Диалог) и её элементами
О функциях и формате шаблона RegExp подробно можно почитать здесь:
http://www.script-coding.info/WSH/RegExp.html
Книга Михайлов А. Системное программирование в 1С: Предприятии 7.7/8.0 (Глава 1. "Применение технологий СОМ и ActiveX" - "Регулярные выражения")
библиотека RegExp является предустановленной т.е. есть в любом Windows
Возможности регулярных выражений:
Сравнить текст с заданным шаблоном (метод Test).
Заменить или удалить из строки текст, соответствующий заданному шаблону (метод Replace).
Извлечь из строки текст, соответствующий заданному шаблону (метод Execute).
1. Использование
RegExp используется в 1С через COM интерфейс пример кода:
RegExp = Новый COMОбъект ( "VBScript.RegExp" ); // создаем объект для работы с регулярными выражениями
RegExp . MultiLine = Истина; // истина — текст многострочный, ложь — одна строка
RegExp . Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp . IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
Шаблон = ".+@.+\..+" ; //шаблон проверки e-mail
RegExp . Pattern = Шаблон ; // шаблон (регулярное выражение)
Если Не RegExp . Test ( ПроверяемыйEMail ) Тогда
Сообщить ( "Некорректный email" );
КонецЕсли;
о методах и свойствах можно почитать подробно здесь
2. Достоинства RegExp
- хорошая скорость анализа т.к. 1С анализ строк (разбор) обычно реализуется циклами и функциями: Лев, Прав, Сред, Найти, а встроенный язык медленный
- высокая читаемость и модифицированность (более предсказуем в случае несоответствия строки - разбору)
- доп. функционал (можно осуществлять анализ, замену и проверку строковых выражений)
- не все задачи можно решить (например рекурсивные разборы тип 1 + (2+3*(2-7)) в случае если нужно разобрать на выражения в скобках) приходится смешивать с кодом
- Возможны зависания при использовании сложных шаблонов. Отладчик RegExBuddy в таких ситуациях пишет о невозможности получить результат за разумное число итераций
- RegExp доп. библиотека (инициализация занимает значительное время)
основное достоинство RegExp это читаемость
3. Отладка и проверка (RegExBuddy)
Отладка регулярных выражений довольно частая задача т.к. бывает трудно понять и сам шаблон и ошибки в разборе. Наиболее удобным инструментом на мой взгляд является программа Также есть тестер 8.1 от coder1cv8, но в нем к сожалению нет подвыражений и запускается только из 1С8.
4. "Обертки"
При частом использовании RegExp приходится делать более удобные и читаемые "оберки" (+ русифицированные) Внимание! Данные функции более медленные
Процедура РегулярныеВыражения_Инициализация ( Шаблон , ИскатьДоПервогоСовпадения = Истина, МногоСтрок = Истина, ИгнорироватьРегистр = Истина) Экспорт
Если RegExp = Неопределено Тогда //Нужна инициализация
RegExp = Новый COMОбъект ( "VBScript.RegExp" ); // создаем объект для работы с регулярными выражениями
КонецЕсли;
//Заполняем данные
RegExp . MultiLine = МногоСтрок ; // истина — текст многострочный, ложь — одна строка
RegExp . Global = Не ИскатьДоПервогоСовпадения ; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp . IgnoreCase = ИгнорироватьРегистр ; // истина — игнорировать регистр строки при поиске
RegExp . Pattern = Шаблон ; // шаблон (регулярное выражение)
Функция РегулярныеВыражения_Проверка ( ПроверяемыйТекст )
Возврат RegExp . Test ( ПроверяемыйТекст );
Функция РегулярныеВыражения_Выполнить ( АнализируемыйТекст ) Экспорт
РезультатАнализаСтроки = RegExp . Execute ( АнализируемыйТекст );
МассивВыражений = Новый Массив ;
Для Каждого Выражение Из РезультатАнализаСтроки Цикл
СтруктураВыражение = Новый Структура ( "Начало, Длина, Значение, ПодВыражения" , Выражение . FirstIndex , Выражение . Length , Выражение . Value );
//Обработка подвыражений
МассивПодВыражений = Новый Массив ;
Для Каждого ПодВыражение Из Выражение . SubMatches Цикл
МассивПодВыражений . Добавить ( ПодВыражение );
КонецЦикла;
СтруктураВыражение . ПодВыражения = МассивПодВыражений ;
МассивВыражений . Добавить ( СтруктураВыражение );
Использование на примере с email:
ПроверяемыйEMail = "[email protected]" ;
Если Не РегулярныеВыражения_Проверка ( ПроверяемыйEMail ) Тогда
Сообщить ( "Некорректный email" );
КонецЕсли;
5. Примеры использования (полезные универсальные функции)
Функция ПодставитьПараметрыВСтроку (СтрокаШаблон, Коллекция) - подставляет в строку параметры из коллекции
СтрокаШаблон - строка вида "Текст [Параметр]" параметры должны быть заключены в квадратные скобки
Коллекция - коллекция из которой будут подбираться одноименные параметры
Пример: ПодставитьПараметрыВСтроку ("Выполнено: [ВыполненоПроцент]%", Новый Структура ("ВыполненоПроцент",50));
Результатом выполнения будет строка : "Выполнено: 50%"
Функция РазложитьСтро куВМассив (Строка, Разделитель = ",") - возвращает массив полученный из строки элементами которого являются строки раз деленные разделителем (эта функция есть практически в любой конфигурации от 1С)
Строка - строка из которой берем данные
Разделитель - символ разделитель (по умолчанию ",")
Результатом выполнения будет массив строк : "1","23","45"
Функция ПодставитьПараметрыВСтроку ( Шаблон , КоллекцияЗаполнения ) Экспорт
РегулярныеВыражения_Инициализация ( "\[([\d\wЁА-Я]+)\]" , Ложь);
НайденныеПараметры = РегулярныеВыражения_Выполнить ( Шаблон );
Для Каждого Параметр Из НайденныеПараметры Цикл
//Получим имя параметра
ИмяПараметра = Параметр . ПодВыражения [ 0 ]; //Первый элемент
Попытка //Параметр может отсутствовать в коллекции
//Получим значение параметра
ЗначениеПараметра = КоллекцияЗаполнения [ ИмяПараметра ];
//Подстановка параметров
НовыйТекст = СтрЗаменить ( НовыйТекст , Параметр . Значение , ЗначениеПараметра );
Исключение
КонецПопытки;
Функция РазложитьСтрокуВМассив ( Строка , Разделитель = "," ) Экспорт
//Разбор строки вида 1,СЛОВО,(1+2); Маска для разделителя ',' ([^\,]+),?"
РегулярныеВыражения_Инициализация ( "[^\" + Разделитель + "]+" , Ложь, Ложь, Ложь);
Выражения = РегулярныеВыражения_Выполнить ( Строка );
Массив = Новый Массив ;
Для Каждого Выражение Из Выражения Цикл
Массив . Добавить ( Выражение . Value );
КонецЦикла;
Можно было привести более сложные примеры, но они бы имели узкую направленность.
6. Заключение
RegExp имеет хорошую скорость обработки и отличную читаемость .
На регулярах построены многие интересные разработки на инфостарте:
т.е. везде где нужна низкоуровневая обработка текста (разбор различных текстовых данных) хороший выбор это регуляры.
Для этого мне потребовалось написать небольшую функцию в общем модуле у которого свойство Вызов сервера = Истина . Тем самым эту функцию мы можем вызывать в любом контексте!
// Функция возвращает результат выполнения регулярного выражения.
//
// Параметры:
// Строка - Строка - исходня строка;
// Метод - Строка - совершаемое действие: replace, test, execute;
// Шаблон - Строка - регулярное выражение;
// Замена - Строка - используется для действия replace.
//
// Возвращаемое значение:
// Булево, Строка, Массив - результат выполнения регулярного выражения.
//
Функция ВыполнитьРегулярноеВыражение(Строка, Метод, Шаблон, Замена = "") Экспорт
RegularExpressions = Новый COMОбъект("VBScript.RegExp");
RegularExpressions.Global = Истина; // Ложь - проверять до первого соответствия, Истина - проверять по всему тексту.
RegularExpressions.IgnoreCase = Ложь; // Ложь - учитывать регистр символов, Истина - игнорировать регистр символов.
RegularExpressions.Pattern = Шаблон; // Строка, используемая как шаблон.
RegularExpressions.MultiLine = ?(СтрЧислоСтрок(Строка) > 1, Истина, Ложь); // Ложь - однострочный объект, Истина - многострочный.
РезультатВыполнения = Неопределено;
Если Метод = "replace" Тогда // Замена соответствующих шаблону вхождений в строке-оригинале на указанную подстроку.
РезультатВыполнения = RegularExpressions.Replace(Строка, Замена);
ИначеЕсли Метод = "test" Тогда // Проверка соответствия шаблону.
РезультатВыполнения = RegularExpressions.Test(Строка);
ИначеЕсли Метод = "execute" Тогда // Поиск соответствующих шаблону вхождений в строке-оригинале.
РезультатВыполнения = RegularExpressions.Execute(Строка);
КоллекцияДанных = Новый Массив;
Для Каждого Элемент Из РезультатВыполнения Цикл
КоллекцияДанных.Добавить(Новый Структура("Значение, ИндексПервогоСимовла", Элемент.Value, Элемент.FirstIndex));
КонецЦикла;
РезультатВыполнения = КоллекцияДанных;
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции // ВыполнитьРегулярноеВыражение()
Думаю, описывать функцию нет смысла, по комментариям должно быть понятно. Вызов функции для моей задачи выглядит следующим образом:
Коллекция = ВыполнитьРегулярноеВыражение("Строка с [Квадратными] скобками для [примера]", "execute", "\[[0-9а-яА-Яa-zA-Z]+\]");
Весь приведенный ниже код работает как в версии 7.7 так и версиях 8.x.
Единственным отличием 7.7 от 8.x является строка создания объекта.
Кроме этого, для полного сходства кода в разных версиях, в коде версии 7.7 полезно определить вот такие переменные:
Хотя во многих конфигурациях эти переменные определены как глобальные.
Ниже описаны свойства и методы объекта VBScript.RegExp.
Свойства:
Методы:
Следующий пример ищет HTML теги в строке:
Использование в шаблоне круглых скобок (группировки) задействует коллекции SubMatces. Изменим шаблон в предыдущем примере таки образом:
Будут найдены не только теги, но и текст до и после тега. Для обработки такого шаблона, код будет выглядеть так:
Если регулярные выражения используются часто, то будет разумно написать некую оболочку. Основные позиции таковы:
- Глобальная переменная, являющаяся объектом VBScript.RegExp;
- Инициализация глобальной переменной при запуске конфигурации или функция инициализации вызываемая по необходимости;
- Инкапсуляция методов объекта VBScript.RegExp.
На этом все, надеюсь данный материал Вам помог.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 1, средняя оценка: 5,00 из 5)Функцию инициализации достаточно вставить в общий модуль с повторным использованием возвращаемых значений и тогда не потребуется глобальных переменных.
Вот пример из разрабатываемой сейчас конфы, где я активно использую регулярки.
Читайте также: