Представление в запросе табличной части документа одним строковым полем
Поставили задачу: «Получить в одно поле, всю таблицу товаров документа «Реализации товаров и услуг» через запятую».
Поля таблицы товаров интересны заказчику были только наименование, количество и единица измерения.
Конечно данный вариант проще сделать в обработке результата или в выражениях СКД, но моё мнение, что в запросе результат будет получен быстрее.
Механизм не универсальный, в данном примере рассматривается таблица максимум с 20-ью строками и количество с типом Число (8,3).
Комплексная Автоматизация 1.1
- Описание
- Подробнее
Описание
Добрый день.
Если кому-то потребуется некую табличную часть в запросе преобразовать в одно строковое поле, которое будет содержать перечисление всех строк таблицы, тогда вам будет интересно это прочитать. Не спорю, что возможно это "жесть".
Первая трудность — Нельзя в запросе преобразовать Число в Строку
В запросе 1С, нельзя сложить в одну строку значения типа Строка и Число, точнее нет возможности преобразовать Число в Строку. Благодаря данному сайту нашел отличное относительно универсальное решение — //sale.itcity.ru/public/331805/ , единственное, что я добавил это убрал нули, т.е. приведенный запрос из 0,5 типа Числа(8,3) вернул бы строку 00000000,500.
Вторая трудность — Строки в столбцы
Трудность была относительной, опять же прочитав где-то в комментариях форума выше упомянутого автора ildarovich про необходимость использовать номер строки, решение пришло само собой. Но решение получилось так же не совсем универсальным. Если с числом ещё понятно, что оно определяется в конфигураторе, то ограничение на количество строк определить не возможно, товаров ведь может быть вбито хоть +100500… проверил, за шесть лет работы компании, максимальное количество строк в таблице товаров было 22 один раз, другие разы не превышало16 и крайне редко… Пришел к мнению, что пока сделаю на 20 строк.
Второй вариант запроса:
(Данный вариант был скорректирован и осмыслен после написания статьи, оптимизация, спасибо всем за советы :))
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка,
РеализацияТоваровУслугТовары.Номенклатура,
ПОДСТРОКА("0123456789", РеализацияТоваровУслугТовары.Количество / 100000 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, РеализацияТоваровУслугТовары.Количество * 0.0006)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, РеализацияТоваровУслугТовары.Количество * 0.006)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, РеализацияТоваровУслугТовары.Количество * 0.06)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, РеализацияТоваровУслугТовары.Количество * 0.6)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, РеализацияТоваровУслугТовары.Количество * 6)) / 6 + 1, 1)
+ ","
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, РеализацияТоваровУслугТовары.Количество * 60)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, РеализацияТоваровУслугТовары.Количество * 600)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, РеализацияТоваровУслугТовары.Количество * 6000)) / 6 + 1, 1) КАК КоличествоСтрокой,
РеализацияТоваровУслугТовары.Количество,
РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
РеализацияТоваровУслугТовары.НомерСтроки
ПОМЕСТИТЬ ЧислоВСтроку
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЧислоВСтроку.Ссылка,
ЧислоВСтроку.Номенклатура.Наименование + " " + ВЫБОР
КОГДА ЧислоВСтроку.КоличествоСтрокой = "000000,000"
ТОГДА ""
ИНАЧЕ ВЫБОР
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 1, 6) = "000000"
ТОГДА "0"
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 1, 5) = "00000"
ТОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 6, 1)
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 1, 4) = "0000"
ТОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 5, 2)
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 1, 3) = "000"
ТОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 4, 3)
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 1, 2) = "00"
ТОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 3, 4)
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 1, 1) = "0"
ТОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 2, 5)
ИНАЧЕ ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 1, 6)
КОНЕЦ + ВЫБОР
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 8, 3) = "000"
ТОГДА ""
ИНАЧЕ "," + ВЫБОР
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 9, 2) = "00"
ТОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 8, 1)
КОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 10, 1) = "0"
ТОГДА ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 8, 2)
ИНАЧЕ ПОДСТРОКА(ЧислоВСтроку.КоличествоСтрокой, 8, 3)
КОНЕЦ
КОНЕЦ
КОНЕЦ + " " + ЧислоВСтроку.ЕдиницаИзмерения.Наименование КАК НоменклатураКоличествоЕдиница,
ЧислоВСтроку.Номенклатура,
ЧислоВСтроку.Количество,
ЧислоВСтроку.ЕдиницаИзмерения,
ЧислоВСтроку.НомерСтроки
ПОМЕСТИТЬ НКЕ
ИЗ
ЧислоВСтроку КАК ЧислоВСтроку
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НКЕ.Ссылка,
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 1 ТОГДА НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 2 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 3 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 4 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 5 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 6 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 7 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 8 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 9 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 10 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 11 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 12 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 13 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 14 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 15 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 16 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 17 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 18 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 19 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 20 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 21 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 22 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 23 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 24 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(ВЫБОР НКЕ.НомерСтроки КОГДА 25 ТОГДА "; " + НКЕ.НоменклатураКоличествоЕдиница ИНАЧЕ "" КОНЕЦ) +
МАКСИМУМ(".") КАК ТаблицаТоварыВСтроку
ИЗ
НКЕ КАК НКЕ
СГРУППИРОВАТЬ ПО
НКЕ.Ссылка
Первый вариант запроса:


