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













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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

 

 

 

 

 

 

 

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

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

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

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

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

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

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

 

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

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

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

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

 

 

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

 

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

 

39 Comments

  1. oberonm

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

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

    Есть статья Полезные примеры составления схемы компоновки данных , рекомендую ознакомится

    Reply
  2. toypaul

    п.2 делается через второй набор и вычисляемое поле на языке СКД — СоедининитьСтроки(Массив(Сотрудник))

    без всяких выкрутасов.

    Reply
  3. kser87

    (1) читайте внимательно статью, прежде чем писать. Я указал, что решение не оптимально с точки зрения производительности. И оно альтернатива языку выражений СКД

    Reply
  4. VmvLer

    (3) Это не альтернатива — это халтура.

    Технологии статьи устарели лет на 5 минимум и логичнее было бы заголовке указать

    устарело, для платформ 8.2 и ниже

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

    сейчас даже число прописью можно вытащить из системных функций платформы.

    Reply
  5. Ibrogim

    За папки плюс )

    Reply
  6. kser87

    (4) [IS-QUOTE] спасибо за комментарий

    Reply
  7. kser87

    (4) в предисловии указана версия платформы. Этого мало?

    Reply
  8. Rustig

    (0)

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

    Можно ли делать замер производительности отчета на СКД?

    Reply
  9. kser87

    (2) можно конечно. Для этого можно установить стандартную обработку в ложь в событии ПриКомпоновкеРезультата и прописать программную компоновку. Затраты на вызов вложенных функций будут отдельно отображены в результате замеров.

    Reply
  10. Yashazz

    (3) Если насчёт «плохо описанного» я ещё соглашусь, то ни единой причины назвать язык функций СКД глючным я за годы использования не наблюдал. Оно стабильно работает, и кажущаяся глючность — есть следствие плохой описанности и плохого понимания устройства этого дела.

    Reply
  11. Yashazz

    (8) Хм, ну можно, но не только и не столько средствами конфигуратора, сколько замерами PerfMon на сервере приложения, ещё можно по ТЖ…

    Статья нового не содержит. У Хрусталёвой это уже было лучше и больше.

    Reply
  12. kser87

    (11) не все умеют пользоваться perfmon, база может быть файловая, в ней может не быть функций для замера производительности.

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

    Reply
  13. pm74

    SKD ? ))

    Reply
  14. user774630

    (13) Systema Komponovki Dannih

    Reply
  15. bsturtle

    комментарии настоялись — делаю. вывод: Infostart дружное сообщество. Программисты 1с — добрые люди.)

    Reply
  16. Sergey_1c

    (13) System Kicked Down

    Reply
  17. kser87

    (16) ну хватит=)

    Reply
  18. user596590_pavel.kuznecov

    (1)Еще проще можно

    СоединитьСтроки (JoinStrings)

    Предназначена для объединения строк в одну строку.

    Синтаксис:

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

    Параметры:

    Значение — выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;

    РазделительЭлементов — строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;

    РазделителиКолонок -строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию «; «.

    Пример:

    СоединитьСтроки(ТаблицаЗначений(НомерТелефона, Адрес));

    Показать

    :

    Reply
  19. user596590_pavel.kuznecov

    (9)Бред, зачем? Это агрегатные функции языка СКД, все делается в схеме компоновки на закладке «Ресурсы».

    Reply
  20. alexqc

    (1), (2) По-ходу, кому-то просто захотелось по-быстрому стартманей срубить, вот и весь смысл данной «статьи».

    Reply
  21. kser87

    (19) на первый взгляд вы не понимаете зачем вообще эти возможности нужны. Они дополняют агрегатные Функции

    Reply
  22. kser87

    (20) уважаемый, я не захожу в ваши т.н. «статьи» и не пишу там нелицеприятные вам вещи.

    Reply
  23. kser87

    (20) что касается стармани, но до минимально необходимого количества знаков для гарантированного начисления она не дотягивает почти вдвое от текущего объема. Дадут ли sm за рейтинг-вопрос открытый

    Reply
  24. user596590_pavel.kuznecov

    (21)На первый взгляд, это Вы не понимаете зачем они нужны, раз придумываете такое и тут публикуете.

    Reply
  25. kser87

    (20) Ваши мысли, зачем нужны эти возможности?

    Reply
  26. husky

    В МОЛах, «Цзиньпин» пишется в одно слово….)

    Reply
  27. kser87

    (26) хоть кто-то по делу написал)

    Reply
  28. alexqc

    (22)

    Статей у меня, вроде и нет, есть обработки столетней давности. Можете комментировать как угодно, не запрещаю.

    Reply
  29. alexqc

    (23)

    А что, за статьи стартмани начисляют? Не знал. Думал, статьи без $m, раз их в «бесплатный» доступ выкладывают.

    Я же собственно, не за саму статью говорил, а за файл к ней. 2 $m всего лишь за то чтобы посмотреть на 3 примера??? Или инфостарт не дает иную цену поставить? (я просто не в курсе, с их этой «политикой монетизации», можно и такое ожидать). ИМХО если цели получить $m нет — файл вообще лишний.

    Reply
  30. alexqc

    (25)

    В смысле, какие возможности нужны?

    Если вы по тексту статьи — то

    1. Имена через точку — тривиальная вещь, описывается и в хелпе редактора СКД и в ЖКК чуть ли не с первых страниц описания СКД. У вас, кстати, даже не сказано что кроме групп есть «добавление» в существующие поля (например, если у вас есть поле «Склад» — соответствующий справочник, с его реквизитами, и вы в добавляете к ним поле с путем, допустим «Склад.ТекущееМОЛ»)

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

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

    3. А тут что вы хотели показать? Как работать с макетом? Так это тоже в хелпе описано.

    И убирать рамку — цветом? А почему не стилем «без рамки»?

    Reply
  31. kser87

    (29) начисляют за статьи объемов знаков больше 10 тыс.

    Reply
  32. kser87

    (30)

    1. Спасибо, я это добавлю в статью если вы не против.

    2. Честно говоря не понимаю, зачем вы пишите про соединение строк средствами языка выражений. Я кажется прямо в статье описал, что предлагаю альтернативу для тех, кому сложно разобраться. И людям вроде как понравилось судя по количеству плюсов. Можете закрыть тему языка выражений здесь? Про безопасность было бы интересно послушать ваши соображения.

    3. Попробуйте, пожалуйста

    Reply
  33. ХамитоваРайса

    Спасибо за статью, мы же ищем на Infostart-е не всегда готовое решение. Даже если есть что-то, от чего можно оттолкнуться и, углубив, применить у себя, уже хорошо.

    Reply
  34. alexqc

    (32)

    2. Во-первых, ничего сложного; во-вторых, потом из-за таких «было сложно разобраться» все тормозит. Лучше бы научили как правильно делать, ей-богу. Ну, или привели бы 2 варианта — с СоединитьСТроки() и с внешними функциями.

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

    3. В чем проблема? Прикладываю пример (под «Всего» специально оставил рамку, пунктирную).

    Reply
  35. kser87

    (34) 2. что у вас там тормозит? Вы уверены, что оно тормозит от неправильного использования СКД?

    Вы пишите, что использовать функции общих модулей в отчетах небезопасно. Не понимаю, причем тут выполнить-вычислить-внешние отчеты?

    Reply
  36. Cmapnep

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

    В приведенном примере с МОЛами складов сократит время вызова во много раз, на больших выборках в сотни, тысячи…

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

    Reply
  37. alexqc

    (35)

    У меня тормозит? Да это ж у вас тормозит!!!

    «Но стоит сразу оговориться, что его тяжело назвать оптимальным с точки зрения производительности.» — чьи слова?

    По факту же: вы на каждую ссылку в выводе дергаете ф-цию, которая лезет в базу. Классический «запрос в цикле» получается.

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

    Reply
  38. kser87

    (34) будет ли оно тормозить или нет-зависит ещё от десятков иных факторов.

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

    Вопрос такой: а вы знаете, как встроенная функция работает? Вы уверены, что всегда можно выцпить нужную информацию начальным запросом?

    Reply
  39. alexqc

    (38)

    Если касательно СоединитьСтроки() — то она описывается, наверно, даже в древней Хрусталёвой.

    Те же случаи когда реально нельзя обойтись встроенными и нужно вызывать внешние ф-ции, при чем лезущие в БД — уже довольно сложные, явно выходящие за пределы вашей статьи. Более того, там скорее всего придется отказаться от «прямого» использования СКД, и писать свою ПриКомпоновкеРезультата() с формированием нужной ТЗ данных, и отдав СКД так сказать «косметическую» роль.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *