Как настроить проверку заполнения колонки табличной части по условию в 1С

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

В процессе разработки конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача сделать заполнение конкретной колонки в табличной части обязательным не для всех строк, а только для определенных. Классический пример: в табличной части документа могут быть как товары, так и услуги. Для товаров необходимо обязательно указывать Партию, а для услуг это поле должно оставаться пустым. Стандартное свойство реквизита Проверка заполнения (установленное в значение "Выдавать ошибку") здесь не поможет, так как оно работает глобально для всей колонки.

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

Метод 1. Использование обработчика ОбработкаПроверкиЗаполнения

Основной механизм контроля корректности данных в 1С реализован в событии ОбработкаПроверкиЗаполнения. Этот обработчик вызывается платформой перед записью или проведением объекта. Рассмотрим по шагам, как настроить в нем выборочную проверку — есть готовая настройка контроля ввода данных без изменения конфигурации.

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


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	// 1. Исключаем стандартную проверку колонки "Партия"
	// Мы будем проверять её вручную в цикле
	Позиция = ПроверяемыеРеквизиты.Найти("Товары.Партия");
	Если Позиция <> Неопределено Тогда
		ПроверяемыеРеквизиты.Удалить(Позиция);
	КонецЕсли;
	
	// 2. Реализуем собственную логику обхода табличной части
	Для Каждого СтрокаТЧ Из Товары Цикл
		
		// Определяем индекс строки для формирования пути к данным
		ИндексСтроки = Товары.Индекс(СтрокаТЧ);
		
		// Проверяем условие: является ли номенклатура товаром
		// Для оптимизации лучше обращаться к заранее заготовленному реквизиту "ТипНоменклатуры"
		Если СтрокаТЧ.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар Тогда
			
			// Если это товар, проверяем заполнение партии
			Если Не ЗначениеЗаполнено(СтрокаТЧ.Партия) Тогда
				
				// Сообщаем пользователю об ошибке с привязкой к конкретной ячейке
				ТекстСообщения = "В строке №" + (ИндексСтроки + 1) + " не указана партия для товара!";
				Поле = "Объект.Товары[" + Формат(ИндексСтроки, "ЧГ=0") + "].Партия";
				
				Сообщение = Новый СообщениеПользователю;
				Сообщение.Текст = ТекстСообщения;
				Сообщение.Поле = Поле;
				Сообщение.УстановитьДанные(ЭтотОбъект);
				Сообщение.Сообщить();
				
				Отказ = Истина;
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;

КонецПроцедуры

Разберем важный нюанс: использование свойства Поле в объекте СообщениеПользователю. Чтобы пользователь мог нажать на сообщение в панели сообщений и автоматически перейти к нужной строке и колонке, путь должен быть строго определенного формата: Объект.ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита. Обратите внимание, что индекс строки начинается с нуля. Для этой задачи есть универсальная система контроля заполнения реквизитов.

Метод 2. Визуализация через Условное Оформление

Программная проверка работает в момент записи, но для удобства пользователя желательно подсветить пустые поля сразу после выбора номенклатуры. Для этого мы воспользуемся механизмом Условного оформления управляемой формы.

Выясним причину, по которой иногда не удается настроить оформление напрямую через реквизиты номенклатуры. В 1С Условное оформление формы "не видит" реквизиты через точку (например, Товары.Номенклатура.ТипНоменклатуры), если они не выведены на форму. Чтобы решить эту проблему, проанализируем следующий алгоритм:

  1. Добавим в табличную часть Товары вспомогательный реквизит ТипНоменклатуры (тип — соответствующее перечисление).
  2. В событии ПриИзменении номенклатуры в строке ТЧ будем заполнять этот реквизит.
  3. В настройках формы (вкладка "Условное оформление") создадим новое правило.

Настройка правила условного оформления:

Теперь, как только пользователь выберет в строке товар, ячейка Партия подсветится красным пунктиром, сигнализируя о необходимости заполнения — для этого подойдёт автоматическое формирование партий в документах 1С.

Метод 3. Оптимизация производительности (Кэширование данных)

Рассмотрим ситуацию, когда в документе сотни строк. Обращение в цикле к СтрокаТЧ.Номенклатура.ТипНоменклатуры приведет к множественным запросам к базе данных (проблема "N+1") — поможет консоль кода и запросов для разработки и отладки. Чтобы этого избежать, мы рекомендуем использовать следующий подход:

При чтении документа или при массовом изменении строк, следует получить все типы номенклатуры одним запросом и поместить их во временную структуру или, что еще лучше, хранить тип номенклатуры прямо в строке табличной части. Это позволит обработчику ОбработкаПроверкиЗаполнения работать молниеносно.


// Пример заполнения вспомогательного реквизита при изменении номенклатуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
	Если ТекущаяСтрока <> Неопределено Тогда
		// Получаем тип номенклатуры (функция на сервере без контекста для скорости)
		ТекущаяСтрока.ТипНоменклатуры = ПолучитьТипНоменклатурыНаСервере(ТекущаяСтрока.Номенклатура);
	КонецЕсли;
	
КонецПроцедуры

Подведем итоги

Для создания качественного интерфейса и надежной проверки данных необходимо комбинировать методы:

  1. Программный обход в ОбработкаПроверкиЗаполнения: гарантирует, что некорректные данные не попадут в базу, даже если проверка на форме будет обойдена. Не забывайте удалять реквизит из массива ПроверяемыеРеквизиты.
  2. Условное оформление формы: обеспечивает мгновенную обратную связь для пользователя через свойство ОтметкаНезаполненного.
  3. Сообщения пользователю: использование СообщениеПользователю с точным указанием пути к данным делает работу с ошибками комфортной.

Такой комплексный подход делает решение профессиональным и минимизирует количество ошибок ввода данных.

← На главную