Имя: Пароль:
1C
1C 7.7
v7: Позиционируется ли периодический методом ЗначениеНаДату ?
0 e-9
 
21.10.14
12:38
или просто возвращает значение?
(можно конечно тестик набросать - но уж очень влом всякий чих платформы проверять; подскажите, а?)
1 Looser-1c
 
21.10.14
12:39
нет
2 e-9
 
21.10.14
12:40
(1) спс!)
3 e-9
 
21.10.14
17:49
...А корректно ли воспользоваться методом НайтиЗначение в цикле перебора исторических записей, т.е.:
    ИсторияПодразделения = СоздатьОбъект("Периодический");            
    ИсторияПодразделения.ИспользоватьОбъект("ВремПодр",СпрСотрудники);

    ИсторияПодразделения.ВыбратьЗначения(ДНач,ДКон);
    Пока ИсторияПодразделения.ПолучитьЗначение()=1 Цикл
        Если (ИсторияПодразделения.НайтиЗначение(ИсторияПодразделения.ДатаЗнач,0)=1) Тогда
//мегакод
...  
???
Дело в том, что на одну дату может быть несколько записей в истории; ВыбратьЗначения занудно перебирает все, что между ДНач и ДКон - а мне надо отсеять те записи в истории, которые не актуальны. Правильно ли я рассчитываю, что вышеприведенная конструкция даст то, что мне нужно?
(сорри, времени не хватает замутить надежные тесты - вот и тереблю гур...)
4 Ёпрст
 
21.10.14
17:52
(3) бред какой то.. зачем при переборе всех значений, что то еще искать при этом ?
5 Ёпрст
 
21.10.14
17:52
они и так все будут в выборке.
6 e-9
 
21.10.14
17:55
(5) ай, Епрст, напряги моск - неужели не очевидно, что как раз НЕ все нужны? На одну дату - N записей; значит, N-1 из них надо выкинуть
вот в чем дело
7 e-9
 
21.10.14
17:55
*ЕСЛИ на одну дату - N записей...
8 Ёпрст
 
21.10.14
18:06
(6) я просто откомментил твой код.
На счет найти в цикле - всё можно, в ложном удалении, например
9 Ёпрст
 
21.10.14
18:07
ну и.. чем просто значение на дату через Получить не устраивает ?

все типовые на этом основаны (и пофик, сколько там записей было в пределах дня)
10 MishaD
 
21.10.14
18:11
(9) а может ему не  последняя, а 8-я слева от 5-й сзади нужна
11 e-9
 
21.10.14
18:22
(9) именно так у меня и было! а теперь - рефакторинг:)
во-первых, мне кажется, так
Для Дт=Днач По ДКон Цикл
   МойРеквизит.Получить(Дт);
КонецЦикла;
- не по-пацански: у многих людей вообще одно значение за период. С другой стороны, по каждому кадровому перемещению (а в некоторых цехах у многих работников чуть ли не каждый день новое перемещение) надо вытянуть (из документа о перемещении) доп. инфу.
(10) ага, типа того
12 Classic
 
21.10.14
18:25
(11)
А разве по документу не ищется? Что там СП говорит?
13 e-9
 
21.10.14
18:29
(12) э?...
в смысле, перебрать выборку документов КадровоеПеремещение - и где Сотрудник из нашего Подразделения (тот самый реквизит, который мучаю), оттуда все дергать?
думал таким путем идти - но там свои заморочки. Хотелось бы все ж через периодический реквизит "войти"...
14 e-9
 
21.10.14
18:56
(3) а вот фигушки (напрягся-таки потестить)
в общем, первый раз ПолучитьЗначение()=1 выполняется, потом в цикле срабатывает НайтиЗначение() - и все, выборка периодики сбрасывается; по крайней мере, следующее ПолучитьЗначение() равно 0. Хотя в реквизите целая куча записей, в период с ДНач по ДКон!!!
15 Йохохо
 
21.10.14
19:05
(14) в (0) ты не про это спрашивал
16 e-9
 
22.10.14
11:17
(15) а я в (14) и не ссылаюсь на (0):) я на (3) там ссылаюсь
...Великий Ёпрст! почему ты не напомнил про ОбратныйПорядок(1)?! Это и есть оно, решение (3)!!!
17 e-9
 
22.10.14
11:18
типа так:
            //мечтаем перебрать всю периодику внутри некоего интервала, отбросив неактуальные записи
            ДКон = КонИнтервала;
            ДНач = 0;
            ТекДата = 0; //нуна для отбрасывания "гнилых" записей
            ИсторияПодразделения.ИспользоватьОбъект("ВремПодр",СпрСотрудники);
            ИсторияПодразделения.ОбратныйПорядок(1);
            Если ИсторияПодразделения.ВыбратьЗначения(НачИнтервала,ДКон) = 1 Тогда
                Пока ИсторияПодразделения.ПолучитьЗначение() = 1 Цикл
                    //может быть несколько записей на одну дату, а нам нужна только ПОСЛЕДНЯЯ, актуальная запись - поэтому "листаем"
                    Если ИсторияПодразделения.ДатаЗнач = ТекДата Тогда Продолжить; КонецЕсли;
                        //тут любой г...код, но обязательно в том числе меняем ДНач и ДКон, в зависимости от своих потребностей
                        ДНач = Макс(НачИнтервала,ИсторияПодразделения.ДатаЗнач);
                        Для Дт=ДНач По ДКон Цикл
                            //мучаем кого-то в это интервальчике
                        КонецЦикла;
                        //либо так
                        ДКон = ДНач-1;
                        ////либо этак
                        //ДКон = ИсторияПодразделения.ДатаЗнач-1;
                    
                    Если ДКон < НачИнтервала Тогда Прервать; КонецЕсли;
                        
                    ТекДата = ИсторияПодразделения.ДатаЗнач;
                КонецЦикла; //конец перебора периодики
            КонецЕсли;
            //если вообще не было периодики за месяц, или закончилась датой позднее начала месяца
            Если (Число(ДНач) = 0) ИЛИ (Число(ДНач)>Число(НачИнтервала)) Тогда
                //то проверяем еще начало интервала - если был в подразделении, то
                Если ПринадлПодмножеству(СпрСотрудники.ВремПодр.Получить(НачИнтервала), Подразделение)=1 Тогда
                    Для Дт=НачИнтервала По ДКон Цикл
                        //опять спасаем вселенную
                    КонецЦикла;
                    //а если нам еще что-то надо от первой, перед НачИнтервала, записи в периодике
                    Если (ИсторияПодразделения.НайтиЗначение(НачИнтервала,-1)=1) Тогда          
                        //то нет проблем
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
18 e-9
 
22.10.14
11:20
"...зерна отольюся в пули,
пули отольются в гири,
таким ударным инструментом
мы пробьем все стены в мире!"
https://www.youtube.com/watch?v=sUOf-RrqEgU#t=217