При получении отчетов по складским остаткам и партиям товаров разработчики и пользователи нередко сталкиваются с ситуацией, когда количественные движения по документу возврата отражаются корректно, а суммовая оценка (себестоимость) в регистре накопления отсутствует. В результате искажаются конечные стоимостные остатки номенклатуры. Разберем подробно причины такого поведения системы и рассмотрим, как правильно исправить документ и оптимизировать текст запроса к виртуальной таблице регистра.
В конфигурациях с классическим партионным учетом (таких как УТП, УПП, УТ 10.3) регистр накопления ПартииТоваровНаСкладах отвечает за учет себестоимости запасов. Документ возврата товаров от покупателя должен восстанавливать партии на склад. Однако расчет стоимости возвращаемого товара зависит от заполнения реквизитов документа.
Проанализируем основные факторы, из-за которых сумма не фиксируется в регистре:
Проведение по партиям.Для корректного отражения сумм возврата выполним следующие шаги:
В исходном тексте запроса разработчики часто допускают методические ошибки, накладывая условия на измерения регистра в секции ГДЕ вместо передачи их в параметры виртуальной таблицы. Это приводит к лишней нагрузке на СУБД и может искажать расчет начальных и конечных остатков.
Посмотрим на исходный вариант запроса с ошибками:
ВЫБРАТЬ
ПартииТоваровНаСкладах.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ПартииТоваровНаСкладах.СтоимостьНачальныйОстаток КАК СтоимостьНачальныйОстаток,
ПартииТоваровНаСкладах.КоличествоПриход КАК КоличествоПриход,
ПартииТоваровНаСкладах.СтоимостьПриход КАК СтоимостьПриход,
ПартииТоваровНаСкладах.КоличествоРасход КАК КоличествоРасход,
ПартииТоваровНаСкладах.СтоимостьРасход КАК СтоимостьРасход,
ПартииТоваровНаСкладах.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
ПартииТоваровНаСкладах.СтоимостьКонечныйОстаток КАК СтоимостьКонечныйОстаток
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(
&ДатаНачало,
&ДатаКонца,
Период,
ДвиженияИГраницыПериода,
Склад В (&вхСкладыСЗ)) КАК ПартииТоваровНаСкладах
ГДЕ
ПартииТоваровНаСкладах.Номенклатура = &вхНоменклатура
Разберем, что необходимо исправить в данном запросе:
Номенклатура должен находиться внутри скобок виртуальной таблицы рядом с условием по складу, объединенный логическим оператором И.23:59:59), параметр даты конца следует передавать как объект Граница с видом ВидГраницы.Включая.Рассмотрим правильный вариант формирования запроса на встроенном языке 1С:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Партии.Номенклатура КАК Номенклатура,
| Партии.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
| Партии.СтоимостьНачальныйОстаток КАК СтоимостьНачальныйОстаток,
| Партии.КоличествоПриход КАК КоличествоПриход,
| Партии.СтоимостьПриход КАК СтоимостьПриход,
| Партии.КоличествоРасход КАК КоличествоРасход,
| Партии.СтоимостьРасход КАК СтоимостьРасход,
| Партии.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
| Партии.СтоимостьКонечныйОстаток КАК СтоимостьКонечныйОстаток
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(
| &ДатаНачало,
| &ДатаКонца,
| ,
| ,
| Склад В (&вхСкладыСЗ) И Номенклатура = &вхНоменклатура
| ) КАК Партии";
Запрос.УстановитьПараметр("вхСкладыСЗ", Объект.Склад);
Запрос.УстановитьПараметр("вхНоменклатура", вхНоменклатура);
Запрос.УстановитьПараметр("ДатаНачало", НачалоДня(Объект.ДатаНачало));
Запрос.УстановитьПараметр("ДатаКонца", Новый Граница(КонецДня(Объект.ДатаКонца), ВидГраницы.Включая));
РезультатЗапроса = Запрос.Выполнить();
Такой подход обеспечивает корректное получение остатков и оборотов как в количественном, так и в суммовом выражении с максимальной производительностью СУБД.