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

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

Проблема отсутствия данных в разрезах времени

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

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

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

⚠️ Внимание: При формировании больших периодов (например, год с детализацией по дням) количество строк в результирующей выборке может вырасти в разы. Убедитесь, что клиентское приложение и сервер 1С справятся с объемом данных, особенно при работе через тонкий клиент в режиме предприятия.

Использование виртуальной таблицы Периоды в СКД

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

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

После добавления источника нужно выполнить левое соединение (LEFT JOIN) между таблицей периодов и основной таблицей фактов. Это гарантирует, что все даты из виртуальной таблицы попадут в результат, даже если к ним не нашлось соответствий в данных.

  • 📅 Используйте шаг 1 для детализации по дням.
  • 🗓️ Указывайте Месяц для формирования итогов по месяцам без пропусков.
  • 🕒 Для почасовой отчетности задавайте шаг в минутах или часах.
💡

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

Алгоритм создания временной таблицы дат

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

Сначала объявляется структура временной таблицы с одним измерением — датой. Затем с помощью оператора ЦИКЛ переменная даты инкрементируется от начала периода до конца. Каждая итерация добавляет новую запись во временную таблицу.

ВЫБРАТЬ

Дата КАК Период

ПОМЕСТИТЬ ВТ_Периоды

ИЗ

(ВЫБРАТЬ &ДатаНач КАК Дата

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ &ДатаКон) КАК НачКон

ЦИКЛ 1000

ДОБАВИТЬ В ВТ_Периоды

ВЫБРАТЬ

ДОБАВИТЬКДАТЕ(ВТ_Периоды.Дата, 1, ДЕНЬ)

ИЗ

ВТ_Периоды

ГДЕ

ВТ_Периоды.Дата < &ДатаКон

И ВТ_Периоды.Дата ЕСТЬ NULL

КОНЕЦ ЦИКЛА;

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

☑️ Алгоритм построения каркаса дат

Выполнено: 0 / 5

Настройка соединений и группировок в СКД

Ключевым моментом является правильная настройка связей между источниками. Если вы используете конструктор запросов СКД, убедитесь, что тип соединения установлен как Левое. Внутреннее соединение (Inner Join) снова отсечет все пустые периоды, сводя на нет все предыдущие усилия.

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

Для корректного отображения нулей часто требуется настроить условное оформление. Если поле суммы равно NULL, его следует заменить на 0. Это делается либо в выражении поля в запросе через функцию ЕСТЬNULL, либо в настройках формата ячейки СКД.

Тип соединения Результат при отсутствии данных Рекомендуемое использование
Внутреннее Строка исключается из отчета Только факты, экономия места
Левое Строка сохраняется, поля фактов NULL Временные ряды, непрерывные графики
Полное Сохраняются все даты и все факты Сверка двух независимых списков
Нюансы работы с NULL в 1С

В запросах 1С значение NULL не равно нулю. При суммировании NULL игнорируется, но при выводе в макет может отображаться как пустая строка. Всегда используйте функцию ЕСТЬNULL(Значение, 0) для гарантированного отображения нуля.

Оптимизация производительности при больших периодах

Генерация непрерывного ряда дат для периодов в несколько лет может существенно замедлить формирование отчета. Серверу 1С приходится обрабатывать десятки тысяч строк временной таблицы, даже если фактических записей всего несколько сотен.

Чтобы избежать проблем с производительностью, рекомендуется ограничивать детализацию. Если пользователю не нужны ежедневные данные за 5 лет, предложите автоматическое переключение шага: дни для месяца, недели для квартала, месяцы для года. Это реализуется через параметр отчета или программно в модуле объекта.

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

⚠️ Внимание: Интерфейс и возможности конструктора запросов могут различаться в разных конфигурациях (Бухгалтерия, УТ, ЗУП) и версиях платформы. Всегда проверяйте синтаксис запроса в конкретной вашей базе перед внедрением в промышленную эксплуатацию.

📊 Какой метод формирования периодов вы используете чаще?
Виртуальная таблица Периоды
Временная таблица в цикле
Заполнение в коде перед выводом
Стандартная группировка без доработок

Частые ошибки и способы их устранения

Одна из распространенных ошибок — неправильный расчет границы периода. Если вы берете конец периода как 31.01.2026 23:59:59, а шаг добавления даты равен суткам, последняя дата может не попасть в выборку из-за разницы во времени. Всегда используйте функцию КОНЕЦПЕРИОДА или явно обнуляйте время.

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

Не забывайте про часовые пояса. Если сервер 1С и клиент находятся в разных зонах, при генерации дат на клиенте и выборке на сервере может возникнуть сдвиг на сутки. Лучше генерировать периоды на стороне сервера в рамках одного запроса.

💡

Главное правило непрерывных отчетов: источник дат (каркас) всегда должен быть левой таблицей в соединении, а фактические данные — правой.

Как заменить NULL на 0 в поле отчета?

Используйте выражение в языке запросов: ЕСТЬNULL(ТаблицаФактов.Сумма, 0) КАК Сумма. Либо в настройках СКД для поля укажите выражение ЕСТЬNULL(Сумма, 0).

Можно ли использовать виртуальную таблицу для рабочих дней?

Нет, виртуальная таблица Периоды генерирует все календарные дни подряд. Для исключения выходных и праздников необходимо использовать временную таблицу с циклом и проверкой функции ЭТОРАБОЧИЙДЕНЬ.

Почему отчет формируется долго при выборе года?

Скорее всего, вы генерируете периоды с детализацией до дня (365 строк) и соединяете их с большим объемом фактов без индексов. Попробуйте увеличить шаг периодизации или ограничить отбор по другим измерениям.

Как добавить в отчет периоды будущего?

Механизм 1С позволяет генерировать даты в будущем без ограничений. Просто укажите в параметре ДатаОкончания будущий период. Виртуальная таблица сгенерирует даты, а факты будут равны нулю, что удобно для план-фактного анализа.