Имя: Пароль:
1C
1C 7.7
v7: сравнение значений в строках после отбора
0 EvgenyRus31
 
16.04.19
16:12
Добрый день! Подскажите, можно ли после того как заполнил ТЗ и сделал свертку и отбор, сравнить полученные строки между собой по значению(определенному столбцу) и записать цифру в переменную по количеству равную одинаковым значениям в этих строках?

Код отбора после свертки:
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл

Если ПустоеЗначение(Водитель)=0 Тогда
Если Таб.ФИО<>Водитель Тогда
Продолжить;
КонецЕсли;

КонецЕсли;
Если ПустоеЗначение(Марка)=0 Тогда
Если Таб.Марка<>Марка Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
//сравнить как то строки
Если Таб.ДатаРаботы=Таб.ДатаРаботы тогда //сравнивать по этому значению строки
Коллл=Коллл+1;
КонецЕсли;
КонецЦикла;

//Но у меня не работает этот код, подскажите правильное решение.
1 Builder
 
16.04.19
16:15
Правильно сформулированный вопрос - половина ответа.
Что надо то?
2 Сияющий в темноте
 
16.04.19
16:15
таб.датаработы=таб.датаработы - это чего такое?
3 Builder
 
16.04.19
16:16
(2) Как что - обычное условие. Всегда выполняется.
4 Builder
 
16.04.19
16:20
Таб.НоваяКолонка("КолвоФИО");
заполняем все строки Таб.КолвоФИО = 1
сворачиваем
Таб.Свернуть("ФИО","КолвоФИО");
Таб.КолвоФИО - количество уникальных фамилий
Это надо?
5 MadDAD
 
16.04.19
16:21
По ходу нужно подсчитать разные ДатаРаботы.

выгрузить в соседнюю ТЗ, добавить поле Количество, заполнить его единицами и свернуть по "ДатаРаботы" и суммировать по "Количество".
6 Builder
 
16.04.19
16:41
Можно еще через список значений.
СписФИО.Установить(Таб.ФИО,Таб.ФИО);

Потом СписФИО.РазмерСписка()
7 Sserj
 
16.04.19
17:13
Подозреваю что Таб.ФИО это таки строка а Водитель элемент справочника.
8 EvgenyRus31
 
16.04.19
17:14
Нет мне нужно не количество ФИО, а посчитать дни работы сотрудника. В документе могут забивать строки с одинаковой датой. Например работал сотрудник 3.04.19 Вывозил мусор и еще ниже строка 3.04.19 гладил белье. Вот мне чтоб посчитать это за 1 день, нужно эти строки соединить вместе и посчитать сколько строк получится - это и будет отработанные дни. У меня в программе заложено заполнение ТЗ по диапазону дат потом свертка по определенным значением а потом только отбор из этих полученных строк. Вот мне нужно эти полученные строки правильно посчитать.
9 EvgenyRus31
 
16.04.19
17:15
Таб.ФИО это заполненное в ТЗ и оно же выводится на печатную форму отчета, а Водитель это отбор который выбираем в отчете из справочника
10 Sserj
 
16.04.19
17:19
(9) Еще раз. Тип поля Там.ФИО кокой?
11 Builder
 
16.04.19
17:31
(8) Да какая разница, поменяй условия да и все.
Сделай сначала Таб.Свернуть("ФИО,ДатаРаботы")
Потом как в (4)
И получишь сколько дней он работал
12 HawkEye
 
16.04.19
19:11
(8) Сверни по сотруднику и дате, получишь все даты когда сотрудник работал.. дальше добавь новую колонку и заполни её 1-кой, сверни по сотруднику суммируя новую колонку - получишь таблицу:
"Сотрудник"; "Кол-во дней работы"
13 EvgenyRus31
 
17.04.19
08:11
Дело в том, что как мне сворачивать данные после отбора? С документа заполнять ТЗ и сворачивать не получается, так как там данные до отбора. Мне нужно как то сворачивать после отбора, как это сделать?
Код отбора после свертки:
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл

Если ПустоеЗначение(Водитель)=0 Тогда
Если Таб.ФИО<>Водитель Тогда
Продолжить;
КонецЕсли;

КонецЕсли;
Если ПустоеЗначение(Марка)=0 Тогда
Если Таб.Марка<>Марка Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
//сравнить как то строки
Если Таб.ДатаРаботы=Таб.ДатаРаботы тогда //сравнивать по этому значению строки
Коллл=Коллл+1;
КонецЕсли;
КонецЦикла;

//Но у меня не работает этот код, подскажите правильное решение.
14 MadDAD
 
17.04.19
08:39
(13)     ТабДни = СоздатьОбъект("ТаблицаЗначений");
    Таб.Выгрузить(ТабДни,,,"ФИО, Марка, ДатаРаботы");
    ТабДни.НоваяКолонка("КоличествоДней");
    
    ТабДни.ВыбратьСтроки();
    Пока ТабДни.ПолучитьСтроку() = 1 Цикл
        ТабДни.КоличествоДней = 1;
    КонецЦикла;
    
    ТабДни.Свернуть("ФИО, Марка, ДатаРаботы", "КоличествоДней");
    
    ТабДни.ВыбратьСтроки();
    Пока ТабДни.ПолучитьСтроку()=1 Цикл
        
        Если ПустоеЗначение(Водитель)=0 Тогда
            Если ТабДни.ФИО<>Водитель Тогда
                Продолжить;
            КонецЕсли;
        КонецЕсли;
        
        Если ПустоеЗначение(Марка)=0 Тогда
            Если ТабДни.Марка<>Марка Тогда
                Продолжить;
            КонецЕсли;
        КонецЕсли;
        
        Коллл = ТабДни.КоличествоДней
        Прервать;
    КонецЦикла;
15 MadDAD
 
17.04.19
08:41
Только я не понял зачем там марка.

В таблице ТабДни получим сколько дней водитель отработал на какой марке.
16 Злопчинский
 
17.04.19
09:26
автор стучись в скайп Zlopun
пока я толком не проснулся и не готов к большой работе - могу помочь
17 EvgenyRus31
 
17.04.19
10:02
Это один параметр из отборов. Отбирать там можно по Водителю, Марке, Основное средство и т.п. я скинул просто фрагмент этого отбора, так как мне нужно после этих всех отборов свернуть как то по ДатаРаботы и посчитать полученные строки.
18 Builder
 
17.04.19
10:12
(17) Ну напиши уже что нибудь со своими отборами и сверни как тебе надо. Примеров скинули достаточно.
19 EvgenyRus31
 
17.04.19
10:13
MadDAD В вашем коде у вас сначала возьмутся все данные со всех документов и посчитаются все дни, а мне нужно посчитать эти дни уже после отбора. Выбрали в отчете по определенному водителю за определенный период, соответственно должны дни посчитаться только за этот период, только по этому водителю. У меня сейчас считает не правильно, потому что данные берутся с документов с указанного периода игнорируя отбор пользователя, поэтому и получается больше дней показывает, чем отобрано по водителю (
20 EvgenyRus31
 
17.04.19
10:16
Builder Я просто не пойму откуда брать данные для того, чтоб свернуть их? Если возьму сразу с документа, то они будут игнорировать отбор пользователя и тупо посчитает все дни с документов. Мне нужно сворачивать уже после отбора, такое вообще возможно делать или нет? или может пойти нужно другим путем, может выводимые данные в печатную форму отчета можно как то построчно сравнить и все одинаковые посчитать и со всех строк отнять одинаковые и получим правильное количество дней? Но наверное так нельзя (
21 HawkEye
 
17.04.19
10:19
(13) сделай еще одну таблицу в которую занеси результаты отбора.... дальше в ней как написано выше..
22 HawkEye
 
17.04.19
10:20
(19) "берутся с документов с указанного периода "...

берутся ИЗ документов ЗА указанный период....
23 MadDAD
 
17.04.19
10:31
(19) В чем смысл отбора? В приведенном в (0) коде попытка подсчета дат. Но там странное условие, которое всегда истинно - "Если Таб.ДатаРаботы = Таб.ДатаРаботы"

Если в Таб - уже строки с датами за нужный период, тогда мой код посчитает все дни, в разрезе водителя и марки.

Попробуйте его запустить, потом смотрите что не правильно считается.

Можете в отборе вместо сравнения дат складывать значения в другую таблицу, которая будет содержать результаты отбора, результат будет аналогичен тому что я написал.

Обычно если не понятно как что считать - для начала нужно нарисовать себе таблицу в том виде в котором она формируется, и попробовать из этих данных вручную на листочке произвести расчет. А потом уже алгоритмизировать.
24 Mikeware
 
17.04.19
10:35
программиста звать не пробовали?
25 EvgenyRus31
 
17.04.19
10:36
MadDAD запустил ваш код, выдает постоянно цифру 1
26 EvgenyRus31
 
17.04.19
10:37
Mikeware, если я позову программиста, то форумы опустеют. Так что я поддержую контент форумов. Хотите приходите конечно ко мне поможете я не против.
27 MadDAD
 
17.04.19
10:39
(25) Да, извиняюсь. Спросонья ошибся.
Попробуйте вот так:


    ТабДни = СоздатьОбъект("ТаблицаЗначений");
    Таб.Выгрузить(ТабДни,,,"ФИО, Марка, ДатаРаботы");
    
    ТабДни.Свернуть("ФИО, Марка, ДатаРаботы", "");
    
    ТабДни.НоваяКолонка("КоличествоДней");
    ТабДни.ВыбратьСтроки();
    Пока ТабДни.ПолучитьСтроку() = 1 Цикл
        ТабДни.КоличествоДней = 1;
    КонецЦикла;    

    ТабДни.Свернуть("ФИО, Марка", "КоличествоДней");
    
    ТабДни.ВыбратьСтроки();
    Пока ТабДни.ПолучитьСтроку()=1 Цикл
        
        Если ПустоеЗначение(Водитель)=0 Тогда
            Если ТабДни.ФИО<>Водитель Тогда
                Продолжить;
            КонецЕсли;
        КонецЕсли;
        
        Если ПустоеЗначение(Марка)=0 Тогда
            Если ТабДни.Марка<>Марка Тогда
                Продолжить;
            КонецЕсли;
        КонецЕсли;
        
        Коллл = ТабДни.КоличествоДней;
        Прервать;
    КонецЦикла;
28 1Сергей
 
17.04.19
10:40
(27) опять будет 1
29 MadDAD
 
17.04.19
10:46
(28) Почему? Вот с то же самое тестовыми данными.

    ТАб.НоваяСтрока();
    ТАб.ФИО = "Иванов Иван Иванович";
    ТАб.Марка = "Краун";
    ТАб.ДатаРаботы = '02.01.2019';
    
    ТАб.НоваяСтрока();
    ТАб.ФИО = "Иванов Иван Иванович";
    ТАб.Марка = "Краун";
    ТАб.ДатаРаботы = '03.01.2019';


    ТАб.НоваяСтрока();
    ТАб.ФИО = "Петров Иван Иванович";
    ТАб.Марка = "Краун";
    ТАб.ДатаРаботы = '03.01.2019';
    
    ТАб.НоваяСтрока();
    ТАб.ФИО = "Петров Иван Иванович";
    ТАб.Марка = "Краун";
    ТАб.ДатаРаботы = '02.01.2019';
    
    
    
    ТабДни = СоздатьОбъект("ТаблицаЗначений");
    Таб.Выгрузить(ТабДни,,,"ФИО, Марка, ДатаРаботы");
    
    ТабДни.Свернуть("ФИО, Марка, ДатаРаботы", "");
    
    ТабДни.НоваяКолонка("КоличествоДней");
    ТабДни.ВыбратьСтроки();
    Пока ТабДни.ПолучитьСтроку() = 1 Цикл
        ТабДни.КоличествоДней = 1;
    КонецЦикла;    

    ТабДни.Свернуть("ФИО, Марка", "КоличествоДней");

    ТабДни.ВыбратьСтроки();
    Пока ТабДни.ПолучитьСтроку()=1 Цикл
        Сообщить(ТабДни.ФИО + " | " + ТабДни.Марка + " | " + ТабДни.КоличествоДней);
    КонецЦикла;
30 EvgenyRus31
 
17.04.19
10:50
MadDAD Вы волшебник!!! Вам огромнейшее спасибо, все четенько и красиво работает. Анализ вашего кода мне поможет теперь разобраться, как все у меня тут устроено. Вы настоящий специалист!!!!!

P.S.
   Mikeware можете ко мне не приезжать, настоящий специалист и на форуме поможет ;)
31 Sserj
 
17.04.19
11:00
(30) Тестовые данные из (29) показывают то что было сказано вчера в (7).
ФИО - строка она не может быть равна ссылке на объект ни при каких условиях.
И код из (29) сломается сразу же как появятся однофамильцы, а манагеры долго будут думать почему это столько начисляется.
32 EvgenyRus31
 
17.04.19
11:11
Sserj   "ФИО","Справочник.Сотрудники"
33 Злопчинский
 
17.04.19
11:15
а мне вот в душу плюнули
34 EvgenyRus31
 
17.04.19
11:16
Злопчинский Кто плюнул и как?
35 EvgenyRus31
 
17.04.19
11:21
MadDAD

Подскажите для подсчета дней нужно отдельно отбор делать или можно будет его встроить в уже существующий?
36 MadDAD
 
17.04.19
11:58
(35) Без исходных данных вообще сложно сказать. Я дал пример как из того что представлено в (0) получить количество уникальных дней. Не понятно отбор чего и из чего, какой набор данных. Пока что у нас получается "дай мне то не знаю что".
37 MadDAD
 
17.04.19
11:58
(31) Не, тут чисто моя догадка про строку. В ФИО может быть все что угодно :)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс