Работа со строками в запросе

12.12.12

Разработка - Запросы

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

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

 

К сожалению, возможности запросов 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. Сложное соединение по строке.

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

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

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

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

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

 

Сымитируем данные:

Выбрать
"30568-12" как ВнутреннийНомер
поместить тз1
Объединить все
Выбрать
"3568-12"
;
Выбрать
"30568/1-12" как ВнутреннийНомер
поместить тз2
Объединить все
Выбрать
"30568/155-12"
Объединить все
Выбрать
"30568/2-12"
Объединить все
Выбрать
"35681/2-12"
Объединить все
Выбрать
"3568/2-12"
Объединить все
Выбрать
"3568/2-13"
;

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

//Выделим из номеров те части, по которым сможем связывать
Выбрать
тз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 Если кому-то пригодится в практических целях, буду рада.


См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122094    670    389    

714

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5742    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6284    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1742    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5388    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16178    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. andrewks 1368 12.12.12 23:18 Сейчас в теме
Временные таблицы со строками и куча ПОДОБНО ?

да это просто издевательство над скулем какое-то
8. catena 110 13.12.12 06:31 Сейчас в теме
(1)Ага :)

(2)На серверной базе моя длина строки работает в полтора раза быстрее(на справочнике 18000 элементов) На файловой в 7 раз(28 секунд против 4). :) И пустые строки ваш запрос игнорирует, исключает из выборки как класс.

А в остальном да, скуль мои запросы не ест :)
12. andrewks 1368 13.12.12 07:11 Сейчас в теме
(8) а пустые строки зачем обрабатывать? хотя, и это можно предусмотреть
13. andrewks 1368 13.12.12 07:14 Сейчас в теме
(8) как замеры производили?
15. catena 110 13.12.12 07:21 Сейчас в теме
(13)В консоли с "WINMM.DLL", "timeGetTime"
17. andrewks 1368 13.12.12 07:28 Сейчас в теме
(15) если не забуду, сегодня на работе постараюсь сравнить время моих и Ваших запросов, отпишусь
19. andrewks 1368 13.12.12 08:32 Сейчас в теме
(15) сразу не разглядел, но причина в том, что у меня макс.длина строки определяется в 1000, у Вас - всего в 100

если переопределить данную табличку
select
 digits1.num+10*digits2.num as num
into numbers 
from
 digits as digits1
,digits as digits2
index by num

Показать

, то, естественно, получаются совершенно другие временные результаты
22. catena 110 13.12.12 09:05 Сейчас в теме
(19)Да действительно, я тоже не обратила на это внимания. Минус одно соединение.
25. andrewks 1368 13.12.12 09:35 Сейчас в теме
(22) как я и ожидал, Ваш вариант разбивки строки в DB2 не отрабатывает. а мой - отрабатывает ;-)
27. catena 110 13.12.12 09:42 Сейчас в теме
(25)Я это еще утром признала.

(24)Не, я про группировки. Например, в оракле я могу так:

with Str as (
select
'fff' f1 from dual
union all
select
'yyy' from dual
union all
select
'rrr' from dual
)
select wmsys.wm_concat(Str.f1) from Str
29. andrewks 1368 13.12.12 09:44 Сейчас в теме
(27) ну, в mssql тоже много чего можно, вплоть до итераций
30. Ёпрст 1063 13.12.12 09:46 Сейчас в теме
(27) в sqllite тоже есть group by concat
2. andrewks 1368 12.12.12 23:23 Сейчас в теме
определяем длину строки:

select
 &Парам1 as str
into ВходнаяВТ

;
// здесь создаём ВТ цифр

select
 0 as num
into digits
union select 1 union select 2 union select 3 union select 4 union select 5
union select 6 union select 7 union select 8 union select 9

;
// здесь создаём ВТ чисел

select
 digits1.num+10*digits2.num+100*digits3.num as num
into numbers 
from
 digits as digits1
,digits as digits2
,digits as digits3
index by num

;

// здесь определяем макс.позицию символа (т.е. длину строки)

select
 tabstr.str
,max(numbers.num) as maxpos
from
 ВходнаяВТ as tabstr
,numbers
where (substring(tabstr.str,numbers.num,1)<>"")
group by
 tabstr.str


Показать
BigB; HenrySLAV; Sergey K; catena; Serj1C; +5 Ответить
7. Поручик 4670 13.12.12 02:05 Сейчас в теме
(2) По-русски сложно написать? Обязательно свои понты дешёвые показать.
SandroHaos; BigB; oks_st; zhivoglot; Светлый ум; for_sale; RodinMax; Demic; Steelvan; +9 Ответить
10. andrewks 1368 13.12.12 07:09 Сейчас в теме
(7) Поручик, о чём Вы, сударь? какие понты? я всегда так пишу. а кто органически неприемлет английский и/или sql-ный синтаксис тех смиренно прошу мои посты игнорировать
andrvyst; fzt; +2 Ответить
35. Painted 49 13.12.12 14:54 Сейчас в теме
(7) Поручик, Я даже не сразу понял, что текст английский. Сначала забрасываю все в Консоль запросов, а там код преобразуется в русский на автомате. ))))
Светлый ум; +1 1 Ответить
50. Светлый ум 406 10.11.19 08:20 Сейчас в теме
3. andrewks 1368 12.12.12 23:25 Сейчас в теме
здесь выделяем из строки то, что в скобках:

select
 &Парам1 as str
into ВходнаяВТ

;
// здесь создаём ВТ цифр

select
 0 as num
into digits
union select 1 union select 2 union select 3 union select 4 union select 5
union select 6 union select 7 union select 8 union select 9

;
// здесь создаём ВТ чисел

select
 digits1.num+10*digits2.num+100*digits3.num as num
into numbers 
from
 digits as digits1
,digits as digits2
,digits as digits3
index by num

;

// здесь определяем макс.символ

select
 tabstr.str
,max(numbers.num) as maxpos
into 
 ВходнаяВТ2
from
 ВходнаяВТ as tabstr
,numbers
//where (substring(tabstr.str,numbers.num,1)<>"") and (substring(tabstr.str,numbers.num,1)<>" ")
where (substring(tabstr.str,numbers.num,1)=")")
group by
 tabstr.str

;

// здесь разбираем входную строку

select
 substring(tabstr.str,1,numbers.num-1) as pred1
,substring(tabstr.str,numbers.num+1,tabstr.maxpos-numbers.num-1) as pred2
from
 ВходнаяВТ2 as tabstr
left join
 numbers
on (numbers.num>0) and (substring(tabstr.str,numbers.num,1)="(")


Показать
4. andrewks 1368 12.12.12 23:28 Сейчас в теме

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

Ну и совсем извращение,


действительно, извращение ))

собственно, делается по аналогии, тут уже лень
5. andrewks 1368 12.12.12 23:30 Сейчас в теме
да, вот ещё в копилку: выбор строки с макс.длиной

select
 "строка 1" as str
into tabstr
union all
select "строка № 45678"
union all
select "а это, похоже, самая длинная строка"

;

select
 0 as num
into digits
union select 1 union select 2 union select 3 union select 4 union select 5
union select 6 union select 7 union select 8 union select 9

;

select
 digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num as num
into numbers 
from
 digits as digits1
,digits as digits2
,digits as digits3
,digits as digits4
index by num

;

select
 tabstr.str as str
,max(numbers.num) as length
into tabstr2
from
 tabstr
,numbers
where (substring(tabstr.str,numbers.num,1)>"")
group by
 tabstr.str

;

select
 max(tabstr.length) as length
into maxlength 
from
 tabstr2 as tabstr

;
 
select
 tabstr.str as str
from
 tabstr2 as tabstr
right join
 maxlength 
on (tabstr.length=maxlength.length)

Показать
6. andrewks 1368 12.12.12 23:32 Сейчас в теме
здесь определяем последний (самый правый) символ строки и его позицию:

select
 &Парам1 as str
into ВходнаяВТ

;
// здесь создаём ВТ цифр, их строковых представлений, и соответствующих степеней десяток

select
 0 as num
,"0" as numstr
into digits
union select 1,"1" union select 2,"2" union select 3,"3" union select 4,"4" union select 5,"5"
union select 6,"6" union select 7,"7" union select 8,"8" union select 9,"9"

;
// здесь создаём ВТ чисел и их строковых представлений

select
 digits1.num+10*digits2.num as num
,digits2.numstr+digits1.numstr as numstr
into numbers 
from
 digits as digits1
,digits as digits2
index by num,numstr

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

select
 substring(tabstr.str,numbers.num,1) as symb
,numbers.num as pos
into symbstr
from
 ВходнаяВТ as tabstr
left join
 numbers
on (numbers.num>0) and (substring(tabstr.str,numbers.num,1)>"")
index by symb,pos

;

// здесь нумеруем символы "чистой" строки с правой стороны

select
 symbstr.symb as symb
,symbstr.pos as pos
,count(symbstr.pos) as ind
into symbols
from
 symbstr
inner join symbstr as symbstr1
on (symbstr.pos<=symbstr1.pos)
group by
 symbstr.symb
,symbstr.pos
//order by ind
index by ind

;
select top 1
 symbols.symb
,symbols.pos
from
 symbols
order by
 pos desc
Показать
47. sss999 48 26.11.13 16:32 Сейчас в теме
(6) andrewks, (30) Ёпрст, а как посчитать длину строки в 1с 77 в прямом запросе,или хотя бы сравнить на равенство длины два значения
48. catena 110 27.11.13 05:55 Сейчас в теме
(47)А разве в прямых запросах недоступны функции скл?
49. sss999 48 27.11.13 08:47 Сейчас в теме
(48) они доступны если база на скуле,а если dbf то синтаксис фокс про и там по своему это все.
9. catena 110 13.12.12 06:32 Сейчас в теме
Хотя на файловой мои все-таки быстрее )))
11. andrewks 1368 13.12.12 07:10 Сейчас в теме
(9) зато на серверных Ваши могут вообще упасть. вот за DB2, в частности, я очень не уверен, на этой СУБД 1с-вское ПОДОБНО зело глючит
14. catena 110 13.12.12 07:16 Сейчас в теме
(11)Я и говорю, что падают. Хотя странно, оракл, например, вроде хорошо работает с like'ом.

Я не отрицаю, что намудрила, но вы же тоже не делитесь знаниями :) Вот про скобки девушка летом вопрошала на форуме и ей в один голос заявили, что в запросе никак. Теперь хоть в поиске будет :) Да и сложное соединение - реальный пример.

(12)Ну чтобы было. Для порядку. Эт я придираюсь.
16. andrewks 1368 13.12.12 07:28 Сейчас в теме
но вы же тоже не делитесь знаниями

лично я всегда делюсь, если встречаю. я эти строки в запросах долго крутил. даже где-то валяется текст по переводу дробного числа из текстового представления в числовое в запросе
18. kasper076 101 13.12.12 08:29 Сейчас в теме
Вот так сделал недавно:
ВЫБОР
	КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 1, 6) = "000000"
		ТОГДА ВЫБОР
				КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 7, 4) = "0000"
					ТОГДА "          " + ПОДСТРОКА(СписокНоменклатуры.Код, 11, 1)
				КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 7, 3) = "000"
					ТОГДА "         " + ПОДСТРОКА(СписокНоменклатуры.Код, 10, 2)
				КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 7, 2) = "00"
					ТОГДА "        " + ПОДСТРОКА(СписокНоменклатуры.Код, 9, 3)
				КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 7, 1) = "0"
					ТОГДА "       " + ПОДСТРОКА(СписокНоменклатуры.Код, 8, 4)
				ИНАЧЕ "      " + ПОДСТРОКА(СписокНоменклатуры.Код, 7, 5)
			КОНЕЦ
	ИНАЧЕ ВЫБОР
			КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 1, 5) = "00000"
				ТОГДА "     " + ПОДСТРОКА(СписокНоменклатуры.Код, 6, 6)
			КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 1, 4) = "0000"
				ТОГДА "    " + ПОДСТРОКА(СписокНоменклатуры.Код, 5, 7)
			КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 1, 3) = "000"
				ТОГДА "   " + ПОДСТРОКА(СписокНоменклатуры.Код, 4, 8)
			КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 1, 2) = "00"
				ТОГДА "  " + ПОДСТРОКА(СписокНоменклатуры.Код, 3, 9)
			КОГДА ПОДСТРОКА(СписокНоменклатуры.Код, 1, 1) = "0"
				ТОГДА " " + ПОДСТРОКА(СписокНоменклатуры.Код, 2, 10)
			ИНАЧЕ СписокНоменклатуры.Код
		КОНЕЦ
КОНЕЦ
Показать
20. andrewks 1368 13.12.12 08:33 Сейчас в теме
(18) kasper076, угу, а теперь попробуйте переписать для кода, скажем, длиной в 15 символов
21. kasper076 101 13.12.12 08:49 Сейчас в теме
Переписывание займет конечно какое-то время, но это нужно будет сделать всего 1 раз. Если прирост от данного метода будет ощутим, то выбор оправдан. Если нет, то конечно использовать постобработку результата запроса.
23. catena 110 13.12.12 09:24 Сейчас в теме
Агрегатной функции конкатенации все-таки оченно не хватает.
24. andrewks 1368 13.12.12 09:31 Сейчас в теме
(23) Вы не про это?

select
 &Парам1+&Парам2 as str



:-)
26. Ёпрст 1063 13.12.12 09:41 Сейчас в теме
чего только не придумают, и всё от того, что язык запросов в снеговике недоделан
:((

ЗЫ: про доп табличку с циферками, обычно есть куча примеров в любой книжке по sql..
28. andrewks 1368 13.12.12 09:43 Сейчас в теме
(26) Ёпрст, угу, 1С - виновница очень многих извращений
34. catena 110 13.12.12 10:15 Сейчас в теме
(28)Зато ничего не страшно :) Когда мне понадобилось быстро научиться читать/писать простейшие оракловые запросы, я для тренировки переводила отрисовку календаря из какой-то местной статьи, а потом доводила до инфаркта получившимся кодом местных ораклистов :)
36. Yashazz 4709 15.12.12 19:43 Сейчас в теме
(26) В смысле строковых операций в запросе много где недоделано. Я вот не знаю, есть ли диалекты, понимающие регулярные выражения в запросе скуля, так что не надо обижать снеговика. С возвращением возможности втыкать общие функции в СКД уже очень много что можно, хотя и транслируется извратно.

Вообще не понимаю я, зачем такие грабли. Только из желания поковыряться ногой в носу, или есть-таки практическое применение? Имхо, грамотно организованные структуры данных и код алгоритмов никто не отменял.
31. andrewks 1368 13.12.12 09:49 Сейчас в теме
а всё почему: потому, что


ПОДОБНО при использовании DB2
Проблема:
В клиент-серверном варианте работы, при использовании СУБД IBM DB2, в запросах, содержащих операцию ПОДОБНО и выражение (а не фиксированную строку) справа от операции, может происходить ошибка и сервер СУБД аварийно завершает свою работу.
Способы решения:
Использовать DB2 9.7 FixPack5

Дата публикации: 2012-04-10


причём, в фикспаке сервак просто не рушится, но результат пустой
32. andrewks 1368 13.12.12 09:51 Сейчас в теме
да бог с ним, с конкатом. лично меня бы очень устроили хотя бы нормальные реализации cast'ов и коррелированных подзапросов
33. DrAku1a 1679 13.12.12 10:04 Сейчас в теме
37. CaSH_2004 372 15.12.12 22:50 Сейчас в теме
(0) В итоге получаем нечитабельный запрос а'ля обфускация. К чему это? Смахивает на софистику т.е. игра словами ради игры. Думаю такие статьи должны сопровождаться знаком "Только для извращенцев которые все перепробовали". Если такие операции приводят к существенному увеличению производительности то конечно оно того стоит, но вроде об этом как то смутно сказано только в комментариях.
38. aspirator23 339 22.12.12 17:21 Сейчас в теме
А как соединить в запросе строковое поле и поле даты?
Что-то такое:
ТекстЗапроса=
.....
Документ.Номер+" от "+Документ.Дата
....

Через Выразить, подстрока.. не получается.
40. catena 110 24.12.12 05:54 Сейчас в теме
(38)На прямую - никак. Можно дату выразить как строку, тоже то еще извращение.

(39)В языке запросов можно использовать любые соединения. В СКД соединения между наборами данных осуществляются левыми соединениями, а в запросе так же можно организовать любое.
39. Bukaska 140 22.12.12 22:12 Сейчас в теме
Извините за вопрос, а какое объединение можно использовать в 1С? А то я слышала что в СКД как с объединениями ни крути - 1С всё переделает как левое внутреннее...
41. OlenkaD 05.02.13 11:42 Сейчас в теме
Подскажите мудрые 1С-ники как в запросе найти дубли номенклатуры у которых незначительно отличаются артикулы?
Например: Номенклатура 1 арт Х-1234
Номенклатура 2 арт Х-1233
Номенклатура 3 арт Х-1243
минимальная длина артикула, которая должна совпадать = 4
42. andrewks 1368 05.02.13 15:17 Сейчас в теме
(41) OlenkaD, используйте ПОДОБНО
43. OlenkaD 05.02.13 15:56 Сейчас в теме
Получился такой запрос:

ВЫБРАТЬ
СвободныеОстаткиОстатки.Номенклатура,
СвободныеОстаткиОстатки.ВНаличииОстаток КАК ПоложитОстаток,
СвободныеОстаткиОстатки.Номенклатура.Артикул
ПОМЕСТИТЬ ПоложительныеОстатки
ИЗ
РегистрНакопления.СвободныеОстатки.Остатки(, Склад = &Склад) КАК СвободныеОстаткиОстатки
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток > 0
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
СвободныеОстаткиОстатки.Номенклатура,
СвободныеОстаткиОстатки.ВНаличииОстаток КАК ОтрицатОстаток,
СвободныеОстаткиОстатки.Номенклатура.Артикул
ПОМЕСТИТЬ ОтрицательныеОстатки
ИЗ
РегистрНакопления.СвободныеОстатки.Остатки(, Склад = &Склад) КАК СвободныеОстаткиОстатки
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток < 0
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
ПоложительныеОстатки.НоменклатураАртикул КАК АртикулПоложит,
ПоложительныеОстатки.Номенклатура КАК НоменклатураПоложит,
ПоложительныеОстатки.ПоложитОстаток,
ОтрицательныеОстатки.НоменклатураАртикул КАК АртикулОтрицат,
ОтрицательныеОстатки.Номенклатура КАК НоменклатураОтрицат,
ОтрицательныеОстатки.ОтрицатОстаток
ИЗ
ПоложительныеОстатки КАК ПоложительныеОстатки
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтрицательныеОстатки КАК ОтрицательныеОстатки
ПО (ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, &Длина) ПОДОБНО ПОДСТРОКА(ПоложительныеОстатки.НоменклатураАртикул, 1, &Длина))



Теперь задача такая: параметр &Длина зависит от кол-ва символов в
ПоложительныеОстатки.Номенклатура КАК НоменклатураПоложит и может принимать значения от N (кол-во символов в этом поле) до &МинДлинаАртикула (которая заранее известна)

Как это можно реализовать в запросе?
44. OlenkaD 05.02.13 16:33 Сейчас в теме
Думается что то подобное написать:

Выбор когда ПоложительныеОстатки.НоменклатураАртикул = ОтрицательныеОстатки.НоменклатураАртикул Тогда
ОтрицательныеОстатки.НоменклатураАртикул
Иначе
Выбор когда
(ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, &Длина) ПОДОБНО
ПОДСТРОКА(ПоложительныеОстатки.НоменклатураАртикул, 1, &Длина)) Тогда
ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, &Длина)
Конец
Конец

Вопрос: как задавать параметр &Длина и считать длину строки прямо в запросе? (аналог СтрДлина)
45. OlenkaD 05.02.13 16:56 Сейчас в теме
Заморочилась так:

Когда Наименование = ПОДСТРОКА ( Наименование,1, 90) Тогда 90
Когда Наименование = ПОДСТРОКА ( Наименование,1, 91) Тогда 91
Когда Наименование = ПОДСТРОКА ( Наименование,1, 92) Тогда 92
Когда Наименование = ПОДСТРОКА ( Наименование,1, 93) Тогда 93
Когда Наименование = ПОДСТРОКА ( Наименование,1, 94) Тогда 94
Когда Наименование = ПОДСТРОКА ( Наименование,1, 95) Тогда 95
Когда Наименование = ПОДСТРОКА ( Наименование,1, 96) Тогда 96
46. Persempre 35 08.08.13 16:30 Сейчас в теме
Клуб извращенцов
Aligator69; Team leader; sstas007; ybatiaev; Gendelf; +5 Ответить
Оставьте свое сообщение