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

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

При разработке отчетов в 1С часто возникает задача сформировать классическую ведомость: остаток на начало периода, приход, расход и остаток на конец периода. Подобный анализ закупок, продаж и остатков товара является базовой потребностью для любого склада. Многие разработчики интуитивно пытаются решить эту задачу в системе компоновки данных (СКД), создавая два отдельных набора данных: один для получения остатков, другой — для оборотов, а затем связывая их. Однако такой подход часто приводит к неверным результатам и сложностям в настройке. Рассмотрим, почему это происходит и как сделать правильно и эффективно.

Проанализируем ситуацию: необходимо создать отчет по остаткам и оборотам товаров на складах в конфигурации "Управление торговлей 11.4". Отчет должен показывать начальный остаток, движения за период и конечный остаток по каждой номенклатуре и характеристике. В более сложных сценариях может потребоваться учитывать движения товаров с резервами и рассчитывать данные нарастающим итогом.

Анализ неверного подхода: два набора данных

Первоначальная идея, которая может прийти в голову, — это создать два независимых запроса и объединить их в СКД.

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

Затем эти два набора данных связываются по общим измерениям, таким как Номенклатура и Характеристика. Вот пример такого подхода:

Запрос 1: ОстаткиТоваров


ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки.Характеристика КАК Характеристика,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК НачальныйОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки

Запрос 2: ОборотыТоваров


ВЫБРАТЬ
    ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОбороты.Характеристика КАК Характеристика,
    ТоварыНаСкладахОбороты.КоличествоПриход КАК Приход,
    ТоварыНаСкладахОбороты.КоличествоРасход КАК Расход
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ТоварыНаСкладахОбороты

В чем здесь кроется ключевая ошибка? Проблема в параметрах виртуальной таблицы остатков. Виртуальная таблица Остатки(&Период, &Условие) ожидает в качестве первого параметра конкретную дату (момент времени), а не интервал. Когда в стандартный параметр СКД &Период, который является интервалом, передается в эту таблицу, система берет остатки на конец этого периода, а не на начало. В результате поле НачальныйОстаток на самом деле содержит конечный остаток, что полностью нарушает логику отчета. При возникновении подобных расхождений полезно выполнить сравнение товаров на складах и товаров организаций (для этого есть анализ расхождений остатков на складах и остатков организаций) для выявления потенциальных ошибок в учете.

Правильное и эффективное решение: виртуальная таблица "ОстаткиИОбороты"

Платформа 1С предоставляет специальный, оптимизированный инструмент именно для таких задач — виртуальную таблицу ОстаткиИОбороты. Эта таблица позволяет за один запрос к базе данных получить все необходимые данные: начальный остаток, конечный остаток, а также обороты (приход и расход) за указанный период. Если же вам требуется расширенная аналитика, например, остатки товаров организаций с себестоимостью и датами закупок, этот метод также ляжет в основу решения.

Этот подход не только корректен, но и значительно производительнее, так как СУБД выполняет одну сложную операцию вместо нескольких с последующим соединением на уровне 1С.

Разберем по шагам создание отчета

Создадим отчет на СКД, используя один набор данных-запрос к виртуальной таблице РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты.

  1. Создание запроса

    Запрос будет выглядеть следующим образом. Обратим внимание на параметры таблицы.

    
    ВЫБРАТЬ
        ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
        ТоварыНаСкладахОстаткиИОбороты.Характеристика,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
        ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
            &НачалоПериода, 
            &КонецПериода, 
            Запись, 
            , 
            ) КАК ТоварыНаСкладахОстаткиИОбороты
    
  2. Анализ параметров виртуальной таблицы

    Рассмотрим параметры, которые мы передали в таблицу ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Периодичность, МетодДополнения, Условие):

    • &НачалоПериода, &КонецПериода — это стандартные параметры, которые СКД создает автоматически, если в запросе используются эти имена. Они определяют границы нашего отчетного периода.
    • Периодичность. Это самый важный параметр в данном контексте. Он определяет, как будут сгруппированы обороты. Мы указали значение Запись (можно также использовать синоним Регистратор). Это означает, что обороты будут получены в разрезе каждого документа-регистратора, что дает нам полную детализацию движений. Если бы мы указали День или Месяц, обороты были бы сгруппированы по дням или месяцам соответственно. Если оставить параметр пустым, обороты свернутся в одну общую запись за весь период.
    • МетодДополнения. Мы его не указывали. Он используется, если нужно дополнять периоды, по которым не было движений.
    • Условие. Также не указано, но сюда можно передать структуру отбора, например, для фильтрации по конкретному складу или организации.
  3. Настройка СКД

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

    • Закладка "Ресурсы". Здесь необходимо указать поля, которые являются расчетными. Для нашего отчета это будут все числовые поля: КоличествоНачальныйОстаток, КоличествоПриход, КоличествоРасход, КоличествоКонечныйОстаток. Для всех них можно оставить выражение по умолчанию Сумма(). Важный момент: для корректного расчета итогов по группировкам для остаточных полей (начальный и конечный остаток) может потребоваться дополнительная настройка. В поле "Рассчитывать по..." нужно указать измерения, по которым остаток не должен суммироваться (например, по группировке верхнего уровня). Для начального остатка часто используют агрегатную функцию Мин(), а для конечного — Макс() в настройках расчета итогов.
    • Закладка "Настройки". Создадим структуру отчета. Например, добавим новую группировку и в качестве полей группировки укажем Номенклатура и Характеристика. В выбранные поля добавим все наши ресурсы: начальный остаток, приход, расход и конечный остаток.

После выполнения этих шагов отчет будет готов. Он будет работать корректно и быстро, так как использует наиболее оптимальный механизм платформы для получения данных такого вида. Использование виртуальной таблицы ОстаткиИОбороты — это лучший способ для создания отчетов-ведомостей, который позволяет избежать логических ошибок и проблем с производительностью. Для комплексного контроля предприятия также рекомендуем использовать анализ продаж, остатков, резервов и доступности, который включает данные о ценах и обеспечении.

← На главную