Как вывести данные из справочников в табличный документ без использования запросов

Программист IT и автоматизация бизнеса
← На главную

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

Архитектура данных: Справочники и связи

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

Разберем три основных варианта реализации этой логики:

  1. Реквизит в справочнике сотрудников: Мы можем добавить в справочник Сотрудники булевский реквизит ЭтоДиректор. Это самый простой способ для проверки условия в цикле.
  2. Реквизит в справочнике филиалов: В справочнике Филиалы можно создать реквизит Руководитель с типом ссылки на СправочникСсылка.Сотрудники. В этом случае при обходе списка сотрудников мы будем сравнивать текущего сотрудника с тем, кто указан руководителем в его филиале.
  3. Отдельный справочник или роль: Использование отдельного справочника Должности, где у сотрудника указана ссылка на элемент "Директор".

Для нашего примера мы будем использовать наиболее гибкий вариант — проверку через реквизит филиала или прямой признак в справочнике сотрудников. Это позволит нам эффективно применять условия оформления.

Подготовка макета табличного документа

Создадим внешнюю обработку и добавим в неё макет с типом "Табличный документ". Назовем его Макет. В макете нам необходимо определить две области:

  1. Шапка: Здесь мы нарисуем заголовки колонок: "Филиал", "ФИО", "Год рождения".
  2. Строка: Это область, которая будет выводиться в цикле. В ячейках этой области нужно установить тип "Параметр" и задать имена: Филиал, ФИО, ГодРождения.

Важно помнить, что оформление (шрифты, границы) лучше настроить сразу в макете, чтобы программно менять только цвет фона при выполнении условия.

Реализация выборки данных с сортировкой

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

Метод Выбрать() принимает четвертым параметром строку порядка. Важно, чтобы поля, по которым идет сортировка, были индексированы в конфигураторе (свойство "Индексировать").


// Пример настройки выборки с сортировкой
Выборка = Справочники.Сотрудники.Выбрать(,,,"Филиал Возр, ДатаРождения Возр");

Здесь Возр означает сортировку по возрастанию. Если поле называется иначе, например ГодРождения, убедитесь, что оно доступно для объекта справочника.

Программный вывод данных и цветовое оформление

Теперь объединим всё в процедуру, которая будет выполняться на сервере. Мы будем получать макет, обходить выборку и заполнять параметры области. Особое внимание уделим раскраске строки для директора. Выясним, как программно менять цвет ячеек.


&НаСервере
Функция СформироватьНаСервере()
    
    // Создаем новый табличный документ
    ТабДок = Новый ТабличныйДокумент;
    
    // Получаем макет из нашей обработки
    ЭтотОбъектОбработка = РеквизитФормыВЗначение("Объект");
    Макет = ЭтотОбъектОбработка.ПолучитьМакет("Макет");
    
    // Выводим шапку
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ТабДок.Вывести(ОбластьШапка);
    
    // Подготавливаем область строки
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    // Запускаем выборку сотрудников с сортировкой
    // Поля "Филиал" и "ДатаРождения" должны быть индексированы
    Выборка = Справочники.Сотрудники.Выбрать(,,,"Филиал Возр, ДатаРождения Возр");
    
    Пока Выборка.Следующий() Цикл
        
        // Заполняем параметры области из данных выборки
        ОбластьСтрока.Параметры.ФИО = Выборка.Наименование;
        ОбластьСтрока.Параметры.Филиал = Выборка.Филиал;
        ОбластьСтрока.Параметры.ГодРождения = Формат(Выборка.ДатаРождения, "ДФ=yyyy");
        
        // Проверяем условие: является ли сотрудник директором
        // Предположим, у нас есть булевский реквизит "ЭтоДиректор"
        Если Выборка.ЭтоДиректор Тогда
            // Устанавливаем цвет фона для всей области строки
            ОбластьСтрока.Область().ЦветФона = WebColors.СветлоРозовый;
        Иначе
            // Сбрасываем цвет в авто (белый), чтобы оформление не "прилипло" к следующим строкам
            ОбластьСтрока.Область().ЦветФона = Новый Цвет();
        КонецЕсли;
        
        // Выводим готовую строку в итоговый документ
        ТабДок.Вывести(ОбластьСтрока);
        
    КонецЦикла;
    
    Возврат ТабДок;
    
КонецФункции

Вывод результата на форму

Чтобы пользователь увидел результат, нам нужно вызвать серверную функцию с клиента. Рассмотрим, как правильно отобразить полученный табличный документ. Если на форме создано "Поле табличного документа" с именем Результат, код будет выглядеть следующим образом:


&НаКлиенте
Процедура Сформировать(Команда)
    
    // Получаем сформированный документ с сервера
    РезультатТабДок = СформироватьНаСервере();
    
    // Копируем его в реквизит формы для отображения в элементе управления
    Объект.Результат.Очистить();
    Объект.Результат.Вывести(РезультатТабДок);
    
КонецПроцедуры

Важные нюансы и оптимизация

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

Таким образом, мы проанализировали процесс создания отчета без использования конструктора запросов. Мы научились программно управлять областями макета, использовать параметры и динамически изменять визуальное оформление строк в зависимости от данных объекта. Этот навык является базовым для любого разработчика 1С и позволяет создавать гибкие интерфейсные решения.

← На главную