Как в запросе 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]