Как вывести начальный и конечный остаток в одной колонке по каждой дате в отчете 1С на СКД?

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

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

Основа решения: Виртуальная таблица ОстаткиИОбороты с детализацией по дням

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

  1. Доступ к начальным и конечным остаткам: Виртуальная таблица ОстаткиИОбороты автоматически рассчитывает и предоставляет нам поля, такие как НачальныйОстаток и КонечныйОстаток (или аналогичные, например, КоличествоНачальныйОстаток, СуммаНачальныйОстаток в зависимости от ресурсов регистра). Это избавляет нас от необходимости писать сложную логику для самостоятельного расчета.
  2. Детализация по периодам: Ключевая особенность этой таблицы – возможность задать необходимую периодичность. Чтобы получить данные по дням, нам необходимо в параметрах виртуальной таблицы указать Периодичность = День.

Рассмотрим пример того, как мы можем построить запрос к виртуальной таблице ОстаткиИОбороты:


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

В этом примере мы:

Важный нюанс: Точность остатков и дополнение отсутствующих дат

При работе с виртуальными таблицами нам следует учесть несколько моментов:

  1. Расчет остатков на начало секунды: По умолчанию, остатки в виртуальных таблицах обычно рассчитываются на начало секунды. Если нам требуется получить остаток именно на конец дня (например, на 23:59:59), может потребоваться программно добавить одну секунду к параметру КонецПериода для достижения необходимой точности.
  2. Дополнение отсутствующих дат: Если за какой-либо день не было движений по регистру, виртуальная таблица ОстаткиИОбороты по умолчанию не вернет запись для этой даты. Чтобы отчет отображал все дни в заданном диапазоне, даже если движений не было, мы можем использовать настройку "Тип дополнения" для группировки по полю Период в СКД, установив его в значение День. Это позволит СКД автоматически заполнить пропущенные даты, и мы увидим "пустые" дни с нулевыми остатками.

Как объединить начальный и конечный остаток в одной колонке?

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

Метод 1: Вычисляемое поле типа "Строка"

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

  1. Перейдите на вкладку "Наборы данных" в схеме СКД.
  2. В списке полей выберите "Вычисляемые поля".
  3. Добавьте новое вычисляемое поле, например, с именем ОстатокДня.
  4. В качестве выражения для этого поля укажите следующую формулу:
    
    Строка(НачальныйОстаток) + " / " + Строка(КонечныйОстаток)
    

Теперь мы можем вывести это поле ОстатокДня в отчет как одну колонку, и оно будет содержать оба значения, разделенные, например, символом "/". Мы можем использовать любые другие разделители или форматирование в строке по нашему усмотрению.

Метод 2: Настройка макета группировки в СКД

Для более тонкой настройки внешнего вида мы можем создать пользовательский макет для группировки по дате. Этот метод позволяет разместить поля друг под другом в одной ячейке отчета.

  1. Перейдите на вкладку "Макеты" в настройках СКД.
  2. Добавьте новый макет для группировки по полю ПериодДень (или как вы назвали поле даты).
  3. В этом макете мы можем разместить два поля (например, НачальныйОстаток и КонечныйОстаток) друг под другом, используя соответствующие области макета. Это дает нам полный контроль над представлением данных.

Метод 3: Группировка выбранных полей

Этот метод является удобным, если нам не требуется сложное форматирование, но нужно просто отобразить два поля вертикально.

  1. В настройках отчета, на вкладке "Выбранные поля", выберите поля НачальныйОстаток и КонечныйОстаток.
  2. Объедините их в группу, нажав правой кнопкой мыши и выбрав "Сгруппировать".
  3. Для созданной группы установите "Режим вывода" в значение Вертикально.

СКД автоматически отобразит эти поля друг под другом в одной колонке отчета.

Важные нюансы и дополнительные рекомендации

Давайте проанализируем дополнительные аспекты, которые могут помочь нам в решении этой задачи.

Роль поля "Остатки"

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

Особенности при сложных запросах и соединениях

Иногда нам приходится работать со сложными запросами, которые собираются из разных регистров или документов. В таких случаях могут возникнуть свои особенности:

  1. Соединение таблицы самой с собой: Если нам требуется получить начальный остаток как конечный остаток предыдущего дня, можно использовать метод соединения таблицы самой с собой. Мы присоединяем тот же набор данных по дате, но со смещением на один день. Однако, при этом следует быть внимательными: если поле Регистратор используется в соединении, но не выводится в отчет, это может привести к некорректному суммированию остатков. В таких случаях может потребоваться либо выводить Регистратор, либо пересмотреть логику запроса.
  2. Остатки на определенное время дня: Для получения остатков на определенное время дня (не строго на 00:00:00), стандартные виртуальные таблицы могут не подойти напрямую. В таких ситуациях возможно программное формирование текста запроса с использованием оператора ОБЪЕДИНИТЬ ВСЕ для каждой нужной точки времени или построение отчета с использованием связей наборов данных, где каждый набор данных получает остаток на свою точку времени.

Типовые отчеты

Прежде чем приступать к разработке собственного отчета, всегда полезно проверить наличие типовых решений. Например, в конфигурации Управление торговлей 11.5 (УТ11.5) существует типовой отчет "Движения денежных средств". В 99% случаев он удовлетворяет большинство потребностей по анализу денежных потоков и остатков, предоставляя гибкие настройки детализации и вывода. Возможно, ваш случай уже покрыт существующим функционалом. Мы рассмотрели основные подходы к выводу начального и конечного остатка в одной колонке по датам в отчете на СКД. Используя виртуальную таблицу ОстаткиИОбороты и различные методы форматирования полей, мы можем добиться желаемого результата, делая отчеты более информативными и удобными для анализа.

← К списку