Имя: Пароль:
1C
1С v8
Проблема с датами при выполнении запроса.
,
0 new1snik
 
28.05.13
14:50
Добрый день. Есть запрос:
Запрос.Текст =  
   "ВЫБРАТЬ
   |    ЕСТЬNULL(ХозрасчетныйОборотыДтКт.СуммаОборот, 0) КАК Сумма
   |ИЗ
   |    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&ДатаНач, &ДатаКон, , СчетДт В ИЕРАРХИИ (&Счет6001), &Субконто, , , ) КАК ХозрасчетныйОборотыДтКт
   |ГДЕ
   |    ХозрасчетныйОборотыДтКт.СубконтоДт1.Код = &Код"
   ;
   
Этот запрос выполняю четыре раза, передавая разные временные промежутки. Даты формирую вот так:
       ДатаНач1 = НачалоМесяца(Период.ДатаНачала);
   ДатаКон1 = КонецМесяца(Период.ДатаОкончания);
   ДатаНач2 = ДобавитьМесяц(ДатаНач1, -1);
   ДатаКон2 = ДобавитьМесяц(ДатаКон1, -1);
   ДатаНач3 = ДобавитьМесяц(ДатаНач1, -12);
   ДатаКон3 = ДобавитьМесяц(ДатаКон1, -12);
   ДатаНач4 = НачалоГода(ДатаНач1);
   ДатаКон4 = ДатаКон1;
Проблема в том, что если я выполняю запрос передавая в него период - месяц апрель(все даты будут рассчитываться от этого периода), то запрос вернет за март(как за предыдущий месяц апреля) одно число. Но если я задам базовым периодом март, то результаты полученные за тот месяц будут отличаться от данных полученных запросом за предыдущий месяц апреля. Хотя по идее они должны быть равны. Еще интересным момент заключается в том, что это происходит не для всех месяцев - иногда запрос работает верно.
1 1Сергей
 
28.05.13
14:53
ДобавитьМесяц(Дата("20130430"), -1)    =    30.03.2013 0:00:00
2 1Сергей
 
28.05.13
14:54
А в марте 31 день. Понятно где косяк?
3 new1snik
 
28.05.13
14:55
(2)Что с этим делать? Первый раз сталкиваюсь.
4 1Сергей
 
28.05.13
14:56
(3) думать
5 MKZM
 
28.05.13
14:57
конецпериода
6 new1snik
 
29.05.13
08:12
(5) И что с ним делать?
7 Defender aka LINN
 
29.05.13
08:14

   |ГДЕ
   |    ХозрасчетныйОборотыДтКт.СубконтоДт1.Код = &Код"

Расстрелять
8 new1snik
 
29.05.13
08:17
(7)А как иначе-то? Субконто в отчете все время одно и тоже, пользователи не будут ничего выбирать.
9 kosts
 
29.05.13
08:22
(3) Функция ДобавитьМесяц работает не так, как ты думаешь, а так как она сделана разработчиком системы.

ДобавитьМесяц(Дата(2013,2,28), -1) => 28.01.2013
как видно не возвращает конец января

Используй другие способы получения предыдущих месяцев
10 new1snik
 
29.05.13
08:24
(9) Может кто подскажет какие есть другие методы получения предыдущего месяца?
11 Defender aka LINN
 
29.05.13
08:24
(8) Мда...
12 kosts
 
29.05.13
08:25
(10)
ДатаКон2 = КонецМесяца(НачалоПериода);

500 рублей
13 Defender aka LINN
 
29.05.13
08:25
(10) В месяце от 28 до 31 дней. Дата - это один день.
14 Бледно Золотистый
 
29.05.13
08:28
Если периоды - месяц, то кури ПериодМесяц в вирт. таблице, а не занимайся х.ней.
15 kosts
 
29.05.13
08:31
Возьми за правило переменные называть по человечески
ДатаНач1, ДатаНач2 , ДатаКон2 ...
потом замучишься вспоминать, что там было.
Называй ДатаНачала, НачалоПредыдущегоМесяца, ДатаНачалаГода и т.д. сам себе спасибо скажешь.
Если что есть Ctrl + c и Ctrl + v, если долго писать руками...
16 new1snik
 
29.05.13
08:35
ДатаНач1 = НачалоМесяца(Период.ДатаНачала);
   ДатаКон1 = КонецМесяца(Период.ДатаОкончания);
   ДатаНач2 = ДобавитьМесяц(ДатаНач1, -1);
   ДатаКон2 = КонецМесяца(ДатаНач2);
   ДатаНач3 = ДобавитьМесяц(ДатаНач1, -12);
   ДатаКон3 = КонецМесяца(ДатаНач3);
   ДатаНач4 = НачалоГода(ДатаНач1);
   ДатаКон4 = ДатаКон1;

Если вот так переделать, то будет правильно работать?

(15) Название переменных мне досталось по наследству.
17 kosts
 
29.05.13
08:39
(16) > то будет правильно работать
Гарантировать не могу, но в данном фрагменте вроде нет грубых ошибок =)
18 new1snik
 
29.05.13
08:40
(17) Исправил, проверил, сейчас вроде по разным периодам выдает нужную информацию.
AdBlock убивает бесплатный контент. 1Сергей