gifts2017

Полезные примеры составления схемы компоновки данных

Опубликовал Информационно-технического развития Служба (SITR-utyos) в раздел Программирование - Практика программирования

Данная статья появилась благодаря периодически появляющимся вопросам на сайте http://1cskd.ru/. Задачи, которые задают авторы вопросов совсем не тривиальные, но их можно решить с помощью СКД.

Посчитать разницу с предыдущей записью

Пример того как можно получить поля предыдущей записи в группировке и не только. Удобно для вычисления разницы значений предыдущей цены и текущей.

Автор данного вопроса хотел посчитать отклонение текущей цены от предыдущей. Мое решение выглядит так:

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

Параметры:

  • Выражение. Тип Строка;
  • Группировка. Тип Строка;
  • ТипРасчета. Тип Строка;
  • Начало. Строка, содержащая одно из вариантов;
  • Конец. Строка, содержащая одно из вариантов;
  • Сортировка. Строка;
  • ИерархическаяСортировка;
  • ОбработкаОдинаковыхЗначенийПорядка

Нас интересует 4 и 5 параметр (Начало и Конец). Выражение будет выглядеть следующим образом:

isNULL((ВЫЧИСЛИТЬВЫРАЖЕНИЕ("Цена", , , "Предыдущая", "Предыдущая") - Цена), 0)

- здесь вычисляем предыдущее значение поля Цена и из него вычитаем текущее значение поля Цена. Естественно, для первой записи предыдущее значение не будет вычислено и результат вычитания со значением текущего поля будет Null, поэтому что бы все было «чисто» используем функцию isNULL(естьNull), чтобы преобразовать Null в число ноль.

Поместить таблицу значений в ячейку табличного документа

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

 

Для этого необходимо воспользоваться функцией: ВычислитьВыражениеСГруппировкойТаблицаЗначений(), у которой есть параметры:

  • Выражение - выражение, которое нужно вычислить. Тип Строка. В строке может быть перечислено несколько выражений через запятую. После каждого выражения может быть необязательное ключевое слово КАК и имя колонки таблицы значений. Например: "Контрагент, Сумма(СуммаОборот) Как ОбъемПродаж".
  • ВыраженияПолейГруппировки - выражения полей группировки, перечисленные через запятую. Например, "Контрагент, Партия";
  • ОтборЗаписей - выражение, применяемое к детальным записям. Например, "ПометкаУдаления = Ложь";
  • ОтборГруппировок - отбор, применяемый к групповым записям. Например: "Сумма(СуммаОборот) > &Параметр1".

Для этого создаем вычисляемое поле, в которое будем выводить получившуюся таблицу, затем помещаем это поле в ресурсы с выражением ВычислитьВыражениеСГруппировкойТаблицаЗначений("Номенклатура, Количество")

Пронумеровать колонки

Пример того как можно пронумеровать колонки в СКД.

Обсуждалось здесь: http://forum.infostart.ru/forum26/topic88579/

Суть решения:

 

  1. Создаем запрос, в котором нумеруем строки результата запроса в пределах определенного подчинения
  2. Выводим результат в кросс-таблицу

ВАЖНО!

После того как строки в запросе пронумерованы их необходимо поместить в ВТ и потом из этой ВТ выбирать, иначе СКД сделает все по-своему и в группировку попадут не те поля

 

Для того чтобы получить результат необходимо создать вычисляемое поле с выражением "Сотрудник" + Формат(НПП,"ЧЦ=3; ЧВН=")  и вычисляемое поле ФИО, в которое просто поместить Сотрудник, затем помещаем поле ФИО в ресурс с выражением Максимум(ФИО) или просто ФИО – никакой разницы

 

Чередование групп с выделением цветом

 Где-то на Мисте или на том же 1Cskd.ru был вопрос как подсвечивать разным цветом строки, образующие группы

 Это достигается созданием вычисляемого поля:

 ВычислитьВыражение("Количество (Различные Номенклатура)",,,"Первая", "Предыдущая",,,"Вместе") % 2

Считаем количество различных "группировок" поля Номенклатура, группировки получается считать за счет установки значения параметра ОбработкаОдинаковыхЗначенийПорядка = "Вместе"

 Остаток от деления на два даст понять это четная группа или нет, соответственно, создаем элемент условного оформления с условием Поле = 1

 Остатки в разрезе характеристик. Характеристики в строку с кол-вом в скобках

На том же 1CSkd.ru была такая тема, в которой автор просит помочь сделать отчет, где в одной из колонок необходим перечень характеристик(размеры обуви) с их количеством. http://1cskd.ru/2013/05/podskazhite-novichku-v-skd/

Это достигается использованием все той же функции ВычислитьВыражениеСГруппировкойМассив()

В этом примере функция выглядит так:

ВычислитьВыражениеСГруппировкойМассив( "ХарактеристикаНоменклатуры.Наименование +
""("" + Формат(КоличествоОстаток,""ЧГ=0"") + "")""",
,
 "ЗначениеЗаполнено(ХарактеристикаНоменклатуры)")

Третий параметр - это отбор, позволяет избежать представления пустой строки "" – соответственно вы не увидите остатков без характеристик

 Соединить две таблицы с ключом Строка = Число

Или вариант как в СКД значение типа число преобразовать в строку

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

Для того чтобы преобразовать число в строку, достаточно просто воспользоваться функцией языка выражений системы компоновки данных СКД Строка() или Формат()

Для того чтобы преобразовать строку в число можно воспользоваться функцией Вычислить()

 

Сортировка по строке как по числу

Задача не новая и периодически встречающаяся. Меня, например впервые попросили это сделать в отчете «Расчетные листки организаций» - необходимо было отсортировать расчетные листки по табельному номеру сотрудника как по числу. В последний раз встретил этот вопрос здесь http://www.forum.mista.ru/topic.php?id=716045

В своем примере я просто выведу справочник сотрудники, отсортировав его по табельному номеру (коду)

Результат будет выглядеть следующим образом:

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

  1. Создаем вычисляемое поле ТабНомерЧисло, с выражением: Вычислить(Сотрудник.Код)
  2. Сортируем по этому полю

по сути это преобразование строки в число с помощью функции языка выражений СКД Вычислить()

 

 


Советую так же посмотреть "Видеоуроки по скд"(легко ищется в гугле)

При разработке я использую сконвертированную консоль отчетов СКД+.

Так же рекомендую посмотреть http://infostart.ru/public/86764/

Скачать файлы

Наименование Файл Версия Размер
Полезные примеры составления схемы компоновки данных.zip 186
.zip 127,81Kb
20.06.15
186
.zip 127,81Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Виктор Лебедев (eeeio) 09.04.14 09:05
Хорошее начинание, но хочется больше разных выкрутасов. Чтоб книга прям получилась.
2. Алексей Кубовцов (aleksey.kubovtsov) 09.04.14 10:22
интересная статья, спасибо автору
3. Сергей Рудаков (fishca) 09.04.14 10:56
Спасибо, как раз примеров использования этих самых функций порой и не хватает.
4. Сергей Ожерельев (Поручик) 09.04.14 12:20
Некоторые вещи знал раньше, но всё равно полезно.
5. John Bolshakov (soulsteps) 09.04.14 13:34
6. Информационно-технического развития Служба (SITR-utyos) 09.04.14 14:11
Планирую еще добавить:
  • Остатки в разрезе характеристик. Характеристики в строку с кол-вом в скобках
  • Как в функции ВычислитьВыражениеСГруппировкойТаблицаЗначений ";" заменить на " - "
7. Анастасия Столбовская (StAsya_1C) 09.04.14 14:23
Век живи, век учись ) Как же круто умеет СКД!
Лет пять назад решали задачу тоже на СКД, примерно следующая: есть РАУЗ, и если товар перемещался, то нужно в дополнительной колонке через запятую вывести названия складов, куда эти 100 штук товара переместили. Толи мы просто не умели, то ли СКД так тогда не умела (8.2 только начиналась), но пришлось делать вспомогательный регистр сведений, куда отчет при формировании писал а потом стирал записи, что из складов "Иванов" "Петров" и "Сидоров" получается строка "Иванов, Петров, Сидоров"
8. Владислав Рожевский (vvr908) 09.04.14 14:59
В первом примере результат кривоват вроде...
Документы установки цен идут не в последовательности, и записи лишние появляются.
9. script Мальчинко (script) 09.04.14 23:52
Тема фукнций не раскрыта
10. Серега Путин (Confucius) 10.04.14 05:53
Даешь ещё примеров и финтиплюшек!!!
11. Андрей Овсянкин (Evil Beaver) 10.04.14 10:04
Коротко, со вкусом и по делу. Респект!
12. mikhail burlakov (burlakov) 10.04.14 12:54
очень полезная статья! спасибо
13. Алексей (Rockman) 14.04.14 13:44
Большое спасибо за полезную информацию.
14. Александр Буганов (buganov) 16.04.14 07:55
15. Александр (Sitex) 16.04.14 08:30
Полезно. Спасибо. Повторил что подзабыл.
16. Марина Чирина (chmv) 16.04.14 08:55
17. Анна Еремеева (Akasy) 21.04.14 10:51
18. unknown unknown (unknownN) 23.04.14 11:16
Очень интересно, спасибо
19. Сергей Белов (Unicorn31) 24.04.14 07:41
20. Татьяна Филатова (belochkaNN) 29.04.14 08:31
Спасибо! Пригодилась раскраска строк! +1
21. for_sale for_sale (for_sale) 30.04.14 11:32
зачем в первом примере такая сложность? дельту можно даже в самом запросе посчитать:

ЕстьNULL(Таб.ТекЦена, 0) - ЕстьNULL(Таб.ПредЦена, 0)
22. Информационно-технического развития Служба (SITR-utyos) 30.04.14 12:17
(21) for_sale, можно, если не лень запросом получать таблицу текущих и предыдущих цен
23. Сергей (dsv_nsk) 01.05.14 10:11
ТЗ в ячейке оказалась кстати.
Спасибо.
24. Евгений Сивов (bird21) 19.05.14 09:44
25. Наталия Худякова (khnatik) 28.05.14 11:25
Очень полезно, спасибо за статью!
26. Александр Жерздев (Al777) 08.07.14 17:05
Мне раскраска цветом строк очень помогла.
27. Марина Семёнова (SemenovaMarinaV) 06.08.14 09:24
28. Марина Семёнова (SemenovaMarinaV) 06.08.14 09:25
Продолжайте эту тему. Очень полезно
29. Eugene (EugeneR1c) 17.09.14 06:10
30. Денис Соломасов (Denis S) 13.10.14 18:25
Отличные советы! Спасибо!
31. Sergey Afanasyev (Afanasyev.sv@mail.ru) 29.12.14 18:09
Подскажите, а как можно разместить таблицу значений не в ячейку, а разбить эту ячейку на записи таблицы значений?
32. Александр Крынецкий (echo77) 29.12.14 20:04
никогда не пробовал так делать.
Думаю, что пока нет
33. Sergey Afanasyev (Afanasyev.sv@mail.ru) 29.12.14 20:45
Вот у меня никак не получается :(
34. Sergey Afanasyev (Afanasyev.sv@mail.ru) 29.12.14 20:50
Даже идей никаких нет? Мне просто нужно именно по отдельности эти ресурсы выбирать в табличном поле, а они целиком в одной ячейке.
35. Информационно-технического развития Служба (SITR-utyos) 30.12.14 08:46
(34) Покажите как у вас выглядит отчет - скриншот нужен.
Если конфигурация типовая - то можно и схему
36. Sergey Afanasyev (Afanasyev.sv@mail.ru) 30.12.14 18:52
Использовал ТаблицаЗначений(). Но нужно чтобы эти данные построчно были, как отдельные ячейки.
Прикрепленные файлы:
37. Sergey Afanasyev (Afanasyev.sv@mail.ru) 30.12.14 19:00
Если нужно, могу схему предоставить. Но там используется внешний набор данных.
38. Александр Крынецкий (echo77) 31.12.14 10:43
(36) Afanasyev.sv@mail.ru, нарисуйте, пожалуйста, как это в итоге должно выглядеть(в excel, потом можно сделать скриншот).

p.s. скриншоты инфографики лучше делать в формате PNG. Про BMP забудьте совсем :-)
39. Sergey Afanasyev (Afanasyev.sv@mail.ru) 07.01.15 13:56
(38) Вот так.
Прикрепленные файлы:
40. Дмитрий (skillhoster) 09.09.15 15:14
Спасибо за статью.
Но Чередование групп с выделением цветом будет работать и с ВычислитьВыражение("Количество (Различные Номенклатура)",,,"Первая", "Текущая") % 2 - проверено, тут смысл именно в "Количество (Различные Номенклатура)", для одинаковых элементов будет принимать одинаковое значение.
41. Владимир Насыров (Spacer) 28.09.15 22:16
"Для этого создаем вычисляемое поле, в которое будем выводить получившуюся таблицу"
А где же выражение для этого поля? Что там должно быть?
42. Александр Крынецкий (echo77) 29.09.15 08:16
(41) Spacer, в выражении должно быть пусто, а еще лучше ""(пустая строка). По большому счету без разницы что там будет, т.к. данное поле имеет смысл только на уровне группировки, т.к. является ресурсом
43. Дмитрий Индерёв (Stepka1206) 06.05.16 15:36
в моей ситуации возможно сгруппировать строки?
Прикрепленные файлы:
44. Информационно-технического развития Служба (SITR-utyos) 30.07.16 14:34
(43) Stepka1206, Все зависит от того, что вы хотите получить
45. Роман Кусков (romku) 08.12.16 12:28
(0) "Посчитать разницу с предыдущей записью". А удалось ли Вам получить итог по колонке "Дельта" ? Что то никак не получается.