Почему в 1С:Бухгалтерия возникает ошибка «Дата документа должна быть не позже определенного года» и как её исправить?

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

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

Технические причины ограничения периода ввода документов

Проанализируем архитектурные особенности работы регистра бухгалтерии Хозрасчетный в платформе 1С:Предприятие 8.3:

  1. Расчет и хранение итогов: Регистры бухгалтерии хранят остатки и обороты по периодам (обычно по месяцам). Когда пользователь по ошибке вводит дату из далекого будущего (например, 2125 год вместо 2025 года), платформа при записи и проведении документа начинает автоматически пересчитывать и формировать таблицы итогов за весь столетний интервал.
  2. Блокировки и зависание базы: Процесс смещения границы рассчитанных итогов на десятилетия вперед приводит к длительной блокировке таблиц регистра. В этот момент другие пользователи теряют возможность проводить документы, а сам процесс может занять значительное время.
  3. Разрастание объема базы данных: Создание пустых записей итогов на каждый месяц в течение сотен лет многократно увеличивает физический размер базы данных (в СУБД или файловом варианте), что особенно критично для облачных сервисов.
  4. Сложность отката: Если документ с далекой будущей датой уже записан, простое изменение его даты обратно на текущую снова вызовет длительную процедуру пересчета итогов регистра в обратную сторону.

Именно для защиты от человеческого фактора (опечаток при ручном вводе или ошибок парсинга данных при интеграциях через XML, JSON или ЭДО) в конфигурации реализован программный контроль корректности дат перед записью объекта.

Где в коде типовой конфигурации выполняется проверка?

Посмотрим на типовую реализацию контроля в общем модуле конфигурации ОбщегоНазначенияБПСобытия в процедуре ПроверитьКорректностьДатыПередЗаписью:


Если Источник[КонтролируемыйРеквизит] > КорректныйПериод.КонецКорректногоПериода Тогда
    ГраницаКорректности = Формат(КорректныйПериод.КонецКорректногоПериода, "ДФ=гггг");
    ШаблонОшибки = НСтр("ru = '%1 документа должна быть не позже %2 года'");
    ЕстьОшибкиВКонтролируемыхРеквизитах = Истина;
КонецЕсли;

В старых релизах конфигурации «Бухгалтерия предприятия» (до версии 3.0.49 включительно) функция КорректныйПериодВводаДокументов() возвращала жестко заданную верхнюю границу — конец 2020 года. При наступлении 2021 года не обновлявшиеся базы перестали позволять вводить новые документы. Начиная с релиза 3.0.50.10, разработчики перевели расчет верхней границы в динамический режим, привязав её к функции ТекущаяДатаСеанса() с запасом вперед на 9 лет.

Способы решения проблемы

Рассмотрим основные варианты устранения ошибки в зависимости от условий сопровождения информационной базы.

Вариант 1. Обновление конфигурации (рекомендуемый способ)

Разберем по шагам наиболее правильное решение — обновление конфигурации на актуальный релиз. В современных версиях «Бухгалтерии предприятия» проверка рассчитывается автоматически и не блокирует штатную работу в текущих и ближайших будущих годах.

  1. Создаем резервную копию информационной базы (выгрузка dt или создание бэкапа средствами СУБД).
  2. Выполняем последовательное обновление конфигурации в режиме Конфигуратор до актуальной версии.
  3. Запускаем базу в режиме «1С:Предприятие» для выполнения регламентных процедур обновления данных.

Вариант 2. Использование расширения конфигурации (без снятия с поддержки)

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

  1. Открываем Конфигурация -> Расширения конфигурации и добавляем новое расширение с назначением Адаптация или Дополнение.
  2. Добавляем в расширение общий модуль, содержащий функцию КорректныйПериодВводаДокументов.
  3. Переопределяем функцию с помощью аннотации &Вместо, задав динамический расчет периода:

&Вместо("КорректныйПериодВводаДокументов")
Функция Расш1_КорректныйПериодВводаДокументов()
    Период = Новый Структура;
    Период.Вставить("НачалоКорректногоПериода", '20000101');
    // Устанавливаем границу на 9 лет вперед относительно даты сеанса
    Период.Вставить("КонецКорректногоПериода", ДобавитьМесяц(КонецГода(ТекущаяДатаСеанса()), 9 * 12));
    Возврат Период;
КонецФункции

Вариант 3. Корректировка кода в доработанной конфигурации

Если конфигурация уже снята с поддержки и обновляется вручную, внесем исправление непосредственно в функцию КорректныйПериодВводаДокументов в модуле ОбщегоНазначенияБПКлиентСервер (или ОбщегоНазначенияБП в зависимости от релиза):


Функция КорректныйПериодВводаДокументов() Экспорт
    
    Результат = Новый Структура;
    Результат.Вставить("НачалоКорректногоПериода", Дата('20000101'));
    Результат.Вставить("КонецКорректногоПериода", ДобавитьМесяц(КонецГода(ТекущаяДатаСеанса()), 9 * 12));
    
    Возврат Результат;
    
КонецФункции

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

Дополнительные проверки при возникновении ошибки

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

  1. Системное время на сервере и клиенте: Убедимся, что на сервере «1С:Предприятие» и рабочих станциях пользователей выставлены корректная дата и часовой пояс. При сбое батарейки BIOS или некорректной синхронизации NTP дата может сместиться в будущее.
  2. Форматы дат во внешних файлах обмена: При загрузке данных из внешних источников (Excel, CSV, веб-сервисы) проверим правила преобразования двухзначного формата года (ГГ) в четырехзначный (ГГГГ), чтобы исключить подстановку некорректных значений.
← На главную