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

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

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

Почему стандартный метод не работает для деревьев

Проанализируем механику работы СообщениеПользователю. Для того чтобы платформа поняла, к какому элементу формы нужно «приклеить» сообщение, ей требуется однозначный путь к данным в формате строки. Например, для таблицы значений это выглядит так: Объект.Товары[5].Количество. Здесь 5 — это индекс строки.

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

Решение 1: Использование условного оформления (Стандарт индустрии)

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

Для реализации этого метода выполним следующие шаги:

  1. Добавим в дерево значений служебную колонку, например, СодержитОшибку с типом Булево. Эту колонку не обязательно показывать пользователю, она будет технической.
  2. Настроим Условное оформление формы. Создадим правило: если поле ИмяВашегоДерева.СодержитОшибку равно Истина, то цвет текста или цвет фона в нужных колонках меняется на красный.
  3. В процессе рекурсивного обхода дерева при обнаружении ошибки будем устанавливать этот флаг.

Разберем пример кода для рекурсивной проверки заполнения дерева:


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

Решение 2: Программная активация строки через КлючДанных

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

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


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Ошибка в данных узла!";
Сообщение.Поле = "ДеревоОбъектов.Количество"; // Имя реквизита и колонки
// Указываем идентификатор строки дерева
Сообщение.КлючДанных = СтрокаУзла.ПолучитьИдентификатор();
Сообщение.УстановитьДанные(Объект); // Если дерево — реквизит объекта
Сообщение.Сообщить();

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

Решение 3: Визуализация через иконки статуса

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

Добавим в дерево колонку Статус с типом Число и свяжем её с полем формы типа Поле картинки. В свойствах поля укажем коллекцию картинок (например, стандартную библиотеку картинок со значками «Ошибка», «Предупреждение»).

В коде проверки будем устанавливать индекс картинки:


Если ДанныеНекорректны Тогда
    СтрокаУзла.Статус = 1; // Индекс картинки "Красный крестик" в коллекции
Иначе
    СтрокаУзла.Статус = -1; // Пустая картинка
КонецЕсли;

Дополнительно мы можем заполнить свойство ТекстПодсказки для этой ячейки. Тогда при наведении курсора на иконку ошибки пользователь увидит расшифровку проблемы в виде всплывающего тултипа. Это создает ощущение профессионального и продуманного интерфейса. В качестве альтернативного решения для вывода пиктограмм в интерфейсе подойдёт инструмент по использованию шрифта Font Awesome в 1С.

Решение 4: Совмещение методов для максимального удобства

Разберем наиболее полную стратегию обработки ошибок в сложных деревьях:

  1. Общий обход: Выполняем рекурсию по дереву, собирая все ошибки.
  2. Подсветка: Используем УсловноеОформление, чтобы выделить ячейки с некорректными данными фоновым цветом.
  3. Навигация: Выводим сообщения через СообщениеПользователю. В тексте сообщения четко прописываем иерархический путь к узлу (например, "Склад > Стеллаж 1 > Ячейка 5: Не указан ответственный"), чтобы пользователь мог найти узел визуально, если автоматическая активация не сработает.
  4. Развертывание: Если мы программно нашли ошибку в глубоко вложенном узле, не забудем вызвать метод Элементы.ИмяДерева.Развернуть(ИдентификаторСтроки), иначе пользователь просто не увидит подсвеченную строку.

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

← На главную