Имя: Пароль:
1C
1С v8
Ошибка при движении по регистру расчета.
0 Сержант ВДВ Онегин
 
15.03.15
11:26
Хочу сделать движение по регистру расчета. В документе, когда начало отпуска и конец отпуска даты из текущего отпуска, тогда документ нормально проводится. Но если начало отпуска указываю 02.02.2015 по 03.03.2015 при проведении дают такую ошибку:

Запись не верна! Неверно задан период действия! (Регистр Расчета основные начисления строка номер 1).

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

Кстати вот сам код:

    м = 0;
    н = Месяц(КонецОтпуска) - Месяц(НачалоОтпуска);
    Движения.ОсновныеНачисления.Записывать=Истина;
    Пока м<=н Цикл
        Движение = Движения.ОсновныеНачисления.Добавить();
        Движение.БазовыйПериодКонец = КонецДня(КонецОтпуска + 86400*28*м);
        Движение.БазовыйПериодНачало = НачалоОтпуска+86400*28*м;
        Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияБюджетныхОрганизаций.Невыход;
        Движение.ГрафикРаботы  = Организация.ГрафикРаботы;
        Движение.ПериодДействияКонец = КонецДня(КонецОтпуска + 86400*28*м);
        Движение.ПериодДействияНачало = НачалоОтпуска+86400*28*м;
        Движение.ПериодРегистрации = Дата;
        Движение.Регистратор = ЭтотОбъект.Ссылка;
        Движение.Сотрудник = Сотрудник;
        Движение.Сторно = Ложь;
        м = м+1;
    КонецЦикла;
1 DES
 
15.03.15
11:32
а если переход через НовыйГод ?
2 Сержант ВДВ Онегин
 
15.03.15
11:33
(1) в смысле?
3 DES
 
15.03.15
11:35
н = Месяц(КонецОтпуска) - Месяц(НачалоОтпуска);
н = 1 - 12;
4 Сержант ВДВ Онегин
 
15.03.15
11:37
(3) Важное замечание. Спасибо.

А как лучше проверить? Ведь табличной части нет у нас.
Разве ошибка в этом?
5 DES
 
15.03.15
11:50
используй функцию разность дат
чтобы получить сколько лет , месяцев, и дней между датами.
6 DES
 
15.03.15
11:52
потом бери цикл по месяцам
и формируй периоды в месяцах явно, а не секундами.
7 DES
 
15.03.15
11:52
потому что в феврале может быть 29 дней иногда
8 Сержант ВДВ Онегин
 
15.03.15
11:58
(5) через запрос?
9 DES
 
15.03.15
12:02
можно и самому написать.
щас поищу свою
10 DES
 
15.03.15
12:04
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет=0, Месяцев=0, Дней=0) Экспорт
    
    Лет=0; Месяцев=0; Дней=0;
    Если Дата1>Дата2 Тогда
        ВременнаяДата=Дата1;
        Если День(ВременнаяДата)<День(Дата2) Тогда
            Дней=(ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
            ВременнаяДата=ДобавитьМесяц(ВременнаяДата,-1);
        КонецЕсли;
        Если Месяц(ВременнаяДата)<Месяц(Дата2) Тогда
            ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
            Месяцев = 12;
        КонецЕсли;
        Лет=Макс(Год(ВременнаяДата)-Год(Дата2),0);
        Месяцев=Макс(Месяцев+Месяц(ВременнаяДата)-Месяц(Дата2),0);
        Дней=Макс(Дней+День(ВременнаяДата)-День(Дата2),0);        
        // скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах
        Если Дата2<>(ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
            Дней=Дней+(День(КонецМесяца(Дата2))-День(НачалоМесяца(Дата2)))-(День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры    // РазобратьРазностьДат
11 DES
 
15.03.15
12:06
в смысле то что я юзаю, вроде бы нареканий нет
12 Сержант ВДВ Онегин
 
15.03.15
12:13
(11) спасибо большое. Сейчас буду разбираться, куда ее впихнуть и как подстроить.
13 Сержант ВДВ Онегин
 
15.03.15
12:35
(11) твою процедуру впихнул. Теперь как вс вой цикл данные вписать?
14 DES
 
15.03.15
12:59
можно так
РасчетныйМесяц = СтартовыйМесяц;
Пока НЕ РасчетныйМесяц>КонечногоМесяца Цикл

.........тут твой код.

РасчетныйМесяц = ДобавитьМесяц(РасчетныйМесяц , 1);

КонецЦикла
15 DES
 
15.03.15
13:00
только приведи мясяцы к началумесяца
16 DES
 
15.03.15
13:02
главное ты знаешь сколько месяцев между датами и сколько циклов нужно выполнить
17 Сержант ВДВ Онегин
 
15.03.15
13:14
(15) я сделал по другому немного. Но все равно это ошибка выходит во время движения по регистру расчета
18 Сержант ВДВ Онегин
 
15.03.15
13:31
Не понимаю в чем прикол.
19 Dен
 
15.03.15
13:36
Дата начала и конца периода действия должна быть внутри одного месяца (периодичность регистра расчета). Если отпуск переходит на следующий месяц, то запись нужно разбивать на несколько - по одной на каждый месяц.
20 Сержант ВДВ Онегин
 
15.03.15
13:41
(19) Вот я также и делаю же нет?

Пока м<=Месяцев Цикл
        Движение = Движения.ОсновныеНачисления.Добавить();
        Движение.БазовыйПериодКонец = ДобавитьМесяц(КонецДня(КонецОтпуска),м);
        Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоОтпуска, м);
        Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияБюджетныхОрганизаций.Невыход;
        Движение.ГрафикРаботы  = Организация.ГрафикРаботы;
        Движение.ПериодДействияКонец = ДобавитьМесяц(КонецМесяца(КонецОтпуска),м);
        Движение.ПериодДействияНачало = ДобавитьМесяц(НачалоОтпуска,м);
        Движение.ПериодРегистрации = Дата;
        Движение.Регистратор = ЭтотОбъект.Ссылка;
        Движение.Сотрудник = Сотрудник;
        Движение.Сторно = Ложь;
        м = м+1;
        КонецЦикла;
21 Сержант ВДВ Онегин
 
15.03.15
13:52
По моему догнал где ошибка :)