Как исправить ошибку «Неправильно задан период: начало периода должно быть меньше или равно окончанию» при формировании Ведомости расчетов?

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

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

{ОбщийМодуль.ДлительныеОперации.Модуль(153)}: Ошибка обработки представления "РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты:Неправильно задан период: начало периода должно быть меньше или равно окончанию"

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

Почему возникает эта ошибка? Технический анализ

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

В запросе СКД используется обращение к виртуальной таблице остатков и оборотов регистра накопления (например, РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты). Платформа автоматически генерирует параметры для этой таблицы на основе настроек периода отчета. В SQL-запросе эти параметры обычно получают имена вроде &П и &П2 (Начало и Конец периода).

Ошибка «Неправильно задан период: начало периода должно быть меньше или равно окончанию» транслируется напрямую от СУБД (Microsoft SQL Server, PostgreSQL и др.) и означает, что переданная дата начала периода хронологически находится позже, чем дата окончания периода. Это происходит в следующих случаях:

Далее подробно рассмотрим все способы решения этой проблемы.

Решение 1. Быстрое исправление для пользователя (без конфигуратора)

Если вы столкнулись с этой ошибкой в режиме «1С:Предприятие», выполните следующие шаги для сброса настроек отчета к первоначальным:

  1. Проанализируем возможность открыть отчет напрямую, а не из карточки контрагента. Перейдите в раздел программы, где расположен отчет (например, «Продажи» или «Закупки» -> «Отчеты по продажам / закупкам») и откройте «Ведомость расчетов с клиентами».
  2. В верхней правой части открывшейся формы отчета нажмите кнопку «Еще».
  3. В выпадающем меню выберите пункт «Прочие настройки», а затем нажмите «Установить стандартные настройки» (или «Выбрать стандартные настройки»). Это действие полностью очистит все сохраненные пользовательские параметры периода и отборов, которые могли вызвать сбой.
  4. Если это не помогло, перейдите в «Настройки...» отчета, переключите вид настроек в положение «Расширенный». На вкладке «Параметры» найдите поля Начало периода и Конец периода. Убедитесь, что они либо оба не заполнены, либо дата начала действительно меньше или равна дате окончания. Очистите некорректные значения и нажмите «Закрыть и сформировать».

После того как стандартные настройки будут успешно применены в ручном режиме, попробуйте снова открыть отчет из карточки контрагента. Ошибка должна исчезнуть.

Решение 2. Использование фигурных скобок в запросе СКД (Для разработчика)

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

Посмотрим на классическую ошибку в тексте запроса схемы компоновки данных:


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

В данном случае параметры виртуальной таблицы жестко завязаны на параметры СКД &НачалоПериода и &КонецПериода. Если пользователь не заполнит один из параметров, СКД передаст в СУБД пустую дату, что и вызовет падение запроса.

Чтобы избежать этого, параметры виртуальной таблицы необходимо обязательно помещать в фигурные скобки {}. Фигурные скобки указывают СКД, что данные параметры являются необязательными для СУБД на этапе компоновки макета. Если параметр не заполнен пользователем, СКД просто исключит его из результирующего SQL-запроса, и СУБД не выдаст ошибку.

Перепишем запрос правильно:


ВЫБРАТЬ
    РасчетыСКлиентами.АналитикаУчетаПоПартнерам,
    РасчетыСКлиентами.СуммаОстаток
ИЗ
    РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты({&НачалоПериода}, {&КонецПериода}, Авто, , ) КАК РасчетыСКлиентами

Использование конструкции {&НачалоПериода} и {&КонецПериода} полностью решает проблему незаполненных дат на уровне генерации запроса платформой.

Решение 3. Программная проверка и корректировка параметров в Модуле объекта отчета

Если отчет вызывается контекстно, и вы хотите гарантировать корректность передаваемых дат на программном уровне до того, как начнется вывод компоновщика, мы можем перехватить управление в модуле объекта отчета.

Проанализируем ситуацию на примере обработчика ПриКомпоновкеРезультата в модуле объекта отчета (в тексте ошибки из лога это строка 46 модуля объекта отчета РасчетыСПартнерами):


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Получаем доступ к установленным параметрам данных компоновщика
    ПараметрНачало = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
    ПараметрКонец  = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
    
    Если ПараметрНачало <> Неопределено И ПараметрКонец <> Неопределено Тогда
        
        ДатаНачала = ПараметрНачало.Значение;
        ДатаОкончания = ПараметрКонец.Значение;
        
        // Проверяем заполненность даты начала при пустой дате окончания
        Если ЗначениеЗаполнено(ДатаНачала) И Не ЗначениеЗаполнено(ДатаОкончания) Тогда
            // Устанавливаем конец периода в далекое будущее, чтобы избежать ошибки СУБД
            ПараметрКонец.Значение = '39991231235959';
            ПараметрКонец.Использование = Истина;
        КонецЕсли;
        
        // Проверяем ситуацию, когда даты перепутаны местами
        Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) 
            И ДатаНачала > ДатаОкончания Тогда
            
            // Корректируем даты: меняем их местами
            ВременнаяДата = ПараметрНачало.Значение;
            ПараметрНачало.Значение = ПараметрКонец.Значение;
            ПараметрКонец.Значение = ВременнаяДата;
            
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

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

Решение 4. Исправление контекстной передачи параметров из карточки Контрагента

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

Обычно в модуле формы контрагента или в связанной команде присутствует код, отвечающий за открытие отчета с передачей структуры параметров. Пример некорректного формирования параметров:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Отбор", Новый Структура("Партнер", Объект.Ссылка));
// Здесь забыли передать период или передали пустые значения дат
ПараметрыОткрытия.Вставить("Период", Новый СтандартныйПериод()); 
ОткрытьФорму("Отчет.РасчетыСПартнерами.Форма", ПараметрыОткрытия);

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


ПериодПоУмолчанию = Новый СтандартныйПериод;
// Установим период, например, с начала текущего года по текущую дату
ПериодПоУмолчанию.ДатаНачала = НачалоГода(ТекущаяДата());
ПериодПоУмолчанию.ДатаОкончания = КонецДня(ТекущаяДата());

ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Отбор", Новый Структура("Партнер", Объект.Ссылка));
ПараметрыОткрытия.Вставить("Период", ПериодПоУмолчанию);
ПараметрыОткрытия.Вставить("КлючНазначенияИспользования", "КонтекстноеОткрытие");

ОткрытьФорму("Отчет.РасчетыСПартнерами.Форма", ПараметрыОткрытия);

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

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

← На главную