Приходую на склад одну номенклатуру за n-ую цену одним документом, потом приходую ее же по другой цене другим документом, приходую ее же по третьей цене третьим документом. Потом продаю эту номенклатуру документом РасходнаяНакладная

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

1. Общая цена складывается сразу за все приходные накладные(считает правильно сумму всех затрат на эту номенклатуру), но, допустим, я купил только 20го числа, а продаю 10го числа, то та сумма, потраченная 20го числа будет влиять всё равно. Как сделать чтобы это работало на дату документа?

2. А вот количество неправильно. Продаю эту номенклатуру, например 10-ым числом, (на тот момент было куплено 18шт номенклатуры), потом продаю, например 20-ым числом (на тот момент куплено 23шт). Но всегда пишет неправильное количество, считает правильно только первый документ, где было 10шт, дальше пишет уже 14, потом пишет 13. Неправильно считается количество. Помогите, пожалуйста новичку

никаких движений в СтоимостьМатериалов не делаю

Код ниже скину
---
Бери оборот, а не остаток, дата начала пустая(ну или начало месяца, по условию задачи). Дата окончания - момент времени документа расхода.
И не просто оборот, а КоличествоПриход
Хотя странно это, зачем уже списанные по себестоимости вещи нужны, но тебе виднее
---
Вот код:

```1c
    Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;

    МенеджерВТ = Новый МенеджерВременныхТаблиц;

    Запрос = Новый Запрос;

    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

    Запрос.Текст =
    "ВЫБРАТЬ
    | РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура,
    | РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    | СУММА(РасходнаяНакладнаяПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
    | СУММА(РасходнаяНакладнаяПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
    |ПОМЕСТИТЬ НоменклатураДокумента
    |ИЗ
    | Документ.РасходнаяНакладная.ПереченьНоменклатуры КАК РасходнаяНакладнаяПереченьНоменклатуры
    |ГДЕ
    | РасходнаяНакладнаяПереченьНоменклатуры.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    | РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура,
    | РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);

    РезультатЗапроса = Запрос.Выполнить();

    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст = "ВЫБРАТЬ
    | НоменклатураДокумента.Номенклатура,
    | НоменклатураДокумента.ВидНоменклатуры,
    | НоменклатураДокумента.КоличествоВДокументе,
    | НоменклатураДокумента.СуммаВДокументе,
    | ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
    | ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
    |ИЗ
    | НоменклатураДокумента КАК НоменклатураДокумента
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&
    | ,
    | Товар В
    | (ВЫБРАТЬ
    | НоменклатураДокумента.Номенклатура
    | ИЗ
    | НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
    | ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Товар
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени
    | ,
    | Товар В
    | (ВЫБРАТЬ
    | НоменклатураДокумента.Номенклатура
    | ИЗ
    | НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
    | ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Товар";

    Запрос2.УстановитьПараметр("МоментВремени", МоментВремени());

    Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;

    Движения.ОстаткиМатериалов.Записать();

    РезультатЗапроса = Запрос2.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
    СтоимостьТовара = 0;
    Иначе
    СтоимостьТовара =
    ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;
    КонецЕсли;

    Если ВыборкаДетальныеЗаписи.ВидНоменклатуры =
    Перечисления.ВидыНоменклатуры.Товар Тогда

    // регистр ОстаткиМатериалов Расход
    Движение = Движения.ОстаткиМатериалов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Товар = ВыборкаДетальныеЗаписи.Номенклатура;
    Движение.Склад = Склад;
    Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;

    КонецЕсли;

    // регистр Продажи
    Движение = Движения.Продажи.Добавить();
    Движение.Период = Дата;
    Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
    Движение.Клиент = Клиент;
    Движение.Мастер = Мастер;
    Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
    Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе;
    Движение.Стоимость = СтоимостьТовара;
    КонецЦикла;

    Движения.Записать();
```
---
Категорически рекомендую Вам пройти курс подготовки к 1С специалист по платформе, там именно этот ньюанс рассматривается крайне подробно.
---
Но вообще, с практической точки зрения - в 1с ушли вообще от этой схемы, и себестоимость считается при закрытии периода, потому что эта модель, даже со всеми опттимизациями и рекомендациями крайне ресурсоемка.
---
ну где я сейчас курсы пройду, отчитывать задание на неделе надо уже)
осталось чтобы только количество и стоимость нормально считались...
---
ну где я сейчас курсы пройду, отчитывать задание на неделе надо уже)
осталось чтобы только количество и стоимость
При желании найти, скачать и изучить этот ньюанс - 3 часа времени, можно посмотреть на форуме Чистова к примеру решения задач на Спеца.
Взять задачник. Найти схожую задачу, посмотреть ее решение и понять зачем так.
С виду - похоже на тестовое задание из сборника на спеца, чем на реальный код.
---
Из листинга - СтоимостьМатериалов.Остатки вычисляется оперативными остатками, а не на момент документа.
---
Так я понимаю, я же выше вопрос задал, как сделать чтобы считалось на момент документа?) я не совсем понимаю пока этого
---
Решение в лоб, но принимающему не понравится.
Запрос2.УстановитьПараметр("МоментВремени", новый Граница (МоментВремени(), ВидГраницы.Исключая));
---
И пихать во все обращения к остаткам.
Но в реальной работе не надо так делать.
И да при перепроведении надо удалять записи, существующие по этому документу в регистрах.
---
сработало, а количество теперь как поправить? количество везде разное
---
По идее если удалишь существующие записи, то и количество при перепроведении должно нормально работать
---
Извините, чувствую себя обезьяной с гранатой (студентом с радченко)))
Не подскажите, какой строкой кода я могу удалять их? это же в коде вы имеете ввиду прописать, чтобы они удалялись?
---
Самый простой способ - в документе на вкладке Движения в Удаление Движений - поставь удалять автоматически
---
Самый простой способ - в документе на вкладке Движения в Удаление Движений - поставь удалять автоматически
---
у меня итак стоит Удалять автоматически
---
Странно - должно работать.
---
себестоимость считает правильно только по самому первому документу продажи, когда пришло только первая партий номенклатуры документом ПрихНакл1
Дальше начинает считать неправильно
---
по самому первому документу продажи, когда пришло только первая партий номенклатуры документом ПрихНакл1
Дальше начинает считать неправильно

А что неправильно то? Фактический остаток на дату вычисляется неверно? Или что?
---
7го числа пришло 10шт товара
20го числа 8шт товара
28го числа 5шт товара

8 числа продаю 4шт (на этот момент количество пишет 10)
20 числа продаю 1 шт ( пишет количество 14)
26 числа продаю 3шт ( пишет 13)
29 числа продаю 3 (пишет 17)
---
нужно именно чтобы количество суммировалось. например, прихнакл1 куплено 10товаров, прихнакл2 куплено 8товаров, прихнакл3 куплено 3 товара. Чтобы количество считалось как 10+8+3 и не учитывало сколько там у меня осталось, сколько продано...
---
Бери оборот, а не остаток, дата начала пустая(ну или начало месяца, по условию задачи). Дата окончания - момент времени документа расхода.
И не просто оборот, а КоличествоПриход
Хотя странно это, зачем уже списанные по себестоимости вещи нужны, но тебе виднее
---
так?

```1c
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст = "ВЫБРАТЬ
    | НоменклатураДокумента.Номенклатура КАК Номенклатура,
    | НоменклатураДокумента.ВидНоменклатуры КАК ВидНоменклатуры,
    | НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
    | НоменклатураДокумента.СуммаВДокументе КАК СуммаВДокументе,
    | ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
    | ЕСТЬNULL(ОстаткиМатериаловОбороты.КоличествоОборот, 0) КАК Количество
    |ИЗ
    | НоменклатураДокумента КАК НоменклатураДокумента
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
    | &МоментВремени,
    | Товар В
    | (ВЫБРАТЬ
    | НоменклатураДокумента.Номенклатура
    | ИЗ
    | НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
    | ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Товар
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Обороты(
    | ,
    | &МоментВремени,
    | ,
    | Товар В
    | (ВЫБРАТЬ
    | НоменклатураДокумента.Номенклатура
    | ИЗ
    | НоменклатураДокумента)) КАК ОстаткиМатериаловОбороты
    | ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОбороты.Товар";

    Запрос2.УстановитьПараметр("МоментВремени", новый Граница (МоментВремени(), ВидГраницы.Исключая));
```
---
всё точно также и осталось, количество также неправильно работает
---
Не так, я же написал, что нужен приход
---
Вместо

```1c
    ЕСТЬNULL(ОстаткиМатериаловОбороты.КоличествоОборот, 0) КАК Количество
```

Надо

```1c
    ЕСТЬNULL(ОстаткиМатериаловОбороты.КоличествоПриход, 0) КАК Количество
```
---
да я уже написал, благодарю вас!
всё работает!
---
количество же должно складываться по мере поступления этого товара