Имя: Пароль:
1C
 
СКД. Как подсчитать количество строк результата?
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
В СКД Вкладка "Настройки" -"Выбранные поля"  смотри окно "Доступные поля", там в папке "Системные поля" есть то, что тебе нужно.
Закон Брукера: Даже маленькая практика стоит большой теории.