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