Как вывести в журнале документов графу из справочника в 1С

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

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

Разберем, как правильно реализовать вывод таких данных без потери производительности при прокрутке списка.

Выбор механизма отображения данных

В зависимости от используемого режима форм платформы 1С подход к решению задачи принципиально различается:

  1. В управляемых формах: Для динамического списка настраивается произвольный запрос с левым соединением нужной таблицы. Платформа самостоятельно оптимизирует выборку и отрисовку.
  2. В обычных формах: Поля, вычисляемые динамически, заполняются программно в событиях табличного поля — ПриВыводеСтроки или ПриПолученииДанных.

Использование события ПриВыводеСтроки для выполнения запросов к базе данных категорически не рекомендуется: запрос будет выполняться отдельно для каждой строки на экране, что приведет к сильным зависаниям интерфейса. Единственно верным решением для обычных форм является использование события ПриПолученииДанных, где все видимые строки обрабатываются пакетно за один запрос.

Пошаговая настройка табличного поля

Разберем по шагам порядок реализации вывода данных:

  1. Откроем форму журнала или списка документов в конфигураторе.
  2. В табличное поле списка добавим новую колонку (например, с именем Оригинал).
  3. В свойствах созданной колонки оставим поле Данные пустым. Если требуется отображать признак флажком, включим свойство ОтображатьФлажок.
  4. В свойствах табличного поля назначим обработчик события ПриПолученииДанных.

Реализация обработчика ПриПолученииДанных

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

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


Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)

    // Массив для передачи в параметр запроса
    МассивСсылок = Новый Массив;
    
    // Соответствие для быстрого поиска строки оформления по ссылке
    СоответствиеСтрок = Новый Соответствие;

    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        ТекСсылка = ОформлениеСтроки.ДанныеСтроки.Ссылка;
        МассивСсылок.Добавить(ТекСсылка);
        СоответствиеСтрок.Вставить(ТекСсылка, ОформлениеСтроки);
    КонецЦикла;

    // Выбираем только те документы, для которых взведен признак оригинала
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ОригиналыДокументов.Документ КАК Документ,
        |	ОригиналыДокументов.Оригинал КАК Оригинал
        |ИЗ
        |	Справочник.ОригиналыДокументов КАК ОригиналыДокументов
        |ГДЕ
        |	ОригиналыДокументов.Документ В(&МассивСсылок)
        |	И ОригиналыДокументов.Оригинал = ИСТИНА";

    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    
    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл
        ТекущееОформление = СоответствиеСтрок[Выборка.Документ];
        Если ТекущееОформление <> Неопределено Тогда
            ТекущееОформление.Ячейки.Оригинал.УстановитьФлажок(Истина);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Рассмотрим подробнее ключевые моменты этого кода:

  1. Коллекция ОформленияСтрок содержит объекты ОформлениеСтроки только для тех строк, которые физически отображаются на экране пользователя.
  2. Объект Соответствие позволяет избежать вложенных циклов и осуществлять поиск нужной строки оформления по ссылке документа за постоянное время O(1).
  3. Запрос отправляется в базу данных ровно один раз на всю порцию видимых данных, что гарантирует плавную прокрутку таблицы.

Важные нюансы и ограничения

Выясним особенности платформенных ограничений при работе с виртуально вычисляемыми колонками:

  1. Индексация реквизитов: Чтобы запрос к справочнику выполнялся мгновенно, реквизит Документ в справочнике обязательно должен быть проиндексирован (свойство метаданных Индексировать). Без индекса СУБД будет сканировать всю таблицу справочника при каждой прокрутке списка.
  2. Сортировка и отбор: По колонкам, заполняемым программно через ПриПолученииДанных, стандартные механизмы сортировки, быстрого поиска и интерактивного отбора в обычных формах не работают, так как эти данные отсутствуют в исходном запросе динамического списка.
  3. Очистка ячеек: Платформа 1С может повторно использовать объекты оформления строк. Если в колонке выводятся текстовые значения или картинки, для строк, не попавших в выборку запроса, следует явно сбрасывать значение (например, устанавливать пустую строку или УстановитьФлажок(Ложь)).

Альтернативные архитектурные решения

Если проект развивается или требует регулярных отборов по выводимому полю, рассмотрим более подходящие архитектурные варианты:

  1. Хранение в регистре сведений: Вместо справочника для привязки статусов к документам удобнее использовать непериодический независимый регистр сведений, где измерением является Документ (индексируется автоматически), а ресурсом — статус или признак оригинала.
  2. Графы журнала документов: Если признак наличия оригинала перенести в реквизит каждого документа, входящего в журнал, можно создать объект конфигурации Графа. Графы отображаются платформой автоматически и поддерживают стандартные отборы и сортировку без написания программного кода.
← На главную