Имя: Пароль:
1C
1С v8
Пропадают записи из регистра накопления при сохранении документа
0 Double_Medved
 
28.01.13
18:13
Подскажите плиз, столкнулся с такой штукой: УТ11, дописанная. Дописано что в ЧекеККМ при проведении создаются дополнительные записи в регистр накопления "КартыЛояльности". Все работает нормально, но потом, если документ открыть и нажать "Сохранить" то запись пропадает! Подскажите плиз, что там такое может удалять записи, учитывая что этого регистра в типовой вообще нет!
1 Бешеная Нога
 
28.01.13
18:14
зная предыдущие темы автора - эта ветка на 100500 постов
2 Kreont
 
28.01.13
18:14
ну показывай код, тот что делал для добавления записей в РН
3 Галахад
 
гуру
28.01.13
18:16
Открыть и сохранить "непроведенный" чек?
4 Aprobator
 
28.01.13
18:17
при перепроведении все пропадает и отладчик не знает где?
5 Double_Medved
 
28.01.13
18:19
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   
   ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(Ссылка, ДополнительныеСвойства, РежимПроведения);
   
   Документы.ЧекККМ.ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства);
   
   ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
   
   ЗапасыСервер.ОтразитьСвободныеОстатки(ДополнительныеСвойства, Движения, Отказ);
   ЗапасыСервер.ОтразитьТоварыНаСкладах(ДополнительныеСвойства, Движения, Отказ);
   ДенежныеСредстваСервер.ОтразитьДенежныеСредстваВКассахККМ(ДополнительныеСвойства, Движения, Отказ);
   ДенежныеСредстваСервер.ОтразитьРасчетыПоЭквайрингу(ДополнительныеСвойства, Движения, Отказ);
   СкладыСервер.ОтразитьДвиженияСерийТоваров(ДополнительныеСвойства, Движения, Отказ);
   
   СформироватьСписокРегистровДляКонтроля();
   
   ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект);
   
   ПроведениеСервер.ВыполнитьКонтрольРезультатовПроведения(ЭтотОбъект, Отказ);
   
   ПроведениеСервер.ОчиститьДополнительныеСвойстваДляПроведения(ДополнительныеСвойства);
   
   
   //Начало
   //Прочитаем значение Скидки по КартеЛояльности из Регистра сведений КартыЛояльностиСведения
   СкидкаПоКарте = 0;
   Если ЗначениеЗаполнено(КартаЛояльности) Тогда
       Если Акция = Ложь Тогда
           НаборЗаписей = РегистрыСведений.КартыЛояльностиСведения.СоздатьНаборЗаписей();
           НаборЗаписей.Прочитать();
           Для Каждого Запись из НаборЗаписей Цикл
               Если Запись.КартаЛояльности.Наименование = КартаЛояльности.Наименование Тогда
                   СкидкаПоКарте = Запись.ПроцентСкидки;
               КонецЕсли;
           КонецЦикла;
       //Пересчитаем строки документа согласно скидке по карте
           Для Каждого ТекСтрокаТовары Из Товары Цикл
               ТекСтрокаТовары.ПроцентАвтоматическойСкидки = СкидкаПоКарте;
               ТекСтрокаТовары.СуммаАвтоматическойСкидки   = Окр(ТекСтрокаТовары.Цена*(СкидкаПоКарте/100))*ТекСтрокаТовары.Количество;
               ТекСтрокаТовары.Сумма                       = Окр(ТекСтрокаТовары.Цена*(1-(СкидкаПоКарте/100)))*ТекСтрокаТовары.Количество;
           КонецЦикла;
       КонецЕсли;
   КонецЕсли;
   
   // Пересчитаем согласно максимальной скидки на товар -
   //Если максимальная скидка меньше предоставляемой по карте -
   //То применим вместо скидки по карте максимальную скидку
   Если ЗначениеЗаполнено(КартаЛояльности) Тогда
       Если Акция = Ложь Тогда
           Для Каждого ТекСтрокаТовары Из Товары Цикл
               н = ТекСтрокаТовары.Номенклатура.Родитель;
               Если (н.ЭтоГруппа = Истина) и (н.МаксимальнаяСкидка < ТекСтрокаТовары.ПроцентАвтоматическойСкидки) Тогда
                   ТекСтрокаТовары.ПроцентАвтоматическойСкидки = н.МаксимальнаяСкидка;
                   ТекСтрокаТовары.СуммаАвтоматическойСкидки   =  Окр(ТекСтрокаТовары.Цена*(н.МаксимальнаяСкидка/100))*ТекСтрокаТовары.Количество;
                   ТекСтрокаТовары.Сумма                       = Окр(ТекСтрокаТовары.Цена*(1-(н.МаксимальнаяСкидка/100)))*ТекСтрокаТовары.Количество;
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
   КонецЕсли;
     //конец                                                                        

КонецПроцедуры
6 Double_Medved
 
28.01.13
18:20
Просто при сохранении он что делает? Перепроводит ведь? Может там что-то типа "Очистить движения" или вроде того?
7 Aprobator
 
28.01.13
18:22
(5) фига се - при обработке проведения документа содержимое его ТЧ меняется? Нехило.
8 Kreont
 
28.01.13
18:23
(5) код ниче не пишет в РН, только читает :)
9 Aprobator
 
28.01.13
18:26
еще как пишет.
10 Double_Medved
 
28.01.13
18:26
Ой блин сорри это не то... Давно писал, перепутал.
&НаСервере
Процедура РасчетДвиженийПоКарте()
   Если ЗначениеЗаполнено(Объект.КартаЛояльности) Тогда
   //Запишем в Регистр накопления КартыЛояльностиНакопление данные из каждой строки таблицы Товары
       НаборЗаписей = РегистрыНакопления.КартыЛояльностиНакопление.СоздатьНаборЗаписей();
       НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
       Для Каждого ТекСтрокаТовары из Объект.Товары Цикл  
           НоваяЗапись = НаборЗаписей.Добавить();
           НоваяЗапись.Номенклатура = ТекСтрокаТовары.Номенклатура;
           НоваяЗапись.Карта        = Объект.КартаЛояльности;
           НоваяЗапись.СуммаБезСкидки = ТекСтрокаТовары.Сумма;
           НоваяЗапись.СуммаСкидки    = ТекСтрокаТовары.СуммаАвтоматическойСкидки;
           НоваяЗапись.Цена           = ТекСтрокаТовары.Цена;
           НоваяЗапись.Период         = Объект.Дата;
           НоваяЗапись.Количество     = ТекСтрокаТовары.Количество;
           НоваяЗапись.ПроцентСкидки  = ТекСтрокаТовары.ПроцентАвтоматическойСкидки;
       КонецЦикла;
       НаборЗаписей.Записать();
       //Запишем в Регистр Сведений КартыЛояльностиСведения Данные о накоплении и скидке по карте
       //согласно справочнику пороговые суммы скидки по карте
       СуммаНакоплПоКарте = 0;
       СкидПоКарте = 0;
       НаборЗаписей = РегистрыСведений.КартыЛояльностиСведения.СоздатьНаборЗаписей();
       НаборЗаписей.Прочитать();
       Для Каждого Запись из НаборЗаписей Цикл
           Если Запись.КартаЛояльности.Наименование = Объект.КартаЛояльности.Наименование Тогда
               СуммаНакоплПоКарте = Запись.СуммаНакопления;
               СкидПоКарте        = Запись.ПроцентСкидки;
           КонецЕсли;
       КонецЦикла;
       
       СуммаНакоплПоКарте = СуммаНакоплПоКарте + Объект.СуммаДокумента;
       //У дежурной карты процент скидки не будет меняться
       Если Объект.КартаЛояльности.ДежурнаяКарта = Ложь Тогда
           ВыборкаПороговыхСумм = Справочники.ПороговыеСуммыСкидкиПоКарте.Выбрать();
           Пока ВыборкаПороговыхСумм.Следующий() = 1 Цикл
               Если (СуммаНакоплПоКарте>=ВыборкаПороговыхСумм.НачальнаяСуммаНакопления) и (СуммаНакоплПоКарте<=ВыборкаПороговыхСумм.КонечнаяСуммаНакопления)
                   Тогда СкидПоКарте = ВыборкаПороговыхСумм.ПроцентСкидки;
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
       
           МенеджерЗаписи = РегистрыСведений.КартыЛояльностиСведения.СоздатьМенеджерЗаписи();
           МенеджерЗаписи.КартаЛояльности = Объект.КартаЛояльности.Ссылка;
           МенеджерЗаписи.ПроцентСкидки = СкидПоКарте;
           МенеджерЗаписи.СуммаНакопления = СуммаНакоплПокарте;
           Попытка    
               МенеджерЗаписи.Записать();
           Исключение
               Сообщить(Описаниеошибки());
           КонецПопытки;
       
   КонецЕсли;    
КонецПроцедуры
11 Aprobator
 
28.01.13
18:27
впрочем могу ошибаться, ибо состав процедур и функций общих модулей не вижу.
12 Kreont
 
28.01.13
18:32
да, тут без отладчика не разберешь :) столько условий и переходов.
Но вот Попытка в таких местах лучше не использовать.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.