При разработке внешних печатных форм в 1С нередко возникает задача выделить визуально элементы справочника, которые являются группами. Однако попытка решить эту задачу «в лоб» через обращение к данным в цикле часто приводит к серьезным проблемам с производительностью. Давайте разберем, как реализовать эту задачу профессионально, избегая распространенных ошибок.
Когда мы пишем код, который внутри цикла обхода строк документа обращается к данным через точку, например Выборка.Номенклатура.ЭтоГруппа, мы совершаем классическую ошибку проектирования. Для каждой итерации цикла платформа 1С вынуждена отправлять отдельный SQL-запрос к серверу баз данных. На 10 или 20 строках это незаметно, но если в документе 1000 строк и более, система начинает тратить огромное количество времени на сетевые задержки и обработку запросов. Это приводит к тому, что печатная форма формируется неоправданно долго.
Самый правильный и производительный способ — получить всю необходимую информацию еще на этапе подготовки данных. Включайте проверку признака ЭтоГруппа непосредственно в запрос, который формирует данные для печатной формы. Таким образом, СУБД выполнит один запрос и вернет сразу готовый набор данных с нужными признаками для каждой строки.
Рассмотрим пример того, как это выглядит в коде:
ВЫБРАТЬ
ТабличнаяЧасть.Номенклатура КАК Номенклатура,
ТабличнаяЧасть.Номенклатура.ЭтоГруппа КАК ЭтоГруппа
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК ТабличнаяЧасть
ГДЕ
ТабличнаяЧасть.Ссылка = &СсылкаНаДокумент
Используя такой подход, при обходе выборки нам не нужно делать дополнительных обращений к базе. Мы просто анализируем значение поля ЭтоГруппа из текущей записи выборки.
Если по какой-то причине вы не можете изменить исходный запрос, используйте подход «Массив ссылок». Суть его заключается в том, чтобы собрать все ссылки на справочник из табличной части в массив, а затем одним запросом к справочнику получить признаки групп для всех этих элементов сразу.
Разберем этот алгоритм по шагам:
Номенклатура из табличной части документа в массив.ЭтоГруппа из справочника, используя условие ГДЕ Ссылка В (&МассивСсылок).После того как мы эффективно получили признак ЭтоГруппа, переходим к визуальному оформлению. В печатной форме 1С (табличном документе) мы работаем с областью ячеек программно.
Рассмотрим пример настройки оформления:
// При обходе строк выборки
Если Выборка.ЭтоГруппа Тогда
ОбластьСтроки.Область().ЦветФона = WebЦвета.СветлоСерый;
Иначе
ОбластьСтроки.Область().ЦветФона = WebЦвета.Белый;
КонецЕсли;
ТабДокумент.Вывести(ОбластьСтроки);
Использование свойства ЦветФона объекта Область позволяет гибко настраивать печатную форму в зависимости от условий, полученных из базы данных. Помните, что выполнение подобных операций на стороне клиента или с уже подготовленными данными всегда будет работать быстрее, чем попытки «достучаться» до базы из цикла формирования вывода.
Подводя черту, запомним главное правило: никогда не обращайтесь к базе данных внутри цикла. Проанализируйте свой код, оцените, можно ли получить нужные реквизиты в основном запросе. Если вы будете следовать принципу «один запрос — все данные», ваши отчеты и печатные формы будут работать быстро и масштабироваться даже на тысячи строк, обеспечивая высокую производительность работы системы.