При разработке аналитических отчетов по продажам в конфигурации «1С:Управление торговлей 10.3» разработчики нередко сталкиваются с ситуацией, когда по определенным документам реализации себестоимость в регистрах не зафиксирована (равна нулю). Типичный пример — отражение гарантийных случаев, замен товара или списаний через документ реализации с нулевой ценой. Чтобы оценить реальные затраты предприятия, требуется подтянуть актуальную или последнюю закупочную цену номенклатуры.
Разберем, почему себестоимость может отсутствовать в регистрах, как правильно извлечь цены из регистров сведений и накопления, а также как настроить отчет в системе компоновки данных (СКД).
Прежде чем переопределять получение стоимости, проанализируем, почему в регистре партий или себестоимости образуются нулевые движения:
Частая ошибка при обращении к виртуальной таблице СрезПоследних регистра сведений ЦеныНоменклатуры — выборка данных без указания отбора по измерению ТипЦен в параметрах самой таблицы. Если накладывать условие через секцию ГДЕ, запрос сначала вернет последние цены для всех существующих в базе типов цен (закупочная, оптовая, розничная и т. д.), что приведет к дублированию строк в результате левого соединения.
Посмотрим на корректно составленный запрос, в котором отбор передается непосредственно в параметры виртуальной таблицы:
ВЫБРАТЬ
Реализация.Ссылка КАК ДокументРеализации,
Реализация.Дата КАК Дата,
РеализацияТовары.Номенклатура КАК Номенклатура,
РеализацияТовары.Количество КАК Количество,
ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена,
РеализацияТовары.Количество * ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК СуммаОценки
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Реализация
ПО РеализацияТовары.Ссылка = Реализация.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&Период,
ТипЦен = &НужныйТипЦен
) КАК ЦеныНоменклатуры
ПО РеализацияТовары.Номенклатура = ЦеныНоменклатуры.Номенклатура
ГДЕ
Реализация.Ссылка = &СсылкаНаДокумент
Важно: если цены номенклатуры заданы в иностранной валюте или за единицу, отличную от единицы хранения остатков, в запросе необходимо предусмотреть пересчет через курс валюты из регистра сведений КурсыВалют и коэффициент единицы измерения (Номенклатура.ЕдиницаХраненияОстатков.Коэффициент).
Если отчет строится за длительный интервал времени и требуется получать срез цен на дату каждого отдельного документа реализации, единый срез на общую дату отчета не подойдет. В СКД эту задачу оптимально решать через соединение двух наборов данных.
Разберем пошагово настройку схемы компоновки данных:
ВЫБРАТЬ
Реализация.Ссылка КАК Документ,
Реализация.Дата КАК ДатаДокумента,
Товары.Номенклатура КАК Номенклатура,
Товары.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Реализация
ПО Товары.Ссылка = Реализация.Ссылка
ГДЕ
Реализация.Проведен = ИСТИНА
ВЫБРАТЬ
Цены.Номенклатура КАК Номенклатура,
Цены.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&ПериодЦен,
ТипЦен = &ВыбранныйТипЦен И Номенклатура = &ПараметрНоменклатура
) КАК Цены
НаборДанных1, а в поле Приемник связи — НаборДанных2.Номенклатура с Номенклатура.ДатаДокумента -> ПериодЦен и Номенклатура -> ПараметрНоменклатура.При такой схеме СКД выполнит запрос цен индивидуально под каждую строчку реализации на момент ее проведения.
Когда регистры сведений цен не заполняются, последнюю закупочную цену можно вычислить напрямую из регистра накопления Закупки. Для этого находим дату последней поставки товара, предшествующей дате отчета или реализации, и получаем фактическую цену закупки единицы.
Рассмотрим структуру запроса:
ВЫБРАТЬ
МаксимальныеДаты.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА Закупки.Количество <> 0
ТОГДА Закупки.Стоимость / Закупки.Количество
ИНАЧЕ 0
КОНЕЦ КАК ПоследняяЦенаЗакупки
ИЗ
(ВЫБРАТЬ
Закупки.Номенклатура КАК Номенклатура,
МАКСИМУМ(Закупки.Период) КАК МаксПериод
ИЗ
РегистрНакопления.Закупки КАК Закупки
ГДЕ
Закупки.Период <= &КонецПериода
СГРУППИРОВАТЬ ПО
Закупки.Номенклатура) КАК МаксимальныеДаты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК Закупки
ПО МаксимальныеДаты.Номенклатура = Закупки.Номенклатура
И МаксимальныеДаты.МаксПериод = Закупки.Период
Оформление гарантийных замен документом РеализацияТоваровУслуг с нулевой суммой искажает управленческую аналитику (занижает средний чек, вносит погрешности в показатель выручки и расчет валовой прибыли).
В типовой методологии 1С для отражения гарантий и брака рекомендуется использовать следующую цепочку документов:
Такой подход обеспечивает корректное списание себестоимости по партиям и позволяет формировать отчетность по убыткам без необходимости нестандартных доработок отчетов.