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