Как правильно реализовать отбор данных за один месяц в запросе 1С с использованием НАЧАЛОПЕРИОДА?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: почему функция в левой части условия — это плохо

Рассмотрим типичную ситуацию. Программисту необходимо выбрать данные за месяц, в который входит определенная дата. Часто в коде можно встретить конструкцию следующего вида:


ГДЕ
    НАЧАЛОПЕРИОДА(ДополнительныеНачисления.ПериодРегистрации, МЕСЯЦ) = &НачалоМесяца

Давайте проанализируем, почему этот вариант считается некорректным с точки зрения профессиональной разработки. Проблема кроется в механизмах работы СУБД (SQL Server, PostgreSQL и др.). Когда мы применяем функцию НАЧАЛОПЕРИОДА непосредственно к полю таблицы (в левой части равенства), СУБД не может использовать индекс по этому полю. Система будет вынуждена выполнить полное сканирование таблицы (Full Table Scan), вычисляя функцию для каждой строки, чтобы сравнить результат с параметром. Если в таблице миллионы записей, отчет будет формироваться крайне долго.

Для обеспечения максимального быстродействия необходимо, чтобы поле в условии запроса оставалось "чистым", то есть к нему не должны применяться никакие функции. Это называется соблюдением принципа SARGability (Searchable Arguments).

Вариант 1: Использование оператора МЕЖДУ (Универсальный способ)

Наиболее правильным и универсальным способом для отбора данных за период является использование оператора МЕЖДУ. В этом случае мы вычисляем границы периода один раз и передаем их в запрос. Посмотрим на пример кода:


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

Здесь параметры &НачалоПериода и &КонецПериода должны быть подготовлены заранее. Мы можем сделать это на языке 1С перед выполнением запроса:


Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ВыбраннаяДата));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ВыбраннаяДата));

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

Вариант 2: Особенности регистров расчета и поля ПериодРегистрации

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

Следовательно, для регистров расчета по полю ПериодРегистрации можно использовать упрощенное условие:


ГДЕ
    ДополнительныеНачисления.ПериодРегистрации = &НачалоМесяца

При этом параметр &НачалоМесяца должен быть строго приведен к началу месяца. Выполнить это приведение лучше всего прямо в запросе, но над параметром, а не над полем таблицы:


ГДЕ
    ДополнительныеНачисления.ПериодРегистрации = НАЧАЛОПЕРИОДА(&МесяцОтчета, МЕСЯЦ)

Проанализируем эту ситуацию: функция НАЧАЛОПЕРИОДА применяется к параметру &МесяцОтчета. Это безопасно, так как значение параметра вычисляется один раз перед запуском запроса, и в СУБД уходит уже готовое значение константы. Индекс при этом продолжает работать корректно.

Вариант 3: Настройка параметров в СКД (Система компоновки данных)

Если отчет строится на базе СКД, хорошим тоном считается вынос логики расчета периодов в настройки самой компоновки. Рассмотрим, как это сделать по шагам:

  1. В тексте запроса используем стандартное условие МЕЖДУ &ДатаНач И &ДатаКон.
  2. Переходим на закладку "Параметры" в схеме компоновки данных.
  3. Для параметра &ДатаНач в колонке "Выражение" пишем: НАЧАЛОПЕРИОДА(&МесяцОтчета, "МЕСЯЦ").
  4. Для параметра &ДатаКон в колонке "Выражение" пишем: КОНЕЦПЕРИОДА(&МесяцОтчета, "МЕСЯЦ").
  5. Для самого параметра &МесяцОтчета устанавливаем тип "Дата" или используем "СтандартныйПериод".

Такой подход позволяет пользователю выбирать любую дату (например, 15-е число), а система автоматически "растянет" этот выбор до границ полного месяца, не нагружая при этом сервер лишними вычислениями внутри циклов СУБД.

Выводы и рекомендации

Подводя итог, выделим основные правила использования НАЧАЛОПЕРИОДА и условий по датам:

Соблюдение этих простых принципов позволит вашим отчетам работать быстро, а код будет соответствовать стандартам разработки фирмы "1С", что критически важно при прохождении аттестации.

← На главную