доброго времени суток, знатоки. вот в запросе выбираю Должности.Наименование, есть такие должности где поставили пробел после наименования, как можно сделать СОКРЛП(Должности.Наименование), вот таким макаром ругается, не знает такую функцию
ВЫБРАТЬ
0 КАК сч
ПОМЕСТИТЬ т01
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
т01.сч * 2 + т02.сч КАК сч
ПОМЕСТИТЬ т04
ИЗ
т01 КАК т01,
т01 КАК т02
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
т01.сч * 4 + т02.сч КАК сч
ПОМЕСТИТЬ т16
ИЗ
т04 КАК т01,
т04 КАК т02
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
т01.сч * 16 + т02.сч КАК сч
ПОМЕСТИТЬ разряды
ИЗ
т16 КАК т01,
т16 КАК т02
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Должности.Ссылка,
ПОДСТРОКА(Должности.Наименование, разряды.сч, 1) КАК символ,
разряды.сч КАК разряд
ПОМЕСТИТЬ тСимволы
ИЗ
Справочник.Должности КАК Должности,
разряды КАК разряды
ГДЕ
разряды.сч <> 0
И "_" + ПОДСТРОКА(Должности.Наименование, разряды.сч, 1) + "_" <> "__"
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тСимволы.Ссылка,
тСимволы.разряд,
тСимволы.символ
ПОМЕСТИТЬ тСимволыОчищенные
ИЗ
тСимволы КАК тСимволы
ЛЕВОЕ СОЕДИНЕНИЕ тСимволы КАК тСимволы1
ПО тСимволы.Ссылка = тСимволы1.Ссылка
И (тСимволы.разряд = тСимволы1.разряд + 1)
ГДЕ
НЕ(тСимволы.символ = ""
И тСимволы1.символ = "")
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тСимволыОчищенные.Ссылка,
выбор когда тСимволыОчищенные.символ=" " тогда " " иначе тСимволыОчищенные.символ конец как символ,
КОЛИЧЕСТВО(тСимволыОчищенные1.Ссылка) КАК порядковый_номер
ПОМЕСТИТЬ Таб
ИЗ
тСимволыОчищенные КАК тСимволыОчищенные
ЛЕВОЕ СОЕДИНЕНИЕ тСимволыОчищенные КАК тСимволыОчищенные1
ПО тСимволыОчищенные.Ссылка = тСимволыОчищенные1.Ссылка
И тСимволыОчищенные.разряд >= тСимволыОчищенные1.разряд
СГРУППИРОВАТЬ ПО
тСимволыОчищенные.Ссылка,
тСимволыОчищенные.символ,
тСимволыОчищенные.разряд
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Таб.Ссылка,
ВЫРАЗИТЬ(Таб.порядковый_номер / 2 КАК ЧИСЛО(15, 0)) КАК порядковый_номер_нов,
Таб.порядковый_номер,
Таб.символ
ПОМЕСТИТЬ Шаг
ИЗ
Таб КАК Таб
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Таб
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Шаг.Ссылка,
Шаг.порядковый_номер_нов КАК порядковый_номер,
МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА Шаг.символ
ИНАЧЕ ""
КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА ""
ИНАЧЕ Шаг.символ
КОНЕЦ) КАК символ
ПОМЕСТИТЬ таб
ИЗ
Шаг КАК Шаг
СГРУППИРОВАТЬ ПО
Шаг.Ссылка,
Шаг.порядковый_номер_нов
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Шаг
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Таб.Ссылка,
ВЫРАЗИТЬ(Таб.порядковый_номер / 2 КАК ЧИСЛО(15, 0)) КАК порядковый_номер_нов,
Таб.порядковый_номер,
Таб.символ
ПОМЕСТИТЬ Шаг
ИЗ
таб КАК Таб
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Таб
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Шаг.Ссылка,
Шаг.порядковый_номер_нов КАК порядковый_номер,
МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА Шаг.символ
ИНАЧЕ ""
КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА ""
ИНАЧЕ Шаг.символ
КОНЕЦ) КАК символ
ПОМЕСТИТЬ таб
ИЗ
Шаг КАК Шаг
СГРУППИРОВАТЬ ПО
Шаг.Ссылка,
Шаг.порядковый_номер_нов
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Шаг
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Таб.Ссылка,
ВЫРАЗИТЬ(Таб.порядковый_номер / 2 КАК ЧИСЛО(15, 0)) КАК порядковый_номер_нов,
Таб.порядковый_номер,
Таб.символ
ПОМЕСТИТЬ Шаг
ИЗ
таб КАК Таб
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Таб
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Шаг.Ссылка,
Шаг.порядковый_номер_нов КАК порядковый_номер,
МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА Шаг.символ
ИНАЧЕ ""
КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА ""
ИНАЧЕ Шаг.символ
КОНЕЦ) КАК символ
ПОМЕСТИТЬ таб
ИЗ
Шаг КАК Шаг
СГРУППИРОВАТЬ ПО
Шаг.Ссылка,
Шаг.порядковый_номер_нов
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Шаг;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Таб.Ссылка,
ВЫРАЗИТЬ(Таб.порядковый_номер / 2 КАК ЧИСЛО(15, 0)) КАК порядковый_номер_нов,
Таб.порядковый_номер,
Таб.символ
ПОМЕСТИТЬ Шаг
ИЗ
таб КАК Таб
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Таб
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Шаг.Ссылка,
Шаг.порядковый_номер_нов КАК порядковый_номер,
МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА Шаг.символ
ИНАЧЕ ""
КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА ""
ИНАЧЕ Шаг.символ
КОНЕЦ) КАК символ
ПОМЕСТИТЬ таб
ИЗ
Шаг КАК Шаг
СГРУППИРОВАТЬ ПО
Шаг.Ссылка,
Шаг.порядковый_номер_нов
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Шаг;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Таб.Ссылка,
ВЫРАЗИТЬ(Таб.порядковый_номер / 2 КАК ЧИСЛО(15, 0)) КАК порядковый_номер_нов,
Таб.порядковый_номер,
Таб.символ
ПОМЕСТИТЬ Шаг
ИЗ
таб КАК Таб
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Таб
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Шаг.Ссылка,
Шаг.порядковый_номер_нов КАК порядковый_номер,
МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА Шаг.символ
ИНАЧЕ ""
КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.порядковый_номер_нов * 2 - Шаг.порядковый_номер
КОГДА 1
ТОГДА ""
ИНАЧЕ Шаг.символ
КОНЕЦ) КАК символ
ИЗ
Шаг КАК Шаг
СГРУППИРОВАТЬ ПО
Шаг.Ссылка,
Шаг.порядковый_номер_нов
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ Шаг;
(24) CratosX, да логика-то простая - разбираем входные строки на символы и выкидываем ненужные:
ВЫБРАТЬ
Должности.Ссылка,
ПОДСТРОКА(Должности.Наименование, разряды.сч, 1) КАК символ,
разряды.сч КАК разряд
ПОМЕСТИТЬ тСимволы
ИЗ
Справочник.Должности КАК Должности,
разряды КАК разряды
ГДЕ
разряды.сч <> 0
И "_" + ПОДСТРОКА(Должности.Наименование, разряды.сч, 1) + "_" <> "__";
ВЫБРАТЬ
тСимволы.Ссылка,
тСимволы.разряд,
тСимволы.символ
ПОМЕСТИТЬ тСимволыОчищенные
ИЗ
тСимволы КАК тСимволы
ЛЕВОЕ СОЕДИНЕНИЕ тСимволы КАК тСимволы1
ПО тСимволы.Ссылка = тСимволы1.Ссылка
И (тСимволы.разряд = тСимволы1.разряд + 1)
ГДЕ
НЕ(тСимволы.символ = ""
И тСимволы1.символ = "")
Показать
финальная часть подсмотрена у комментатора выше.
Развитие темы в публикации.
Если бы была функция в языке запросов, позволяющая определить длину строки, то задача была бы реализуема в запросе. Если данные используются для отчета на СКД, то можно создать вычисляемое поле, которое будет вычисляться путем вызова функции в общем модуле.
Напрямую в запросе для работы со строками есть только сравнение с помощью ПОДОБНО и различных масок и ПОДСТРОКА. Более в запросе никаких действий со строками, в отличии от SQL запросов, сделать нельзя.
ПРО СКД - посмотри курс Насипова и Гилёва, там достаточно подробно все показано ну или книжку по СКД скачай/купи.
ну или через ПОДОБНО:
ВЫРАЗИТЬ ... КАК СТРОКА(...)
... ПОДОБНО ...
Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.
Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:
% (процент): последовательность, содержащая любое количество произвольных символов
_ (подчеркивание): один произвольный символ
[…] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок
В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
[^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
Любой другой символ означает сам себя и не несет никакой дополнительной нагрузки.
Если в качестве самого себя необходимо записать один из перечисленных символов, то ему должен предшествовать <Спецсимвол>. Сам <Спецсимвол> (любой подходящий символ) определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.
Например, шаблон “%АБВ[0-9][абвг]\_абв%” СПЕЦСИМВОЛ “\” означает подстроку, состоящую из последовательности символов:
буквы А; буквы Б; буквы В; одной цифры; одной из букв а, б, в или г; символа подчеркивания; буквы а; буквы б; буквы в.
Причем перед этой последовательностью может располагаться произвольный набор символов.
Вот код для проверки на пустое значение и приведения к удобному для обработки виду реквизита в произвольном выражении СКД. Потом этот реквизит легко сравнивается с "" и никаких ошибок :)
Сначала проверяем на значение на NULL, затем на пустую строку(незначащие пробелы обрезаются)
ВЫБОР
КОГДА ПроверяемыйРеквизит ЕСТЬ NULL
ТОГДА ""
ИНАЧЕ ВЫБОР
КОГДА (ВЫРАЗИТЬ(ПроверяемыйРеквизит КАК СТРОКА(100))) = ""
ТОГДА ""
ИНАЧЕ ПроверяемыйРеквизит
КОНЕЦ
КОНЕЦ
Выбор
когда Должность подобно %+" " тогда Подстрока(Должность,1,ДлинаСтроки(Должность)-1)
когда Должность подобно %+" " тогда Подстрока(Должность,1,ДлинаСтроки(Должность)-2)
...
Конец
Если нужно убрать не все пробелы, а только пробелы справа (аналог функции СокрП), то это можно сделать, определив длину строки ДлинаСтр, а затем воспользоваться готовой функции ПОДСТРОКА(Строка, 1, ДлинаСтр). Длину строки в запросе можно определить как в статье Минимализмы (пример 21).
Все проще можно и сразу в запросе):
Например, на строковый реквизит наложена маска !99.999.999 и верный код будет следующим: B01.057.002, но встречается код, в к-м в середине не 3 знака, а 2 и менеджеры ставят пробел: A15.01_.001 (здесь _ обозначает пробел)), то при обменке - убираем этот пробел прямо в запросе:
ВЫБОР
КОГДА ПОДСТРОКА(МедицинскийДокументВыполненныеУслуги.Номенклатура.КодМинЗдрава, 7, 1) = " "
ТОГДА ПОДСТРОКА(МедицинскийДокументВыполненныеУслуги.Номенклатура.КодМинЗдрава, 1, 6) + ПОДСТРОКА(МедицинскийДокументВыполненныеУслуги.Номенклатура.КодМинЗдрава, 8, 4)
ИНАЧЕ МедицинскийДокументВыполненныеУслуги.Номенклатура.КодМинЗдрава
КОНЕЦ