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