Как в журнале документов 1С 8.3 добавить колонку с данными из разных реквизитов?

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

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

Способ 1. Использование произвольного запроса в динамическом списке

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


ВЫБОР
    КОГДА Ссылка ССЫЛКА Документ.ПриходныйКассовыйОрдер 
        ТОГДА Ссылка.СтатьяДвиженияДенежныхСредств
    КОГДА Ссылка ССЫЛКА Документ.РасходныйКассовыйОрдер 
        ТОГДА Ссылка.Контрагент
    ИНАЧЕ NULL
КОНЕЦ КАК ДополнительныйРеквизит

Важно: Для корректной работы сортировки и отборов по этой колонке желательно, чтобы все возвращаемые типы были совместимы. Если типы слишком разные, можно привести их к строковому представлению с помощью функции ПРЕДСТАВЛЕНИЕ().

Способ 2. Обработчик события «ПриПолученииДанныхНаСервере»

Если данные для колонки невозможно получить простым запросом (например, требуется сложный расчет или обращение к экспортным функциям модулей), стоит использовать событие ПриПолученииДанныхНаСервере. Посмотрим, как это реализовать эффективно, чтобы не вызвать падение производительности.

Выясним причину, по которой нельзя просто делать запрос в цикле: это создаст огромную нагрузку на сервер (проблема N+1 запроса). Вместо этого мы подготовим данные сразу для всей коллекции строк:


&НаСервере
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    
    Для Каждого СтрокаСписок Из Строки Цикл
        ДанныеСтроки = СтрокаСписок.Значение;
        // Проверяем тип документа и заполняем данные оформления
        Если ТипЗнч(ДанныеСтроки.Ссылка) = Тип("ДокументСсылка.ПриходныйКассовыйОрдер") Тогда
            СтрокаСписок.Оформление["МояКолонка"].УстановитьТекст(ДанныеСтроки.Ссылка.СтатьяДвиженияДенежныхСредств);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Способ 3. Программная модификация текста запроса через СКД

В сложных системах, таких как КА 2 или ERP, списки часто строятся динамически. Проанализируем ситуацию, когда нам нужно внедрить свою колонку программно в событии ПриСозданииНаСервере. Мы можем программно изменить свойство ТекстЗапроса у динамического списка.

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


ТекстЗапроса = Список.ТекстЗапроса;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЗ ЖурналДокументов.ДенежныеСредства КАК Журнал", 
    "ИЗ ЖурналДокументов.ДенежныеСредства КАК Журнал
    |ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер КАК ПКО
    |ПО Журнал.Ссылка = ПКО.Ссылка");
Список.ТекстЗапроса = ТекстЗапроса;

Способ 4. Создание элементов формы программно

Если вы добавили поле в запрос динамического списка программно, оно не появится на форме автоматически. Разберем по шагам, как добавить саму колонку в таблицу формы:

  1. Создаем новый элемент формы с типом ПолеФормы.
  2. Устанавливаем вид поля как ПолеНадписи или ПолеВвода.
  3. Связываем его с путем к данным динамического списка.

Посмотрим на пример кода:


НоваяКолонка = Элементы.Добавить("КонтрагентИлиСтатья", Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
НоваяКолонка.ПутьКДанным = "Список.ДополнительныйРеквизит";
НоваяКолонка.Заголовок = "Доп. информация";

Оптимизация и производительность

При работе с динамическими списками в 1С 8.3 (Управляемые формы) всегда нужно помнить о производительности. Мы рекомендуем:

Таким образом, выбор метода зависит от сложности условий: для простых случаев подойдет ВЫБОР в запросе, для сложных вычислений — ПриПолученииДанныхНаСервере, а для гибкой настройки в тиковых решениях — работа со схемой компоновки данных.

← На главную