Развернуть строки в столбцы скд 1с
Как настроить схему компоновки данных в 1С 8, чтобы колонки ресурсов не выводились последними, после колонок измерений.
Кому подойдет информация: Программист 1С
Пожалуй, наиболее популярный вопрос, который возникает у программистов 1С при работе со схемой компоновки данных.
Когда создается отчет на СКД, то, пока не определены ресурсы, показатели будут выводиться в той последовательности, которая определена на вкладке "Выбранные поля" вкладки "Настройки".
Нажатие на изображении увеличит его
Рис.1. Пример вывода полей (колонок) отчета на СКД , пока не определены ресурсы.
Если определить, какие из полей будут ресурсами, то колонки ресурсов будут выведены схемой компоновки данных после всех полей. Для определенных задач, не смотря на то, что все же данные в отчете есть, это может оказаться не удобным хотя бы в силу человеческого восприятия. Поэтому один из популярных вопросов, касающихся отчетов, созданных на СКД - "Как СКД вывести ресурсы не в конце?" Наиболее распространенный ответ на этот вопрос заключается в том, чтобы "нарисовать" макет для группировок отчета на вкладке "Макеты" - об этом на примере можно прочитать в книге "Разработка сложных отчетов в 1С:Предприятии 8. Система компоновки данных" под авторством Е.Ю.Хрусталевой в Главе 5 - "Макеты", где приведены примеры для макетов полей, ресурсов, группировок, заголовков группировок и остального. Но это может оказаться трудоемким процессом, тем более тогда, когда макет определен, а нужно отчет дополнить новыми данными. Сделать то, конечно можно, но время будет израсходовано прилично, чтобы изменять макет, особенно если отчет и макет соответственно сложный.
Нажатие на изображении увеличит его
Рис. 2. Результат вывода полей(колонок) отчета после определения ресурсов.
Но есть одно простое, не идеальное, но доступное решение этой ситуации произвольного вывода колонок ресурсов. На вкладке "Другие настройки" формы схемы компоновки для параметра "Авто позиция ресурсов" выбрать значение "Не использовать". Не идеальность заключается в том, что неплохо работает для группировок, и может совсем плохо себя "повести" для таблицы.
Нажатие на изображении увеличит его
Рис. 3. Настройки схемы компоновки данных для изменения порядка вывода ресурсов.
Тогда порядок следования колонок ресурсов между колонками полей будет соответствовать порядку, установленному на вкладке "Выбранные поля" СКД.
Нажатие на изображении увеличит его
Рис. 4. Колонки ресурсов в отчете выведены между колонками полей СКД.
Есть запрос на СКД.
Нужно, при формировании документа-результата, обращаться к каждой текущей строке выборки и, проверяя значения на соответствие условиям, выводить определенные данные в свой макет группировки. Кроме того по каждой строке нужно в переменную записывать по условию сумму значений (т.е. из одной строки сумму включать в переменную, из другой нет), а затем выводить ее в свой макет общих итогов (стандартные общие итоги не считают по такому алгоритму).
Подскажите, как это можно сделать?
а в других процедурах (ПриКомпоновкеРезультата или других) нельзя отловить каждую текущую строку выборки?
(9) нет, пробовал их.
у меня так(результат запроса):
Договор____СуммаДоговора____Документ
1__________5000_____________Док1
1__________5000_____________Док2
1__________5000_____________Док3
1__________5000_____________Док4
В общих итогах по полю Договор выводит 20000, хотя сумма по договору=5000 и надо выводить 5000.
Поэтому думал как-то программно проверять на значение текущей строки в выборке и суммировать в какую-то переменную реальную сумму по договору(5000) и потом значение этой переменной выводить в общие итоги.
(11)так я и суммирую только по договору. Договор есть в четырех документах, соответственно 5000*4=20000. А сумма по договору=5000.
т.е. надо так сделать:
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________Док1_______100
1__________5000_____________Док2_______5600
1__________5000_____________Док3_______4500
1__________5000_____________Док4_______1200
2__________3000_____________Док1_______500
2__________3000_____________Док2_______1600
2__________3000_____________Док3_______2500
2__________3000_____________Док4_______1250
Итого______8000________________________ХХХ
т.е. чтобы итоговая сумма по всем договорам была равна 8000
(10) Я так понял группировка Документ самая нижняя. Добавь в запросе еще одно поле для счетчика документов. На закладке ресурсы добавь еще один ресурс СуммаДоговора рассчитывать по договору, в выражении Сумма(СуммаДоговора)/Сумма(ПолеСчетчикаДокументов) и есстественно через выбор для проверки Сумма(ПолеСчетчикаДокументов) <> 0. Как-то так. Это если структура группировок жесткая.
(16) пробовал этот вариант: для отдельного договора считает сумму по договору правильно, для общих итогов неправильно. Для примера (14) итог по сумме договора посчитает 32000/8=4000, а надо 8000
(17) В общем-то можно в форму добавить новую кнопку "Сформировать" и прописать алгоритм формирования отчета через СКД. Если надо, я могу алгоритм обработки скинут
(21) подскажите, как там проверить, какая группировка там текущая и в зависимости от этого выводить свой определенный макет вместо стандартного.
(14) У тебя не правильно построен запрос. необходимо в компоновке создать два набора данных "Договор" и "Документы" и связать их на закладке "Связи наборов данных" и ВСЕ.
(23) так то же самое получится. Для одного договора (и его суммы) есть несколько документов. При Левом соединениии (все договоры и документы удовлетворяющие условию связи по договору) будет таблица как в (14), т.е. суммы договоров будут повторяться для каждого документа. Далее в итогах они будут увеличиваться в столько раз, сколько документов по договору.
(24) Есть еще вариант, не знаю, будет ли тебе это сложновато?
В СКД есть возможность импользовать "Вложенные схемы".
Суть в том, чтоб строку с итогами выводить отдельной схемой
(28) Не путай человека.
(27) Если в СКД применять несколько наборов данных, то итоги рассчитываются в каждом из них отдельно.
(31) Все зависит от задачи. Ты можешь написать сколь угодно сложные запросы в наборах, а компоновка будет обрабатывать уже готовые наборы. В том числе и при помощи описания связей.
еще вопрос в тему: если в какую-то колонку (поле) в скд нужно будет выводить результат выборки строк какой-то таблицы (прямо через запятую последовательно значения строк выборки), то как это можно сделать?
т.е. примерно так (характеристики):
Договор____СуммаДоговора_____Характеристики_______Документ
1__________5000_______________доп.согл1,допсогл2___Док1___
1__________5000_______________доп.согл1,допсогл2___Док2___
1__________5000_______________доп.согл1,допсогл2___Док3___
1__________5000_______________доп.согл1,допсогл2___Док4___
2__________3000_______________доп.согл1,допсогл2___Док1___
2__________3000_______________доп.согл1,допсогл2___Док2___
2__________3000_______________доп.согл1,допсогл2___Док3___
2__________3000_______________доп.согл1,допсогл2___Док4___
Итого______8000___________________________________________
(36) т.е. так же отдельным набором данных присоединить таблицу характеристик к таблице договоров по условию совпадения по договору, а как потом перебрать все значения таблицы характеристик по договору и вставить их в одну ячейку?
(38) неправильно написал: в поле характеристики через запятую надо вывести значения строк регистра сведений по каждому договору.
(39) Сворачивание нескольких строк в одну отдельная задача.
А в данном случае не понял структуру характеристик. "доп.согл." - это значение характеристики? Тип какой? Сколько может быть характеристик? Подозрение, что не совсем верно организовано хранение данных. Если доп.согл. - это документы, то лучше бы добавить в них реквизит с ссылкой на договор. В общем не понятно.
(40) мне как раз и нужно несколько строк в одну свернуть.Это можно сделать с помощью конструктора скд?
Характеристики - это периодический регистр сведений для договора. Хранит номера, даты, названия доп. соглашений с опред. даты. Нужно перебрать все строки регистра по договору, и вывести их результат через запятую в одном поле скд.
(41) СКД такой вопрос не решает. Можно при помощи запроса (много раз обсуждалось) или при помощи предварительной обработки характеристик - создаем программно ТЗ с колонками "Договор" и "Характеристики" (уже свернутые) и передаем в СКД как объект.
я как раз запросом и пытаюсь сделать - добавил для характеристик набор-запрос, а как в одну строку-то свернуть?
Кстати. В 8.2.14 появилась в СКД функция ВычислитьВыражение, которая, если я правильно понял, может делать тоже самое, что и запрос из (46).
(46) а если у меня для объекта может быть 1 св-во, а может быть и 20, то тогда надо добавлять 20 полей?
КАК Свойство1
.
КАК Свойство20
(48) Ну если кому то нужен отчет, в ячейке которого через запятую будет перечислено 20 свойств - пиши "КАК Свойство20".
А в приведенный запрос будет отображать первые четыре даже если реально 20.
(49) имел ввиду нет ли чего более универсального, т.к. хранить во врем. таблице 20 полей, которые не всегда будут использованы.
Функция возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.
Строка() - Если в качестве параметра передан массив, то функция возвращает строку, содержащую строковые представления всех элементов массива, разделенных символами "; ".
(67) через Строка пробовал, но в тексте запроса это не работает, опять же непонятно, как какой-то тип (число, дата) преобразовать в строку в самом запросе
(69) в вычисляемых полях нельзя использовать в выражении вычисляемые поля. У меня нужно сначала к дате добавить символ (", "), затем сложить несколько таких полей. Т.е. поле с датой и с символом(",") должно быть готовое уже в запросе, а потом в вычисляемом поле уже несколько таких полей сложить.
В запросе получаешь поля Т.Свойство1 . Т.Свойство20.
в вычисляемом поле пишешь
Формат(Свойство1,"ДЛФ=D") + ", " + . + Формат(Свойство20,"ДЛФ=D")
(71) я именно так и сделал. Не устраиваю лишние запятые в случае пустых значений. Поэтому нужна предварительная обработка, чтобы "Свойство1" уже содержало текст "Свойство1, " в случае наличия, и текст "" в случае отсутствия текста в "Свойство1".
можно ли менять размер колонок в скд, не используя макеты? Потому как слишком широкие стандартные колонки.
(83) Колонка "Оформление" в описании полей на закладках "Наборы данных" и "Вычисляемые поля".
Или постобработка табличного документа.
ВычислитьВыражениеСГруппировкойМассив пока оставлю. Попробую еще вариант сделать то же через внешний набор данных.
Шрифт заголовков можно изменить в "Макете оформления компоновки данных". Выбор макета осуществляется в настройках компоновки на закладке "Другие настройки". Создать свой макет можно либо в общих макетах ветки конфигурации. либо в другом объекте где возможно создание макетов. При создании макета надо указать тип макета - "Макет оформления компоновки данных". В открывшемся окне редактора макета, за основу возможно взять один из стандартных макетов и отредактировать его.
В какой процедуре нужно этот макет оформления (созданный на основе стандартного) привязывать к компоновщику макета? При нажатии на кнопку "сформировать"? т.е. надо свою кнопку "сформировать" с обработчиком делать?
(92) это стандартный макет. Я так понял, чтобы изменить шрифт заголовков полей группировок, нужно создать свой макет оформления и в нем изменить шрифт. А потом программно его подвязать к компоновщику макета. Если не так, поясните.
(29) Вы писали, что если в СКД применять несколько наборов данных, то итоги рассчитываются в каждом из них отдельно.
Подскажите, если делать не через скд, а просто запросом в модуле отчета, то как результат запроса можно привести к виду (т.е. чтобы итоговая сумма по всем договорам была равна 8000)?
таб1:
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________Док1_______100
1__________5000_____________Док2_______5600
1__________5000_____________Док3_______4500
1__________5000_____________Док4_______1200
2__________3000_____________Док1_______500
2__________3000_____________Док2_______1600
2__________3000_____________Док3_______2500
2__________3000_____________Док4_______1250
Итого______8000________________________ХХХ
т.е. чтобы итоговая сумма по всем договорам была равна 8000.
Я кроме как объединением таблиц не знаю. В случае объединения будет так (таб2):
Договор____СуммаДоговора____Документ__СуммаДока
1__________5000_____________""_________0
1__________0________________Док1_______5600
1__________0________________Док2_______4500
1__________0________________Док3_______1200
2__________3000_____________""_________0
2__________0________________Док1_______1600
2__________0________________Док2_______2500
2__________0________________Док3_______1250
Итого______8000________________________ХХХ
Подскажите, можно ли такое сделать через соединение, т.к. в 1-ом результате (таб1) если делать итоги по сумме договора, получится 32000.
(94)-(95). Создал в разделе макетов отчета макет с типом "Макет оформления компоновки данных". В нем загрузил стандартный макет. Изменил его. Сохранил. Макет в настройках не появился.
+(98)
Подвязал этот макет к компоновщику макета:
После этого отчет выводится через этот макет. Но в настройках его не нашел, поясните.
Вопрос-ответ Отзывов (5) В закладки
Господа, помогите, сам не справился
СКД разворачивает по горизонтали по измерениям, если есть ресуры.
Но у меня в схеме используются только измерения.
2 из них я хочу использовать в группировках, одну, номенклатуру разворачивать по вертикали, другую, дату по горизонтали. Остальные измерения используются в качестве детальных записей и отображать в колонках.
Не знаю как заставить СКД работать в таком режиме.
Нет похожих статей
Никаким другим способом, кроме как определением ресурсов.
Ей наверное нужны точно знать, что строки/колонки не будут поторятся или что-то в этом духе.
P.S. Вы можете попробовать при определении ресурсов не использовать агрегатные функции или же попробовать МАКСИМУМ или МИНИМУМ.
Спасибо Дмитрий.
Я так и делаю, экспериметирую, казалось бы такая простая вещь.
Досаднее всего, что разочаровываешься в СКД.
Итак, простая задача.
Есть регистр сведений.
Измерения – Номенклатура, Период (просто дата начала месяца).
Ресурсы – Разные параметры типа “строка” и “число”, например ликвидность, приод оборачиваемости, сумма продаж и пр.
Задача состоит в том, чтобы получить в отчете таблицу, в строках которой будет номенклатура а в столбцах – периоду.
Если не указывать в качестве ресурсов отчета ресурсы регистра, тогда СКД не помещает ресурсы в регистра в колонки отчета.
Если указать ресурсы регистра в качестве ресурсов отчета, тогда ресурсы попадают в столбцы в первоначальном виде, но в группировках они обрабатываются функцией Количество. К сожалению, в последнем случае, СКД начинает дублировать строки отчета и кроме того, помещать ресурсы в столбцы в шахматном порядке.
По всей видимости, нет возможности заставить СКД работать в этом специфическом случае. Придется программировать отчет вручную.
Я же в предыдущем комментарие упомянул:
когда определяете ресурсы СКД – там автоматически проставляется какая0то агрегатная функция – в вашем случае Количество().
Но вы можете ее убрать и оставить просто как есть – Ресурс.
Далее – если вам просто нужна таблица, без итогов по группировкам – тогда для группировки строк таблицы не определяйте подгруппировку “Детальные записи”, а сразу в ней опеределите состав этой строки: сама группировка и ресурсы.
Я потестил – выводится отлично. Если не понятно – могу привести скриншоты или саму СКД.
Спасибо Дмитрий. Попробовал сделать как Вы рекомендовали.
Параллельно нашел несколько ошибок у себя.
Реально помогло Ваше предложение не определять функции в ресурсах СКД.
Разве можно было догодаться, что надо было просто стереть “Количество” ручками. СКД при выборе функции не в списке показывает только “Количество”, “Сумма”, “Минимум”, “Максимум”.
1. Использовать свою функцию для вычисления ресурсов, к примеру, МояФункция(Значение).
2. С выходом новой версии СКД 8.2.14, можно воспользоваться, Массив или СоеденитьСтроки(Массив(Значение))
IronDemon Полезные примеры Отзывов (15) В закладки
Часто возникают вопросы «как в СКД сделать свои итоги», «как определенные поля выводить только в нужном месте». Начнем рассказ.
Наша цель – посчитать среднюю цену продажи и вывести ее в нужном месте.
Цену рассчитываем в ресурсах:
Добавим вычисляемое поле, назовем его «ДополнительнаяКолонка».
Конструктором настроек формируем таблицу, в строках «Номенклатура», в колонках «Подразделение».
В колонки добавляем группировку «ДополнительнаяКолонка».
Мы хотим, чтобы поле «Цена» не выводилась в итогах.
Для этого итоги нужно «переопределить». Отключим стандартный вывод горизонтальных итогов.
В группировке «ДополнительнаяКолонка» изменим состав выводимых полей следующим образом.
Зададим заголовок группировке в условном оформлении.
В результате наш отчет выглядит так.
Желаем чтобы, поле «Цена» не было в группировке «Подразделение» а в итогах пусть будет.
Изменим состав выводимых полей в группировке «Подразделение» следующим образом.
А в группировке «ДополнительнаяКолонка» так.
Теперь наш отчет выглядит так.
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: представление отчёта в виде таблицы
Автор уроков и преподаватель школы: Владимир Милькин
На всех прошлых уроках мы выводили данные в отчет в виде списка. Сегодня разберёмся со вторым типом отчета: "Таблица".
Ставим цель
- Написать отчёт, который выводит информацию о заказе еды клиентами в виде таблицы.
- В строках таблицы должна выводиться еда, в колонках - клиенты, а на пересечении количество данной еды заказанной данным клиентом.
- Информацию будем брать из документов "ЗаказКлиента".
Создаём новый отчёт
Открываем базу "Гастроном" в конфигураторе и через меню "Файл"->"Новый. " создаём новый отчёт:
Вид документа - "Внешний отчет":
В новой форме отчёта указываем имя "Урок8" и нажимаем кнопку "Открыть схему компоновки данных":
Имя схемы компоновки данных оставляем по умолчанию:
Составляем запрос
Добавляем новый набор данных - запрос:
Выделяем новый набор данных и вызываем конструктор запроса:
Будем выбирать из табличных частей документа "ЗаказКлиента" следующие поля:
Получился следующий текст запроса:
Сначала пробуем список
Перейдём на закладку "Настройки" и нажмём волшебную палочку, чтобы вызвать конструктор:
Вначале попробуем по старинке выбрать тип отчета "Список. ":
Укажем поля, которые будут отображаться в отчете:
Сохраним наш отчёт в конфигураторе и сформируем в режиме пользователя:
Получился привычный нам список с тремя колонками: Клиент, Еда и Количество.
Выводим в виде таблицы
Ах как замечательно было бы представить эти же самые данные в виде таблицы, в строках которой перечислена еда, в колонках - клиенты, а на пересечении количество данной еды, которое заказал данный клиент:
Сделать это действительно легко. Для этого вернёмся на закладку "Настройки" и вновь вызовем конструктор настроек через волшебную палочку:
На этот раз в качестве типа отчета выберем "Таблица..":
Из полей, которые будут отображаться в отчёте уберём "Клиент" и "Еда", так как эти поля по нашей задумке уйдут в столбцы и строки соответственно:
Оставим только количество, которое будет отображаться на пересечении строк и столбцов:
Здесь нужно указать конструктору какие поля будут отображаться в строках, а какие в столбцах. Для нас очевидно (см. рисунок выше), что строки - это еда, а колонки - клиенты:
Получилось вот так:
Итоговая структура отчёта будет такой:
Сохраняем наш отчёт в конфигураторе и формируем в режиме пользователя:
Вроде бы неплохо. Еда отображаться в строках, а клиенты - в столбцах. Но показатели количества, которые мы ожидали увидеть на пересечении строк и столбцов почему-то оказались все слепёшены в одном столбце.
А причина в том, что строки и столбцы у нас сгруппированы, а показатели нет! Поэтому и такой разлад.
Чтобы сгруппировать количество нужно подвести по нему итоги (вычислить ресурсы). Это мы уже делать умеем.
Забыли подвести итоги
Переходим на закладку "Ресурсы" и перетаскиваем поле "Количество" из левой колонки в правую:
Выражение "Сумма(Про. " оставляем без изменения:
Снова сохраняем отчет и формируем в режиме пользователя:
То, что надо! Мы хорошо поработали. А на следующем уроке - мы модифицируем этот отчёт (вернее его копию) и представим эти же данные в виде диаграммы.
Войдите на сайт как ученик
Для учеников
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .
Читайте также: