Все примеры сделаны на небольшой самописной конфигурации на платформе 1С:Предприятие 8.3 (8.3.13.1513). В ней несколько справочников, пара документов и отчет со всеми примерами. Текст запроса отчета простой и выглядит следующим образом:
ВЫБРАТЬ
ТоварыНаСкладеОбороты.Склад КАК Склад,
ТоварыНаСкладеОбороты.Номенклатура КАК Номенклатура,
ТоварыНаСкладеОбороты.КоличествоПриход КАК КоличествоПриход,
ТоварыНаСкладеОбороты.КоличествоРасход КАК КоличествоРасход,
ТоварыНаСкладеОбороты.Организация КАК Организация,
ТоварыНаСкладеОбороты.Регистратор КАК Регистратор
ИЗ
РегистрНакопления.ТоварыНаСкладе.Обороты(, , Регистратор, ) КАК ТоварыНаСкладеОбороты
1. Создание папок (групп) полей
В разделе описано, как в СКД можно самостоятельно создавать подобные папки:
Для этого нужно в конструкторе СКД, на вкладке "Наборы данных", указать в поле "Путь" имя папки через точку, перед именем поля. Поля с одинаковыми названиями папок будут сгруппированы. Например, вместо КоличествоРасход и КоличествоПриход, указать соответственно КоличественныеПоказатели.КоличествоРасход и КоличественныеПоказатели.КоличествоПриход. Можно делать вложенные папки. Например, у поля склад можно указать «Аналитика.Склады.Склад»
В результате, на вкладке редактирования настроек, набор доступных полей для выбора будет выглядеть так:
Механизм может быть удобен в тех случаях, когда в отчете много полей (более 9).
2. Соединение строк (без использования языка выражений)
Иногда перед разработчиками 1С ставят задачу вывести данные колонки табличной части документа в одно поле рядом с самим владельцем. Строки должны быть при этом разделены, например, точкой с запятой. Задачу можно решить при помощи плохо описанного (в справке 1С) и довольно глючного языка выражений СКД (см ВычислитьВыражение). Но у этой задачи есть простое и прозрачное решение. Но стоит сразу оговориться, что его тяжело назвать оптимальным с точки зрения производительности.
Пускай есть документ "ПриходТоваров" с табличной частью МОЛ и единственной колонкой "Сотрудник". Стоит задача в группировке с документом вывести через запятую всех сотрудников из указанной табличной части. Порядок решения следующий:
1. В общем серверном модуле ОбщегоНазначения создал экспортную процедуру со следующим содержанием:
Функция ВывестиТабличнуюЧастьДокумента(СсылкаНаДокумент) Экспорт
МассивСтрок = СсылкаНаДокумент.МОЛ.ВыгрузитьКолонку("Сотрудник");
Возврат СтрСоединить(МассивСтрок,",");
КонецФункции
2. В конструкторе СКД, на вкладке «Вычисляемые поля» добавил новое поле. В пути к данным указал нужное значение ОбщегоНазначения.ВывестиТабличнуюЧастьДокумента(Регистратор):
3. Добавить новое поле в настройки отчета.
В выражениях СКД можно использовать почти любые функции серверных модулей. Это дает разработчику практически неограниченные возможности. Но стоит помнить о том, что неосторожное использование этой фичи может негативно сказаться на производительности системы.
3. Вывод числа прописью
Вызов общих серверных функций доступен не только в вычисляемых полях. Их можно использовать в макетах. Пускай перед разработчиком стоит задача опционно выводить в подвале отчета итог прописью. Для этого:
1. На вкладке "Макеты" конструктора СКД добавил макет группировки с именем "Подвал".
2. В макете я задал единственный параметр КоличествоИтог. Чтобы в отчете не было видно рамок ячеек, я установил цвет рамок "Фон формы":
3. В заполнении параметра указал ОбщегоНазначения.КоличествоПрописью(КоличественныеПоказатели.КоличествоПриход)
Теперь осталось вывести макет в настройки отчета. Для этого нужно:
1. На вкладке "Настройки" конструктора СКД добавить группировку детальных записей и установить ей имя "Подвал".
2. В выбранных полях детальных записией надо удалить автополе и добавить "КоличественныеПоказатели.КоличествоПриход". Таким образом в макет будет выведен общий итог, без группировки по полям.
3. Осталось задать свойство элемента пользовательских настроек, чтобы вывод подвала стал опционным. Для этого нужно кликнуть правой кнопкой мыши по полю "Детальные записи" и выбрать пункт "Свойства элемента пользовательских настроек" и задать имя группировке:
В результате отчет будет выглядеть следующим образом:
Надеюсь, что статья позволила читателю несколько расширить свои представления о возможностях Системы компоновки данных .
СКД, использующий внешние функции, выполняется в разы дольше. я бы не рекомендовл их использовать в формировании детальных записей. для вывода подвала или шапки — возможно.
Полезные примеры составления схемы компоновки данных , рекомендую ознакомится
Для соединения строк используйте другой механизм СКД «ВычислитьВыражениеСГруппировкойТаблицаЗначений(),»
Есть статья
п.2 делается через второй набор и вычисляемое поле на языке СКД — СоедининитьСтроки(Массив(Сотрудник))
без всяких выкрутасов.
(1) читайте внимательно статью, прежде чем писать. Я указал, что решение не оптимально с точки зрения производительности. И оно альтернатива языку выражений СКД
(3) Это не альтернатива — это халтура.
Технологии статьи устарели лет на 5 минимум и логичнее было бы заголовке указать
устарело, для платформ 8.2 и ниже
таки да, общие модули в СКД используют когда другой альтернативы нет и только.
сейчас даже число прописью можно вытащить из системных функций платформы.
За папки плюс )
(4) [IS-QUOTE] спасибо за комментарий
(4) в предисловии указана версия платформы. Этого мало?
(0)
Можно ли делать замер производительности отчета на СКД?
(2) можно конечно. Для этого можно установить стандартную обработку в ложь в событии ПриКомпоновкеРезультата и прописать программную компоновку. Затраты на вызов вложенных функций будут отдельно отображены в результате замеров.
(3) Если насчёт «плохо описанного» я ещё соглашусь, то ни единой причины назвать язык функций СКД глючным я за годы использования не наблюдал. Оно стабильно работает, и кажущаяся глючность — есть следствие плохой описанности и плохого понимания устройства этого дела.
(8) Хм, ну можно, но не только и не столько средствами конфигуратора, сколько замерами PerfMon на сервере приложения, ещё можно по ТЖ…
Статья нового не содержит. У Хрусталёвой это уже было лучше и больше.
(11) не все умеют пользоваться perfmon, база может быть файловая, в ней может не быть функций для замера производительности.
статья не претендует на обьемы учебника по СКД. Если для вас ничего нового, то я могу лишь восхититься объемом ваших знаний.
SKD ? ))
(13) Systema Komponovki Dannih
комментарии настоялись — делаю. вывод: Infostart дружное сообщество. Программисты 1с — добрые люди.)
(13) System Kicked Down
(16) ну хватит=)
(1)Еще проще можно
Предназначена для объединения строк в одну строку.
Синтаксис:
СоединитьСтроки (Значение, РазделительЭлементов, РазделителиКолонок)
Параметры:
Значение — выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;
РазделительЭлементов — строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;
РазделителиКолонок -строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию «; «.
Пример:
СоединитьСтроки(ТаблицаЗначений(НомерТелефона, Адрес));
Показать
:
(9)Бред, зачем? Это агрегатные функции языка СКД, все делается в схеме компоновки на закладке «Ресурсы».
(1), (2) По-ходу, кому-то просто захотелось по-быстрому стартманей срубить, вот и весь смысл данной «статьи».
(19) на первый взгляд вы не понимаете зачем вообще эти возможности нужны. Они дополняют агрегатные Функции
(20) уважаемый, я не захожу в ваши т.н. «статьи» и не пишу там нелицеприятные вам вещи.
(20) что касается стармани, но до минимально необходимого количества знаков для гарантированного начисления она не дотягивает почти вдвое от текущего объема. Дадут ли sm за рейтинг-вопрос открытый
(21)На первый взгляд, это Вы не понимаете зачем они нужны, раз придумываете такое и тут публикуете.
(20) Ваши мысли, зачем нужны эти возможности?
В МОЛах, «Цзиньпин» пишется в одно слово….)
(26) хоть кто-то по делу написал)
(22)
Статей у меня, вроде и нет, есть обработки столетней давности. Можете комментировать как угодно, не запрещаю.
(23)
А что, за статьи стартмани начисляют? Не знал. Думал, статьи без $m, раз их в «бесплатный» доступ выкладывают.
Я же собственно, не за саму статью говорил, а за файл к ней. 2 $m всего лишь за то чтобы посмотреть на 3 примера??? Или инфостарт не дает иную цену поставить? (я просто не в курсе, с их этой «политикой монетизации», можно и такое ожидать). ИМХО если цели получить $m нет — файл вообще лишний.
(25)
В смысле, какие возможности нужны?
Если вы по тексту статьи — то
1. Имена через точку — тривиальная вещь, описывается и в хелпе редактора СКД и в ЖКК чуть ли не с первых страниц описания СКД. У вас, кстати, даже не сказано что кроме групп есть «добавление» в существующие поля (например, если у вас есть поле «Склад» — соответствующий справочник, с его реквизитами, и вы в добавляете к ним поле с путем, допустим «Склад.ТекущееМОЛ»)
2. Конкатенация строк без языка выражений — ну да, заменили выражение вызов ф-ции языка СКД на выражение вызов ф-ции общего модуля. Выражением оно от того быть не перестало.
Про то что встроенная ф-ция будет и быстрее, и даже само выражение короче получится — вам уже написали. Я же добавлю, что вызов внешних ф-ций — «небезопасная» операция, и для случая пользовательских полей при отсутствии у пользователя соответствующих прав он не сможет такое запустить. Для программиста в вычисляемых полях такое, конечно, неважно.
3. А тут что вы хотели показать? Как работать с макетом? Так это тоже в хелпе описано.
И убирать рамку — цветом? А почему не стилем «без рамки»?
(29) начисляют за статьи объемов знаков больше 10 тыс.
(30)
1. Спасибо, я это добавлю в статью если вы не против.
2. Честно говоря не понимаю, зачем вы пишите про соединение строк средствами языка выражений. Я кажется прямо в статье описал, что предлагаю альтернативу для тех, кому сложно разобраться. И людям вроде как понравилось судя по количеству плюсов. Можете закрыть тему языка выражений здесь? Про безопасность было бы интересно послушать ваши соображения.
3. Попробуйте, пожалуйста
Спасибо за статью, мы же ищем на Infostart-е не всегда готовое решение. Даже если есть что-то, от чего можно оттолкнуться и, углубив, применить у себя, уже хорошо.
(32)
2. Во-первых, ничего сложного; во-вторых, потом из-за таких «было сложно разобраться» все тормозит. Лучше бы научили как правильно делать, ей-богу. Ну, или привели бы 2 варианта — с СоединитьСТроки() и с внешними функциями.
Про безопасность — а какие соображения вы хотите услышать? Пользователю по ролям/профилю безопасности запрещают открытие внешних отчетов и использование исполняемого кода в потенциально-критичных местах (типа непривилегированных Выполнить/Вычислить, табло в неуправляемом режиме, или в пользовательских полях СКД). На закладку вычислимых полей это не влияет.
3. В чем проблема? Прикладываю пример (под «Всего» специально оставил рамку, пунктирную).
(34) 2. что у вас там тормозит? Вы уверены, что оно тормозит от неправильного использования СКД?
Вы пишите, что использовать функции общих модулей в отчетах небезопасно. Не понимаю, причем тут выполнить-вычислить-внешние отчеты?
Вызов функций внешних модулей в отчетах СКД может быть оправдан только если это внешний модуль с повторным использованием на время серверного вызова — если подходящего нет (чаще всего так и будет), то сделать свой прокси-модуль с вызовом функций других модулей
В приведенном примере с МОЛами складов сократит время вызова во много раз, на больших выборках в сотни, тысячи…
Автор наверняка об этом знает, но раз уж статья для новичков, то имеет смысл дополнить предложенный способ советом по оптимальному использованию модулей
(35)
У меня тормозит? Да это ж у вас тормозит!!!
«Но стоит сразу оговориться, что его тяжело назвать оптимальным с точки зрения производительности.» — чьи слова?
По факту же: вы на каждую ссылку в выводе дергаете ф-цию, которая лезет в базу. Классический «запрос в цикле» получается.
В то же время использование встроенной ф-ции во-первых, по возможности оптимизируется компоновщиком, во-вторых, понуждает программиста всю недостающую информацию получать в начальном запросе.
(34) будет ли оно тормозить или нет-зависит ещё от десятков иных факторов.
У меня классический запрос в цикле, да. Но при этом запрос с отбором по ссылке-то есть наиболее щадящий вариант. Да и запрос в цикле-СКД этим грешит во множестве случаев. Например, просто при выводе результата.
Вопрос такой: а вы знаете, как встроенная функция работает? Вы уверены, что всегда можно выцпить нужную информацию начальным запросом?
(38)
Если касательно СоединитьСтроки() — то она описывается, наверно, даже в древней Хрусталёвой.
Те же случаи когда реально нельзя обойтись встроенными и нужно вызывать внешние ф-ции, при чем лезущие в БД — уже довольно сложные, явно выходящие за пределы вашей статьи. Более того, там скорее всего придется отказаться от «прямого» использования СКД, и писать свою ПриКомпоновкеРезультата() с формированием нужной ТЗ данных, и отдав СКД так сказать «косметическую» роль.