|
СКД. Как подсчитать количество строк результата? | ☑ | ||
---|---|---|---|---|
0
SeiOkami
27.11.14
✎
08:36
|
Здравия всем.
Подскажите, как можно при программном выводе подсчитать количество строк результата выполнения СКД? Сейчас это происходит путём формирования отчета сначала в ТЗ (для подсчета количества), а затем уже в ТабДокумент. Это бредово - дважды выполняется СКД. Можно как-то нормально получить количество строк без таких махинаций? |
|||
1
Wobland
27.11.14
✎
08:37
|
на зачем?
|
|||
2
Heckfy
27.11.14
✎
08:37
|
Количество (*) Как Колич
|
|||
3
SeiOkami
27.11.14
✎
08:38
|
(2), добавлять спец поле количества строк и выводить в результат? По-момему, это тоже не ахти. Плюс, пользователи могут его отключить
|
|||
4
SeiOkami
27.11.14
✎
08:39
|
(1), какой странный вопрос. Надо же
|
|||
5
Wobland
27.11.14
✎
08:40
|
(4) ну да
|
|||
6
ДенисЧ
27.11.14
✎
08:41
|
"Зачем" ещё не спрашивали? ))
|
|||
7
Heckfy
27.11.14
✎
08:43
|
И это, а чем служебное поле № строки не устраивает?
|
|||
8
SeiOkami
27.11.14
✎
08:43
|
Ок. Никогда не понимал зачем постоянно спрашивать "зачем". >_>
Мне нужно в конкретное поле на форме вывести количество строк |
|||
9
SeiOkami
27.11.14
✎
08:44
|
(7), ответ тот же (3).
|
|||
10
Wobland
27.11.14
✎
08:45
|
(8) вперёд
|
|||
11
SeiOkami
27.11.14
✎
08:47
|
(10), предложения есть? Без глупостей про "да это негому не нушна!"
|
|||
12
Heckfy
27.11.14
✎
08:48
|
На закладке Ресурсы добавь поле по которому количество хочешь считать.
|
|||
13
SeiOkami
27.11.14
✎
08:50
|
(12), -> (9) -> (3)
Уже предлагали подобное. Но для этого нужно это самое поле выводить в результат, а оно там никому не нужно. Даже если условным оформлением его закрасить, то его могут отключить пользователи. Да и не гибко. |
|||
14
SeiOkami
27.11.14
✎
08:51
|
Неужели нет нормального способа\метода для СКД? 0_о
|
|||
15
Heckfy
27.11.14
✎
08:52
|
Ну так запрети пользователям его отключать.
|
|||
16
SeiOkami
27.11.14
✎
08:53
|
(15), естественно это не выход. Костыль ещё тот
|
|||
17
ам794123
27.11.14
✎
08:53
|
(0) Например так:
Создаешь пользовательское поле "КоличествоСтрок". На закладке Выражение итоговых записей прописываешь формулу: Сумма(ВычислитьВыражениеСГруппировкойМассив("1", "КакоеТоПолеОтчета")) |
|||
18
SeiOkami
27.11.14
✎
08:54
|
(17),
(12) -> (9) -> (3) Уже отвечал )) "Уже предлагали подобное. Но для этого нужно это самое поле выводить в результат, а оно там никому не нужно. Даже если условным оформлением его закрасить, то его могут отключить пользователи. Да и не гибко." |
|||
19
Heckfy
27.11.14
✎
08:56
|
||||
20
SeiOkami
27.11.14
✎
08:58
|
(19), мне не нужно выводить в подвал таблицы. Мне нужно получить его программно и загнать в переменную
|
|||
21
Heckfy
27.11.14
✎
09:01
|
Юзай
Сч=0; Пока Выборка.Следующий Цикл Сч=Сч+1; КонецЦикла; ТвояПеременная=Сч; Универсальный механизм!!! |
|||
22
SeiOkami
27.11.14
✎
09:04
|
(21), причем тут вообще выборка? У меня СКД
|
|||
23
Лефмихалыч
27.11.14
✎
09:06
|
(0) в отдельную группировку вывести вычисляемое поле, которое вычисляет Количество(*) пробовал?
|
|||
24
SeiOkami
27.11.14
✎
09:08
|
(23)
Эх... (18) -> (12) -> (9) -> (3) Уже отвечал |
|||
25
ifso
27.11.14
✎
09:08
|
(20) переменная где/как объявляется?
|
|||
26
SeiOkami
27.11.14
✎
09:10
|
(25), а это важно? В момент программного формирования СКД.
|
|||
27
ам794123
27.11.14
✎
09:29
|
Тогда как-то так:
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КоличествоСтрок = ТаблицаЗначений.Количество(); |
|||
28
SeiOkami
27.11.14
✎
09:31
|
(27), эмм.... Я ведь об этом писал в (0) =)
|
|||
29
mikecool
27.11.14
✎
09:37
|
Пробуй так
КоличествоСтрокРезультатаВыполненияСКД= Новый ПроцессорРасчетаКоличестваСтрокРезультатаВыполненияКомпоновкиДанныхВМоюПеременнуюИЧтобПользовательНеСмогОтключитьБыстроНах(ПроцессорКомпоновки) |
|||
30
batman69
27.11.14
✎
09:38
|
Почитаешь тему... ТС молодой и грубый.
|
|||
31
Wobland
27.11.14
✎
09:38
|
(29) Нуралиев сейчас подпрыгнул от зависти
|
|||
32
batman69
27.11.14
✎
09:39
|
(29) +100500
|
|||
33
ам794123
27.11.14
✎
09:45
|
А если так: МакетКомпоновки.Тело.Получить(1).КоличествоЗаписей
|
|||
34
SeiOkami
27.11.14
✎
09:50
|
(33), к сожалению, тоже нет =(
КоличествоЗаписей (RecordsCount) Использование: Чтение и запись. Описание: Тип: Число. Указывает количество записей, отображаемых в группировке. Доступность: Сервер, толстый клиент, внешнее соединение. Примечание: Если значение равно -1, выводятся все записи. |
|||
35
ifso
27.11.14
✎
09:53
|
(31) всенепременно юзая "СделатьФсё" чего подпрыгивать?)
|
|||
36
ИС-2
naïve
27.11.14
✎
09:54
|
(0) Если используется программный вывод, то использовать вместо Вывести() ВывестиЭлемент() и при каждом выводе увеличивать счетчик.
Другой вариант добавить Вычисляемое поле "Кол-во элементов" с выражением "количество(массив(ИмяПоляПоКоторомуМожноПодсчитатьКоличество))" Чтобы пользователи не отключили поле в событии "ПриКомпоновке" искустевенно его добавлять и в условном оформлении выключать видимость |
|||
37
Timon1405
27.11.14
✎
09:56
|
ПроцессорВывода.НачатьВывод();
Элемент = ПроцессорКомпоновкиДанных.Следующий(); Сч=1; Пока Элемент<>Неопределено Цикл ПроцессорВывода.ВывестиЭлемент(Элемент); Если Элемент.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец Тогда // ниже нет детальных записей // Если <еще какое-нибудь условие, которое поможет понять, что выводится детальная запись, хз может по макету связаться> Тогда Сч=Сч+1; // КонецЕсли; КонецЕсли; Элемент=ПроцессорКомпоновкиДанных.Следующий(); КонецЦикла; ПроцессорВывода.ЗакончитьВывод(); |
|||
38
Timon1405
27.11.14
✎
09:57
|
(36) группировки тоже считаться будут, а нужны только детальные записи
|
|||
39
Wobland
27.11.14
✎
09:59
|
(38) группировки он тоже хочет, раз ТЗ считает
|
|||
40
SeiOkami
27.11.14
✎
11:25
|
Функция СформироватьКакСКД(СтрокаПравила)
{...} МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, КомпоновщикДляВыполнения.Настройки, ДанныеРасшифровки,,Тип("ГенераторМакетаКомпоновкиДанных")); МассивИменМакетовДетальныхЗаписей = ИменаМакетовДетальныхЗаписей(МакетКомпоновки); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки,Истина); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; РезультатТабДок = Новый ТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(РезультатТабДок); ПроцессорВывода.НачатьВывод(); КоличествоСтрок = 0; Пока Истина Цикл ЭлементРезультата = ПроцессорКомпоновкиДанных.Следующий(); Если ЭлементРезультата= Неопределено Тогда Прервать; Иначе Если МассивИменМакетовДетальныхЗаписей.Найти(ЭлементРезультата.Макет) <> Неопределено Тогда КоличествоСтрок = КоличествоСтрок + 1; КонецЕсли; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); КонецЕсли; КонецЦикла; ПроцессорВывода.ЗакончитьВывод(); КонецФункции Функция ИменаМакетовДетальныхЗаписей(МакетКомпоновки, ИмяИтератора = "Тело") МассивЭлементов = Новый Массив; МассивИменМакетовДетальныхЗаписей = Новый Массив; Для Каждого Тело Из МакетКомпоновки.Тело Цикл ТипТела = ТипЗнч(Тело); Если ТипТела = Тип("ЗаписиМакетаКомпоновкиДанных") Тогда МассивЭлементов.Добавить(Тело); ИначеЕсли ТипТела = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда врМассивИменМакетовДетальныхЗаписей = ИменаМакетовДетальныхЗаписей(Тело); Для Каждого врЭлемент Из врМассивИменМакетовДетальныхЗаписей Цикл МассивИменМакетовДетальныхЗаписей.Добавить(врЭлемент); КонецЦикла; ИначеЕсли ТипТела = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда врМассивИменМакетовДетальныхЗаписей = ИменаМакетовДетальныхЗаписей(Тело, "Строки"); Для Каждого врЭлемент Из врМассивИменМакетовДетальныхЗаписей Цикл МассивИменМакетовДетальныхЗаписей.Добавить(врЭлемент); КонецЦикла; КонецЕсли; КонецЦикла; Для Каждого ЭлементДетальныхЗаписей Из МассивЭлементов Цикл Для Каждого МакетДетальныхЗаписей Из ЭлементДетальныхЗаписей.Тело Цикл МассивИменМакетовДетальныхЗаписей.Добавить(МакетДетальныхЗаписей.Макет); КонецЦикла; КонецЦикла; Возврат МассивИменМакетовДетальныхЗаписей; КонецФункции |
|||
41
SeiOkami
27.11.14
✎
11:26
|
(37), спасибо! Самый дельный совет.
Правда проверка не детальные записи таким образом не сработала. Нашел только способ в (40). Пока работает... |
|||
42
SeiOkami
27.11.14
✎
11:28
|
Понятно, что можно написать красивее, просто это то, что я сейчас накидал по-быстрому
|
|||
43
mikecool
27.11.14
✎
11:29
|
(42) замерь время формирования (40) и простого вычисляемого поля
|
|||
44
SeiOkami
27.11.14
✎
12:04
|
(43), не забывай о том, что подход в (40) сработает всегда, а вычисляемое поле - можно только надеяться.
Если, конечно, нет нюансов, которые я не учёл. Но пока что не нашел. |
|||
45
DrZombi
гуру
27.11.14
✎
12:14
|
(3) Оно есть
|
|||
46
DrZombi
гуру
27.11.14
✎
12:17
|
(11) Оно есть в стандартных полях "Номер строки" и "Номер строки в группе"
Если интересует "Итого строк в группе", тогда реализуй подсчет кол строк в той или иной группе, через Дополнительный набор данных. Только связку придумай. Или в Запросе посчитай :) |
|||
47
DrZombi
гуру
27.11.14
✎
12:17
|
(40) Извращенец, спасибо, но мы как нить без этой глупости :)
|
|||
48
SeiOkami
27.11.14
✎
12:28
|
(47), если есть варианты без этой глупости, то буду рад
|
|||
49
Apollo 11
03.12.14
✎
16:08
|
В СКД Вкладка "Настройки" -"Выбранные поля" смотри окно "Доступные поля", там в папке "Системные поля" есть то, что тебе нужно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |