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

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

Многие пользователи, работающие на старых, существенно доработанных релизах 1С:Бухгалтерия предприятия 3.0 (например, ветки 3.0.43 или 3.0.44), столкнулись с неприятной ситуацией: при попытке создать или провести документ с датой 2021 года и позже программа выдает блокирующую ошибку: «Дата документа должна быть не позже 2020 года». Рассмотрим подробно, почему возникает эта проблема и как её решить техническими средствами, не прибегая к полному обновлению конфигурации.

Выясним причину возникновения ограничения

Проанализируем ситуацию: данная проверка не является багом в привычном понимании. В свое время разработчики «1С» внедрили механизм контроля корректности ввода даты, чтобы уберечь пользователей от случайных опечаток (например, ввода 2027 года вместо 2017). В старых релизах этот лимит был жестко ограничен 31 декабря 2020 года. Предполагалось, что к этому времени все пользователи перейдут на новые версии программы. Однако для баз с большим количеством самописных доработок обновление может быть крайне трудоемким, поэтому проще внести точечное исправление в код.

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

Способ 1: Изменение границы корректного периода (Рекомендуемый)

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

Выполним следующие действия в режиме Конфигуратор:

  1. Откроем конфигурацию (меню Конфигурация — Открыть конфигурацию). Если на объектах стоит значок «замок», необходимо включить возможность изменения (Конфигурация — Поддержка — Настройка поддержки — Включить возможность изменения).
  2. Воспользуемся глобальным поиском (клавиши Ctrl + Shift + F). В строке поиска введем текст: КорректныйПериодВводаДокументов.
  3. Проанализируем результаты поиска. Нам нужен общий модуль ОбщегоНазначенияБПСобытия.

Найдем в этом модуле код функции и внесем изменения. Исходный код обычно выглядит так:


Функция КорректныйПериодВводаДокументов() Экспорт
    КорректныйПериод = Новый Структура;
    КорректныйПериод.Вставить("НачалоКорректногоПериода", Дата(2000, 01, 01));
    КорректныйПериод.Вставить("КонецКорректногоПериода", Дата(2020, 12, 31, 23, 59, 59));
    Возврат КорректныйПериод;
КонецФункции

Для решения проблемы заменим 2020 на 2030 или воспользуемся более гибким алгоритмом, который будет актуален всегда. Рассмотрим пример кода, который разрешает ввод документов на 10 лет вперед от текущей даты:


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

Способ 2: Отключение проверки через комментирование кода

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

Рассмотрим, какие именно строки нужно закомментировать (добавить // в начале строки):


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

Важный момент: будьте осторожны при комментировании. Если вы просто поставите комментарий перед ИначеЕсли, но оставите тело условия или последующие операторы КонецЕсли, возникнет синтаксическая ошибка «Ожидается символ (» или «Оператор не найден». Программа просто не сможет скомпилировать модуль.

Посмотрим на полный и корректный текст процедуры, который можно использовать для восстановления модуля, если вы случайно удалили лишнее:


Процедура ПроверитьКорректностьДатыПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    Если Источник.ОбменДанными.Загрузка Или ПроведениеСервер.ГрупповоеПерепроведение(Источник) Тогда
        Возврат;
    КонецЕсли;

    МетаданныеДокумента = Источник.Метаданные;
    КорректныйПериод = КорректныйПериодВводаДокументов();
    ЕстьОшибкиВКонтролируемыхРеквизитах = Ложь;

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

        Если ЕстьОшибкиВКонтролируемыхРеквизитах Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;

    // ... далее идет стандартный код вывода сообщения об ошибке
КонецПроцедуры

Особенности базовых версий

Проанализируем ситуацию для пользователей Базовых конфигураций. В базовой версии 1С:Бухгалтерии возможность редактирования кода в Конфигураторе заблокирована на уровне лицензии. Если вы видите надпись «Объект не редактируется» или «Конфигурация находится на поддержке без возможности изменения», и при этом у вас именно Базовая версия — внести правки в код не получится.

В этом случае есть только один выход: обновление программы. Ограничение по 2020 году было снято в последующих релизах (начиная с 3.0.86 и выше). Если ваша конфигурация типовая и без доработок, процедура обновления пройдет автоматически и исправит проблему.

Завершение правок

После того как вы внесли изменения в код модуля ОбщегоНазначенияБПСобытия, обязательно выполните следующие действия:

  1. Сохраните изменения в модуле (клавиши Ctrl + S).
  2. Обновите конфигурацию базы данных (клавиша F7 или кнопка с синим бочонком на панели инструментов).
  3. Согласитесь с изменениями в структуре, если программа выведет соответствующее окно.

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

← На главную