Имя: Пароль:
1C
1С v8
Получить таблицу значений после наложения отбора
,
0 ildary
 
10.06.15
13:00
Уважаемые специалисты, посоветуйте пожалуйста, как правильно сделать следующее - на форму выведена таблица значений, на которой пользователь может сделать отбор, например через поиск или через .ОтборСтрок

Как правильно получить строки, которые в данный момент видны у данной таблицы значений? Если перебирать сам объект ТЗ - то в нем будут и те строки, которые не видно. Я нагуглил метод ПроверитьСтроку() - но для его работы придется перебирать 2 ТЗ (на форме и ТЗ-источник данных). Есть ли способ проще?
1 DmitrO
 
10.06.15
13:14
МассивОбобранныхСтрок = ТЗ.НайтиСтроки(Элементы.ТЗ.ОтборСтрок);
наверно так?
2 palpetrovich
 
10.06.15
13:14
Ну дык, наверное
Строки = ТЗ.НайтиСтроки(Отбор);
Для инд=1 по Строки.Количество() Цикл
Строка = Строки[инд]
...
3 ildary
 
10.06.15
13:24
(1)+(2) а если отбор был через поиск, а не ОтборСтрок()?
4 ДенисЧ
 
10.06.15
13:28
такая фигня делается через построитель запроса / отчёта.
С внешними данными и копированием отбора ТП в построитель
5 palpetrovich
 
10.06.15
13:29
(3) а "Элементы.ТЗ.ОтборСтрок" разве не все-равно как именно был сделан отбор?
6 DmitrO
 
10.06.15
13:33
(3)на сколько я знаю, тогда никак, это одна из вещей которую уже давно "предъявляют 1С", а они забили..
7 DmitrO
 
10.06.15
13:50
как вариант решения, можно немного изменить принципам обработки..
строки отбираются явно для какой-то операции над ними, так вот, суть изменения в следующем:
- а после поиска (который в УФ выглядит как отбор), заставить пользователей нажимать Ctrl+A (т.е. выделить все), выделяются какраз таки отобраные;
- а эту операцию нужно делать всегда для выделенных строк;
8 DmitrO
 
10.06.15
13:52
(7)+ научить их выделять строки также с Shift и Ctrl.
9 ildary
 
10.06.15
13:55
(6) если соавтор 1с++ и формекса говорит мне, что никак, то мне остается только пойти поплакать...

(7)+(8) а программно вызвать CTRL+A и снять выделение можно?
10 ОператорПК
 
10.06.15
13:55
(4) + 1
11 DirecTwiX
 
10.06.15
13:56
Функция ПолучитьСтрокиСОтбором(ТолькоВыбранные = Ложь)
    Построитель = Новый ПостроительЗапроса;
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(РеглОтчеты);
    Для каждого ЭлементОтбора Из ЭлементыФормы.РеглОтчеты.ОтборСтрок Цикл  
        Если ЭлементОтбора.Использование Тогда
            НовыйЭлемент = Построитель.Отбор.Добавить(ЭлементОтбора.ПутьКДанным, ЭлементОтбора.Имя, ЭлементОтбора.Представление);
            НовыйЭлемент.ВидСравнения = ЭлементОтбора.ВидСравнения;
            НовыйЭлемент.Значение = ЭлементОтбора.Значение;
            НовыйЭлемент.ЗначениеС = ЭлементОтбора.ЗначениеС;
            НовыйЭлемент.ЗначениеПо = ЭлементОтбора.ЗначениеПо;
            НовыйЭлемент.Использование = Истина;
        КонецЕсли;
    КонецЦикла;
    Если ТолькоВыбранные Тогда
        Эл = Построитель.Отбор.Найти("Пометка");
        Если Эл<>Неопределено Тогда
            Если Эл.Использование и ((Эл.Значение = Ложь и Эл.ВидСравнения = ВидСравнения.Равно) ИЛИ (Эл.Значение = Истина и Эл.ВидСравнения = ВидСравнения.НеРавно)) Тогда
                Возврат Новый Массив;
            Иначе
                Эл.Использование = Истина;  
                Эл.ВидСравнения = ВидСравнения.Равно;
                Эл.Значение = Истина;
            КонецЕсли;     
        Иначе
            НовыйЭлемент = Построитель.Отбор.Добавить("Пометка");
            НовыйЭлемент.ВидСравнения = ВидСравнения.Равно;
            НовыйЭлемент.Значение = Истина;
            НовыйЭлемент.Использование = Истина;
        КонецЕсли;     
    КонецЕсли;
    
    Результат = Построитель.Результат; //отобранные строки типа РезультатЗапроса

    ВыборкаТоварыСОтбором = Результат.Выбрать();    
    
    Строки = Новый Массив;
    Отбор = Новый Структура("НомерСтроки");
    Для каждого Стр Из РеглОтчеты Цикл
        Отбор.НомерСтроки = Стр.НомерСтроки;
        ВыборкаТоварыСОтбором.Сбросить();
        Если ВыборкаТоварыСОтбором.НайтиСледующий (Отбор) Тогда
            Строки.Добавить(Стр);    
        КонецЕсли;
    КонецЦикла;
    Возврат Строки;
КонецФункции
12 ОператорПК
 
10.06.15
13:56
Постр=Новый ПостроительЗапроса;
    Постр.ИсточникДанных=Новый ОписаниеИсточникаДанных(ТабличноеПоле1);
    Постр.Выполнить();
    РРР=Постр.Результат.Выгрузить();
13 DmitrO
 
10.06.15
14:00
(9)на счет формекса я тут не причем, зря меня в савторы записал.. а по 1с++, да, был грех :)
14 Живой Ископаемый
 
10.06.15
14:02
2(12) +100500
15 DmitrO
 
10.06.15
14:05
(14) мы тут вроде про УФ говорим
16 DmitrO
 
10.06.15
14:07
на ОФ, да можно так: (12)
17 DirecTwiX
 
10.06.15
14:09
(12) Фигня.
Откуда построитель узнает про отбор ТЧ?
18 DmitrO
 
10.06.15
14:10
(9)программно снять выделение, это просто очистить выделенные строки у ТаблицыФормы, ну или оставить там одну, например первую.
19 Михаил Козлов
 
10.06.15
14:44
В ОФ для ТЧ использовал построитель, для ТЗ - ПроверитьСтроку().
20 DirecTwiX
 
10.06.15
15:05
(19) И как в построитель засунуть ТЧ?
21 palpetrovich
 
10.06.15
15:35
Обфчнве формы, ТабЧасть - на форме обработки. МассивСтрок получается согласно отбору:

Отбор = Новый Структура();
Для каждого ЭлементОтбора Из ЭлементыФормы.ТабЧасть.ОтборСтрок Цикл  
    Если ЭлементОтбора.Использование Тогда
        Отбор.Вставить(ЭлементОтбора.Имя, ЭлементОтбора.Значение);            
    КонецЕсли;
КонецЦикла;
МассивСтрок = ТабЧасть.НайтиСтроки(Отбор);
Для инд=0 по МассивСтрок.Количество()-1 Цикл
   ТекЗнач = МассивСтрок[инд];
КонецЦикла;
22 ЧеловекДуши
 
10.06.15
15:41
(21) А на УФ не получается согласно отбору :)
23 palpetrovich
 
10.06.15
15:42
(22) на УФ "я не в курсе" (цы) :)
24 DirecTwiX
 
10.06.15
15:48
(21) Ну либо почти получается, если там неравенства есть)

(22) К счастью)
25 Живой Ископаемый
 
10.06.15
16:01
2(17) Сначала попробуй, а потом уже будешь говорить "фигня".
26 palpetrovich
 
10.06.15
16:12
(25)  а что пробовать?  РРР получится без отбора
27 Михаил Козлов
 
10.06.15
16:14
(20) Похоже, наврал: нашел только для списков (документов, регистров).
28 Classic
 
10.06.15
16:31
(26)
Дык отбор в построитель тоже не мешало бы передать
29 palpetrovich
 
10.06.15
16:45
(28) дык, речь за (12) ;)
30 ildary
 
10.06.15
22:26
Большое спасибо всем помогавшим, таки сделал через выделенные строки, причем получилось сделать без требования к оператору нажимать Ctrl+A, вот так:

    Попытка
        
        Скрипт = Новый COMОбъект( "MSScriptControl.ScriptControl" );
        Скрипт.Language = "vbscript";
        
        Скрипт.AddCode( "
        |Sub RunSendKey()
        |   Set WSHShell = CreateObject( ""WScript.Shell"" )
        |   WshShell.SendKeys ""^A""
        |End Sub
        |" );
        
        Скрипт.Run( "RunSendKey" );
        
    Исключение
    КонецПопытки;


только почему-то при первом вызове происходит выделение всех строк, но фактически выделенной (для программы) остается одна строка, при повторном нажатии на кнопку - раз уже все строки таблицы выделены - отрабатывается вся видимая таблица. Попробовал в скрипт вставить строку WScript.Sleep 300 - ругается на ошибку и не выполняется.