Имя: Пароль:
1C
1С v8
Как реализовать переоценку товаров?
0 wellno
 
21.10.20
09:41
Добрый день.
У меня имеется документ ИзменениеЦены, который задает новое значение товара в регистр сведений Цены. Также у меня имеется регистр накоплений ПродажнаяСтоимостьТоваровНаСкладе в который входит: товар, склад, стоимость, количество. Каким образом мне реализовать переоценку в этом регистре? Я уже сделал два варианта: один находил все движения с заданным товаром и дублировал их с новой ценой, второй вариант просто напрямую изменял стоимость старых движений. Однако, оба способа некорректны. Каким образом должен выглядеть верный вариант?
1 wellno
 
21.10.20
15:04
"Суть документа переоценки в том, что после его проведения изменяется только остаток. То есть документ должен СОЗДАТЬ такие движения, чтоб после его проведения ОСТАТОК имел новую стоимость (анализировать надо именно с Остатки)."  Может, хоть это кто-нибудь расшифрует?
2 MikhaNik
 
21.10.20
15:44
Если "Стоимость" это измерение и = цена*количество,
то нужно найти все товары на этом складе и запись будет
"Склад", "Товар", "Количество"=0 (не меняем), "Стоимость" = "Стоимость" - "Цена" * "Количество"
т.е. если цена останется прежней итоги не поменяются (тут можно условие предусмотреть что бы не формировать лишние записи)
3 MikhaNik
 
21.10.20
15:45
(поправка)
Если "Стоимость" это "ресурс" и = цена*количество,
то нужно найти все товары на этом складе и запись будет
"Склад", "Товар", "Количество"=0 (не меняем), "Стоимость" = "Стоимость" - "Цена" * "Количество"
т.е. если цена останется прежней итоги не поменяются (тут можно условие предусмотреть что бы не формировать лишние записи)
4 wellno
 
21.10.20
16:03
Реализовал что-то похожее:
Если ТекСтрокаЦены.ПредыдущаяСтоимость * Количество > РаботаСДокументами.ПолучитьПродажнуюСтоимость(Дата, ТекСтрокаЦены.Товар) * Количество Тогда
                // регистр ПродажнаяСтоимостьТоваровНаСкладе Расход
                Движение = Движения.ПродажнаяСтоимостьТоваровНаСкладе.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;
                Движение.Товар = ТекСтрокаЦены.Товар;
                Движение.ПродажнаяСтоимость = (ТекСтрокаЦены.ПредыдущаяСтоимость * Количество) - (РаботаСДокументами.ПолучитьПродажнуюСтоимость(Дата, ТекСтрокаЦены.Товар) * Количество);
                Движение.Склад = СпрСклад.Ссылка;
            Иначе
                // регистр ПродажнаяСтоимостьТоваровНаСкладе Приход
                Движение = Движения.ПродажнаяСтоимостьТоваровНаСкладе.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
                Движение.Период = Дата;
                Движение.Товар = ТекСтрокаЦены.Товар;
                Движение.ПродажнаяСтоимость = (РаботаСДокументами.ПолучитьПродажнуюСтоимость(Дата, ТекСтрокаЦены.Товар) * Количество) - (ТекСтрокаЦены.ПредыдущаяСтоимость * Количество);
                Движение.Склад = СпрСклад.Ссылка;
            КонецЕсли;

Если новая цена больше - находим остаток и проводим приход. Если же цена меньше - находим остаток и проводим расход. Проблема в том, что в отчете по данному регистру, эти движения тоже будут считаться. А значит несколько раз меняя цену, сумма расхода и прихода будет складываться. В итоге я получу не совсем верные данные, так как все движения документа пойдут в отчет. Стоит ли решать эту проблему?
5 MikhaNik
 
21.10.20
18:10
Это цикл, а в цикле еще запрос (желательно все одним запросом делать)
РаботаСДокументами.ПолучитьПродажнуюСтоимость(Дата, ТекСтрокаЦены.Товар)

причем 2 раза за проход, если уж так писать, то хотя бы переменную сделай, что бы 1 раз считалось в цикле