Имя: Пароль:
1C
1С v8
Отбор в ТЗ
, ,
0 ikbokov
 
18.06.14
15:35
из ЖР вытаскиваем пользователей кто сидит с одного компа, в итоге получаем ТЗ: колонки имя компа, пользователь. Хочу сделать красиво и потереть строчки с компами которые встречаются один раз за всю таблицу.
Как отобрать все уникальные значения в колонке? Конструктивная критика кривизны написания приветствуется)

Процедура КнопкаВыполнитьНажатие(Кнопка)
         
    Фильтр = Новый Структура("ДатаНачала, ДатаОкончания");
    Фильтр.ДатаНачала = НачПериода;
    Фильтр.ДатаОкончания  = КонПериода;
        
    ТЗ = Новый ТаблицаЗначений;
    ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Дата, ИмяПользователя, Компьютер, Сеанс");    
    ТЗ.Сортировать("ИмяПользователя Возр,Дата Возр");
        
    Счетчик = 0;
    Пока Счетчик < (ТЗ.Количество()-1)Цикл
        СтрокаПольз = ТЗ.Получить(Счетчик);
        Если СтрокаПольз.ИмяПользователя = ТЗ.Получить(Счетчик+1).ИмяПользователя
    И  СтрокаПольз.Компьютер = ТЗ.Получить(Счетчик+1).Компьютер Тогда
            ИндексСтр = ТЗ.Индекс(СтрокаПольз);
            ТЗ.Удалить(ИндексСтр);
        Иначе
            Счетчик = Счетчик + 1;
        КонецЕсли;
    КонецЦикла;
    
    ТЗ.Сортировать("Компьютер");    
    
    ТЗ.ВыбратьСтроку();
КонецПроцедуры
1 Maxus43
 
18.06.14
15:37
запросом делай, группируй, итоги навешивай, условия
2 ikbokov
 
18.06.14
15:39
(1) эх, а так хотелось парой строчек отделаться, спасибо)
3 Maxus43
 
18.06.14
15:43
(2) в запросе как раз меньше будет.
используюя ИМЕЮЩИЕ - вычисляются все компы встречающиеся 1 раз, потом по списук удалишь. Или просто отбор на них поставь
4 ikbokov
 
19.06.14
12:16
Ругается на первый запрос что "Тип не может быть выбран в запросе", Но я же правильно понимаю что ВыгрузитьЖурналРегистрации создает ТЗ с типизированными колонками? где косяк?

Как-то так:

Запрос = Новый Запрос;
    Запрос.Текст = "
        |ВЫБРАТЬ
        |    ТЗ.ИмяПользователя Пользователь,
        |    ТЗ.Компьютер Компьютер
        |ПОМЕСТИТЬ ВТЗ
        |ИЗ &ТЗ ТЗ";
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("ТЗ",ТЗ);
    Запрос.Выполнить();    
    
    Запрос2 = Новый Запрос;
    Запрос2.Текст = "
        |ВЫБРАТЬ
        |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТЗ.Пользователь) Пользователь,
        |    ВТЗ.Компьютер
        |ИЗ ВТЗ ВТЗ
        |СГРУППИРОВАТЬ ПО
        |ВТЗ.Компьютер";
    Запрос2.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
    Результат = Запрос2.Выполнить();
    ТЗ2 = Результат.Выгрузить();
                
    ТЗ2.ВыбратьСтроку();
5 Фокусник
 
19.06.14
12:25
(4) "создает ТЗ с типизированными колонками? где косяк? "

Возможно, там тип "строка неограниченной длины", тогда нужно в запросе её через ВЫРАЗИТЬ(... КАК СТРОКА (...))
6 Fragster
 
гуру
19.06.14
12:28
(4) там колонка Пользователь - уникальныйИдентификатор. Он разве может быть выбран в запросе? Ну и про строку неограниченной длины, по которой группировать нельзя, надо Выразить() как в (5)
7 ikbokov
 
19.06.14
12:32
(5) Спасибо, ща попробую
(6) Колонка ИмяПользователя, у нее тип Строка тоже
8 Fragster
 
гуру
19.06.14
12:33
(7) Попутал с "Пользователь"
9 ikbokov
 
19.06.14
12:40
|ВЫБРАТЬ
        |    ВЫРАЗИТЬ(ТЗ.ИмяПользователя как Строка (100)) ИмяПользователя,
        |    ВЫРАЗИТЬ(ТЗ.Компьютер как Строка (30)) Компьютер

Ругается теперь что
Несовместимые типы "ВЫРАЗИТЬ"
<<?>>ВЫРАЗИТЬ(ТЗ.ИмяПользователя как Строка (100)) ИмяПользователя,
10 Kamas
 
19.06.14
12:55
(0) как вариант можно без запроса скопировать таблицу добавь колонку в тз  Заполнить "1" свернуть по пользователю отбор по добавленной колонке на 1 у тебя есть список пользователей которые встречаются один раз удалить строки из исходной таблицы с этими пользователями
11 Рэйв
 
19.06.14
13:03
(0) КАк вариант


1.Сделай копию своей ТЗ всторонке.
2.Через .НайтиСтроки(Новый Структура("<ИменаОтборов>",<значения отборов>)) получи массив нужных строк.
3. Уддали из ТЗ те строки, которые не входят в массив.

При смене значений отборов, скопируй эталонную ТЗ из п.1 в ту, с которой работаешь и дальше начиная с п.2
12 ikbokov
 
19.06.14
13:26
(11) а на (9) есть мысли? я думал запросами определить нужные компы и потом отбором из тз их вытащить просто
13 Рэйв
 
19.06.14
13:28
(12)В запросе к ТЗ много всяких ограничений.
14 Рэйв
 
19.06.14
13:28
(12).НайтиСтроки как раз и вытаскивает то что тебе надо
15 Kamas
 
19.06.14
13:45
(11) отбор на уникальность как обеспечить??
16 ikbokov
 
19.06.14
15:04
По поводу(9) :
Решил проблему через Ж)):

Массив1 = Новый Массив;
    Массив1 = ТЗ.ВыгрузитьКолонку("Компьютер");
    
    Массив2 = Новый Массив;
    Массив2 = ТЗ.ВыгрузитьКолонку("ИмяПользователя");
        
    ТаблЗН = Новый ТаблицаЗначений;
    ТаблЗН.Колонки.Добавить("Компьютер", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(30)));
    ТаблЗН.Колонки.Добавить("ИмяПользователя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100)));        
    
    Для Н=1 По Массив1.Количество() Цикл
        ТаблЗН.Добавить();
    КонецЦикла;

    ТаблЗН.ЗагрузитьКолонку(Массив1,"Компьютер");
    ТаблЗН.ЗагрузитьКолонку(Массив2,"ИмяПользователя");
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший