Как правильно проверить признак «ЭтоГруппа» для строк печатной формы в 1С?

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

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

Почему запросы в цикле — это плохая практика

Когда мы пишем код, который внутри цикла обхода строк документа обращается к данным через точку, например Выборка.Номенклатура.ЭтоГруппа, мы совершаем классическую ошибку проектирования. Для каждой итерации цикла платформа 1С вынуждена отправлять отдельный SQL-запрос к серверу баз данных. На 10 или 20 строках это незаметно, но если в документе 1000 строк и более, система начинает тратить огромное количество времени на сетевые задержки и обработку запросов. Это приводит к тому, что печатная форма формируется неоправданно долго.

Решение 1: Получение данных в основном запросе (Рекомендуемый метод)

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

Рассмотрим пример того, как это выглядит в коде:


ВЫБРАТЬ
    ТабличнаяЧасть.Номенклатура КАК Номенклатура,
    ТабличнаяЧасть.Номенклатура.ЭтоГруппа КАК ЭтоГруппа
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК ТабличнаяЧасть
ГДЕ
    ТабличнаяЧасть.Ссылка = &СсылкаНаДокумент

Используя такой подход, при обходе выборки нам не нужно делать дополнительных обращений к базе. Мы просто анализируем значение поля ЭтоГруппа из текущей записи выборки.

Решение 2: Использование массива ссылок и пакетного запроса

Если по какой-то причине вы не можете изменить исходный запрос, используйте подход «Массив ссылок». Суть его заключается в том, чтобы собрать все ссылки на справочник из табличной части в массив, а затем одним запросом к справочнику получить признаки групп для всех этих элементов сразу.

Разберем этот алгоритм по шагам:

  1. Выгрузите колонку Номенклатура из табличной части документа в массив.
  2. С помощью запроса выберите поле ЭтоГруппа из справочника, используя условие ГДЕ Ссылка В (&МассивСсылок).
  3. Результат запроса поместите в таблицу значений или соответствие (ключ — ссылка, значение — признак группы).
  4. Во время обхода строк печатной формы обращайтесь к этой таблице/соответствию, чтобы мгновенно получить признак группы без обращения к БД.

Как оформить раскраску в печатной форме

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

Рассмотрим пример настройки оформления:


// При обходе строк выборки
Если Выборка.ЭтоГруппа Тогда
    ОбластьСтроки.Область().ЦветФона = WebЦвета.СветлоСерый;
Иначе
    ОбластьСтроки.Область().ЦветФона = WebЦвета.Белый;
КонецЕсли;

ТабДокумент.Вывести(ОбластьСтроки);

Использование свойства ЦветФона объекта Область позволяет гибко настраивать печатную форму в зависимости от условий, полученных из базы данных. Помните, что выполнение подобных операций на стороне клиента или с уже подготовленными данными всегда будет работать быстрее, чем попытки «достучаться» до базы из цикла формирования вывода.

Итоги и рекомендации

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

← На главную