1с проверить текст на соответствие шаблону

Обновлено: 07.07.2024

Как вызвать стандартную проверку заполнения реквизитов?
Код 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.х

Разместил: E_Migachev  Версии: | 8.x | 8.2 УП |  Дата: 25.01.2010   Прочитано: 75022

Распечатать

Похожие 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 = "test@mail.ru" ;
Если Не РегулярныеВыражения_Проверка ( Проверяемый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)

Работа с Dropbox из 1С

Работа с сетью в 1С. Объекты WinHttpRequest и Stream

Сегодня речь пойдет о работе с сетью в 1С, использовать стандартные методы не будем,

Использование WIA.ImageFile в 1С

Timestamp в 1С

Timestamp-ом в народе называют способ хранения даты в виде количества секунд прошедших с момента

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

Читайте также: