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