Александр Иосифович, спасибо, что откликнулись на наши просьбы!
Вы конечно правы относительно того, что поведение чужого кода непредсказуемо. Но, может быть, после тестирования его всё-таки допустимо будет включить его в стандартную поставку? Как справедливо отметил Максим, функция имеет значение для ИРБИС в целом, а не для одной или двух организаций и переносить библиотеку будет не удобно. Кроме того, использование специального UNIFOR позволит существенно упростить синтаксис, который для этой функции в любом случае получится достаточно сложным.
Что касается конструкции UNIFOR, я думаю, её главной функцией будет всё же выделение нужных фрагментов. Поэтому возможность использования найденных элементов будет иметь определяющее значение.
Мне кажется вполне подходящей следующая схема:
&uf([идентификатор конкретного UNIFOR][ограничитель регулярного выражения][регулярное выражение][ограничитель регулярного выражения][исходная строка][разделитель][номер переменной с «карманами»])
Например: &uf(‘RE{([A-я\-]+)\,? ([A-я\-]*)\.? ?([A-я\-]*)\.?}Иванов Т.Х.#999’)
Здесь:
1. идентификатор конкретного UNIFOR – RE
2. ограничитель регулярного выражения – {
3. регулярное выражение – ([A-я\-]+)\,? ([A-я\-]*)\.? ?([A-я\-]*)\.?
4. исходная строка – Иванов Т.Х.(в реальных условиях она не будет предзадана)
5. номер переменной с «карманами» – 999 (опциональный элемент. Может отсутствовать)
Функция возвращает :
0 - если ничего не найдено(хотя лучше бы в этом случае она вообще ничего не возвращала)
1 - если найдено найдено
Данное выражение позволит получить:
1. Фамилию: &uf(‘Ag999#1’) – в данном случае «Иванов»
2. Первый инициал: &uf(‘Ag999#2’) – в данном случае «T»
3. Второй инициал инициал: &uf(‘Ag999#2’) – в данном случае «Х»
Допустим, выделение элементов ФИО требуется для простановки запятой после фамилии и пробела между инициалами. Тогда весь код будет выглядеть так:
if &uf(‘RE{([A-я\-]+)\,? ([A-я\-]*)\.? ?([A-я\-]*)\.?}Иванов Т.Х.#999’)=’1’ then
&uf(‘Ag999#1’), ‘, ‘&uf(‘Ag999#2’)’. ‘&uf(‘Ag999#3’)’. ‘
fi,
Сегодня для той же цели используется гораздо более сложный код:
(if p(v330^3) then|A=|d330^3,if p(v330^>) then if v330^>:'1' then v330^3 else &unifor('E'v330^>,v330^3),|, |v330^;,if a(v330^;) then if &unifor('F'v330^>,v330^3)<>'' then ', 'if &unifor('F'v330^>,v330^3):'. ' then &unifor('F'v330^>,v330^3) else if &unifor('F'v330^>,v330^3):'.'then &unifor('G0.'&unifor('F'v330^>,v330^3)),'. '&unifor('G2.'&unifor('F'v330^>,v330^3)) else &unifor('F'v330^>,v330^3) fi fi fi fi fi else if v330^3:',' then &unifor('G0,'v330^3),else &unifor('G0 'v330^3) fi,|, |v330^;,if a(v330^;) then if &unifor('G2 'v330^3):'. ' then ', '&unifor('G2 'v330^3) else if &unifor('G2 'v330^3):'.'then ', ' &unifor('G0.'&unifor('G2 'v330^3)),'. '&unifor('G2.'&unifor('G2 'v330^3)) fi fi fi fi,|\|v330^t*4|\| fi,|/)