Как получить остатки товаров на дату в закупочных ценах в УТ 10.3

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

В конфигурации «1С:Управление торговлей 10.3» задача получения остатков в закупочных ценах часто вызывает затруднения, так как понятие «закупочная цена» может трактоваться по-разному: как цена последней закупки, как учетная цена из справочника или как фактическая себестоимость партии. В этой статье мы подробно разберем несколько способов решения данной задачи — от использования типового функционала до написания сложных запросов.

Метод 1. Использование отчета «Стоимостная оценка склада в ценах номенклатуры»

Это самый простой и быстрый способ, не требующий программирования. Однако он опирается на предварительно заполненные данные в регистре сведений ЦеныНоменклатуры. Рассмотрим, как его настроить.

Для начала нам нужно убедиться, что для товаров задан тип цены «Закупочная» и эти цены актуальны. Затем выполним следующие шаги:

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

Проанализируем особенности этого метода: отчет берет текущий остаток из регистра ТоварыНаСкладах и умножает его на цену из регистра ЦеныНоменклатуры, действующую на указанную дату. Если вы не ведете историю закупочных цен в этом регистре, отчет покажет нулевые значения или неактуальные данные. Этот метод идеален, когда цены поставщиков меняются редко и фиксируются документами УстановкаЦенНоменклатуры.

Метод 2. Использование партионного учета (Себестоимость)

Если в вашей базе ведется полноценный партионный учет, то наиболее точным отражением «закупочной цены» будет фактическая себестоимость товаров, находящихся на складе. Разберем, как получить эти данные.

Используем отчет Ведомость по партиям товаров на складах. В отличие от обычной ведомости, этот отчет обращается к регистрам ПартииТоваровНаСкладах. Здесь мы увидим не просто абстрактную цену, а конкретную сумму, за которую товар был приобретен (с учетом доп. расходов, если они были распределены на партию).

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

Метод 3. Запрос по ценам последней закупки

Иногда требуется увидеть остатки не по «плановой» закупочной цене и не по средней себестоимости, а именно по цене последнего поступления. Это классическая задача, которую часто решают с помощью вложенных запросов. Рассмотрим пример кода, который выбирает последние цены из документов поступления и соединяет их с текущими остатками.

Проанализируем структуру такого запроса по шагам. Сначала найдем даты последних поступлений для каждой номенклатурной позиции:


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

Затем получим саму цену из этих документов и соединим её с остатками в регистре ТоварыНаСкладах. Обратите внимание, что в запросе ниже мы также учитываем склады и характеристики:


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

Рассмотрим подробнее этот подход: он позволяет динамически определять цену закупки, даже если в справочнике цен ничего не заполнено. Однако стоит учитывать производительность — при большом объеме документов поступления такой запрос может работать медленно.

Метод 4. Программное получение цен с учетом валют

В реальных условиях закупочные цены часто ведутся в валюте (USD, EUR), а отчет требуется сформировать в рублях. Выясним причину сложности: нам нужно не просто взять число из регистра, но и привести его к единому коэффициенту единицы измерения и текущему курсу валюты управленческого учета.

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


ВЫРАЗИТЬ(ВЫБОР 
    КОГДА ЦеныНоменклатуры.Цена ЕСТЬ NULL 
    ТОГДА ЦеныНоменклатурыБезХарактеристик.Цена * ТаблицаРегистра.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЦеныНоменклатурыБезХарактеристик.ЕдиницаИзмерения.Коэффициент 
          * (КурсыВалют.Курс / КурсыВалют.Кратность) / (УпрВалюта.Курс / УпрВалюта.Кратность)
    ИНАЧЕ ЦеныНоменклатуры.Цена * ТаблицаРегистра.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЦеныНоменклатуры.ЕдиницаИзмерения.Коэффициент 
          * (КурсыВалют.Курс / КурсыВалют.Кратность) / (УпрВалюта.Курс / УпрВалюта.Кратность)
КОНЕЦ КАК ЧИСЛО(15, 2))

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

Метод 5. Использование регистра «Закупки»

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

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

Пример логики запроса через регистр Закупки:

  1. Выбираем остатки из ТоварыНаСкладах.Остатки.
  2. Левым соединением подтягиваем данные из Закупки.Обороты, где период — это максимально возможный интервал до даты отчета.
  3. Рассчитываем цену как СтоимостьОборот / КоличествоОборот.

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

Резюме и рекомендации

Подведем итог. Если вам нужно быстрое решение «здесь и сейчас» — используйте типовой отчет «Стоимостная оценка склада», предварительно заполнив закупочные цены. Если важна финансовая точность и в базе включена партионка — ваш выбор «Ведомость по партиям товаров».

Для разработчиков, которым необходимо создать уникальный отчет, наиболее надежным способом будет комбинация данных из регистра ТоварыНаСкладах (для количества) и регистра ЦеныНоменклатуры или Закупки (для определения стоимостных показателей). Не забывайте всегда проверять валюту цены и коэффициенты единиц измерения, чтобы избежать ошибок в расчетах суммы остатков.

← На главную