В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача: при добавлении новой записи в дерево значений (или таблицу) на форме обработки нужно отображать не стандартное представление объекта (например, «Выезд мастера №... от...»), а специфический набор данных, собранный из реквизитов этого объекта. Разберем ситуацию, когда документ создается через форму, а затем «магическим» образом появляется в дереве на основной форме обработки, и нам нужно перехватить этот момент для кастомизации вывода.
Прежде чем изменять код, давайте проанализируем, как данные попадают в дерево значений. Если в процедуре открытия формы документа нет явного кода возврата данных, а строка в дереве всё равно появляется, значит, задействован один из механизмов оповещения или автоматического обновления. Рассмотрим основные варианты, где может скрываться код заполнения строки.
Это самый распространенный способ в управляемых формах. Когда документ записывается или проводится, в его форме (или модуле) вызывается метод Оповестить(). Форма обработки, в свою очередь, «слушает» это событие. Давайте выясним, как это найти и изменить.
Для начала перейдем в модуль формы обработки и найдем там предопределенную процедуру ОбработкаОповещения. Рассмотрим пример того, как может выглядеть этот код:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗаписанДокументВыездМастера" Тогда
// Параметр обычно содержит ссылку на новый документ
ДобавитьСтрокуВДеревоНаОсновеДокумента(Параметр);
КонецЕсли;
КонецПроцедуры
Именно в этой процедуре (или вызываемой из неё) происходит физическое добавление строки в дерево. Чтобы отобразить нужную нам информацию (Номер, Контрагент, вид техники, марка), нам нужно получить эти данные из ссылки. Посмотрим на пример реализации функции добавления:
&НаСервере
Процедура ДобавитьСтрокуВДеревоНаОсновеДокумента(СсылкаНаДокумент)
// Получаем необходимые данные из документа одним запросом для производительности
ДанныеДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаДокумент, "Номер, Контрагент, ВидТехники, Марка");
// Формируем красивое строковое представление
ПредставлениеДляДерева = СтрШаблон("%1, %2, %3, %4",
ДанныеДокумента.Номер,
ДанныеДокумента.Контрагент,
ДанныеДокумента.ВидТехники,
ДанныеДокумента.Марка);
// Находим нужную ветку или добавляем в корень
НоваяСтрока = ДеревоДанных.ПолучитьЭлементы().Добавить();
НоваяСтрока.ДокументСсылка = СсылкаНаДокумент;
НоваяСтрока.НаименованиеОтображение = ПредставлениеДляДерева; // Наша составная колонка
КонецПроцедуры
Если в коде кнопки ДобавитьВыездМастера вместо Новый УникальныйИдентификатор используется объект ОписаниеОповещения, значит, система ожидает закрытия формы документа для выполнения конкретной процедуры. Давайте проанализируем этот случай.
Изменим исходную процедуру, чтобы она могла принимать результат:
&НаКлиенте
Процедура ДобавитьВыездМастера(Команда)
ПараметрыФормы = Новый Структура("Контрагент", ОтборКонтрагент);
// Создаем описание оповещения, указывая процедуру, которая выполнится ПОСЛЕ закрытия
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормыДокумента", ЭтотОбъект);
ОткрытьФорму("Документ.СЦентр_ВыездМастера.Форма.ФормаДокумента", ПараметрыФормы, ЭтотОбъект, , , , Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияФормыДокумента(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // Пользователь просто закрыл форму
КонецЕсли;
// Вызываем серверный метод для получения данных и обновления дерева
ОбновитьДеревоЗначенийНаСервере(Результат);
КонецПроцедуры
Иногда разработчики называют «деревом» элемент формы, который на самом деле является Динамическим списком с иерархическим отображением. Если данные появляются в нем «сами», без явного кода в ОбработкаОповещения, значит, список просто обновляет данные из базы.
В этом случае нам не нужно искать процедуру заполнения. Рассмотрим по шагам, как изменить отображение:
ДинамическийСписок).
ВЫБРАТЬ
Док.Ссылка,
Док.Номер + ", " + Док.Контрагент.Наименование + ", " + Док.ВидТехники + ", " + Док.Марка КАК СоставноеПредставление
ИЗ
Документ.СЦентр_ВыездМастера КАК Док
СоставноеПредставление.Если дерево значений заполняется стандартно, но мы хотим изменить визуальное отображение текста без изменения самих данных в колонках, можно воспользоваться Условным оформлением формы. Это мощный инструмент, позволяющий подменять текст в ячейках.
Разберем, как программно настроить такое оформление:
&НаСервере
Процедура НастроитьОформлениеДерева()
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Указываем поле, которое будем оформлять
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ДеревоЗначенийПредставление");
// Устанавливаем текст, который будет выводиться (можно использовать шаблоны в коде заполнения)
// В управляемых формах для сложных строк лучше всё же заполнять текстовую колонку при обновлении данных.
КонецПроцедуры
Если вы всё еще не нашли место, где добавляется строка, воспользуемся проверенным методом — Глобальным поиском и точками остановки. Проанализируем алгоритм поиска:
.Добавить() или .ДобавитьСтроку().СЦентр_ВыездМастера в процедуре ПриЗаписи или ПослеЗаписи.ПриЗаписи для вашего документа. Вполне возможно, что в подписке вызывается экспортный метод формы обработки.Важный нюанс: Помните, что дерево значений на форме может обновляться при активации формы (событие ПриАктивации) или через обработчик ожидания (ПодключитьОбработчикОжидания). Если данные подтягиваются из базы данных, ищите запросы в этих процедурах.
Подводя итог, наиболее вероятное место для внесения правок — это процедура ОбработкаОповещения в форме вашей обработки. Именно там нужно перехватить момент добавления строки и, используя свойства полученного объекта (ссылки на документ), сформировать ту самую строку "Номер, Контрагент, вид техники, марка", которую вы хотите видеть.