В процессе работы с программами на платформе 1С:Предприятие 8.3 пользователи и разработчики часто сталкиваются с ошибками при формировании отчетов, построенных на базе системы компоновки данных (СКД). Одной из наиболее распространенных и при этом сбивающих с толку является ошибка исполнения отчета, связанная с неправильно заданным периодом. В этой статье мы подробно разберем, почему возникает эта ситуация, как технически устроены механизмы проверки дат в виртуальных таблицах и как быстро устранить проблему.
Рассмотрим типичное сообщение, которое выдает система:
Ошибка исполнения отчета по причине: Ошибка получения данных по причине: Ошибка создания набора данных "НаборДанных" по причине: Ошибка при исполнении запроса набора данных по причине: {(12, 2)}: Ошибка обработки представления "РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты: Неправильно задан период: начало периода должно быть меньше или равно окончанию"
Проанализируем этот текст. Ключевым моментом здесь является обращение к виртуальной таблице ОстаткиИОбороты регистра накопления ТоварыНаСкладах. Система сообщает, что параметры, переданные в качестве границ периода, противоречат логике: дата начала оказалась позже даты окончания.
Как показывает практика и наш пример с форума, самая частая причина — банальная опечатка. Разберем ситуацию: пользователь планирует сформировать отчет за 2023 год. В поле «Начало периода» он вводит 01.01.2023, а в поле «Конец периода» по ошибке вбивает 31.12.1023 (пропустив цифру или случайно нажав не ту клавишу).
Для человеческого глаза даты могут выглядеть привычно, если не приглядываться к каждой цифре, но для системы 1С 1023 год — это глубокое прошлое, которое на 1000 лет раньше 2023 года. Условие Начало <= Конец нарушается, и генератор запроса выдает ошибку.
Что нужно сделать: внимательно перепроверить год, месяц и день в обоих полях. Иногда ошибка кроется в перепутанных местах полях «С» и «По».
Давайте выясним причину, которая не видна с первого взгляда. В 1С тип данных Дата всегда содержит время (часы, минуты, секунды). Если в настройках отчета или в коде программы не предусмотрено автоматическое приведение дат к началу и концу дня, может возникнуть коллизия.
Рассмотрим пример:
01.10.2023. Если время установилось программно на середину дня, например, 12:00:00.01.10.2023, но время установилось на начало дня — 00:00:00.Фактически, 12 часов дня больше, чем 0 часов того же дня. Система воспринимает это как нарушение последовательности. В типовых конфигурациях для этого используются специальные функции, которые мы сейчас разберем.
Посмотрим на фрагмент запроса из ошибки: РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&П, &П2, Авто, , ).
Многих пользователей пугают названия &П и &П2. Это внутренние имена параметров, которые система компоновки данных (СКД) подставляет автоматически, если разработчик не задал им понятные псевдонимы (например, «НачалоПериода» и «КонецПериода»).
Проанализируем ситуацию, когда СКД управляет параметрами. Если в схеме компоновки данных на закладке «Параметры» установлены ограничения или неправильно настроены связи, значения могут передаваться в запрос в неверном порядке. Если вы разработчик, проверьте, чтобы для параметров периода были установлены правильные типы и заголовки.
В системе 1С существует понятие «пустой» даты — 01.01.0001 00:00:00. Если пользователь случайно очистил поле конца периода или программа не смогла вычислить значение, в запрос уходит именно эта дата. Поскольку любая актуальная рабочая дата больше, чем первый день первого года нашей эры, возникает ошибка «начало должно быть меньше или равно окончанию».
Чтобы пользователи не сталкивались с подобными «чудесами», рекомендуется использовать стандартные объекты платформы. Рассмотрим наиболее эффективные способы:
Пример кода для программной установки периода:
// Приводим даты к правильным границам дня
НачалоПериода = НачалоДня(ВыбраннаяДатаНачала);
КонецПериода = КонецДня(ВыбраннаяДатаОкончания);
// Проверяем условие перед выполнением
Если НачалоПериода > КонецПериода Тогда
Сообщить("Ошибка: Дата начала не может быть больше даты окончания!");
Возврат;
КонецЕсли;
Проанализируем, почему именно на этой таблице ошибка возникает чаще всего. Таблица ОстаткиИОбороты является виртуальной — это значит, что в базе данных её не существует в явном виде, она строится «на лету» при выполнении запроса.
Для расчета остатков на начало, оборотов за период и остатков на конец системе необходимо строго понимать временной интервал. В отличие от таблицы Остатки, которая принимает только одну точку во времени, ОстаткиИОбороты требует две точки. Если эти точки перепутаны, математическая модель расчета итогов ломается, так как невозможно рассчитать приход и расход в обратном временном направлении.
Если вы столкнулись с такой ошибкой прямо сейчас, пройдите по следующим шагам:
23:59:59, а в поле «Начало» — 00:00:00.Таким образом, мы выяснили, что за пугающим техническим текстом чаще всего скрывается простая невнимательность или отсутствие программных «защит от дурака» в самописных отчетах. Соблюдение хронологии — это базовое требование для работы любых регистров накопления в 1С.