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