Имя: Пароль:
1C
1С v8
Как бы вывести КоличествоРазличных в подвал?
0 Lenka_Boo
 
23.08.12
11:33
Что-то не могу сообразить как этому подступиться...

Дано:
Табличное поле в документе на обычной форме.
Есть подвал с итогами (естественно только по числовым колонка).

Нужно:
Чтоб в итоге колонки, где данные подбираются из справочника, показывалось КоличествоРазличных.

Дополнительная сложность:
В табличном поле есть возможность использования фильтра, т.е. отбора и сортировки строк, который не влияет на ТабличнуюЧасть документа.
Нужно, чтоб КоличествоРазличных считалось с учетом этих отборов.
1 Lenka_Boo
 
24.08.12
07:23
Вообще никаких идей нет?
2 ZloyProger
 
24.08.12
07:40
(1) Почему нет? В процедуру ПриОбновленииОтображения() засунуть запрос с учетом отбора в списке и все.
3 ZloyProger
 
24.08.12
07:40
+(2) Хотя не айс, тормозить будет..
4 ZloyProger
 
24.08.12
07:42
Мдя.. (2) и (3) удалить, невнимательно прочитал( Сорри.. Ща покумекаю, мб чего и подскажу дельного, решал нечто подобное.
5 Lenka_Boo
 
24.08.12
07:43
(2) Как перехватить какой отбор использовали?
Мне пока еще перебор в цикле предложили... :\
6 ZloyProger
 
24.08.12
07:44
(5) Какой тип у табличного поля? Что в нем?
7 Lenka_Boo
 
24.08.12
07:47
(6) Справочник
8 ZloyProger
 
24.08.12
07:47
(7) Справочник.Список мб?)
9 Lenka_Boo
 
24.08.12
07:49
(7) Тьфу.
Колонка Тип данных справочник.
Табличное поле - табличная часть документа.
10 Lenka_Boo
 
24.08.12
07:51
+(9) Отборы, соответственно, на данные не влияют. Это сделано чтобы проще было ориентироваться на простыне в 400-500 строк.
11 Zmich
 
24.08.12
07:51
Запросом можно:

ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...)
12 ZloyProger
 
24.08.12
07:53
(10) А.. А то я уже голову сломал) А как фильтры накладываются?
13 kn
 
24.08.12
07:53
Вот пример для ТЧ Номенклатура и ТЗ Номенклатура
Процедура НоменклатураПриПолученииДанных(Элемент, ОформленияСтрок)

   КолвоСтрокВОтборе = 0;
   Для Каждого Стр Из Номенклатура Цикл
       Если ЭлементыФормы.Номенклатура.ПроверитьСтроку(Стр)                     Тогда
           КолвоСтрокВОтборе = КолвоСтрокВОтборе + 1;
       КонецЕсли;    
   КонецЦикла;    

   ЭлементыФормы.Надпись3.Заголовок = Строка(КолвоСтрокВОтборе);

КонецПроцедуры
14 kn
 
24.08.12
07:55
вот только не различных это а всего
15 Lenka_Boo
 
24.08.12
07:56
(12) На командной панели типовые кнопочки. Действие: "Установить отбор и сортировку списка",  "Отбор по значению"  и т.д.
16 Лоботряс
 
24.08.12
08:02
сделать как в (13), только из каждой строки ссоответсвующей отбору сохранять значение нужного реквизита в массив, потом сделать запрос к этому массиву и посчитать в нем количестово Различные.
17 Lenka_Boo
 
24.08.12
08:04
Я пока не нашла способа выгрузить строки отбора куда-либо...
18 ZloyProger
 
24.08.12
08:07
(17) Только циклом перебирать имхо и проверять на Использование, если истина - исходя из ВидаСравнения добавляешь условие к запросу.
19 Лоботряс
 
24.08.12
08:08
А выгружать и не надо, ты циклом обходишь всю таб цасть построчно и методом ПроверитьСтроку() проверяешь соответсвует ли она отбору. если да то значение реквизита добавляешь в массив
20 tdm
 
24.08.12
08:08
(17) в ответ (13)
метод - ПроверитьСтроку()
21 Лоботряс
 
24.08.12
08:08
(19)+значение колонки  строки
22 Lenka_Boo
 
24.08.12
08:09
Хотелось бы менее громоздкий способ. Хотя бы перехватить условия отбора, а потом запросом по ТЧ.
23 kn
 
24.08.12
08:12
(17)не надо никуда выгружать, надо заменить
Для Каждого Стр Из Номенклатура Цикл на
Для Каждого Стр Из ЗдесьИмяТабличнойЧастиДок Цикл
, а  Если ЭлементыФормы.Номенклатура.ПроверитьСтроку(Стр)                     Тогда на
Если ЭлементыФормы.ЗдесьимяТабличногоПоля.ПроверитьСтроку(Стр)                     Тогда
Внутри цикла можно складывать нужную колону в какую нибудь доп ТЗ,
после ее свернуть и получить кол-во строк.
Вот это ЭлементыФормы.ЗдесьимяТабличногоПоля.ПроверитьСтроку(Стр) проверяет принадлежность отбору.
24 tdm
 
24.08.12
08:13
(22) событие НоменклатураПриПолученииДанных() и так птимальнее ПриОбновленииОтображения()  или ПриВыводеСтроки() всё норм должно быть
25 Лоботряс
 
24.08.12
08:19
(22)Это очень простой способ. Ну в принципе можно и условия отбора обходить и запоминать,а потом ТабличнаяЧасть.НайтиСтроки(ПараметрыОтбора) сделать, но так будет работать только если в отборе все условия на равенство установлены.
26 Лоботряс
 
24.08.12
08:23
(25)+или запрос конструируемый делать. Все равно первый  - самый оптимальный способ на мой взгляд.
27 Lenka_Boo
 
24.08.12
15:45
Сделала так:

Процедура ОбработатьИзменениеОтбора()

   ПостроительОтчета = Новый ПостроительОтчета;
   ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ЭлементыФормы.МояТабличка.Значение.Выгрузить());
   ПостроительОтчета.ИсточникДанных.Колонки.НомерСтроки.Итог = "Количество(НомерСтроки)";
   ПостроительОтчета.ИсточникДанных.Колонки.МояКолонка.Итог = "Количество (Различные МояКолонка)";
           ЗаполнитьЗначенияСвойств(ПостроительОтчета.Отбор, ЭлементыФормы.МояТабличка.ОтборСтрок);
           
   ПостроительОтчета.ЗаполнитьНастройки();
   ПостроительОтчета.Выполнить();
   Дерево = ПостроительОтчета.Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
   ЭлементыФормы.МояТабличка.Колонки.НомерСтроки.ТекстПодвала = Дерево.Строки[0].НомерСтроки;
   ЭлементыФормы.МояТабличка.Колонки.МояКолонка.ТекстПодвала = Дерево.Строки[0].МояКолонка;

КонецПроцедуры


Куда бы это еще запихнуть, чтоб работало только при изменении количества строк?
в ПриОбновленииОтображения() и ОбновлениеОтображения() работают на каждый поворот колеса мышки.
28 ptiz
 
24.08.12
15:48
в ПриПолученииДанных
29 ptiz
 
24.08.12
15:50
да, еще в ПриАктивизацииСтроки, но вставить проверку на последний сделанный отбор:

   ТекущийОтбор = ЗначениеВСтрокуВнутр(Элемент.ОтборСтрок);
   Если мПоследнийОтборСтрокТоваров = Неопределено
       ИЛИ мПоследнийОтборСтрокТоваров <> ТекущийОтбор Тогда
.....заново считаем что надо

       мПоследнийОтборСтрокТоваров = ТекущийОтбор;
30 Lenka_Boo
 
24.08.12
16:07
Ок. Спасибо! Сообразила. :)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.