1. Funtik90 11.04.12 10:25 Сейчас в теме

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

доброго времени суток, знатоки. вот в запросе выбираю Должности.Наименование, есть такие должности где поставили пробел после наименования, как можно сделать СОКРЛП(Должности.Наименование), вот таким макаром ругается, не знает такую функцию
Ответы
Избранное Подписка Сортировка: Древо
2. ediks 329 11.04.12 10:34 Сейчас в теме
(1) А ПОДСТРОКА не поможет?
22. ditp 50 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/

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

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

финальная часть подсмотрена у комментатора выше.
Развитие темы в публикации.
3. Funtik90 11.04.12 10:35 Сейчас в теме
не знаю не нашел по ней информации
4. ediks 329 11.04.12 10:39 Сейчас в теме
(3) ПОДСТРОКА(<Строка>, <НачальнаяПозиция>, <Длина>)
Но что-то я, наверное, ступил. Не знаю как вычислить "полезную" длину.
5. Funtik90 11.04.12 10:42 Сейчас в теме
т.е. получает через перебор записывать в таблицу СОКРЛП(значение)
6. Lyns_owner 342 11.04.12 10:47 Сейчас в теме
Если бы была функция в языке запросов, позволяющая определить длину строки, то задача была бы реализуема в запросе. Если данные используются для отчета на СКД, то можно создать вычисляемое поле, которое будет вычисляться путем вызова функции в общем модуле.
7. Funtik90 11.04.12 10:48 Сейчас в теме
скажите что такое СКД, уже не первый раз читаю а знать не знаю ((
9. Поручик 4332 11.04.12 10:52 Сейчас в теме
8. Lyns_owner 342 11.04.12 10:52 Сейчас в теме
Схема компоновки данных
10. Funtik90 11.04.12 10:56 Сейчас в теме
вот через СКД и использую ))
11. FReIM 4 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 342 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 46 22.08.13 10:20 Сейчас в теме
Ну и тогда уже:

Запрос.Текст = "ВЫБРАТЬ
...
| ИЗ
...
| ГДЕ
| ВЫРАЗИТЬ(ОбрабатываемыйРеквизит КАК СТРОКА(" + СтрДлина(СокрЛП(ИскомоеТекстовоеЗначение)) + "))
...";
18. MrFlanker 167 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 08.10.15 21:13 Сейчас в теме
Если нужно пробелы убрать именно в строковом поле, то только ПОДОБНО
23. ildarovich 6755 09.10.15 11:51 Сейчас в теме
Если нужно убрать не все пробелы, а только пробелы справа (аналог функции СокрП), то это можно сделать, определив длину строки ДлинаСтр, а затем воспользоваться готовой функции ПОДСТРОКА(Строка, 1, ДлинаСтр). Длину строки в запросе можно определить как в статье Минимализмы (пример 21).
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии


Программист 1С
Краснодар
зарплата от 80 000 руб. до 160 000 руб.
Полный день

Консультант 1 С
Краснодар
зарплата от 50 000 руб. до 150 000 руб.
Полный день

Консультант-методолог 1С
Краснодар
зарплата от 110 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству