При разработке отчетов в 1С часто возникает задача сформировать классическую ведомость: остаток на начало периода, приход, расход и остаток на конец периода. Подобный анализ закупок, продаж и остатков товара является базовой потребностью для любого склада. Многие разработчики интуитивно пытаются решить эту задачу в системе компоновки данных (СКД), создавая два отдельных набора данных: один для получения остатков, другой — для оборотов, а затем связывая их. Однако такой подход часто приводит к неверным результатам и сложностям в настройке. Рассмотрим, почему это происходит и как сделать правильно и эффективно.
Проанализируем ситуацию: необходимо создать отчет по остаткам и оборотам товаров на складах в конфигурации "Управление торговлей 11.4". Отчет должен показывать начальный остаток, движения за период и конечный остаток по каждой номенклатуре и характеристике. В более сложных сценариях может потребоваться учитывать движения товаров с резервами и рассчитывать данные нарастающим итогом.
Первоначальная идея, которая может прийти в голову, — это создать два независимых запроса и объединить их в СКД.
РегистрНакопления.ТоварыНаСкладах.Остатки, чтобы получить остатки на начало периода.РегистрНакопления.ТоварыНаСкладах.Обороты, чтобы получить движения за период.Затем эти два набора данных связываются по общим измерениям, таким как Номенклатура и Характеристика. Вот пример такого подхода:
Запрос 1: ОстаткиТоваров
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.Характеристика КАК Характеристика,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК НачальныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
Запрос 2: ОборотыТоваров
ВЫБРАТЬ
ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОбороты.Характеристика КАК Характеристика,
ТоварыНаСкладахОбороты.КоличествоПриход КАК Приход,
ТоварыНаСкладахОбороты.КоличествоРасход КАК Расход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ТоварыНаСкладахОбороты
В чем здесь кроется ключевая ошибка? Проблема в параметрах виртуальной таблицы остатков. Виртуальная таблица Остатки(&Период, &Условие) ожидает в качестве первого параметра конкретную дату (момент времени), а не интервал. Когда в стандартный параметр СКД &Период, который является интервалом, передается в эту таблицу, система берет остатки на конец этого периода, а не на начало. В результате поле НачальныйОстаток на самом деле содержит конечный остаток, что полностью нарушает логику отчета. При возникновении подобных расхождений полезно выполнить сравнение товаров на складах и товаров организаций (для этого есть анализ расхождений остатков на складах и остатков организаций) для выявления потенциальных ошибок в учете.
Платформа 1С предоставляет специальный, оптимизированный инструмент именно для таких задач — виртуальную таблицу ОстаткиИОбороты. Эта таблица позволяет за один запрос к базе данных получить все необходимые данные: начальный остаток, конечный остаток, а также обороты (приход и расход) за указанный период. Если же вам требуется расширенная аналитика, например, остатки товаров организаций с себестоимостью и датами закупок, этот метод также ляжет в основу решения.
Этот подход не только корректен, но и значительно производительнее, так как СУБД выполняет одну сложную операцию вместо нескольких с последующим соединением на уровне 1С.
Создадим отчет на СКД, используя один набор данных-запрос к виртуальной таблице РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты.
Создание запроса
Запрос будет выглядеть следующим образом. Обратим внимание на параметры таблицы.
ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.Характеристика,
ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
Запись,
,
) КАК ТоварыНаСкладахОстаткиИОбороты
Анализ параметров виртуальной таблицы
Рассмотрим параметры, которые мы передали в таблицу ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Периодичность, МетодДополнения, Условие):
&НачалоПериода, &КонецПериода — это стандартные параметры, которые СКД создает автоматически, если в запросе используются эти имена. Они определяют границы нашего отчетного периода.Запись (можно также использовать синоним Регистратор). Это означает, что обороты будут получены в разрезе каждого документа-регистратора, что дает нам полную детализацию движений. Если бы мы указали День или Месяц, обороты были бы сгруппированы по дням или месяцам соответственно. Если оставить параметр пустым, обороты свернутся в одну общую запись за весь период.Настройка СКД
После того как запрос готов, остается настроить сам отчет в конструкторе СКД. В некоторых случаях для проверки корректности данных может потребоваться сравнение товаров на складах организаций и себестоимости товаров — удобнее через отчет для выявления ошибок в учете товаров через сравнение регистров.
КоличествоНачальныйОстаток, КоличествоПриход, КоличествоРасход, КоличествоКонечныйОстаток. Для всех них можно оставить выражение по умолчанию Сумма().
Важный момент: для корректного расчета итогов по группировкам для остаточных полей (начальный и конечный остаток) может потребоваться дополнительная настройка. В поле "Рассчитывать по..." нужно указать измерения, по которым остаток не должен суммироваться (например, по группировке верхнего уровня). Для начального остатка часто используют агрегатную функцию Мин(), а для конечного — Макс() в настройках расчета итогов.Номенклатура и Характеристика. В выбранные поля добавим все наши ресурсы: начальный остаток, приход, расход и конечный остаток.После выполнения этих шагов отчет будет готов. Он будет работать корректно и быстро, так как использует наиболее оптимальный механизм платформы для получения данных такого вида. Использование виртуальной таблицы ОстаткиИОбороты — это лучший способ для создания отчетов-ведомостей, который позволяет избежать логических ошибок и проблем с производительностью. Для комплексного контроля предприятия также рекомендуем использовать анализ продаж, остатков, резервов и доступности, который включает данные о ценах и обеспечении.