Как правильно реализовать проверку даты документа и вывести сообщение пользователю при проведении?

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

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

Разбираем причины распространенных ошибок

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

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

Шаг 1: Правильная работа с датами

Чтобы корректно определить, прошло ли три дня с момента изменения документа, необходимо использовать встроенные функции платформы. Не следует высчитывать количество секунд вручную (умножая 60*60*24*3), так как это не учитывает особенности календаря. Рекомендуется использовать функцию РазностьДат() или корректное приведение дат к началу дня.

Рассмотрим пример правильного подхода к вычислению разницы:


// Получаем разницу в днях между текущей датой и датой документа
РазницаВДнях = РазностьДат(ДатаДокумента, ТекущаяДатаСеанса(), "ДЕНЬ");

Если РазницаВДнях >= 3 Тогда
    // Выполняем действия
КонецЕсли;

Шаг 2: Реализация вывода сообщения

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

Рассмотрим структуру процедуры с использованием объекта СообщениеПользователю:


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

Шаг 3: Выбор правильного события

Для того чтобы проверка отрабатывала надежно, мы рекомендуем перенести логику из модуля формы в модуль объекта. В модуле объекта используйте процедуру ПередЗаписью() или ОбработкаПроведения(). Это гарантирует, что проверка сработает независимо от того, каким образом записывается документ: через форму, программно или в процессе групповой обработки.

Рекомендации по отладке

Чтобы убедиться, что ваша логика работает корректно, пройдемся по списку контрольных вопросов:

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

← На главную