Цель статьи – дать полное представление о том, как работает параметр период в запросах к регистрам накопления (остатки, обороты, остатки и оборот) в системе 1С:Предприятие, какие подводные камни могут возникнуть и как их обходить.
Содержание - Что такое «период» в запросах
- Виртуальные таблицы «Остатки», «Обороты», «ОстаткиИОбороты»
- Примеры SQL‑запросов с периодом
- Типичные ошибки и способы их устранения
- Оптимизация запросов по периодам
- Контакты для обращения
Регистры накопления – один из базовых механизмов учёта в 1С. Они позволяют хранить остатки (состояние на определённую дату) и обороты (изменения за период). Основные типы виртуальных таблиц:
- Остатки – данные о состоянии на конец выбранного периода.
- Обороты – суммирование всех записей, попавших в указанный диапазон дат.
- ОстаткиИОбороты – комбинация двух предыдущих, позволяющая получать и остатки, и обороты в одном наборе.
Все эти таблицы формируются «на лету» из реальных записей регистра и используют внутренний механизм СтандартныйПериод.
Что такое «период» в запросах
Параметр Период задаётся в запросе двумя датами:
- НачалоПериода – первая мгновенная метка, с которой учитываются записи.
- КонецПериода – последняя метка, включаемая в расчёт.
Если в виртуальной таблице периодичность установлена Авто, то в результирующем наборе данных будет присутствовать поле Период, которое принимает значения в зависимости от выбранного уровня детализации (день, месяц, квартал, год).
Особенность 1С: даты в базе хранятся со смещением +2000 лет. Это «техническая» особенность платформы, позволяющая различать «период‑итог» и «реальную дату». Смещение задаётся в конфигурации и обычно не меняется пользователем.
Виртуальные таблицы «Остатки», «Обороты», «ОстаткиИОбороты»
Содержит одну запись на каждый уникальный набор измерений (например, склад + номенклатура) и на каждый запрошенный период. Если за выбранный период нет оборотов, запись всё равно будет создана, но поле Количество будет равно 0.
Суммирует все изменения за указанный диапазон дат. В отличие от Остатки, здесь нет «заполнения нулями» – если за период не было записей, строка отсутствует.
Объединяет два предыдущих набора. Важно помнить, что в этой таблице не хранятся остатки по периодам для позиций, у которых не было оборотов. Поэтому при построении отчётов с «полным» набором периодов часто используют LEFT JOIN с отдельной таблицей‑списком всех периодов.
Примеры SQL‑запросов с периодом Запрос остатка на конец года ВЫБРАТЬ
Остатки.Организация,
Остатки.Склад,
Остатки.Номенклатура,
Остатки.Количество КАК ОстатокНаКонецГода
ИЗ
РегистрНакопления.Остатки КАК Остатки
ГДЕ
Остатки.Период МЕЖДУ &ДатаНачала И &ДатаКонца
И Остатки.Организация = &Организация
И Остатки.Склад = &Склад
УПОРЯДОЧИТЬ ПО
Остатки.Период;
ВЫБРАТЬ
Остатки.Организация,
Остатки.Склад,
Остатки.Номенклатура,
Остатки.Количество КАК ОстатокНаКонецГода
ИЗ
РегистрНакопления.Остатки КАК Остатки
ГДЕ
Остатки.Период МЕЖДУ &ДатаНачала И &ДатаКонца
И Остатки.Организация = &Организация
И Остатки.Склад = &Склад
УПОРЯДОЧИТЬ ПО
Остатки.Период;
Параметры &ДатаНачала и &ДатаКонца обычно задаются как 00:00:00 и 23:59:59 соответственно.
Обороты за месяц с разбивкой по дням ВЫБРАТЬ
Обороты.Период КАК Дата,
Обороты.Номенклатура,
СУММА(Обороты.Количество) КАК ОборотЗаДень
ИЗ
РегистрНакопления.Обороты КАК Обороты
ГДЕ
Обороты.Период МЕЖДУ &ДатаНачала И &ДатаКонца
ГРУППИРОВАТЬ ПО
Обороты.Период,
Обороты.Номенклатура
УПОРЯДОЧИТЬ ПО
Обороты.Период;
Заполнение «пустых» периодов (пример с LEFT JOIN) /* Таблица со всеми датами месяца */
ВЫБРАТЬ
ДатаПериода.Период
ИЗ
(ВЫБРАТЬ
ДАТА(ГОД(&ДатаНачала), МЕСЯЦ(&ДатаНачала), ДЕНЬ(1) + СЧЁТ(СЧЁТ) — 1) КАК Период
ИЗ
(ВЫБРАТЬ 1 КАК СЧЁТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 2 КАК СЧЁТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 3 КАК СЧЁТ
... // до количества дней в месяце
) КАК Счёт
) КАК ДатаПериода
) КАК Даты
LEFT JOIN
(ВЫБРАТЬ
Обороты.Период,
Обороты.Номенклатура,
СУММА(Обороты.Количество) КАК Оборот
ИЗ
РегистрНакопления.Обороты КАК Обороты
ГДЕ
Обороты.Период МЕЖДУ &ДатаНачала И &ДатаКонца
ГРУППИРОВАТЬ ПО
Обороты.Период,
Обороты.Номенклатура
) КАК Обороты
ON Даты.Период = Обороты.Период
ВЫБРАТЬ
Обороты.Период КАК Дата,
Обороты.Номенклатура,
СУММА(Обороты.Количество) КАК ОборотЗаДень
ИЗ
РегистрНакопления.Обороты КАК Обороты
ГДЕ
Обороты.Период МЕЖДУ &ДатаНачала И &ДатаКонца
ГРУППИРОВАТЬ ПО
Обороты.Период,
Обороты.Номенклатура
УПОРЯДОЧИТЬ ПО
Обороты.Период;
/* Таблица со всеми датами месяца */
ВЫБРАТЬ
ДатаПериода.Период
ИЗ
(ВЫБРАТЬ
ДАТА(ГОД(&ДатаНачала), МЕСЯЦ(&ДатаНачала), ДЕНЬ(1) + СЧЁТ(СЧЁТ) — 1) КАК Период
ИЗ
(ВЫБРАТЬ 1 КАК СЧЁТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 2 КАК СЧЁТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 3 КАК СЧЁТ
... // до количества дней в месяце
) КАК Счёт
) КАК ДатаПериода
) КАК Даты
LEFT JOIN
(ВЫБРАТЬ
Обороты.Период,
Обороты.Номенклатура,
СУММА(Обороты.Количество) КАК Оборот
ИЗ
РегистрНакопления.Обороты КАК Обороты
ГДЕ
Обороты.Период МЕЖДУ &ДатаНачала И &ДатаКонца
ГРУППИРОВАТЬ ПО
Обороты.Период,
Обороты.Номенклатура
) КАК Обороты
ON Даты.Период = Обороты.Период
В результате получаем строки для всех дней месяца, даже если в некоторые дни оборотов не было (поле Оборот будет NULL).
Типичные ошибки и способы их устранения - Неправильный диапазон дат – часто используют
00:00:00 – 23:59:59. Если указать только дату без времени, система может интерпретировать её как 00:00:00, и запись за последний день будет исключена. - Отсутствие записей в итоговой таблице – при запросе
ОстаткиИОбороты без LEFT JOIN к таблице периодов «пропадают» пустые периоды. - Смещение на 2000 лет – в некоторых случаях (например, экспорт в внешние СУБД) требуется «отнять» 2000 лет из поля
Период. Делается через функцию Дата(Год(Период)-2000, Месяц(Период), День(Период)). - Неучтённый параметр СтандартныйПериод – если в конфигурации установлен «расчётный» период (например, квартальный), запрос без указания этого параметра может вернуть неверные результаты.
Как исправить - Всегда задавайте полные метки времени в параметрах
НачалоПериода и КонецПериода. - Для «полных» наборов периодов используйте вспомогательные таблицы‑списки (см. пример 4.3).
- Если требуется экспортировать даты в «чистом» виде, применяйте функцию
СократитьГод(Дата) (самописная функция, вычитает 2000 лет). - Проверяйте настройки Управление итогами в конфигурации: минимальный период итогов может влиять на получаемый остаток.
Оптимизация запросов по периодам
00:00:00 – 23:59:59. Если указать только дату без времени, система может интерпретировать её как 00:00:00, и запись за последний день будет исключена.ОстаткиИОбороты без LEFT JOIN к таблице периодов «пропадают» пустые периоды.Период. Делается через функцию Дата(Год(Период)-2000, Месяц(Период), День(Период)).- Всегда задавайте полные метки времени в параметрах
НачалоПериодаиКонецПериода. - Для «полных» наборов периодов используйте вспомогательные таблицы‑списки (см. пример 4.3).
- Если требуется экспортировать даты в «чистом» виде, применяйте функцию
СократитьГод(Дата)(самописная функция, вычитает 2000 лет). - Проверяйте настройки Управление итогами в конфигурации: минимальный период итогов может влиять на получаемый остаток.
Оптимизация запросов по периодам
Для больших объёмов данных (млн‑ы записей) рекомендуется:
- Индексация полей
Период,Организация,Склад,Номенклатурав базе данных. - Применять параллельные запросы в СКД (если поддерживается версия 1С 8.3+).
- Сократить количество измерений в запросе – каждый дополнительный измеритель (например,
Контрагент) удваивает объём выборки.
Пример ускоренного запроса с использованием индекса:
/* Предполагаем, что в СУБД уже создан индекс:
CREATE INDEX ix_РегОстатки_Период_Орг_Склад ON РегистрОстатки (Период, Организация, Склад);
*/
ВЫБРАТЬ
Остатки.Организация,
Остатки.Склад,
Остатки.Номенклатура,
Остатки.Количество
ИЗ
РегистрНакопления.Остатки КАК Остатки
ГДЕ
Остатки.Период = &ДатаЗапроса
И Остатки.Организация = &Организация
И Остатки.Склад = &Склад;
Контакты для обращения
Если у вас возникли вопросы по работе с регистрами накопления, настройке периодов или оптимизации запросов – свяжитесь с нашей технической поддержкой.
- Официальный сайт: https://www.example-1c-support.ru
- Горячая линия: +7 (800) -23‑45‑67 (круглосуточно)
- Номера телефонов:
- Техническая поддержка – +7 (495) -23‑45‑67 (09:00–18:00 МСК)
- Отдел продаж – +7 (495) -87‑65‑43 (08:00–17:00 МСК)
- Электронный адрес: support@example-1c-support.ru
- Личный кабинет: https://cabinet.example-1c-support.ru
- Личный приём (для юридических лиц): г. Москва, ул. Тверская, д. 7, офис 305
- График приёма: Пн–Пт 09:00–17:00, суббота – по предварительной записи
- Отделы:
- Отдел технической поддержки
- Отдел внедрения и адаптации
- Отдел обучения и сертификации
- Отдел разработки решений под 1С
- Руководство:
- Генеральный директор – Иванов И.И.
- Технический директор – Петров П.П.
- Директор по развитию – Сидорова А.А.
- Отзывы клиентов:
- «Отличная поддержка, быстро решают любые вопросы по регистрам» – ООО «ТехноСтрой»
- «Помогли оптимизировать запросы, ускорили отчётность в 3 раза» – АО «Логистик»
- «Профессионалы своего дела, рекомендую!» – ИП «Смирнов В.В;»