Период в запросах по регистрах остатков

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Цель статьи – дать полное представление о том, как работает параметр период в запросах к регистрам накопления (остатки, обороты, остатки и оборот) в системе 1С:Предприятие, какие подводные камни могут возникнуть и как их обходить.


Содержание
  1. Что такое «период» в запросах
  2. Виртуальные таблицы «Остатки», «Обороты», «ОстаткиИОбороты»
  3. Примеры SQL‑запросов с периодом
  4. Типичные ошибки и способы их устранения
  5. Оптимизация запросов по периодам
  6. Контакты для обращения

Регистры накопления – один из базовых механизмов учёта в 1С. Они позволяют хранить остатки (состояние на определённую дату) и обороты (изменения за период). Основные типы виртуальных таблиц:

  • Остатки – данные о состоянии на конец выбранного периода.
  • Обороты – суммирование всех записей, попавших в указанный диапазон дат.
  • ОстаткиИОбороты – комбинация двух предыдущих, позволяющая получать и остатки, и обороты в одном наборе.

Все эти таблицы формируются «на лету» из реальных записей регистра и используют внутренний механизм СтандартныйПериод.


Что такое «период» в запросах

Параметр Период задаётся в запросе двумя датами:

  • НачалоПериода – первая мгновенная метка, с которой учитываются записи.
  • КонецПериода – последняя метка, включаемая в расчёт.

Если в виртуальной таблице периодичность установлена Авто, то в результирующем наборе данных будет присутствовать поле Период, которое принимает значения в зависимости от выбранного уровня детализации (день, месяц, квартал, год).

Особенность 1С: даты в базе хранятся со смещением +2000 лет. Это «техническая» особенность платформы, позволяющая различать «период‑итог» и «реальную дату». Смещение задаётся в конфигурации и обычно не меняется пользователем.


Виртуальные таблицы «Остатки», «Обороты», «ОстаткиИОбороты»

Содержит одну запись на каждый уникальный набор измерений (например, склад + номенклатура) и на каждый запрошенный период. Если за выбранный период нет оборотов, запись всё равно будет создана, но поле Количество будет равно 0.

Суммирует все изменения за указанный диапазон дат. В отличие от Остатки, здесь нет «заполнения нулями» – если за период не было записей, строка отсутствует.

Объединяет два предыдущих набора. Важно помнить, что в этой таблице не хранятся остатки по периодам для позиций, у которых не было оборотов. Поэтому при построении отчётов с «полным» набором периодов часто используют LEFT JOIN с отдельной таблицей‑списком всех периодов.


Примеры SQL‑запросов с периодом

Запрос остатка на конец года
ВЫБРАТЬ
 Остатки.Организация,
 Остатки.Склад,
 Остатки.Номенклатура,
 Остатки.Количество КАК ОстатокНаКонецГода
ИЗ
 РегистрНакопления.Остатки КАК Остатки
ГДЕ
 Остатки.Период МЕЖДУ &ДатаНачала И &ДатаКонца
 И Остатки.Организация = &Организация
 И Остатки.Склад = &Склад
УПОРЯДОЧИТЬ ПО
 Остатки.Период;

Параметры &ДатаНачала и &ДатаКонца обычно задаются как 00:00:00 и 23:59:59 соответственно.

Обороты за месяц с разбивкой по дням
ВЫБРАТЬ
 Обороты.Период КАК Дата,
 Обороты.Номенклатура,
 СУММА(Обороты.Количество) КАК ОборотЗаДень
ИЗ
 РегистрНакопления.Обороты КАК Обороты
ГДЕ
 Обороты.Период МЕЖДУ &ДатаНачала И &ДатаКонца
ГРУППИРОВАТЬ ПО
 Обороты.Период,
 Обороты.Номенклатура
УПОРЯДОЧИТЬ ПО
 Обороты.Период;

Заполнение «пустых» периодов (пример с LEFT JOIN)
/* Таблица со всеми датами месяца */
ВЫБРАТЬ
 ДатаПериода.Период
ИЗ
 (ВЫБРАТЬ
 ДАТА(ГОД(&ДатаНачала), МЕСЯЦ(&ДатаНачала), ДЕНЬ(1) + СЧЁТ(СЧЁТ) — 1) КАК Период
 ИЗ
 (ВЫБРАТЬ 1 КАК СЧЁТ
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ 2 КАК СЧЁТ
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ 3 КАК СЧЁТ
 ... // до количества дней в месяце
 ) КАК Счёт
 ) КАК ДатаПериода
) КАК Даты

LEFT JOIN
 (ВЫБРАТЬ
 Обороты.Период,
 Обороты.Номенклатура,
 СУММА(Обороты.Количество) КАК Оборот
 ИЗ
 РегистрНакопления.Обороты КАК Обороты
 ГДЕ
 Обороты.Период МЕЖДУ &ДатаНачала И &ДатаКонца
 ГРУППИРОВАТЬ ПО
 Обороты.Период,
 Обороты.Номенклатура
 ) КАК Обороты
ON Даты.Период = Обороты.Период

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


Типичные ошибки и способы их устранения
  • Неправильный диапазон дат – часто используют 00:00:00 – 23:59:59. Если указать только дату без времени, система может интерпретировать её как 00:00:00, и запись за последний день будет исключена.
  • Отсутствие записей в итоговой таблице – при запросе ОстаткиИОбороты без LEFT JOIN к таблице периодов «пропадают» пустые периоды.
  • Смещение на 2000 лет – в некоторых случаях (например, экспорт в внешние СУБД) требуется «отнять» 2000 лет из поля Период. Делается через функцию Дата(Год(Период)-2000, Месяц(Период), День(Период)).
  • Неучтённый параметр СтандартныйПериод – если в конфигурации установлен «расчётный» период (например, квартальный), запрос без указания этого параметра может вернуть неверные результаты.

Как исправить
  1. Всегда задавайте полные метки времени в параметрах НачалоПериода и КонецПериода.
  2. Для «полных» наборов периодов используйте вспомогательные таблицы‑списки (см. пример 4.3).
  3. Если требуется экспортировать даты в «чистом» виде, применяйте функцию СократитьГод(Дата) (самописная функция, вычитает 2000 лет).
  4. Проверяйте настройки Управление итогами в конфигурации: минимальный период итогов может влиять на получаемый остаток.

Оптимизация запросов по периодам

Для больших объёмов данных (млн‑ы записей) рекомендуется:

  • Индексация полей Период, Организация, Склад, Номенклатура в базе данных.
  • Применять параллельные запросы в СКД (если поддерживается версия 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 раза» – АО «Логистик»
    • «Профессионалы своего дела, рекомендую!» – ИП «Смирнов В.В;»