Маленькая хитрость СКД - выводим строки X раз

17.12.16

Разработка - СКД

Здесь я расскажу, как вывести в отчет СКД произвольное количество одинаковых строк.

Был у меня как-то клиент, разрабатывали ему конфигурацию по управлению сетью хостелов.

И вот возникла одна несложная задачка: сделать отчет, который будет показывать состояние комнат на какой-то момент времени в следующем виде:

Группировка по Хостелам и комнатам, детали: проживающий, дата заезда, планируемая дата выезда и что-то там еще по проживающим:

Комната 313 (5 мест)
   Иванов Иван Перович, 01.01.2016, 31.01.2016
   Пупкин Петр Васильевич, 05.01.2016, 25.01.2016
   СВОБОДНО
   СВОБОДНО 
   СВОБОДНО

Самое интересное и оказалось в том, что каждое свободное место в комнате должно выводиться отдельной строчкой.

Структура конфигурации не предполагала учет по конкретным местам и более того, нигде, кроме этого отчета и не возникала такая необходимость. Т.е. у нас есть информация о количестве мест в комнате всего и о каждом проживающим, каждый из которых занимает 1 место.

Конечно, можно было бы быстренько состряпать отдельный отчет и сделать так:

Для i 1 по КоличествоСободныхМест Цикл
    ТабДок.Вывести("ОбластьСвободноеМесто");
КонецЦикла;

Но как только я давным давно познакомился С КД, я старался делать все отчеты с помощью компоновки. Причина в двух неоспоримых плюсах: быстрота разработки и гибкость настроек для пользователя. В 99% случаев я даже формы не создавал для отчетов, все прекрасно описывается в схеме компоновки. И псевдонимы полей, и списки значений, а если надо – можно пользоваться функциями общих модулей. В общем очень не хотел я делать шаг в прошлое, поэтому достаточно быстро в голове родился вариант решения. Томить не стану, вот оно само решение, набросал без метаданных, чтобы любой желающий смог быстро посмотреть его в консоли:
В 

ВЫБРАТЬ    0 КАК Число
ПОМЕСТИТЬ ВТ_До10
ОБЪЕДИНИТЬ
ВЫБРАТЬ    1
ОБЪЕДИНИТЬ
ВЫБРАТЬ    2
ОБЪЕДИНИТЬ
ВЫБРАТЬ    3
ОБЪЕДИНИТЬ
ВЫБРАТЬ    4
ОБЪЕДИНИТЬ
ВЫБРАТЬ    5
ОБЪЕДИНИТЬ
ВЫБРАТЬ    6
ОБЪЕДИНИТЬ
ВЫБРАТЬ    7
ОБЪЕДИНИТЬ
ВЫБРАТЬ    8
ОБЪЕДИНИТЬ
ВЫБРАТЬ    9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_До10.Число * 10 + ВТ_До10_1.Число КАК Индекс
ПОМЕСТИТЬ ВТ_ПустыеСтроки
ИЗ
    ВТ_До10 КАК ВТ_До10,
    ВТ_До10 КАК ВТ_До10_1
//Повторить сколько угодно раз, ориентируясь на максимально возможный индекс
ГДЕ
    ВТ_До10.Число * 10 + ВТ_До10_1.Число > 0
;

////////////////////////////////////////////////////////////////////////////////
//Тестовые данные - Комнаты
ВЫБРАТЬ
    "Комната1" КАК Комната,
    5 КАК КоличествоМест
ПОМЕСТИТЬ ВТ_Комнаты

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Комната2",
    4
;

////////////////////////////////////////////////////////////////////////////////
//Тестовые данные - состояние проживающих
ВЫБРАТЬ
    "Комната1" КАК Комната,
    "Иванов Иван Иванович" КАК Постоялец,
    ДАТАВРЕМЯ(2016, 1, 1, 0, 0, 0) КАК ДатаЗаезда,
    ДАТАВРЕМЯ(2016, 1, 31, 0, 0, 0) КАК ПланируемаяДатаВыезда
ПОМЕСТИТЬ ВТ_ИнфорамцияОПроживающих

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Комната1",
    "Пупкин Петр Васильевич",
    ДАТАВРЕМЯ(2016, 1, 5, 0, 0, 0),
    ДАТАВРЕМЯ(2016, 1, 25, 0, 0, 0)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ИнфорамцияОПроживающих.Комната,
    ВТ_ИнфорамцияОПроживающих.Постоялец,
    ВТ_ИнфорамцияОПроживающих.ДатаЗаезда,
    ВТ_ИнфорамцияОПроживающих.ПланируемаяДатаВыезда
ИЗ
    ВТ_ИнфорамцияОПроживающих КАК ВТ_ИнфорамцияОПроживающих

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    СвободныеМеста.Комната,
    "СВОБОДНО",
    NULL,
    NULL
ИЗ
    (ВЫБРАТЬ
        ВТ_Комнаты.Комната КАК Комната,
        ВТ_Комнаты.КоличествоМест - ЕСТЬNULL(КОЛИЧЕСТВО(ВТ_ИнфорамцияОПроживающих.Постоялец), 0) КАК СвободноМест
    ИЗ
        ВТ_Комнаты КАК ВТ_Комнаты
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИнфорамцияОПроживающих КАК ВТ_ИнфорамцияОПроживающих
            ПО ВТ_Комнаты.Комната = ВТ_ИнфорамцияОПроживающих.Комната
    
    СГРУППИРОВАТЬ ПО
        ВТ_Комнаты.Комната,
        ВТ_Комнаты.КоличествоМест) КАК СвободныеМеста
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПустыеСтроки КАК ВТ_ПустыеСтроки
        ПО СвободныеМеста.СвободноМест >= ВТ_ПустыеСтроки.Индекс

В принципе, данный способ можно использовать везде, где есть необходимость что-то учесть в запросе X раз, именно не умножить на X, а сделать X строк из одной.

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159416    872    399    

861

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8684    implecs_team    6    

47

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    6995    56    obmailok    21    

79

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    3148    5    Yashazz    1    

34

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    10804    23    John_d    25    

124

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    8016    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ardn 657 19.12.16 06:01 Сейчас в теме
В чем же заключается хитрость СКД?
Патриот; +1 Ответить
4. alexandersh 265 19.12.16 12:23 Сейчас в теме
(1)
В чем же заключается хитрость СКД?

Хитрость заключается в том, что на вскидку я не знаю другого способа в СКД без дополнительной обработки результата, вывести сколько угодно раз пустые строки. Если есть альтернатива - поделись, с удовольствием добавлю со ссылкой на твое авторство ;-)
5. ardn 657 19.12.16 13:22 Сейчас в теме
(4)
В Вашей статье описывается "хитрый" запрос, который путем соединения таблицы с данными и искусственно созданной таблицы дает нужный результат. Этот запрос можно запустить в консоли, встроить в свою обработку, отчет, отчет на СКД, на построителе отчетов.
Боюсь, что упоминание СКД в заголовке вводит в заблуждение.
xzorkiix; ABudnikov; TreeDogNight; Murik_1984; ixijixi; Патриот; CyberCerber; krv2k; bulpi; klinval; Ганс; +11 Ответить
6. alexandersh 265 19.12.16 13:43 Сейчас в теме
(5) Ну как сказать вводит в заблуждение. То что запрос можно использовать в любом другом месте - это понятно, на то он и запрос.Статья решает не проблему использования запроса. У тебя есть другой способ решения данной задачи именно на СКД? Чтобы не делать пост-обработку результата. Если нет, то не вижу основания в критике. )
"Здесь я расскажу, как вывести в отчет СКД произвольное количество одинаковых строк." - вот какая задача решается в статье с приложением минимальных усилий, разве нет?)) или ты хочешь сказать, что эта задача не решена?))
7. NeviD 19.12.16 15:05 Сейчас в теме
(6) У вас задача решена не на СКД. Она решена в запросе. Поэтому название "Маленькая хитрость СКД ..." неправильно - СКД тут вообще не при чем.
TreeDogNight; +1 Ответить
8. alexandersh 265 19.12.16 15:20 Сейчас в теме
(7) ок, еще раз суть задачи: сделать отчет СКД, в который необходимо выводить X пустых строк. есть другой вариант решения этой задачи?
9. klinval 343 19.12.16 16:56 Сейчас в теме
(8) Александр, я плюсанул статью, но всё-таки вам верное замечание делают. У вас статья про "хитрость" в запросе, а не в СКД! То что вы написали в статье никак не затрагивает механизмов СКД, и можно применять и вне СКД.
ок, еще раз суть задачи: сделать отчет СКД, в который необходимо выводить X пустых строк. есть другой вариант решения этой задачи?

Пример 1: вы задачу для какой конфигурации решали? Допустим для УПП 1.3. Вы можете назвать статью "Маленькая хитрость УПП 1.3 - выводим строки X раз"? Можете, но на самом деле статья касается не чисто этой конфигурации, и не СКД. А в ответ всем можно говорить "еще раз суть задачи: сделать отчет для УПП 1.3"... Логика выбора названия та-же, логика ответа оппонентам та-же.

Пример 2: ваша же статья "Распределение в запросе" или "избавляемся от перебора". Если бы вы сделали распределение для отчета на СКД, то тоже назвали "Распределение в СКД"?

Пример 3: допустим я написал функцию, которая очень быстро возвращает какой-нибудь показатель, и допустим до этого никто не додумался так сделать. Но эту функцию я применяю в вычисляемых полях СКД. Сами понимаете, раз это функция, то её в принципе можно применять где угодно - вызвать, получить результат и дальше работать с ним. А я статью назвал "<Описание того что делает функция> на СКД". Т.е. я заведомо в названии статьи сузил область применения до СКД.

На инфостарте грешат писать "Универсальное...." хотя оно совсем не универсально, а например написано для одной конкретной конфы. Т.е. заведомо расширять область применения. Вы же наоборот зачем-то сузили.

Плюс какая такая это хитрость СКД, если механизмы СКД никак не задействованы?
veretennikoff; TreeDogNight; maxopik2; ixijixi; CyberCerber; krv2k; Scop; Serj1C; le0nid; molodoi1sneg; ardn; bulpi; +12 1 Ответить
14. Патриот 458 23.12.16 23:59 Сейчас в теме
1.
(1), поддерживаю -- очевидно, что СКД здесь не при чём.
(8), А следуя логике
ок, еще раз суть задачи: сделать отчет СКД, в который необходимо выводить X пустых строк. есть другой вариант решения этой задачи?
можно название поменять например на "Маленькая хитрость СКД в УТ и УПП на платформе 8.2.12.3 в ясный зимний день" после чего вопрошать есть ли другой вариант решения задачи для отчёта на "СКД в УТ и УПП на платформе 8.2.12.3 в ясный зимний день".

2.
Другой вариант решения? Пожалуйста! И относиться к СКД они будут больше, нежели представленный в статье:
а) Сформировать таблицу чисел вне СКД (любым способом, хоть тем же, что в статье) и передать его в СКД в качестве внешнего набора данных.
б) Доработать запрос перед компоновкой данных, как это делает ЗУП в механизме "генерируемых представлений".
в) Доработать ТабДок после вывода отчёта компоновщиком.
!!!И эти варианты реально связаны с СКД, т.к. затрагивают её механизмы. А вот вариант наподобие вашего:
в) Доработать запрос, но таблицу чисел не генерировать самому а брать из регистра БД, где она гарантированно д.б., например взять РС График работы.

Уверен, что есть и другие способы, т.к. это пришло в голову примерно за 5 сек - дольше времени на набор текста ушло.

3.
Самое главное. Суть статьи далеко не новая - сгенерить таблицу чисел в запросе и использовать для своих целей. Такая задача не раз обсуждалась и на ИС в том числе. Лучшие решения в данной области собирает Ильдарович
TreeDogNight; dabu-dabu; NeviD; ardn; Yashazz; +5 Ответить
2. klinval 343 19.12.16 12:18 Сейчас в теме
В
ВЫБРАТЬ
        ВТ_Комнаты.Комната КАК Комната,
        ВТ_Комнаты.КоличествоМест - ЕСТЬNULL(КОЛИЧЕСТВО(ВТ_ИнфорамцияОПроживающих.Постоялец), 0) КАК СвободноМест
    ИЗ
        ВТ_Комнаты КАК ВТ_Комнаты
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИнфорамцияОПроживающих КАК ВТ_ИнфорамцияОПроживающих
            ПО ВТ_Комнаты.Комната = ВТ_ИнфорамцияОПроживающих.Постоялец
    
    СГРУППИРОВАТЬ ПО
        ВТ_Комнаты.Комната,
        ВТ_Комнаты.КоличествоМест
Показать

Ошибка в связи. Нужно:
 ВТ_Комнаты.Комната = ВТ_ИнфорамцияОПроживающих.Комната 
3. alexandersh 265 19.12.16 12:21 Сейчас в теме
(2)
Ошибка в связи. Нужно:
ВТ_Комнаты.Комната = ВТ_ИнфорамцияОПроживающих.Комната

да, спасибо, обновил
10. amatey 21.12.16 09:15 Сейчас в теме
Автору зачет! Название привлекательное, поэтому и обратил внимание т.к. УПП меня не интересует. А вот механизм в запросе зачетный. Спасибо за идею! Критикуем название, а ведь главное идея. Критиковать и я умею, а вот хорошие идеи - для меня редкость
11. chek.e.l@mail.ru 21.12.16 10:52 Сейчас в теме
Добрый день!
В чем собственно хитрость СКД?
Представлен код который соединяет искуственно созданную таблицу (что не совсем хитрость, а скорее костыль (как минимуму данную таблицу нужно собирать циклом перед запросом)) с данными.
+ Данный код можно использовать как в СКД так и в обычном запросе, предлагаю переименовать в "хитрость в запросе" =)

P.S. Автору бесспорно плюс.
12. Onwardv 66 21.12.16 12:04 Сейчас в теме
Была такая тема пару месяцев назад.
Вот, нашел:
http://forum.infostart.ru/forum9/topic156546/
13. mitia.mackarevich 75 21.12.16 12:21 Сейчас в теме
Если кому интересно, откройте типовой зуп 3.1 например и посмотрите как получаются (запихано в представления) все дни периода, это будет полная версия методики которую попытался донести автор.
15. Yashazz 4790 25.12.16 01:54 Сейчас в теме
Автор, смотри публикации Ильдаровича, и познаешь, как надо)
16. botokash 394 28.12.16 17:58 Сейчас в теме
Мне кажется приведенную в начале проблему нужно было решать на уровне метаданных, а не хитростью запросов. Все таки койко-место, комнаты и хостелы это физические объекты, можно было выразить их перечень и состояния в виде справочников и регистров.
UniversaLL; Yashazz; +2 Ответить
Оставьте свое сообщение