В процессе разработки на платформе 1С:Предприятие часто возникают ситуации, когда необходимо выполнить проверку корректности данных непосредственно в момент записи или проведения документа. Одной из частых задач является проверка «возраста» документа, чтобы предупредить пользователя о том, что документ был изменен или создан значительное время назад. Рассмотрим, как правильно реализовать подобную проверку, избежав типичных ошибок новичков.
При попытке реализовать проверку даты, разработчики часто сталкиваются с тем, что код не работает или ведет себя непредсказуемо. Давайте проанализируем основные причины:
Дата с числом (результатом математических вычислений в секундах). В 1С эти типы несовместимы напрямую.Отказ: Параметр Отказ предназначен для блокировки записи объекта. Если вы устанавливаете Отказ = Истина в логике вывода информационного сообщения, запись документа будет принудительно остановлена, чего пользователь часто не ожидает.Чтобы корректно определить, прошло ли три дня с момента изменения документа, необходимо использовать встроенные функции платформы. Не следует высчитывать количество секунд вручную (умножая 60*60*24*3), так как это не учитывает особенности календаря. Рекомендуется использовать функцию РазностьДат() или корректное приведение дат к началу дня.
Рассмотрим пример правильного подхода к вычислению разницы:
// Получаем разницу в днях между текущей датой и датой документа
РазницаВДнях = РазностьДат(ДатаДокумента, ТекущаяДатаСеанса(), "ДЕНЬ");
Если РазницаВДнях >= 3 Тогда
// Выполняем действия
КонецЕсли;
Для того чтобы сообщение гарантированно было прочитано пользователем, необходимо использовать объект СообщениеПользователю. Это позволяет не только отобразить текст, но и указать поле, к которому относится замечание, что делает интерфейс более интуитивно понятным.
Рассмотрим структуру процедуры с использованием объекта СообщениеПользователю:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ДатаКорректировки = ЭтотОбъект.ДатаПоследнейКорректировки;
// Проверяем условие
Если РазностьДат(ДатаКорректировки, ТекущаяДатаСеанса(), "ДЕНЬ") >= 3 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Внимание: документ был скорректирован более 3 дней назад!";
Сообщение.Поле = "ДатаПоследнейКорректировки"; // Привязка к полю
Сообщение.Сообщить();
// Если необходимо запретить проведение, устанавливаем Отказ = Истина
// Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Для того чтобы проверка отрабатывала надежно, мы рекомендуем перенести логику из модуля формы в модуль объекта. В модуле объекта используйте процедуру ПередЗаписью() или ОбработкаПроведения(). Это гарантирует, что проверка сработает независимо от того, каким образом записывается документ: через форму, программно или в процессе групповой обработки.
Чтобы убедиться, что ваша логика работает корректно, пройдемся по списку контрольных вопросов:
Отказ = Истина там, где нужно просто проинформировать пользователя.ТекущаяДатаСеанса() вместо ТекущаяДата(), чтобы учитывать часовой пояс пользователя, если это важно для бизнес-логики учета.Следуя этим простым шагам, вы сможете организовать надежную проверку данных и улучшить пользовательский опыт в вашей конфигурации 1С.