Почему сумма возврата не попадает в регистр «Партии товаров на складах» в 1С?

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При получении отчетов по складским остаткам и партиям товаров разработчики и пользователи нередко сталкиваются с ситуацией, когда количественные движения по документу возврата отражаются корректно, а суммовая оценка (себестоимость) в регистре накопления отсутствует. В результате искажаются конечные стоимостные остатки номенклатуры. Разберем подробно причины такого поведения системы и рассмотрим, как правильно исправить документ и оптимизировать текст запроса к виртуальной таблице регистра.

Причина отсутствия суммовых движений при возврате товаров

В конфигурациях с классическим партионным учетом (таких как УТП, УПП, УТ 10.3) регистр накопления ПартииТоваровНаСкладах отвечает за учет себестоимости запасов. Документ возврата товаров от покупателя должен восстанавливать партии на склад. Однако расчет стоимости возвращаемого товара зависит от заполнения реквизитов документа.

Проанализируем основные факторы, из-за которых сумма не фиксируется в регистре:

  1. Не указана себестоимость или документ партии в документе возврата: если возврат оформляется без привязки к конкретному документу реализации (партии отгрузки) и в табличной части не заполнена колонка себестоимости (цена партии), система делает движение по регистру исключительно в количественном выражении с нулевой суммой.
  2. Отложенное проведение по партиям: если в настройках параметров учета отключено списание партий в реальном времени, суммовые оценки при проведении первичных документов не рассчитываются. Суммы в регистре появляются только после выполнения регламентной обработки Проведение по партиям.
  3. Нарушение хронологической последовательности: проведение возврата датой, предшествующей реализации, либо изменение документов задним числом приводит к нарушению партионного учета. В таком случае требуется полное перепроведение партионной последовательности.

Способы устранения ошибки в документах

Для корректного отражения сумм возврата выполним следующие шаги:

  1. Откроем документ возврата товаров от покупателя и проверим заполнение документа партии в табличной части. Если отгрузка известна, укажем документ партии или воспользуемся типовой кнопкой заполнения по документу реализации.
  2. Если возврат осуществляется без документа отгрузки, вручную укажем расчетную себестоимость товара в соответствующей колонке табличной части документа.
  3. Запустим регламентную обработку проведения по партиям за проверяемый период, чтобы восстановить актуальную себестоимость списания и возврата.

Оптимизация и исправление запроса к регистру «ОстаткиИОбороты»

В исходном тексте запроса разработчики часто допускают методические ошибки, накладывая условия на измерения регистра в секции ГДЕ вместо передачи их в параметры виртуальной таблицы. Это приводит к лишней нагрузке на СУБД и может искажать расчет начальных и конечных остатков.

Посмотрим на исходный вариант запроса с ошибками:


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

Разберем, что необходимо исправить в данном запросе:

  1. Перенос условий в параметры виртуальной таблицы: отбор по измерению Номенклатура должен находиться внутри скобок виртуальной таблицы рядом с условием по складу, объединенный логическим оператором И.
  2. Настройка периодичности: если требуется получить единые начальные, конечные остатки и обороты за весь период без детализации по датам движений, периодичность указывать не нужно (оставляем параметр пустым).
  3. Передача границы конца периода: чтобы гарантированно учесть движения, проведенные в последнюю секунду периода (23:59:59), параметр даты конца следует передавать как объект Граница с видом ВидГраницы.Включая.

Рассмотрим правильный вариант формирования запроса на встроенном языке 1С:


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

Запрос.УстановитьПараметр("вхСкладыСЗ", Объект.Склад);
Запрос.УстановитьПараметр("вхНоменклатура", вхНоменклатура);
Запрос.УстановитьПараметр("ДатаНачало", НачалоДня(Объект.ДатаНачало));
Запрос.УстановитьПараметр("ДатаКонца", Новый Граница(КонецДня(Объект.ДатаКонца), ВидГраницы.Включая));

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

Такой подход обеспечивает корректное получение остатков и оборотов как в количественном, так и в суммовом выражении с максимальной производительностью СУБД.

← На главную