Имя: Пароль:
1C
1С v8
Запись в DBFфайл
0 ВежливаяТварь
 
09.08.12
09:50
Добрый день столкнулся с весьма мистической проблемой. Есть DBF файл я в него сохраняю остатки на начало дня в периоде месяца. Проблема в том что остатки на некоторые дни он записывает правильно а некоторые нет. Например: сохраняю период месяц, за 28 число он сохраняет не правильный остаток. Проверяю запрос который вытягивает остаток за этот день- все правильно. Сохраняю только 28 число в DBF правильный остаток. Не подскажите в чем загадка.

Код:Процедура ЭкспортОстатковНаНачДняВЛокальнойКодировке()
   ЗапросОстатковНаНачДняЛокКод=Новый Запрос;
   ЗапросОстатковНаНачДняЛокКод.Текст="ВЫБРАТЬ
                                      |    ТоварыНаСкладахОстаткиИОбороты.Склад.Код КАК Wareh_Code,
                                      |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Код КАК Code,
                                      |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Наименование,
                                      |    ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК Stock,
                                      |    ТоварыНаСкладахОстаткиИОбороты.Период КАК Date
                                      |ИЗ
                                      |    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
                                      |ГДЕ
                                      |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Ссылка В ИЕРАРХИИ(&ВыгружаемаяНоменклатура)
                                      |    И ТоварыНаСкладахОстаткиИОбороты.Склад В(&Склад)";
                       
   ЗапросОстатковНаНачДняЛокКод.УстановитьПараметр("ВыгружаемаяНоменклатура", ВыгружаемаяНоменклатура);
   ЗапросОстатковНаНачДняЛокКод.УстановитьПараметр("ДатаНач", ДатаНач);
   ЗапросОстатковНаНачДняЛокКод.УстановитьПараметр("ДатаКон", ДатаКон);
   ЗапросОстатковНаНачДняЛокКод.УстановитьПараметр("Склад", СписокСкладов);
       
   РезультатЗапросаОстатковНаНачДняЛокКод=ЗапросОстатковНаНачДняЛокКод.Выполнить();
   Если  РезультатЗапросаОстатковНаНачДняЛокКод.Пустой() Тогда
       Возврат;    
   КонецЕсли;

   ПутьКФайлу=ПутьСохраненияТаблиц+"\ARSTOCK.DBF";
   ФайлОстНаНачДняЛокКод=Новый XBase;
   
   Попытка
       ФайлОстНаНачДняЛокКод.ОткрытьФайл(ПутьКФайлу);
       ФайлОстНаНачДняЛокКод.ОчиститьФайл();
   Исключение
       Сообщить("Файл таблицы остатков на начало дня (локальная кодировка) не найдён");
       Логи.ДобавитьСтроку("ОШИБКА Таблица остатков на начало дня: ошибка при выгрузке "+ОписаниеОшибки());
       Возврат;
   КонецПопытки;
           
   РезультатЗапросаОстатковНаНачДняЛокКод=РезультатЗапросаОстатковНаНачДняЛокКод.Выбрать();
   Пока РезультатЗапросаОстатковНаНачДняЛокКод.Следующий() Цикл
       ФайлОстНаНачДняЛокКод.Добавить();
       ФайлОстНаНачДняЛокКод.Wareh_Code=РезультатЗапросаОстатковНаНачДняЛокКод.Wareh_Code;
       ФайлОстНаНачДняЛокКод.LocalCode=РезультатЗапросаОстатковНаНачДняЛокКод.Code;
       ФайлОстНаНачДняЛокКод.Stock=РезультатЗапросаОстатковНаНачДняЛокКод.Stock;
       ФайлОстНаНачДняЛокКод.Date=Формат(РезультатЗапросаОстатковНаНачДняЛокКод.date,"ДФ=yyyyMMdd");
       ФайлОстНаНачДняЛокКод.Записать();
   КонецЦикла;
   
   ФайлОстНаНачДняЛокКод.ЗакрытьФайл();            
   Логи.ДобавитьСтроку("Таблица остатков на начало дня: выгружена успешно");
   Сообщить ("Таблица остатков на начало дня: выгружена успешно");

КонецПроцедуры
1 Wobland
 
09.08.12
09:52
а зачем ты дату как строку записываешь?
2 Wobland
 
09.08.12
09:53
да и Записать() в цикле вроде как лишнее
3 Нуф-Нуф
 
09.08.12
09:54
1. зачем тебе остатки и обороты, если у тебя только остатки пишутся
2. условия склад и номенклатура лучше перенести в параметры виртуальной таблицы
3. лучше отдельным запросом получить таблицу номенклатуры по условию в иерархии, и эту таблицу засунуть как условие в параметры виртуальной таблицы

п.2 и 3 как рекомендации к оптимизации запроса
4 ВежливаяТварь
 
09.08.12
09:57
(1) не совсем понял на счет строки
(2) То есть можно и не записывать каждую строку можно потом один раз записать поставить и все запишется?
(3) В простых остатках я не нашёл как период поставить
5 Wobland
 
09.08.12
09:59
(4) 1. ФайлОстНаНачДняЛокКод.Date=Формат() - присваиваешь строку. дбф понимает тип данных дата, только я не помню, как с этим правильно работать
2. именно это я и хотел сказать. проверь
3. что такое начальный остаток за период (с-по)?
6 ВежливаяТварь
 
09.08.12
10:02
(5) 3. Нужно записать остаток товара на начало каждого дня в указанном периоде
7 Wobland
 
09.08.12
10:03
(6) Формат() свой глянь в отладчике на всякий случай
8 ВежливаяТварь
 
09.08.12
10:04
(5) 2. Нет он тогда записывает только последнюю строку
9 Wobland
 
09.08.12
10:04
(8) буду знать ;)
10 ВежливаяТварь
 
09.08.12
10:08
(7) Да формат переводит в строку. Но там в тз написано дату подавать виды ггггММдд
11 Wobland
 
09.08.12
10:11
(10) тз тзой, а что кушает дбф? таки строку должен по ТЗ?
12 ВежливаяТварь
 
09.08.12
10:23
В ТЗ ничего не указано по повду строка или дата, сказано лишь что вид должен быть ггггММдд
13 ВежливаяТварь
 
09.08.12
10:28
Не может быть связано со скоростью записи?
14 Wobland
 
09.08.12
10:46
(12) ну я хз. сделай дополнительно Сообщить() свой формат() и сравни с содержимым файла. может, ты просто данные не так интерпретируешь
(13) нет.
15 ВежливаяТварь
 
09.08.12
11:26
(14) ок Сейчас попробую. Спасибо.
16 ptiz
 
09.08.12
12:03
ОстаткиИОбороты не выдают остатки на день, в котором не было движений по этому складу и номенлклатуре
17 ptiz
 
09.08.12
12:03
и как же этого иногда не хватает :(
18 ВежливаяТварь
 
09.08.12
17:57
(16) понял сейчас проверю,
19 ВежливаяТварь
 
09.08.12
17:58
(16)+ Но когда я формирую остатки и обороты за один день, то все в порядке получается.
20 ВежливаяТварь
 
09.08.12
18:36
(16) по ходу прав. Если брать период 1-2 число или 2-3, то остатки выводятся правильные а если 1-3 то остатки за 2 число слегка уменьшены.