Имя: Пароль:
1C
1C 7.7
v7: БИ на 00:00:02 от первых чисел каждого месяца
,
0 Dwarrior
 
27.08.09
17:04
Добрый день, камрады!

Каждый день, в 00:00:02 создается расходник, который выписывает в подотчет на 1251 какую-то сумму. Есть вот такой код:

начТочка = СформироватьПозициюДокумента(начДата,0,0,3);
   
БИ = СоздатьОбъект("БухгалтерскиеИтоги");
БИ.ВключатьСубсчета(-1);
БИ.ВыполнитьЗапрос(начТочка, начДата+1, СчетПоКоду("1251"));
   
Сообщить(БИ.СНД());

Т.е. получаем остаток по счету 1251 на 3 секунду начДаты. Так вот, все дни, кроме первых чисел месяцев это работает, а вот 01.06.09, 01.07.09, 01.08.09 и т.п. БИ.СНД()=0!!! Бьюсь над этой проблемой уже который день, мозг сломал...Это глюк 1С или я неправильно что-то делаю? Кстати, граница "00:00:02" условная, это может быть другое время. База ДБФ, 1с 25 релиз.
Подскажите пожалуйста, кто сталкивался...
1 Dwarrior
 
28.08.09
06:33
Что, совсем никаких мыслей?:)
2 VoditelKobyly
 
28.08.09
07:23
По первым числам этот кусок кода не работает.
Из какой процедуры это выдернуто?
Когда запускается эта процедура?
Проблема в том что создается расходник или в том что не создается?
3 Dwarrior
 
28.08.09
12:41
это я сам написал, но мне кажется, что он законченный, в смысле там все есть...
Процедура запускается сейчас за любой первый день месяца:)
4 Dwarrior
 
28.08.09
12:41
это фрагмент отчета
5 Dwarrior
 
28.08.09
12:43
Проблема в том, что БИ.СНД() = 0 в вышеприведенном примере, хотя должно быть точно не ноль. И только если начДата='01.06.09', '01.07.09' и т.п. За все другие дни БИ.СНД() показывает правильную сумму.
6 zak555
 
28.08.09
16:05
(0) а так что покажет? + обновил бы платформы

БИ.ВыполнитьЗапрос(начДата, начДата+1, СчетПоКоду("1251"));
7 Torquader
 
29.08.09
22:44
Чего-то мне кажется, что там где-то из даты вычитается единица, только не в этом коде, а в другом - может такое быть ?
8 Джинн
 
29.08.09
22:48
(0) Бред какой-то :(
Я между 00.00.00 и 00.00.02 легко запихаю несколько сотен документов.
9 Torquader
 
29.08.09
23:22
(8) так не в количестве документов вопрос, а в итогах, которые у автора неправильные.
Может ему даже больше нас ТИИ поможет.
10 Побрекито
 
29.08.09
23:30
какая-то хрень!
(0) если тебе нужно просто посмотреть начальное сальдо на НачДата, зачем ты указываешь конец периода НачДата+1?
P.S. чтобы решить проблему сабжа, запрашивай не начальное сальдо текущего дня, а конечное сальдо предыдущего.

БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
БухИт.ВключатьСубсчета(-1);
БухИт.ВыполнитьЗапрос(, НачДата-1, СчетПоКоду("1251"));

Сообщить(БухИт.СКД());
11 Dwarrior
 
02.09.09
17:29
Доброе время суток!

Извиняюсь, выпал ненадолго из обоймы..
Напомню еще раз суть проблемы:
01.08.09 00:00:00 - СНД=0
01.08.09 00:00:02 - Документом на счет 1251 закидывается сумма, например 500
01.08.09 00:00:03 - Смотрим СНД по счету 1251 на этот момент. И оно равно 0!

Если этот трюк повторить не первым числом месяца(2,3,4 и т.п.) - то в итоге сальдо = 500, т.е. как и надо. Проблема только ПЕРВЫМИ числами месяцев.

Думается мне, что это глюк 1С, связанный с помесячным расчетом ее промежуточных итогов. Но мне не хочется в это верить:)
12 Dwarrior
 
02.09.09
17:37
вот еще результаты опытов - не имеет значения счет и субконто. Также попробовал то же самое на MSSQL базе - там все нормально, сальдо показывается правильно. Значит дело в формате DBF?
13 Dwarrior
 
02.09.09
17:38
Может, это можно как-то преодолеть?
14 zak555
 
03.09.09
14:20
(11) ща проверил - аналогичная ситуация
15 zak555
 
03.09.09
14:24
+ (14) делай тогда так:

БИ.ВыполнитьЗапрос(начДата, начТочка, СчетПоКоду("РВ.1"),,,1,,1);
результат:
БИ.СНД() = 0 БИ.ДО() = 100 БИ.СКД() = 100

НО, если сделать так:
БИ.ВыполнитьЗапрос(, начТочка, СчетПоКоду("РВ.1"),,,1,,1);
результат:
БИ.СНД() = 0 БИ.ДО() = 0 БИ.СКД() = 0
16 Dwarrior
 
04.09.09
08:29
Спасибо zak555!
так и придется сделать...
Всем спасибо за участие:)
17 zak555
 
04.09.09
11:03
а что у всех всё работает?
18 Torquader
 
04.09.09
12:46
(17) Предлагаешь тестовую конфигурацию "замутить" на предмет проверки ?
19 zak555
 
04.09.09
12:55
(18) а что мутить?
вон код из (15) из бухи типовой

создал операцию на первое число месяца в 00:00:02

результат описан
20 Torquader
 
04.09.09
13:03
(19) Сегодня посмотрю - сейчас у меня Linux восстановлением диска занимается - и "бюстгалтерию" на нём не запустишь.
21 Dwarrior
 
04.09.09
16:24
а никто не обладает лицензионной 1С-кой? мож позвонить к производителю(или реселлеру) и спросить, типа что за фигня? Мож есть какой-нить патчик для релиза (или более новый релиз), который бы нам помог...
Я бы позвонил, но у меня все ломанное и украденное:)
22 zak555
 
04.09.09
16:40
(21) ужас! к тебе придёт ОБЭП
23 zak555
 
06.09.09
14:07
(20) ну и как успехи?
24 Torquader
 
06.09.09
16:27
(23) Так оно и есть.
Сляпал тестовую конфу, в которой два счёта и документ, который проводит с одного на другой некоторую сумму.
У каждого счёта по одному субконто из справочника.
Документ записываю в нужную дату:
Procedure CreateOper()
   Ref=CreateObject("Reference.Суб1Спр");
   if Ref.FindByCode("1")<>1 then Message("Первого нет");return;endif;
   r1=Ref.CurrentItem();
   if Ref.FindByCode("2")<>1 then Message("Второго нет");return;endif;
   r2=Ref.CurrentItem();
   Doc=CreateObject("Document.Проводилово");
   Doc.New();
   Doc.Суб1=r1;
   Doc.Суб1Кред=r2;
   Doc.Сумма=50;
   Doc.DocDate=ВыбДата;// выбирается в диалоге
   Doc.SetTime(0,0,2);
   Doc.Write();
// установка времени повторно, так как иначе получается 12-00-00
   Doc.SetTime(0,0,2);
   Doc.Write();
   Doc.MakeActions();
EndProcedure

Далее снимаю отчёт по итогам:
Procedure ShowTotals()
   t=CreateObject("Text");
   t.AddLine("Обороты:");
   Pos=MakeDocPosition(ВыбДата,23,59,59);// на конец дня
   Message("POS="+String(Pos));// смотрю позицию
   BT=CreateObject("BookkeepingTotals");
   BT.UseSubconto(SubcontoKinds.Суб1);
   if BT.DoQuery(Pos,выбДата+1,AccountByCode("123"),,,1,,"S")=1 then
       if BT.SelectSubconto(1)=1 then
           while BT.GetSubconto()=1 do
               t.AddLine(String(BT.Subconto(1))+":"+String(BT.IDB())+":"+String(BT.ICB()));
           enddo;
       endif;
   endif;
   t.Show();
EndProcedure

Первого числа созданный документ почему-то не попадает в итог на начало периода.
А второго - попадает.

Если сделать так:
Procedure ShowTotals()
   t=CreateObject("Text");
   t.AddLine("???????:");
   Pos=MakeDocPosition(???????,0,0,3);
   PosEnd=MakeDocPosition(???????,23,59,59);
   Message("POS="+String(Pos));
   Message("POSEND="+String(PosEnd));
   BT=CreateObject("BookkeepingTotals");
   BT.UseSubconto(SubcontoKinds.???1);
   if BT.DoQuery(Pos,PosEnd,AccountByCode("123"),,,1,,"S")=1 then
       if BT.SelectSubconto(1)=1 then
           while BT.GetSubconto()=1 do
               t.AddLine(String(BT.Subconto(1))+":"+String(BT.IDB())+":"+String(BT.ICB()));
           enddo;
       endif;
   endif;
   t.Show();
EndProcedure

То не попадают не только итоги, но и нет записей (у меня первый документ первого числа) - то есть система смотрит остатки на конец прошлого периода.

Позиции документов можно посмотреть так:
Procedure ShowPosInfo()
   d=CreateObject("Document.Проводилово");
   t=CreateObject("Text");
   t.AddLine("Позиции документов:");
   if d.SelectDocuments(ВыбДата,ВыбДата)=1 then
       while d.GetDocument()=1 do
           t.AddLine("Документ № "+TrimAll(d.DocNum)+" от "+String(d.DocDate)+" время "+d.GetTime()+" позиция "+String(d.GetPosition()));
       enddo;
   endif;
   t.Show();
EndProcedure

Документ № 2 от 01.09.09 время 00:00:02 позиция #20090901     20000     22905  
Документ № 1 от 01.09.09 время 12:00:10 позиция #20090901 432100000     22904  
Документ № 3 от 02.09.09 время 00:00:02 позиция #20090902     20000     22906  
P.S. получается, что "съели" не только документ со временем 2 секунды, но и стандартный (созданный вручную) в 12-00-00.
25 Torquader
 
06.09.09
16:30
Релиз был 7.70.020 - в понедельник "поимею" на 27-ом.
26 Torquader
 
06.09.09
16:57
Кстати, документы до начала выборки (Pos) в конечный остаток (FDB и FCB) тоже не попадают.
Если же документ внутри выбранного интервала - то он попадает в конечный остаток.

Мораль такова - на первое число получаем нереальные итоги, если вместо даты указываем позицию.
27 zak555
 
06.09.09
19:40
(24) а зачем конфу текстовую?
вон на бухе можно типовой! )))
28 zak555
 
06.09.09
19:40
(26) не позицию, а дату!
29 Torquader
 
06.09.09
20:52
(27) Чтобы видеть всё, что делается и быть уверенным, что оно работает, как надо.
(28) Как раз в позиции и дело - если использовать дату (в тексте не Pos, а ВыбДата) то всё работает.
Просто где-то в выборке на первое число неправильно преобразуется позиция.
Проверю на 27 - если и там такое, то можно спросить и у 1С.
30 zak555
 
07.09.09
07:22
(29) + надо посомтреть файл итогов!
самое прикольное, что вот так тоже не работает

БИ.ВыполнитьЗапрос(начДата, начТочка, СчетПоКоду("РВ.1"),,,1,"Проводка",1);


результат:
БИ.СНД() = 0 БИ.ДО() = 100 БИ.СКД() = 100
31 zak555
 
07.09.09
14:31
(29) ну как?
32 Torquader
 
07.09.09
23:30
7.70.027 лажается точно также.
Завтра буду узнавать, у кого можно спросить - почему так.
33 zak555
 
08.09.09
00:10
(32) думается, что в итоги не попадает проводки от первого числа, если начальная "точка" - позиция, т.к. если дата - то всё гуд
34 Dwarrior
 
08.09.09
08:42
(33) zak555, все таки есть!
Torquader, а спрашивать будешь у производителя?:) Мне кажется, вопрос нужно адресовать им.
35 zak555
 
08.09.09
11:13
(34) вообще я нашёл решения твоей задачи из (0)

БИ не работают 1-го числа месяца с ПОЗИЦИЕЙ, но не с ДОКУМЕНТОМ
создал фиктивный док от первого числа в 00:00:03 (операция ручная была по-прежнему от 00:00:03) делаю запрос:

       НачДата = РабочаяДата();
   начТочка = СформироватьПозициюДокумента(начДата,0,0,3);
   
   БИ = СоздатьОбъект("БухгалтерскиеИтоги");
                                 
   Док = СоздатьОбъект("Документ.БухгалтерскаяСправка");
   Док.НайтиПоНомеру("00000001", НачДата);
   НачТочка = Док.ТекущийДокумент();
   БИ.ВыполнитьЗапрос(начТочка,начДата + 1, СчетПоКоду("РВ.1"),,,1,,1);


результат:

БИ.СНД() = 100 БИ.ДО() = 0 БИ.СКД() = 100

т.е. косяк в позиции !!!
36 zak555
 
08.09.09
11:32
+ (35) опытным путём выяснилось, что не работает функция:

СформироватьПозициюДокумента(<?>,,,,);
MakeDocPosition(<?>,,,,);
Синтаксис:
СформироватьПозициюДокумента(<Дата>,<Час>,<Мин>,<Сек>,<ФлагКонцаСекунды>)
Назначение:
Формирует и возвращает позицию документа согласно переданным параметрам.
Параметры:
<Дата> - дата, на которую формируется позиция документа,
<Час> - час, на который формируется позиция документа,
<Мин> - минута, на которую формируется позиция документа,
<Сек> - секунда, на которую формируется позиция документа.
<ФлагКонцаСекунды> - необязательный параметр. Число: 1 - позиция будет браться от следующей секунды. 0 - позиция от указан-ной секунды. Значение по умолчанию - 0.

а вот функция эта - работает:

СформироватьПозициюДокумента(<?>,);
MakeDocPosition(<?>,);
Синтаксис:
СформироватьПозициюДокумента(<Докум>,<ФлагСмещения>)
Назначение:
Формирует и возвращает позицию документа согласно переданным параметрам.
Параметры:
<Докум> - значение документа (или его позиция), позиция которого определяется.
<ФлагСмещения> - необязательный параметр. Число: -1 (минус единица) - предыдущая позиция. 1 - следующая позиция. 0 - текущая позиция. Значение по умолчанию - 0. Использование данного параметра позволяет получить предыдущую или последующую позицию от уже имеющейся позиции.


Док-во:

       НачДата = РабочаяДата();

   БИ = СоздатьОбъект("БухгалтерскиеИтоги");
                                 
   Док = СоздатьОбъект("Документ.БухгалтерскаяСправка");
   Док.НайтиПоНомеру("00000001", НачДата);
   //НачТочка = Док.ТекущийДокумент();
   начТочка =  СформироватьПозициюДокумента(Док.ТекущийДокумент(),1);
   БИ.ВыполнитьЗапрос(начТочка,начДата + 1, СчетПоКоду("РВ.1"),,,1,,1);


результат:

БИ.СНД() = 100 БИ.ДО() = 0 БИ.СКД() = 100
37 Torquader
 
08.09.09
18:12
На самом деле функция работает - позиция формируется правильно, а вот система с ней работать не может.
(Если позицию формировать от документа, то система смотрит на его внутренний ID и ничего больше её не интересует).
Есть подозрение, что система ошибается из-за того, что после анализа позиции итоги запрашиваются на прошлую дату, а потом делается выборка документов по текущей дате и они добавляются в итог (просто прошлая дата получается 00-ХХ-ХХХХ, что и приводит к ошибке).
Во всех стандартных отчётах позиция документа не используется - и ошибка не повлияет на работу типовой.
38 zak555
 
08.09.09
18:14
(37) в (0) использовалась начДата+1
ДО не было!!!
39 zak555
 
08.09.09
21:41
кстати, а может так как-то с шалонов и внутренним представление можно что-то сделать?
40 zak555
 
18.09.09
13:18
так можно что-то с шаблоном намуть?