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