Строковое выражение в запросе

Обновлено: 21.11.2024

Только ленивый, по-моему, не писал еще о вариантах вырезания гланд через анус автогеном запросами. Ну и я поделюсь.

К сожалению, возможности запросов 1С в отношении строковых переменных крайне малы. Практически они исчерпываются одной функцией и одним оператором. Тем не менее, постоянно всплывают темы в духе «а как мне сделать это прямо в запросе?». Конечно, большинство задач решаются в СКД, оставшаяся часть решается пост-обработкой результата, но чисто в качестве разминки для ума, кое-что в запросе сделать можно.

Во всех примерах я буду использовать следующие временные таблицы:

ВЫБРАТЬ
"_" КАК Симв ,
1 КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"__" ,
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"___" ,
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"____" ,
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_____" ,
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"______" ,
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_______" ,
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"________" ,
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_________" ,
9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"" ,
0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Прав . Симв КАК Симв ,
тзКоличествоСимволов9_Лев . КолСимв * 10 + тзКоличествоСимволов9_Прав . КолСимв КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов100
ИЗ
тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Лев ,
тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Прав
;
////////////////////////////////////////////////////////////////////////////////

Для приведенных примеров их вполне хватит, смысл, думаю, понятен, так что не будем заострять внимание на оптимальности их построения.

Так же рекомендую экспериментировать с приведенными запросами в файловых базах – серверные более нежные и работать автогеном в таком грязном месте не любят. :)

  1. Подсчет количества символов в строке.

Тут всё очень просто

ВЫБРАТЬ
Номенклатура . Наименование ,
КоличествоСимволов . КолСимв
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволов
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволов . Симв )

Всё. Теперь можно отрезать последний пробел, например:

ВЫБРАТЬ
Номенклатура . Наименование ,
КоличествоСимволов . КолСимв ,
ВЫБОР
КОГДА Наименование подобно "% "
ТОГДА ПОДСТРОКА ( Номенклатура . Наименование , 1 , КоличествоСимволов . КолСимв - 1 )
ИНАЧЕ Номенклатура . Наименование
КОНЕЦ КАК НаименованиеБезПробела
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволов
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволов . Симв )

2. Разбить строку

Здесь чуть сложнее. Но теми же граблями.

Задача: в некоторой номенклатуре в наименовании записан некоторый текст в скобках. Надо вытащить этот текст в отдельное поле.

Для простоты договоримся, что скобочки в наименовании у нас один раз открываются и один раз закрываются.

ВЫБРАТЬ Различные
Номенклатура . Ссылка ,
Выразить ( ПОДСТРОКА ( Номенклатура . Наименование , КоличествоСимволовДоОткрытия . КолСимв + 2 , КоличествоСимволовДоЗакрытия . КолСимв - КоличествоСимволовДоОткрытия . КолСимв - 1 ) как строка ( 100 )) КАК ТекстВСкобках
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоОткрытия
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволовДоОткрытия . Симв + &СимволОткрытия + "%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоЗакрытия
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволовДоЗакрытия . Симв + &СимволЗакрытия + "%" )
ГДЕ
Номенклатура . Наименование ПОДОБНО "%" + &СимволОткрытия + "%" + &СимволЗакрытия + "%"

Тут &СимволОткрытия, понятно «(»,&СимволЗакрытия соответственно «)». Находим позицию символов и вытаскиваем подстроку. Помним, что запросы тошнит от строк неограниченной длины, поэтому используем ВЫРАЗИТЬ.

3. Сложное соединение по строке.

Ну и совсем извращение, но пример взят из реальной темы.

Существуют две таблицы:

В одной номера договоров в формате: «Номер-постфикс»

В другой номера тех же договоров, но дополненные неким доп-индексом в формате: «Номер/Индекс-постфикс».

Необходимо связать. Номер, индекс и постфикс могут быть разной длины, ориентироваться можно только на «/» и «-».

И начнем выпендриваться.

//Выделим из номеров те части, по которым сможем связывать
Выбрать
тз1сРазбиением . ВнутреннийНомер ,
Подстрока ( тз1сРазбиением . ВнутреннийНомер , 1 , КоличествоСимволовДоТире . КолСимв ) как ДоСлэша ,
Подстрока ( тз1сРазбиением . ВнутреннийНомер , КоличествоСимволовДоТире . КолСимв + 2 , СтрДлина . КолСимв ) как ПослеТире
поместить тз1сРазбиением
из тз1 как тз1сРазбиением
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоТире
ПО ( тз1сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоТире . Симв + "-%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК СтрДлина
ПО ( тз1сРазбиением . ВнутреннийНомер ПОДОБНО СтрДлина . Симв )
;
Выбрать
тз2сРазбиением . ВнутреннийНомер ,
Подстрока ( тз2сРазбиением . ВнутреннийНомер , 1 , КоличествоСимволовДоСлэша . КолСимв ) как ДоСлэша ,
Подстрока ( тз2сРазбиением . ВнутреннийНомер , КоличествоСимволовДоТире . КолСимв + 2 , СтрДлина . КолСимв ) как ПослеТире
поместить тз2сРазбиением
из тз2 как тз2сРазбиением
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоСлэша
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоСлэша . Симв + "/%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоТире
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоТире . Симв + "-%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК СтрДлина
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО СтрДлина . Симв )
;

ВЫБРАТЬ Различные
тз11 . ВнутреннийНомер ,
тз22 . ВнутреннийНомер
ИЗ
тз1сРазбиением КАК тз11
Левое СОЕДИНЕНИЕ тз2сРазбиением КАК тз22
ПО тз11 . ДоСлэша Подобно тз22 . ДоСлэша
и тз11 . ПослеТире Подобно тз22 . ПослеТире

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

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