Как запретить ввод некорректных дат в далеком прошлом и будущем в 1С:Управление торговлей?

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

Ошибки ввода дат пользователями — частая проблема при активном документообороте. Достаточно пропустить точку-разделитель при быстром наборе (например, ввести 02.20 вместо 02.2024), как платформа 1С интерпретирует число как 220 год нашей эры. В результате в информационной базе появляются документы времен Римской империи или эпохи Средневековья, а также записи из далекого будущего (например, 3999 год).

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

В чем опасность дат в далеком прошлом для базы данных 1С

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

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

Способ 1. Использование типового механизма «Даты запрета изменения данных»

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

  1. Перейдем в раздел НСИ и администрирование > Настройка пользователей и прав > Даты запрета изменения.
  2. Установим флаг Даты запрета изменения и перейдем по гиперссылке Настроить.
  3. Выберем вариант настройки Для всех пользователей или укажем индивидуальные правила для конкретных групп пользователей.
  4. В поле даты выберем динамический запрет, например: Конец прошлого месяца или Конец прошлой недели.

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

Способ 2. Создание универсальной подписки на событие через расширение

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

Разберем по шагам алгоритм создания проверки:

  1. Подключим новое расширение конфигурации в режиме Конфигуратор (с назначением Адаптация или Дополнение).
  2. В дереве метаданных расширения добавим объект Подписка на событие.
  3. В свойстве Источник выберем тип ДокументОбъект (это охватит абсолютно все документы базы).
  4. В свойстве Событие укажем ПередЗаписью.
  5. В свойстве Обработчик создадим процедуру в общем серверном модуле расширения.

Посмотрим на пример кода обработчика, который проверяет дату документа на попадание в допустимый диапазон:


Процедура ПроверитьДатуДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
	
	// Пропускаем проверку, если дата не заполнена (проверяется стандартными механизмами)
	Если Не ЗначениеЗаполнено(Источник.Дата) Тогда
		Возврат;
	КонецЕсли;
	
	// Определяем допустимые границы
	ГраницаПрошлого = '20150101000000'; // Дата начала ведения реального учета в базе
	КоличествоДнейВперед = 30;          // Допустимый сдвиг вперед для будущих отгрузок/заказов
	ГраницаБудущего = КонецДня(ТекущаяДатаСеанса() + (КоличествоДнейВперед * 86400));
	
	// Проверяем попадание даты в допустимый интервал
	Если Источник.Дата < ГраницаПрошлого Или Источник.Дата > ГраницаБудущего Тогда
		Отказ = Истина;
		
		ТекстОшибки = СтрШаблон(
			"Недопустимая дата документа: %1. Дата должна быть в диапазоне от %2 до %3.",
			Формат(Источник.Дата, "ДФ=dd.MM.yyyy HH:mm:ss"),
			Формат(ГраницаПрошлого, "ДФ=dd.MM.yyyy"),
			Формат(ГраницаБудущего, "ДФ=dd.MM.yyyy")
		);
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			ТекстОшибки,
			Источник,
			"Дата"
		);
	КонецЕсли;
	
КонецПроцедуры

Важное замечание: не следует автоматически приравнивать ошибочную дату к ТекущаяДатаСеанса() без уведомления пользователя. Если документ проводится текущим днем вместо целевой даты, это нарушит хронологию взаиморасчетов, списание партий по ФИФО и нумерацию связанных счетов-фактур. Установка Отказ = Истина с информативным сообщением принуждает пользователя осознанно ввести корректное значение.

Способ 3. Валидация дат при обмене данными и интеграциях

Если документы попадают в базу через внешние интеграции (ЭДО, файлы Excel, веб-сервисы или универсальный формат EnterpriseData), человеческий фактор дополняется ошибками некорректного парсинга форматов дат.

Проанализируем контрольные точки для интеграций:

  1. В правилах конвертации данных или обработчиках загрузки необходимо проверять год полученной даты. Если год меньше минимально допустимого (например, меньше 2015), запись объекта должна прерываться с записью в журнал регистрации.
  2. При парсинге строковых представлений дат из файлов CSV/Excel всегда проверяйте длину строки года. Форматы с двухзначным годом (yy) следует явно приводить к четырехзначным с учетом текущего века.

Что делать с уже записанными некорректными документами

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

  1. С помощью отчета по журналу документов или универсальной обработки поиска найдем все документы, у которых дата меньше даты запуска предприятия.
  2. Исправим даты на корректные или распроведем и поместим на удаление неактуальные документы.
  3. Обязательно выполним регламентную процедуру сжатия и пересчета итогов регистров через пункт меню Все функции (Функции для технического специалиста) > Стандартные > Управление итогами, либо запустим Пересчет итогов в режиме Тестирование и исправление конфигуратора.
← На главную