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