Имя: Пароль:
1C
1C 7.7
v7: Работа с периодическими реквизитами
0 BORG
 
15.08.11
13:45
Подскажите плз как решить проблему которая возникла при работе с период. реквизитом справочника или может это какие то баги самой 1с:

Задача была следующая: Есть справочник товаров, в нем есть периодический реквизит "СрМесПрод",  в который надо записать данные по среднемесячной продаже товара, наличию на складе товара и реализации этого товара за каждый месяц из 12 предыдущих.
Данные выбираются из регистров. Записывать данные решили так: на 1 число месяца - записывается значение средн.мес. продаж, на 2 число -наличие на складе, на 3 число - реализация.

Так вот после того как данные были выбраны и помещены в таблицу делаем обычный цикл в котором записываем данные по товару в период реквизит, изначально происходит удаление всех записей в период реквизите, и потом по месячно заново записываем, так вот проблема в том что по некоторым товарам запись в периодически реквизит происходит а по некоторым когда потом смотришь значения период реквизита там пусто, хотя по отладчике видно что значения установлены и после это элемент справочника записан.

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

ТаблИтог.ВыбратьСтроки();    
   Пока ТаблИтог.ПолучитьСтроку() = 1 Цикл  
       
       
       Если  ТекТовар <> ТаблИтог.Товар Тогда
           НовТовар = 1;
           ДатНач     = ДатаНачРасч; //дата начала выборки результатов обычно -12 месяц от текущей даты
           ТекТовар = ТаблИтог.Товар;
       Иначе
           НовТовар = 0;
       КонецЕсли;
       
       Если СпрТов.НайтиЭлемент(ТаблИтог.Товар) = 1 Тогда
           Ист.ИспользоватьОбъект("СрМесПрод", ТаблИтог.Товар);
           Если  НовТовар = 1 Тогда //Чистим справочник товара СрМесТов  
               Ист.ВыбратьЗначения(,ТекущаяДата());
               Пока Ист.ПолучитьЗначение() = 1 Цикл
                   Попытка
                       Ист.Удалить();                        
                       Состояние("==Удаление для товара "+ТекТовар);
                   Исключение
                       Сообщить("=====При удалении значения для товара "+ТекТовар+" произошла ошибка.Значение не удалено !!!");
                   КонецПопытки;                    
               КонецЦикла;    
           КонецЕсли;    
           СрМесТов = ?(ТаблИтог.Вкл > 0,Окр(ТаблИтог.Реализация / ТаблИтог.Вкл,2),0);
           Если ДатаГод(ДатНач)  = ТаблИтог.Год Тогда
               ДатЗап1  =  ДобавитьМесяц(НачМесяца(ДатНач),ТаблИтог.Месяц-ДатаМесяц(ДатНач));
           Иначе
               ДатНач =  НачГода(ДобавитьМесяц(ДатНач,12));            
               ДатЗап1  =  ДобавитьМесяц(НачМесяца(ДатНач),ТаблИтог.Месяц-ДатаМесяц(ДатНач));
           КонецЕсли;
               
           ДатЗап   = НачМесяца(ДатЗап1+5); //Для корректировки определения начала месяца из за багов 1С по функции "ДобавитьМесяц"
           Если ДатЗап = НачМесяца(ДатаРасч) Тогда
               Продолжить;
           КонецЕсли;
           СпрТов.СрМесПрод.Установить(ДатЗап,СрМесТов);
           СпрТов.СрМесПрод.Установить(ДатЗап+1,ТаблИтог.Вкл);
           СпрТов.СрМесПрод.Установить(ДатЗап+2,ТаблИтог.Реализация);
           //СпрТов.СрМесПрод.Установить(ДатЗап+3,ТаблИтог.Остаток);
           //СпрТов.СрМесПрод.Установить(ДатЗап+4,ТаблИтог.Резерв);
           //Сообщить("На дату = "+ДатЗап+ " Значение = "+СрМесТов+" Товар "+ТаблИтог.Товар+" Месяц "+ТаблИтог.Месяц+ " Вкл "+ТаблИтог.Вкл);
           Состояние("== На дату = "+ДатЗап+ " Значение = "+СрМесТов+" Товар "+ТаблИтог.Товар+" Месяц "+ТаблИтог.Месяц+ " Вкл "+ТаблИтог.Вкл+" Реал "+ТаблИтог.Реализация);
           КолЗап    = КолЗап + 1;
           //Если (ТаблИтог.Месяц = 12) ИЛИ (ТаблИтог.Месяц < ДатаМесяц(ДатНач)) Тогда
           //    ДатНач =  НачГода(ДобавитьМесяц(ДатНач,12));            
           //КонецЕсли;
           Попытка
               СпрТов.Записать();    
           Исключение
               Сообщить("=====При записи значения для товара "+ТаблИтог.Товар+" произошла ошибка !!!");
           КонецПопытки;
       Иначе
           Сообщить("==Не найден элемент справочника "+ТаблИтог.Товар);
       КонецЕсли;
   КонецЦикла;    
КонецЕсли;
1 mikecool
 
15.08.11
13:47
так вот проблема в том что по некоторым товарам запись в периодически реквизит происходит а по некоторым когда потом смотришь значения период реквизита там пусто, хотя по отладчике видно что значения установлены и после это элемент справочника записан.
какие то чудеса, а чудес не бывает