Как вывести данные из справочника в колонку журнала документов на обычных формах?

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

В платформе 1С:Предприятие при работе с обычными формами часто возникает задача вывести в список документов дополнительные сведения, которые физически хранятся не в самих документах, а во внешних объектах — справочниках или регистрах сведений (например, признак наличия оригинала документа, дополнительный статус или комментарий).

Штатная графа журнала документов на уровне конфигуратора может отображать только реквизиты документов, входящих в состав этого журнала. Чтобы вывести значение из внешнего источника, добавим в табличное поле журнала произвольную колонку и заполним её программно.

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

Почему нельзя использовать ПриВыводеСтроки для запросов?

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

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

Пошаговый алгоритм вывода данных

Разберем по шагам реализацию задачи, когда в журнале документов требуется вывести признак Оригинал (тип Булево) из справочника ОригиналыДокументов, где есть реквизит Документ (ссылка на документ) и реквизит Оригинал.

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

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

Посмотрим на пример эффективного кода. Чтобы быстро сопоставлять результаты запроса с оформлением конкретных строк на форме, используем объект Соответствие, где ключом будет выступать ссылка на документ, а значением — объект ОформлениеСтроки.


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

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

Как настроить вывод флажка вместо текста

Если реквизит имеет тип Булево, по умолчанию в ячейку выводится текст «Да» или «Нет». Чтобы ячейка отображалась в виде графического чекбокса, обратим внимание на следующие настройки:

  1. В коде обработчика у объекта ОформлениеЯчейки обязательно устанавливаем ОтображатьФлажок = Истина и очищаем текст с помощью УстановитьТекст("").
  2. Установить состояние флажка можно через свойство Флажок = Истина/Ложь либо методом УстановитьФлажок(Значение).
  3. В свойствах самой колонки в конфигураторе можно указать ЭлементУправления = ПолеФлажка и режим редактирования Непосредственно, если планируется интерактивное переключение флажка прямо из списка.

Важные ограничения и рекомендации по оптимизации

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

  1. Индексация реквизитов: Если справочник или регистр, из которого выбираются данные, содержит большое количество записей, обязательно включите свойство Индексировать (или Индексировать с доп. упорядочиванием) для реквизита Документ в метаданных. Без индекса поиск по условию В(&МассивДокументов) вызовет сканирование всей таблицы и замедлит прокрутку формы.
  2. Ограничения отборов и сортировки: Поскольку колонка не связана напрямую с таблицей базы данных динамического списка, платформа не может выполнять по ней стандартную сортировку, быстрый поиск и установку отбора через контекстное меню.
  3. Архитектурная альтернатива: Хранение отметок по документам в отдельном справочнике не всегда оптимально с точки зрения архитектуры метаданных. Для подобных задач (отметки оригиналов, статусы проверки документов закрытых периодов) стандартом разработки в 1С является использование независимого непериодического Регистра сведений с ведущим измерением Документ и ресурсом Оригинал (Булево).
← На главную