Некоторые редко используемые возможности СКД

18.11.19

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

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

Все примеры сделаны на небольшой самописной конфигурации на платформе 1С:Предприятие 8.3 (8.3.13.1513). В ней несколько справочников, пара документов и отчет со всеми примерами. Текст запроса отчета простой и выглядит следующим образом:

ВЫБРАТЬ
    ТоварыНаСкладеОбороты.Склад КАК Склад,
    ТоварыНаСкладеОбороты.Номенклатура КАК Номенклатура,
    ТоварыНаСкладеОбороты.КоличествоПриход КАК КоличествоПриход,
    ТоварыНаСкладеОбороты.КоличествоРасход КАК КоличествоРасход,
    ТоварыНаСкладеОбороты.Организация КАК Организация,
    ТоварыНаСкладеОбороты.Регистратор КАК Регистратор
ИЗ
    РегистрНакопления.ТоварыНаСкладе.Обороты(, , Регистратор, ) КАК ТоварыНаСкладеОбороты

1. Создание папок (групп) полей

В разделе описано, как в СКД можно самостоятельно создавать подобные папки: 

Для этого нужно в конструкторе СКД, на вкладке "Наборы данных", указать в поле "Путь" имя папки через точку, перед именем поля. Поля с одинаковыми названиями папок будут сгруппированы. Например, вместо КоличествоРасход и КоличествоПриход, указать соответственно КоличественныеПоказатели.КоличествоРасход и КоличественныеПоказатели.КоличествоПриход. Можно делать вложенные папки. Например, у поля склад можно указать «Аналитика.Склады.Склад»

В результате, на вкладке редактирования настроек, набор доступных полей для выбора будет выглядеть так:

Механизм может быть удобен в тех случаях, когда в отчете много полей (более 9). 

2. Соединение строк (без использования языка выражений)

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

Пускай есть документ "ПриходТоваров" с табличной частью МОЛ и единственной колонкой "Сотрудник". Стоит задача в группировке с документом вывести через запятую всех сотрудников из указанной табличной части. Порядок решения следующий:

1. В общем серверном модуле ОбщегоНазначения создал экспортную процедуру со следующим содержанием:

Функция ВывестиТабличнуюЧастьДокумента(СсылкаНаДокумент) Экспорт               

     МассивСтрок = СсылкаНаДокумент.МОЛ.ВыгрузитьКолонку("Сотрудник");            

     Возврат СтрСоединить(МассивСтрок,",");

КонецФункции

2. В конструкторе СКД, на вкладке «Вычисляемые поля» добавил новое поле. В пути к данным указал нужное значение ОбщегоНазначения.ВывестиТабличнуюЧастьДокумента(Регистратор):

 

 

 

 

 

 

 

 

 

3. Добавить новое поле в настройки отчета. 

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

3. Вывод числа прописью 

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

1. На вкладке "Макеты" конструктора СКД добавил макет группировки с именем "Подвал".

2. В макете я задал единственный параметр КоличествоИтог. Чтобы в отчете не было видно рамок ячеек, я установил цвет рамок "Фон формы": 

3. В заполнении параметра указал ОбщегоНазначения.КоличествоПрописью(КоличественныеПоказатели.КоличествоПриход)

 

Теперь осталось вывести макет в настройки отчета. Для этого нужно:

1. На вкладке "Настройки" конструктора СКД добавить группировку детальных записей и установить ей имя "Подвал". 

2. В выбранных полях детальных записией надо удалить автополе и добавить "КоличественныеПоказатели.КоличествоПриход". Таким образом в макет будет выведен общий итог, без группировки по полям. 

3. Осталось задать свойство элемента пользовательских настроек, чтобы вывод подвала стал опционным. Для этого нужно кликнуть правой кнопкой мыши по полю "Детальные записи" и выбрать пункт "Свойства элемента пользовательских настроек" и задать имя группировке:

 

 

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

 

Надеюсь, что статья позволила читателю несколько расширить свои представления о возможностях Системы компоновки данных .

 

Как создать папки полей в СКД как вывести число прописью табличную часть строку массив поле убрать рамки ячеек макете

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    161349    893    399    

873

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

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

15.05.2024    9075    implecs_team    6    

47

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

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

3 стартмани

05.02.2024    7230    56    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3197    5    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    10965    24    John_d    25    

124

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

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

05.12.2023    8248    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. oberonm 9 11.11.19 08:22 Сейчас в теме
СКД, использующий внешние функции, выполняется в разы дольше. я бы не рекомендовл их использовать в формировании детальных записей. для вывода подвала или шапки - возможно.
Для соединения строк используйте другой механизм СКД "ВычислитьВыражениеСГруппировкойТаблицаЗначений(),"
Есть статья Полезные примеры составления схемы компоновки данных , рекомендую ознакомится
echo77; glime; JohnyDeath; user596590_pavel.kuznecov; mcgoblin; it_tungus; strafer; ids79; zqzq; frkbvfnjh; Yashazz; PLAstic; wowik; +13 1 Ответить
3. kser87 2473 11.11.19 08:37 Сейчас в теме
(1) читайте внимательно статью, прежде чем писать. Я указал, что решение не оптимально с точки зрения производительности. И оно альтернатива языку выражений СКД
shmellevich; YPermitin; +2 Ответить
4. VmvLer 11.11.19 09:50 Сейчас в теме
(3) Это не альтернатива - это халтура.

Технологии статьи устарели лет на 5 минимум и логичнее было бы заголовке указать
устарело, для платформ 8.2 и ниже

таки да, общие модули в СКД используют когда другой альтернативы нет и только.
сейчас даже число прописью можно вытащить из системных функций платформы.
ixijixi; glime; Merkalov; Yashazz; +4 1 Ответить
6. kser87 2473 11.11.19 10:51 Сейчас в теме
(4) [IS-QUOTE] спасибо за комментарий
YPermitin; +1 Ответить
7. kser87 2473 11.11.19 10:52 Сейчас в теме
(4) в предисловии указана версия платформы. Этого мало?
mifort; YPermitin; +2 Ответить
40. user640716_mt1710 11.09.20 12:37 Сейчас в теме
(4) "сейчас даже число прописью можно вытащить из системных функций платформы"
можно ссылку на пример?
10. Yashazz 4794 11.11.19 12:31 Сейчас в теме
(3) Если насчёт "плохо описанного" я ещё соглашусь, то ни единой причины назвать язык функций СКД глючным я за годы использования не наблюдал. Оно стабильно работает, и кажущаяся глючность - есть следствие плохой описанности и плохого понимания устройства этого дела.
18. user596590_pavel.kuznecov 46 13.11.19 10:47 Сейчас в теме
(1)Еще проще можно
СоединитьСтроки (JoinStrings)
Предназначена для объединения строк в одну строку.

Синтаксис:

СоединитьСтроки (Значение, РазделительЭлементов, РазделителиКолонок)

Параметры:

Значение - выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;
РазделительЭлементов - строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;
РазделителиКолонок -строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию "; ".
Пример:

СоединитьСтроки(ТаблицаЗначений(НомерТелефона, Адрес));
Показать
:
20. alexqc 150 14.11.19 09:00 Сейчас в теме
(1), (2) По-ходу, кому-то просто захотелось по-быстрому стартманей срубить, вот и весь смысл данной "статьи".
22. kser87 2473 14.11.19 10:26 Сейчас в теме
(20) уважаемый, я не захожу в ваши т.н. "статьи" и не пишу там нелицеприятные вам вещи.
28. alexqc 150 16.11.19 09:31 Сейчас в теме
(22)
Статей у меня, вроде и нет, есть обработки столетней давности. Можете комментировать как угодно, не запрещаю.
23. kser87 2473 14.11.19 10:29 Сейчас в теме
(20) что касается стармани, но до минимально необходимого количества знаков для гарантированного начисления она не дотягивает почти вдвое от текущего объема. Дадут ли sm за рейтинг-вопрос открытый
29. alexqc 150 16.11.19 09:42 Сейчас в теме
(23)
А что, за статьи стартмани начисляют? Не знал. Думал, статьи без $m, раз их в "бесплатный" доступ выкладывают.
Я же собственно, не за саму статью говорил, а за файл к ней. 2 $m всего лишь за то чтобы посмотреть на 3 примера??? Или инфостарт не дает иную цену поставить? (я просто не в курсе, с их этой "политикой монетизации", можно и такое ожидать). ИМХО если цели получить $m нет -- файл вообще лишний.
31. kser87 2473 16.11.19 12:09 Сейчас в теме
(29) начисляют за статьи объемов знаков больше 10 тыс.
25. kser87 2473 14.11.19 12:47 Сейчас в теме
(20) Ваши мысли, зачем нужны эти возможности?
30. alexqc 150 16.11.19 10:10 Сейчас в теме
(25)
В смысле, какие возможности нужны?
Если вы по тексту статьи -- то
1. Имена через точку -- тривиальная вещь, описывается и в хелпе редактора СКД и в ЖКК чуть ли не с первых страниц описания СКД. У вас, кстати, даже не сказано что кроме групп есть "добавление" в существующие поля (например, если у вас есть поле "Склад" -- соответствующий справочник, с его реквизитами, и вы в добавляете к ним поле с путем, допустим "Склад.ТекущееМОЛ")

2. Конкатенация строк без языка выражений -- ну да, заменили выражение вызов ф-ции языка СКД на выражение вызов ф-ции общего модуля. Выражением оно от того быть не перестало.
Про то что встроенная ф-ция будет и быстрее, и даже само выражение короче получится -- вам уже написали. Я же добавлю, что вызов внешних ф-ций -- "небезопасная" операция, и для случая пользовательских полей при отсутствии у пользователя соответствующих прав он не сможет такое запустить. Для программиста в вычисляемых полях такое, конечно, неважно.

3. А тут что вы хотели показать? Как работать с макетом? Так это тоже в хелпе описано.
И убирать рамку -- цветом? А почему не стилем "без рамки"?
ixijixi; Yashazz; +2 2 Ответить
32. kser87 2473 16.11.19 12:35 Сейчас в теме
(30)
1. Спасибо, я это добавлю в статью если вы не против.
2. Честно говоря не понимаю, зачем вы пишите про соединение строк средствами языка выражений. Я кажется прямо в статье описал, что предлагаю альтернативу для тех, кому сложно разобраться. И людям вроде как понравилось судя по количеству плюсов. Можете закрыть тему языка выражений здесь? Про безопасность было бы интересно послушать ваши соображения.
3. Попробуйте, пожалуйста
34. alexqc 150 16.11.19 15:53 Сейчас в теме
(32)
2. Во-первых, ничего сложного; во-вторых, потом из-за таких "было сложно разобраться" все тормозит. Лучше бы научили как правильно делать, ей-богу. Ну, или привели бы 2 варианта -- с СоединитьСТроки() и с внешними функциями.
Про безопасность -- а какие соображения вы хотите услышать? Пользователю по ролям/профилю безопасности запрещают открытие внешних отчетов и использование исполняемого кода в потенциально-критичных местах (типа непривилегированных Выполнить/Вычислить, табло в неуправляемом режиме, или в пользовательских полях СКД). На закладку вычислимых полей это не влияет.
3. В чем проблема? Прикладываю пример (под "Всего" специально оставил рамку, пунктирную).
Прикрепленные файлы:
ПроверкаРамкиСКД.erf
35. kser87 2473 16.11.19 22:43 Сейчас в теме
(34) 2. что у вас там тормозит? Вы уверены, что оно тормозит от неправильного использования СКД?
Вы пишите, что использовать функции общих модулей в отчетах небезопасно. Не понимаю, причем тут выполнить-вычислить-внешние отчеты?
37. alexqc 150 18.11.19 11:13 Сейчас в теме
(35)
У меня тормозит? Да это ж у вас тормозит!!!
"Но стоит сразу оговориться, что его тяжело назвать оптимальным с точки зрения производительности." -- чьи слова?

По факту же: вы на каждую ссылку в выводе дергаете ф-цию, которая лезет в базу. Классический "запрос в цикле" получается.
В то же время использование встроенной ф-ции во-первых, по возможности оптимизируется компоновщиком, во-вторых, понуждает программиста всю недостающую информацию получать в начальном запросе.
38. kser87 2473 18.11.19 11:20 Сейчас в теме
(34) будет ли оно тормозить или нет-зависит ещё от десятков иных факторов.
У меня классический запрос в цикле, да. Но при этом запрос с отбором по ссылке-то есть наиболее щадящий вариант. Да и запрос в цикле-СКД этим грешит во множестве случаев. Например, просто при выводе результата.

Вопрос такой: а вы знаете, как встроенная функция работает? Вы уверены, что всегда можно выцпить нужную информацию начальным запросом?
39. alexqc 150 18.11.19 15:40 Сейчас в теме
(38)
Если касательно СоединитьСтроки() -- то она описывается, наверно, даже в древней Хрусталёвой.

Те же случаи когда реально нельзя обойтись встроенными и нужно вызывать внешние ф-ции, при чем лезущие в БД -- уже довольно сложные, явно выходящие за пределы вашей статьи. Более того, там скорее всего придется отказаться от "прямого" использования СКД, и писать свою ПриКомпоновкеРезультата() с формированием нужной ТЗ данных, и отдав СКД так сказать "косметическую" роль.
2. toypaul 63 11.11.19 08:26 Сейчас в теме
п.2 делается через второй набор и вычисляемое поле на языке СКД - СоедининитьСтроки(Массив(Сотрудник))

без всяких выкрутасов.
user596590_pavel.kuznecov; user925427; zqzq; Yashazz; +4 1 Ответить
9. kser87 2473 11.11.19 10:58 Сейчас в теме
(2) можно конечно. Для этого можно установить стандартную обработку в ложь в событии ПриКомпоновкеРезультата и прописать программную компоновку. Затраты на вызов вложенных функций будут отдельно отображены в результате замеров.
19. user596590_pavel.kuznecov 46 13.11.19 11:25 Сейчас в теме
(9)Бред, зачем? Это агрегатные функции языка СКД, все делается в схеме компоновки на закладке "Ресурсы".
21. kser87 2473 14.11.19 10:24 Сейчас в теме
(19) на первый взгляд вы не понимаете зачем вообще эти возможности нужны. Они дополняют агрегатные Функции
24. user596590_pavel.kuznecov 46 14.11.19 12:43 Сейчас в теме
(21)На первый взгляд, это Вы не понимаете зачем они нужны, раз придумываете такое и тут публикуете.
5. Ibrogim 1328 11.11.19 10:09 Сейчас в теме
За папки плюс )
user743891; Cmapnep; glime; Angel_19; kser87; +5 Ответить
8. RustIG 1749 11.11.19 10:55 Сейчас в теме
(0)
В выражениях СКД можно использовать почти любые функции серверных модулей. Это дает разработчику практически неограниченные возможности. Но стоит помнить о том, что неосторожное использование этой фичи может негативно сказаться на производительности системы.


Можно ли делать замер производительности отчета на СКД?
11. Yashazz 4794 11.11.19 12:34 Сейчас в теме
(8) Хм, ну можно, но не только и не столько средствами конфигуратора, сколько замерами PerfMon на сервере приложения, ещё можно по ТЖ...

Статья нового не содержит. У Хрусталёвой это уже было лучше и больше.
12. kser87 2473 11.11.19 13:27 Сейчас в теме
(11) не все умеют пользоваться perfmon, база может быть файловая, в ней может не быть функций для замера производительности.

статья не претендует на обьемы учебника по СКД. Если для вас ничего нового, то я могу лишь восхититься объемом ваших знаний.
13. pm74 203 11.11.19 19:35 Сейчас в теме
14. user774630 11.11.19 19:45 Сейчас в теме
(13) Systema Komponovki Dannih
Luksez; Al_Z; Dimasik2007; kser87; +4 Ответить
16. Sergey_1c 54 12.11.19 10:33 Сейчас в теме
17. kser87 2473 12.11.19 12:16 Сейчас в теме
15. dnikolaev 179 12.11.19 10:04 Сейчас в теме
комментарии настоялись - делаю. вывод: Infostart дружное сообщество. Программисты 1с - добрые люди.)
26. husky 6 14.11.19 15:05 Сейчас в теме
В МОЛах, "Цзиньпин" пишется в одно слово....)
27. kser87 2473 14.11.19 15:39 Сейчас в теме
(26) хоть кто-то по делу написал)
33. ХамитоваРайса 16.11.19 13:11 Сейчас в теме
Спасибо за статью, мы же ищем на Infostart-е не всегда готовое решение. Даже если есть что-то, от чего можно оттолкнуться и, углубив, применить у себя, уже хорошо.
36. Cmapnep 19 18.11.19 10:49 Сейчас в теме
Вызов функций внешних модулей в отчетах СКД может быть оправдан только если это внешний модуль с повторным использованием на время серверного вызова - если подходящего нет (чаще всего так и будет), то сделать свой прокси-модуль с вызовом функций других модулей
В приведенном примере с МОЛами складов сократит время вызова во много раз, на больших выборках в сотни, тысячи...
Автор наверняка об этом знает, но раз уж статья для новичков, то имеет смысл дополнить предложенный способ советом по оптимальному использованию модулей
Оставьте свое сообщение