Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: сравнение значений в строках после отбора

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

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

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

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

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

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

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

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

КонецЕсли; 
Если ПустоеЗначение(Марка)=0 Тогда 
Если Таб.Марка<>Марка Тогда 
Продолжить; 
КонецЕсли; 
КонецЕсли; 
//сравнить как то строки 

Если Таб.ДатаРаботы=Таб.ДатаРаботы тогда//сравнивать по этому значению строки 

Коллл=Коллл+1; 
КонецЕсли; 
КонецЦикла; 

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.