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