Как в запросе 1С:Предприятие 8 одно строковое поле разделить на два?

Приветсвую вас, уважаемые читатели блога SoftMaker.kz! Сегодня, с помощью примеров, мы рассмотрим, как на практике можно использовать функцию запросов 1С ПОДСТРОКА / SUBSTRING. Использование данной функции пригодится не только в простых запросах, которые мы рассмотрим здесь, но и при соединении и объединении запросов, а также в пакетных запросах. Итак, давайте приступим!

Задача состояла в том, что нужно было из реквизита документа Сответствие выделить две строки и сделать сортировку по ним. Соответствие счета, такого вида:

779000/004599.

Как разбить это значение на два? У функции ПОДСТРОКА три параметра. В качестве первого указывается исходная строка, из которой требуется выделить часть символов — подстроку. Понятно, что тип значения этого параметра — это Строка. Внимание, это очень важное замечание, если использовать тип первого параметра не строку, функция не будет работать, запрос будет выдавать ошибку! Второй параметр определяет позицию символа в исходной строке, с которого начинается выделение части строки, а третий — это длина выделяемой подстроки. Тип значения для второго и третьего параметров — число. Перейдём к практике:

ВЫБРАТЬ
	Типовой.Регистратор КАК Название,
	ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 1, 6) КАК СчетЗатрат,
	ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 8, 11) КАК Отдел,
	СУММА(ВЫБОР
			КОГДА МЕСЯЦ(Типовой.Период) = 3
				ТОГДА ВЫРАЗИТЬ(Типовой.Сумма КАК ЧИСЛО(15, 2))
			ИНАЧЕ 0
		КОНЕЦ) КАК Март
ИЗ
	РегистрБухгалтерии.Типовой КАК Типовой
ГДЕ
	Типовой.СчетКт = &СчетКт
	И Типовой.Период МЕЖДУ &ПериодНач И &ПериодКон

СГРУППИРОВАТЬ ПО
	ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 1, 6),
	ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 8, 11),
	Типовой.Регистратор

УПОРЯДОЧИТЬ ПО
	Отдел,
	СчетЗатрат

Результат этого запроса следующий:

Название СчетЗатрат Отдел Март
Платежное поручение исходящее 00000000319 от 01.03.2010 14:42:54 779000 004599 9 000
Платежное поручение исходящее 00000000320 от 02.03.2010 12:07:34 779000 004599 4 721,6
Платежное поручение исходящее 00000000203 от 01.03.2010 12:28:52 786500 004599 987 614,51
Платежное поручение исходящее 00000000227 от 03.03.2010 14:16:00 786500 004599 400 000
Платежное поручение исходящее 00000000238 от 05.03.2010 12:37:57 732000 004600 5 400
Платежное поручение исходящее 00000000197 от 01.03.2010 11:53:11 732500 004600 12 100
Платежное поручение исходящее 00000000198 от 01.03.2010 11:55:39 732500 004600 12 100
Платежное поручение исходящее 00000000279 от 26.03.2010 0:00:00 734100 004600 19 609
Платежное поручение исходящее 00000000287 от 29.03.2010 14:15:36 734100 004600 55 300
Платежное поручение исходящее 00000000291 от 30.03.2010 11:01:10 734100 004600 18 090
Платежное поручение исходящее 00000000268 от 18.03.2010 10:34:25 738000 004600 10 050
Платежное поручение исходящее 00000000276 от 18.03.2010 12:20:20 750400 004600 13 060,98
Платежное поручение исходящее 00000000281 от 29.03.2010 12:33:46 750400 004600 555 645,41
Платежное поручение исходящее 00000000234 от 04.03.2010 12:21:55 754450 004600 24 120
Платежное поручение исходящее 00000000290 от 30.03.2010 10:44:39 754450 004600 100 000
Платежное поручение исходящее 00000000240 от 09.03.2010 10:53:24 786300 004600 20 800
Платежное поручение исходящее 00000000269 от 18.03.2010 10:58:04 786300 004600 61 012
Платежное поручение исходящее 00000000289 от 30.03.2010 9:27:14 786300 004600 6 000
Платежное поручение исходящее 00000000223 от 03.03.2010 12:13:38 786500 004600 36 000
Платежное поручение исходящее 00000000228 от 04.03.2010 9:52:35 786500 004600 378 138,85
Платежное поручение исходящее 00000000229 от 04.03.2010 9:57:50 786503 004600 126 117,75
Платежное поручение исходящее 00000000200 от 01.03.2010 11:58:06 754422 004762 63 000
Платежное поручение исходящее 00000000286 от 29.03.2010 14:10:18 764422 004762 10 000
Платежное поручение исходящее 00000000267 от 17.03.2010 0:00:00 764423 004762 464 370
Платежное поручение исходящее 00000000261 от 15.03.2010 11:16:28 764522 004762 81 357

Итак, если мы берём строку 779000/004599, то ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 1, 6) будет выделять строку «779000». А ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 8, 11) будет выводить «004599». В этом же запросе, используется выражение:

СУММА(ВЫБОР
	КОГДА МЕСЯЦ(Типовой.Период) = 3
		ТОГДА ВЫРАЗИТЬ(Типовой.Сумма КАК ЧИСЛО(15, 2))
	ИНАЧЕ 0
КОНЕЦ) КАК Март

В этой же задаче необходимо было добавить новые колонки с названиями месяцев и с суммами по ним. Как раз это выражение решает эту задачу. Если Вам нужно использовать другие месяца, например январь, то заменим выражение:

СУММА(ВЫБОР
	КОГДА МЕСЯЦ(Типовой.Период) = 1
		ТОГДА ВЫРАЗИТЬ(Типовой.Сумма КАК ЧИСЛО(15, 2))
	ИНАЧЕ 0
КОНЕЦ) КАК Январь

Приведу пример текста запроса, в котором с помощью цикла формируются поля месяцев (выделено жирным), начиная с марта по февраль.

ТекстЗапроса = "
 |ВЫБРАТЬ
 |Типовой.Регистратор КАК Название,
 |ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 1, 6) КАК СчетЗатрат,
 |ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 8, 11) КАК Отдел,";
 
 Для Сч = 1 По 12 Цикл
 	Если Сч < 11 Тогда
 		Мес = Сч + 2;
 	Иначе
 		Мес = Сч - 10;
 	КонецЕсли;
 	ТекстЗапроса = ТекстЗапроса + "
 	|СУММА(ВЫБОР
 	|	КОГДА МЕСЯЦ(Типовой.Период) = " + Мес + "
 	|		ТОГДА ВЫРАЗИТЬ(Типовой.Сумма КАК ЧИСЛО(15, 2))
 	|	ИНАЧЕ 0
 	|КОНЕЦ) КАК Поле" + Мес + ?(Сч=12,"",",");
 КонецЦикла;
 ТекстЗапроса = ТекстЗапроса + "
 |ИЗ
 |	РегистрБухгалтерии." + ИмяРегистраБухгалтерии + ".ДвиженияССубконто(
 |		&НачПериода,
 |		&КонПериода,";
 
 СтрокаОграниченийПоРеквизитам = " (Активность = ИСТИНА) И (Счет В ИЕРАРХИИ (&СчетАнализа))";
 
 ТекстЗапроса = ТекстЗапроса + СтрокаОграниченийПоРеквизитам + "
 |	) КАК Типовой
 |";
 
 ТекстЗапроса = ТекстЗапроса + "
 |ГДЕ
 |	Типовой.СчетКт = &СчетАнализа
 |	И Типовой.Период МЕЖДУ &НачПериода И &КонПериода
 |СГРУППИРОВАТЬ ПО
 |	ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 1, 6),
 |	ПОДСТРОКА(Типовой.Регистратор.Соотв.Наименование, 8, 11),
 |	Типовой.Регистратор
 |УПОРЯДОЧИТЬ ПО
 |	Отдел,
 |	СчетЗатрат";
 

Итак, с помощью кода приведенного выше (выделено жирным), выводятся части запроса с месяцами. Таким образом, происходит добавление новых колонок с названиями месяцев и с суммами по ним.

ПОДПИСКА

[dwqa-submit-question-form]