Можно ли в запросе для поля убрать пробелы?

1. Funtik90 11.04.12 10:25 Сейчас в теме
доброго времени суток, знатоки. вот в запросе выбираю Должности.Наименование, есть такие должности где поставили пробел после наименования, как можно сделать СОКРЛП(Должности.Наименование), вот таким макаром ругается, не знает такую функцию
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ediks 337 11.04.12 10:34 Сейчас в теме
(1) А ПОДСТРОКА не поможет?
22. ditp 94 09.10.15 11:40 Сейчас в теме
(1) Funtik90, можно:



Код:
ВЫБРАТЬ
	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
				ТОГДА ""
			ИНАЧЕ Шаг.символ
		КОНЕЦ) КАК символ
ИЗ
	Шаг КАК Шаг

СГРУППИРОВАТЬ ПО
	Шаг.Ссылка,
	Шаг.порядковый_номер_нов
;

////////////////////////////////////////////////////////////­////////////////////
УНИЧТОЖИТЬ Шаг;
Показать


В финальной части запроса использована идея обработки от Ildarovich'a: http://infostart.ru/public/200275/

ВНИМАНИЕ: пробелы заменяются на "неразрывные пробелы" - нужно учитывать при постобработке.
Trukit; wowik; mplavnik; hydro2588_2015; alsan; Maximysis; e][tend; МирославаЯсная; CratosX; Salavat; ildarovich; +11 Ответить
24. CratosX 114 14.10.15 12:17 Сейчас в теме
(22) ditp, как, КАК вы это сделали?
aikosyapr; aleksae; user1145678; mplavnik; roman8115; inf012; Gendelf; e][tend; +8 Ответить
25. ditp 94 14.10.15 12:27 Сейчас в теме
(24) CratosX, да логика-то простая - разбираем входные строки на символы и выкидываем ненужные:
ВЫБРАТЬ
    Должности.Ссылка,
    ПОДСТРОКА(Должности.Наименование, разряды.сч, 1) КАК символ,
    разряды.сч КАК разряд
ПОМЕСТИТЬ тСимволы
ИЗ
    Справочник.Должности КАК Должности,
    разряды КАК разряды
ГДЕ
    разряды.сч <> 0
    И "_" + ПОДСТРОКА(Должности.Наименование, разряды.сч, 1) + "_" <> "__";

ВЫБРАТЬ
    тСимволы.Ссылка,
    тСимволы.разряд,
    тСимволы.символ
ПОМЕСТИТЬ тСимволыОчищенные
ИЗ
    тСимволы КАК тСимволы
        ЛЕВОЕ СОЕДИНЕНИЕ тСимволы КАК тСимволы1
        ПО тСимволы.Ссылка = тСимволы1.Ссылка
            И (тСимволы.разряд = тСимволы1.разряд + 1)
ГДЕ
    НЕ(тСимволы.символ = ""
                И тСимволы1.символ = "")
Показать

финальная часть подсмотрена у комментатора выше.
Развитие темы в публикации.
3. Funtik90 11.04.12 10:35 Сейчас в теме
не знаю не нашел по ней информации
4. ediks 337 11.04.12 10:39 Сейчас в теме
(3) ПОДСТРОКА(<Строка>, <НачальнаяПозиция>, <Длина>)
Но что-то я, наверное, ступил. Не знаю как вычислить "полезную" длину.
5. Funtik90 11.04.12 10:42 Сейчас в теме
т.е. получает через перебор записывать в таблицу СОКРЛП(значение)
6. Lyns_owner 356 11.04.12 10:47 Сейчас в теме
Если бы была функция в языке запросов, позволяющая определить длину строки, то задача была бы реализуема в запросе. Если данные используются для отчета на СКД, то можно создать вычисляемое поле, которое будет вычисляться путем вызова функции в общем модуле.
7. Funtik90 11.04.12 10:48 Сейчас в теме
скажите что такое СКД, уже не первый раз читаю а знать не знаю ((
9. Поручик 4658 11.04.12 10:52 Сейчас в теме
(7) В гугле спроси.
alei1180; user1252865; +2 2 Ответить
26. Aleksandr_prof 198 08.10.21 11:37 Сейчас в теме
(9) Спросил в гугле и попал сюда)
Ermigen; Allesly; fort13; aikosyapr; Trukit; s_uu; +6 Ответить
8. Lyns_owner 356 11.04.12 10:52 Сейчас в теме
Схема компоновки данных
10. Funtik90 11.04.12 10:56 Сейчас в теме
вот через СКД и использую ))
11. FReIM 9 11.04.12 10:58 Сейчас в теме
Напрямую в запросе для работы со строками есть только сравнение с помощью ПОДОБНО и различных масок и ПОДСТРОКА. Более в запросе никаких действий со строками, в отличии от SQL запросов, сделать нельзя.
ПРО СКД - посмотри курс Насипова и Гилёва, там достаточно подробно все показано ну или книжку по СКД скачай/купи.
12. Funtik90 11.04.12 11:02 Сейчас в теме
спасибо, обязательно на входных посмотрю
13. spenser123 11.04.12 12:19 Сейчас в теме
а после выполнения результатов не подходит?
Результат=Запрос.Выполнить....

ЗначениеДолжности = СокрЛП(РезультатЗапроса.Наименование)

ну или через ПОДОБНО:
ВЫРАЗИТЬ ... КАК СТРОКА(...)
... ПОДОБНО ...
Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.

Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:

% (процент): последовательность, содержащая любое количество произвольных символов
_ (подчеркивание): один произвольный символ
[…] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок
В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
[^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
Любой другой символ означает сам себя и не несет никакой дополнительной нагрузки.

Если в качестве самого себя необходимо записать один из перечисленных символов, то ему должен предшествовать <Спецсимвол>. Сам <Спецсимвол> (любой подходящий символ) определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.

Например, шаблон “%АБВ[0-9][абвг]\_абв%” СПЕЦСИМВОЛ “\” означает подстроку, состоящую из последовательности символов:
буквы А; буквы Б; буквы В; одной цифры; одной из букв а, б, в или г; символа подчеркивания; буквы а; буквы б; буквы в.

Причем перед этой последовательностью может располагаться произвольный набор символов.
Показать
14. Lyns_owner 356 12.04.12 13:43 Сейчас в теме
(13) spenser123,
ну или через ПОДОБНО:

Вы бы описание не скидывали а привели кусок кода, раз считаете, что это реализуемо в запросе.
15. w1ncent 02.05.12 10:00 Сейчас в теме
Вот код для проверки на пустое значение и приведения к удобному для обработки виду реквизита в произвольном выражении СКД. Потом этот реквизит легко сравнивается с "" и никаких ошибок :)
Сначала проверяем на значение на NULL, затем на пустую строку(незначащие пробелы обрезаются)


ВЫБОР
КОГДА ПроверяемыйРеквизит ЕСТЬ NULL
ТОГДА ""
ИНАЧЕ ВЫБОР
КОГДА (ВЫРАЗИТЬ(ПроверяемыйРеквизит КАК СТРОКА(100))) = ""
ТОГДА ""
ИНАЧЕ ПроверяемыйРеквизит
КОНЕЦ
КОНЕЦ
16. w1ncent 02.05.12 11:03 Сейчас в теме
ВЫРАЗИТЬ(ОбрабатываемыйРеквизит КАК СТРОКА(КоличествоПолучаемыхСимволов))

Аналог СокрЛП, не работает с датой
17. igor_gk 49 22.08.13 10:20 Сейчас в теме
Ну и тогда уже:

Запрос.Текст = "ВЫБРАТЬ
...
| ИЗ
...
| ГДЕ
| ВЫРАЗИТЬ(ОбрабатываемыйРеквизит КАК СТРОКА(" + СтрДлина(СокрЛП(ИскомоеТекстовоеЗначение)) + "))
...";
18. MrFlanker 232 25.12.13 09:48 Сейчас в теме
(17), Так нельзя же в запросе функции применять
19. oldfornit 25.12.13 10:00 Сейчас в теме
а в чем состоит первоначальная задача?
20. Crush 13.03.14 16:05 Сейчас в теме
Выбор
когда Должность подобно %+" " тогда Подстрока(Должность,1,ДлинаСтроки(Должность)-1)
когда Должность подобно %+" " тогда Подстрока(Должность,1,ДлинаСтроки(Должность)-2)
...
Конец
21. tigermonster 11 08.10.15 21:13 Сейчас в теме
Если нужно пробелы убрать именно в строковом поле, то только ПОДОБНО
23. ildarovich 7936 09.10.15 11:51 Сейчас в теме
Если нужно убрать не все пробелы, а только пробелы справа (аналог функции СокрП), то это можно сделать, определив длину строки ДлинаСтр, а затем воспользоваться готовой функции ПОДСТРОКА(Строка, 1, ДлинаСтр). Длину строки в запросе можно определить как в статье Минимализмы (пример 21).
shalupov61; +1 Ответить
27. soft_wind 08.10.21 11:51 Сейчас в теме
и нафига все это? сам результат запроса ни куда не идет,
он все равно где-то как-то для чего-то обрабатывается,

Вот там и вставить функцию
НаименованиеДолжности = СокрЛП(Выборка.НаименованиеДолжности);
28. Ninja|68 07.09.22 11:16 Сейчас в теме
Гугл/Яндекс направляют людей сюда.
Так вот теперь можно это сделать, но только с 20 версии платформы.
Реализовано в версии 8.3.20.1549
Новые функции языка запросов и системы компоновки данных
https://wonderland.v8.1c.ru/blog/novye-funktsii-yazyka-zaprosov-i-sistemy-komponovki-dannykh/?sphrase_id=323070
Язык запросов
В язык запросов добавляются функции:

Строка(String) – преобразует значение в примитивного типа в строку с учетом национальных установок.

Тригонометрические функции Sin, Cos, Tan, ASin, ACos, ATan (все вычисления производятся в радианах)

Exp - вычисляет результат возведения основания натурального логарифма (числа e) в степень

Log - вычисляет натуральный логарифм числа.

Log10 - вычисляет десятичный логарифм числа.

Pow - вычисляет возведение в степень.

Sqrt – вычисляет квадратный корень.

Окр(Round) - округляет исходное число до нужной разрядности

Цел(Int) - вычисляет целую часть переданного числа, полностью отсекая дробную часть.

ДлинаСтроки(StringLength) – вычисляет длину строки.

СокрЛ(TrimL) – отбрасывает незначащие пробелы слева.

СокрП(TrimR) – отбрасывает незначащие пробелы справа.

СокрЛП(TrimAll) – отбрасывает незначащие пробелы слева и справа.

Лев(Left) – получает первые слева символы строки.

Прав(Right) – получает первые справа символы строки.

СтрНайти(StrFind) – находит первую позицию подстроки в строке (без учета регистра).

ВРег(Upper) – преобразует все символы строки в верхний регистр.

НРег(Lower) – преобразует все символы строки в нижний регистр.

СтрЗаменить(StrReplace) – заменяет все вхождения подстроки на другую подстроку (без учета регистра).

РазмерХранимыхДанных(StoredDataSize) – возвращает размер данных в байтах, которые занимают данные параметра.

Система компоновки данных
В язык выражений системы компоновки данных добавлены новые функции:

СокрЛ(TrimL) – отбросить незначащие пробелы слева.

СокрП(TrimR) – отбросить незначащие пробелы справа.

СокрЛП(TrimAll) – отбросить незначащие пробелы слева и справа.

Лев(Left) – получить первые слева символы строки.

Прав(Right) – получить первые справа символы строки.

СтрНайти(StrFind) – найти подстроку в строке (без учета регистра).

ВРег(Upper) – преобразует все символы строки в верхний регистр.

НРег(Lower) – преобразует все символы строки в нижний регистр.

СтрЗаменить(StrReplace) – заменяет все вхождения подстроки на другую подстроку (без учета регистра).

НСтр(NStr) – получает строку на языке пользователя (аналогично тому, как работает метод НСтр глобального контекста). Параметры:

ИсходнаяСтрока – строка, содержащая строки на разных языках (например, "ru = 'Добрый вечер!'; en = 'Good Evening!'").

КодЯзыка (необязательный) – строка с кодом языка, на котором нужно получать строку. Если не указан - строка получается на языке текущего пользователя.
serverstar; РГФ; user1364468; SagittariusA; +4 Ответить
29. serverstar 69 01.02.24 11:28 Сейчас в теме
30. Said-We 01.02.24 14:58 Сейчас в теме
(29) Это 1С - в запросах тут простая задача решается автогеном через...
Да и тема 2012 года.
Прикрепленные файлы:
31. jan-pechka 426 25.06.24 13:21 Сейчас в теме
Все проще можно и сразу в запросе):
Например, на строковый реквизит наложена маска !99.999.999 и верный код будет следующим: B01.057.002, но встречается код, в к-м в середине не 3 знака, а 2 и менеджеры ставят пробел: A15.01_.001 (здесь _ обозначает пробел)), то при обменке - убираем этот пробел прямо в запросе:
ВЫБОР
	КОГДА ПОДСТРОКА(МедицинскийДокументВыполненныеУслуги.Номенклатура.КодМинЗдрава, 7, 1) = " "
		ТОГДА ПОДСТРОКА(МедицинскийДокументВыполненныеУслуги.Номенклатура.КодМинЗдрава, 1, 6) + ПОДСТРОКА(МедицинскийДокументВыполненныеУслуги.Номенклатура.КодМинЗдрава, 8, 4)
	ИНАЧЕ МедицинскийДокументВыполненныеУслуги.Номенклатура.КодМинЗдрава
КОНЕЦ
32. user1619761 25.06.24 14:10 Сейчас в теме
(31) в современных платформах и сокрлп в запросах работает, публикации 12 лет уже)
33. jan-pechka 426 25.06.24 19:15 Сейчас в теме
(32)у меня с маской-надо какой-то устный алгоритм контроля-для устрашения пользователей)
34. пользователь 25.06.24 20:33
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот