Как реализовать проверку заполнения документа перед проведением?

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

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

Разделение логики интерфейса и логики данных

Первое, что мы должны усвоить: модуль объекта не должен зависеть от состояния элементов формы. Если вы привязываете логику проведения к нажатию кнопки на форме, вы создаете «костыльное» решение. Такой документ невозможно будет провести программно (например, при обмене данными или групповой обработке), так как кнопка в фоновом режиме не будет нажата.

Давайте разберем, как поступить профессионально.

Способ 1: Использование дополнительных свойств (временное решение)

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

В модуле формы (событие ПередЗаписьюНаСервере) мы передаем состояние элемента:


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

А в модуле документа (событие ОбработкаПроведения) анализируем полученные данные:


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

Обратите внимание: это решение работает только для интерактивного проведения пользователем.

Способ 2: Стандартная проверка заполнения (рекомендуемый путь)

Наиболее рациональный метод — использование свойства Проверка заполнения. Платформа 1С позволяет настроить обязательность заполнения реквизитов или табличных частей без написания кода.

  1. Откройте конфигуратор и перейдите к табличной части вашего документа.
  2. Выберите нужный реквизит или саму табличную часть.
  3. В палитре свойств найдите параметр Проверка заполнения и установите значение Выдавать ошибку.

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

Способ 3: Программная валидация в обработчике ОбработкаПроверкиЗаполнения

Если условия проверки сложнее, чем просто «заполнено/не заполнено» (например, нужно проверить, что сумма во второй табличной части равна сумме в первой), используйте событие ОбработкаПроверкиЗаполнения в модуле объекта:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если ТЧ2.Количество() = 0 Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Необходимо заполнить вторую табличную часть!";
        Сообщение.Сообщить();
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Почему лучше использовать статусы, а не кнопки?

Если бизнес-процесс требует «утверждения» документа, создайте для него реквизит Статус (тип Перечисление). Пользователь меняет статус документа, и именно это значение является для системы сигналом, что документ готов к проведению. Это делает логику программы прозрачной, тестируемой и удобной для анализа в отчетах.

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

← На главную