Как изменить вывод строк запроса в СКД? #582763


#0 by mirrr
Есть запрос на СКД. Нужно, при формировании документа-результата, обращаться к каждой текущей строке выборки и, проверяя значения на соответствие условиям, выводить определенные данные в свой макет группировки. Кроме того по каждой строке нужно в переменную записывать по условию сумму значений (т.е. из одной строки сумму включать в переменную, из другой нет), а затем выводить ее в свой макет общих итогов (стандартные общие итоги не считают по такому алгоритму). Подскажите, как это можно сделать?
#0 by mirrr
Есть запрос на СКД. Нужно, при формировании документа-результата, обращаться к каждой текущей строке выборки и, проверяя значения на соответствие условиям, выводить определенные данные в свой макет группировки. Кроме того по каждой строке нужно в переменную записывать по условию сумму значений (т.е. из одной строки сумму включать в переменную, из другой нет), а затем выводить ее в свой макет общих итогов (стандартные общие итоги не считают по такому алгоритму). Подскажите, как это можно сделать?
#1 by mirrr
?
#2 by чувак
Как-то так:
#3 by mirrr
это в модуле объекта надо писать в какой процедуре?
#4 by mirrr
?
#5 by чувак
А как формируется вообще отчет? Через какую кнопку?
#6 by mirrr
Стандартная команда "Сформировать"
#7 by чувак
Этот код работает тогда, когда обработчик событий кнопки доступен. ИМХО
#8 by mirrr
а в других процедурах (ПриКомпоновкеРезультата или других) нельзя отловить каждую текущую строку выборки?
#9 by PVV65
А пользовательские поля не подойдут?
#10 by mirrr
нет, пробовал их. у меня так(результат запроса): Договор____СуммаДоговора____Документ 1__________5000_____________Док1 1__________5000_____________Док2 1__________5000_____________Док3 1__________5000_____________Док4 В общих итогах по полю Договор выводит 20000, хотя сумма по договору=5000 и надо выводить 5000. Поэтому думал как-то программно проверять на значение текущей строки в выборке и суммировать в какую-то переменную реальную сумму по договору(5000) и потом значение этой переменной выводить в общие итоги.
#11 by mikecool
итоги суммируй только по договору
#12 by mirrr
так я и суммирую только по договору. Договор есть в четырех документах, соответственно 5000*4=20000. А сумма по договору=5000.
#13 by чувак
В СКД в закладке "Ресурсы" у этого ресурса в колонке "Рассчитывать по" установи флажок на "Договор"
#14 by mirrr
т.е. надо так сделать: Договор____СуммаДоговора____Документ__СуммаДока 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
#15 by mirrr
см.
#16 by viktor_vv
Я так понял группировка Документ самая нижняя. Добавь в запросе еще одно поле для счетчика документов. На закладке ресурсы добавь еще один ресурс СуммаДоговора рассчитывать по договору, в выражении Сумма(СуммаДоговора)/Сумма(ПолеСчетчикаДокументов) и есстественно через выбор для проверки Сумма(ПолеСчетчикаДокументов) <> 0. Как-то так. Это если структура группировок жесткая.
#17 by mirrr
пробовал этот вариант: для отдельного договора считает сумму по договору правильно, для общих итогов неправильно. Для примера итог по сумме договора посчитает 32000/8=4000, а надо 8000
#18 by viktor_vv
Ну да, насчет общих итогов засада получается.
#19 by чувак
В общем-то можно в форму добавить новую кнопку "Сформировать" и прописать алгоритм формирования отчета через СКД. Если надо, я могу алгоритм обработки скинут
#20 by mirrr
скинь, может поможет
#21 by чувак
#22 by mirrr
подскажите, как там проверить, какая группировка там текущая и в зависимости от этого выводить свой определенный макет вместо стандартного.
#23 by PVV65
У тебя не правильно построен запрос. необходимо в компоновке создать два набора данных "Договор" и "Документы" и связать их на закладке "Связи наборов данных" и ВСЕ.
#24 by mirrr
так то же самое получится. Для одного договора (и его суммы) есть несколько документов. При Левом соединениии (все договоры и документы удовлетворяющие условию связи по договору) будет таблица как в , т.е. суммы договоров будут повторяться для каждого документа. Далее в итогах они будут увеличиваться в столько раз, сколько документов по договору.
#25 by PVV65
Связь в компоновке - это не просто "Левое соединение".
#26 by PVV65
+ Сначала попробуй - потом говори.
#27 by mirrr
а какое?
#28 by чувак
Есть еще вариант, не знаю, будет ли тебе это сложновато? В СКД есть возможность импользовать "Вложенные схемы". Суть в том, чтоб строку с итогами выводить отдельной схемой
#29 by PVV65
Не путай человека. Если в СКД применять несколько наборов данных, то итоги рассчитываются в каждом из них отдельно.
#30 by mirrr
блин, не ожидал - работает
#31 by mirrr
а я в одном запросе (наборе) их соединял...
#32 by чувак
В СКД настоятельно рекомендуется соединить наборы данных, а не в запросе.
#33 by PVV65
Все зависит от задачи. Ты можешь написать сколь угодно сложные запросы в наборах, а компоновка будет обрабатывать уже готовые наборы. В том числе и при помощи описания связей.
#34 by mirrr
еще вопрос в тему: если в какую-то колонку (поле) в скд нужно будет выводить результат выборки строк какой-то таблицы (прямо через запятую последовательно значения строк выборки), то как это можно сделать?
#35 by mirrr
т.е. примерно так (характеристики): Договор____СуммаДоговора_____Характеристики_______Документ 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 by PVV65
Если правильно понял, то "Вычисляемое поле", в котором соединяешь нужные поля через запятую.
#37 by mirrr
т.е. так же отдельным набором данных присоединить таблицу характеристик к таблице договоров по условию совпадения по договору, а как потом перебрать все значения таблицы характеристик по договору и вставить их в одну ячейку?
#38 by PVV65
Для характеристик в СКД свой механизм - расширение языка запросов.
#39 by mirrr
неправильно написал: в поле характеристики через запятую надо вывести значения строк регистра сведений по каждому договору.
#40 by PVV65
Сворачивание нескольких строк в одну отдельная задача. А в данном случае не понял структуру характеристик. "доп.согл." - это значение характеристики? Тип какой? Сколько может быть характеристик? Подозрение, что не совсем верно организовано хранение данных. Если доп.согл. - это документы, то лучше бы добавить в них реквизит с ссылкой на договор. В общем не понятно.
#41 by mirrr
мне как раз и нужно несколько строк в одну свернуть.Это можно сделать с помощью конструктора скд? Характеристики - это периодический регистр сведений для договора. Хранит номера, даты, названия доп. соглашений с опред. даты. Нужно перебрать все строки регистра по договору, и вывести их результат через запятую в одном поле скд.
#42 by PVV65
СКД такой вопрос не решает. Можно при помощи запроса (много раз обсуждалось) или при помощи предварительной обработки характеристик - создаем программно ТЗ с колонками "Договор" и "Характеристики" (уже свернутые) и передаем в СКД как объект.
#43 by mirrr
с созданием тз и набором данных-объектом попробую. А при помощи запроса - где посмотреть можно?
#44 by mirrr
я как раз запросом и пытаюсь сделать - добавил для характеристик набор-запрос, а как в одну строку-то свернуть?
#45 by mirrr
?
#46 by PVV65
ВЫБРАТЬ    ЗначенияСвойствОбъектов.Объект, ВЫБРАТЬ ВЫБРАТЬ Немного адаптируешь.
#47 by PVV65
Кстати. В 8.2.14 появилась в СКД функция ВычислитьВыражение, которая, если я правильно понял, может делать тоже самое, что и запрос из .
#48 by mirrr
а если у меня для объекта может быть 1 св-во, а может быть и 20, то тогда надо добавлять 20 полей? ...........
#49 by PVV65
Ну если кому то нужен отчет, в ячейке которого через запятую будет перечислено 20 свойств - пиши "КАК Свойство20". А в приведенный запрос будет отображать первые четыре даже если реально 20.
#50 by mirrr
имел ввиду нет ли чего более универсального, т.к. хранить во врем. таблице 20 полей, которые не всегда будут использованы...
#51 by PVV65
Более универсальное в .
#52 by mirrr
кстати про нее - она только числа суммирует?
#53 by PVV65
нет
#54 by mirrr
а какой агрегатной функцией строковые поля суммировать? Сумма?
#55 by mirrr
"сумма" по строковому полю ошибку выдает
#56 by mirrr
ВычислитьВыражение("Количество(НаименованияПоля)",,,"Первая","Последняя") ошибку пишет
#57 by PVV65
У меня не стоит 8.2.14. Поэкспериментировать не могу. - почитай тут и тут -
#58 by mirrr
там вычисляются выражения по полям-ресурсам, про сворачивание строк ничего нет
#59 by PVV65
Функция возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю. Строка(<Выражение>) - Если в качестве параметра передан массив, то функция возвращает строку, содержащую строковые представления всех элементов массива, разделенных символами "; ".
#60 by mirrr
почти сделал запросом , только при соединении ЕстьNULL(Т.Свойство1,"") + " / " + ЕстьNULL(Т.Свойство2,"") + " / " + ЕстьNULL(Т.Свойство3,"") + " / " + ЕстьNULL(Т.Свойство4,"") КАК Поле1 если у свойств тип дата, тогда ест-но к ней символ прибавить нельзя. Пробовал эту дату перевести в строку (Представление, строка), все равно не хочет выводить 01.01.2011 00:00:00/01.02.2011 00:00:00 И кстати из этой даты время не убирается
#61 by PVV65
Собирай строку не в запросе, а в вычисляемом поле в зависимости от типов.
#62 by mirrr
а время как убрать можно?
#63 by mirrr
НАЧАЛОПЕРИОДА пробовал
#64 by PVV65
День(Дата) + Месяц(Дата) + Год(Дата)
#65 by mirrr
ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(Т.Свойство1)="ДАТА" ТОГДА ??? как тип дата в строку перевести
#66 by mirrr
вроде дата 01.01.2011 вернет результат 14?
#67 by PVV65
Строка(День(Т.Свойство1)) + Строка(Месяц(Т.Свойство1)) + Строка(Год(Т.Свойство1))
#68 by mirrr
через Строка пробовал, но в тексте запроса это не работает, опять же непонятно, как какой-то тип (число, дата) преобразовать в строку в самом запросе Есть еще представление, но то же самое будет
#69 by PVV65
Я же те написал в . А еще есть функция "Формат". Читай справку.
#70 by mirrr
в вычисляемых полях нельзя использовать в выражении вычисляемые поля. У меня нужно сначала к дате добавить символ (", "), затем сложить несколько таких полей. Т.е. поле с датой и с символом(",") должно быть готовое уже в запросе, а потом в вычисляемом поле уже несколько таких полей сложить.
#71 by PVV65
В запросе получаешь поля Т.Свойство1 ..... Т.Свойство20. в вычисляемом поле пишешь Формат(Свойство1,"ДЛФ=D") + ", " + ...... + Формат(Свойство20,"ДЛФ=D")
#72 by mirrr
я именно так и сделал. Не устраиваю лишние запятые в случае пустых значений. Поэтому нужна предварительная обработка, чтобы "Свойство1" уже содержало текст "Свойство1, " в случае наличия, и текст "" в случае отсутствия текста в "Свойство1".
#73 by PVV65
Выбор Когда Формат(Свойство1,"ДЛФ=D") = "" Тогда "" Иначе ", " Конец + ...... + Формат(Свойство20,"ДЛФ=D")
#74 by PVV65
А еще есть функция СКД "ЗначениеЗаполнено"
#75 by mirrr
опять только для вычисляемого поля, или и в запросе можно, при описании поля?
#76 by mirrr
единственный минус - последняя запятая всегда выводится
#77 by mirrr
кстати в коде ВТ уничтожать надо, или не обязательно?
#78 by PVV65
в запросе - нет. у меня не выводится. нет.
#79 by mirrr
последняя не выводится, даже если не все 20 свойств заполнены?
#80 by PVV65
Как напишешь - так и будет выводиться.
#81 by mirrr
согласен. но кроме как варианта не знаю, потому и спрашиваю.
#83 by mirrr
можно ли менять размер колонок в скд, не используя макеты? Потому как слишком широкие стандартные колонки.
#84 by PVV65
Колонка "Оформление" в описании полей на закладках "Наборы данных" и "Вычисляемые поля". Или постобработка табличного документа.
#85 by mirrr
"постобработка табличного документа" - это через закладку "макеты"?
#86 by mirrr
то, что через запрос , можно через ВычислитьВыражениеСГруппировкойМассив сделать?
#87 by PVV65
это из встроенного языка. я уже писал, что не знаю, а предполагаю (из описания функции).
#88 by mirrr
ВычислитьВыражениеСГруппировкойМассив пока оставлю. Попробую еще вариант сделать то же через внешний набор данных.
#89 by mirrr
как можно шрифт заголовков полей группировок изменить?
#90 by PVV65
Шрифт заголовков можно изменить в "Макете оформления компоновки данных". Выбор макета осуществляется в настройках компоновки на закладке "Другие настройки". Создать свой макет можно либо в общих макетах ветки конфигурации. либо в другом объекте где возможно создание макетов. При создании макета надо указать тип макета - "Макет оформления компоновки данных". В открывшемся окне редактора макета, за основу возможно взять один из стандартных макетов и отредактировать его.
#91 by mirrr
В какой процедуре нужно этот макет оформления (созданный на основе стандартного) привязывать к компоновщику макета? При нажатии на кнопку "сформировать"? т.е. надо свою кнопку "сформировать" с обработчиком делать?
#92 by PVV65
>>>>>> Выбор макета осуществляется в настройках компоновки на закладке "Другие настройки".
#93 by mirrr
это стандартный макет. Я так понял, чтобы изменить шрифт заголовков полей группировок, нужно создать свой макет оформления и в нем изменить шрифт. А потом программно его подвязать к компоновщику макета. Если не так, поясните.
#94 by PVV65
нет. на основе стандарта. сохраняешь свое. в настройках выбираешь.
#95 by PVV65
если создал макет и дал ему имя, он появится в настройках.
#96 by mirrr
Вы писали, что если в СКД применять несколько наборов данных, то итоги рассчитываются в каждом из них отдельно. Подскажите, если делать не через скд, а просто запросом в модуле отчета, то как результат запроса можно привести  к виду (т.е. чтобы итоговая сумма по всем договорам была равна 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.
#98 by mirrr
-. Создал в разделе макетов отчета макет с типом "Макет оформления компоновки данных". В нем загрузил стандартный макет. Изменил его. Сохранил. Макет в настройках не появился.
#100 by mirrr
+ Подвязал этот макет к компоновщику макета: МакетОформления=ПолучитьМакет("МойМакет"); МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки, МакетОформления); После этого отчет выводится через этот макет. Но в настройках его не нашел, поясните.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С