Как получить последнюю цену номенклатуры в отчете СКД при нулевой себестоимости реализации

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

При разработке аналитических отчетов по продажам в конфигурации «1С:Управление торговлей 10.3» разработчики нередко сталкиваются с ситуацией, когда по определенным документам реализации себестоимость в регистрах не зафиксирована (равна нулю). Типичный пример — отражение гарантийных случаев, замен товара или списаний через документ реализации с нулевой ценой. Чтобы оценить реальные затраты предприятия, требуется подтянуть актуальную или последнюю закупочную цену номенклатуры.

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

Причины отсутствия себестоимости в движениях документа

Прежде чем переопределять получение стоимости, проанализируем, почему в регистре партий или себестоимости образуются нулевые движения:

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

Способ 1. Получение цены из регистра сведений «ЦеныНоменклатуры»

Частая ошибка при обращении к виртуальной таблице СрезПоследних регистра сведений ЦеныНоменклатуры — выборка данных без указания отбора по измерению ТипЦен в параметрах самой таблицы. Если накладывать условие через секцию ГДЕ, запрос сначала вернет последние цены для всех существующих в базе типов цен (закупочная, оптовая, розничная и т. д.), что приведет к дублированию строк в результате левого соединения.

Посмотрим на корректно составленный запрос, в котором отбор передается непосредственно в параметры виртуальной таблицы:


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

Важно: если цены номенклатуры заданы в иностранной валюте или за единицу, отличную от единицы хранения остатков, в запросе необходимо предусмотреть пересчет через курс валюты из регистра сведений КурсыВалют и коэффициент единицы измерения (Номенклатура.ЕдиницаХраненияОстатков.Коэффициент).

Способ 2. Получение цен на дату каждого документа через связи наборов данных СКД

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

Разберем пошагово настройку схемы компоновки данных:

  1. Создаем НаборДанных1 (Запрос): выбираем список реализаций, их даты, номенклатуру и количество.
    
    ВЫБРАТЬ
        Реализация.Ссылка КАК Документ,
        Реализация.Дата КАК ДатаДокумента,
        Товары.Номенклатура КАК Номенклатура,
        Товары.Количество КАК Количество
    ИЗ
        Документ.РеализацияТоваровУслуг.Товары КАК Товары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Реализация
            ПО Товары.Ссылка = Реализация.Ссылка
    ГДЕ
        Реализация.Проведен = ИСТИНА
    
  2. Создаем НаборДанных2 (Запрос): получаем срез цен с фильтрацией по номенклатуре и периоду через параметры.
    
    ВЫБРАТЬ
        Цены.Номенклатура КАК Номенклатура,
        Цены.Цена КАК Цена
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
            &ПериодЦен, 
            ТипЦен = &ВыбранныйТипЦен И Номенклатура = &ПараметрНоменклатура
        ) КАК Цены
    
  3. Настраиваем вкладку «Связи наборов данных»:
    1. В поле Источник связи указываем НаборДанных1, а в поле Приемник связи — НаборДанных2.
    2. В условии связи связываем Номенклатура с Номенклатура.
    3. В колонке Параметры сопоставляем: ДатаДокумента -> ПериодЦен и Номенклатура -> ПараметрНоменклатура.

При такой схеме СКД выполнит запрос цен индивидуально под каждую строчку реализации на момент ее проведения.

Способ 3. Извлечение цены из последнего поступления через регистр «Закупки»

Когда регистры сведений цен не заполняются, последнюю закупочную цену можно вычислить напрямую из регистра накопления Закупки. Для этого находим дату последней поставки товара, предшествующей дате отчета или реализации, и получаем фактическую цену закупки единицы.

Рассмотрим структуру запроса:


ВЫБРАТЬ
    МаксимальныеДаты.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА Закупки.Количество <> 0
            ТОГДА Закупки.Стоимость / Закупки.Количество
        ИНАЧЕ 0
    КОНЕЦ КАК ПоследняяЦенаЗакупки
ИЗ
    (ВЫБРАТЬ
        Закупки.Номенклатура КАК Номенклатура,
        МАКСИМУМ(Закупки.Период) КАК МаксПериод
    ИЗ
        РегистрНакопления.Закупки КАК Закупки
    ГДЕ
        Закупки.Период <= &КонецПериода
    СГРУППИРОВАТЬ ПО
        Закупки.Номенклатура) КАК МаксимальныеДаты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК Закупки
        ПО МаксимальныеДаты.Номенклатура = Закупки.Номенклатура
        И МаксимальныеДаты.МаксПериод = Закупки.Период

Методологические рекомендации по отражению гарантийных затрат

Оформление гарантийных замен документом РеализацияТоваровУслуг с нулевой суммой искажает управленческую аналитику (занижает средний чек, вносит погрешности в показатель выручки и расчет валовой прибыли).

В типовой методологии 1С для отражения гарантий и брака рекомендуется использовать следующую цепочку документов:

  1. «Возврат товаров от покупателя» — фиксирует поступление неисправного изделия на склад брака.
  2. «Списание товаров» или «Требование-накладная» — списывает изделие на затраты компании с указанием статьи затрат (например, «Гарантийный ремонт» или «Расходы по браку»).

Такой подход обеспечивает корректное списание себестоимости по партиям и позволяет формировать отчетность по убыткам без необходимости нестандартных доработок отчетов.

← На главную