Разработка первого внешнего отчета — это всегда важный этап для начинающего разработчика. Давайте разберем, как написать эффективный и корректный код, основываясь на лучших практиках работы в 1С:Предприятие. Мы проанализируем, как правильно строить запросы, работать с данными и оформлять алгоритмы, чтобы отчет работал быстро и был удобным в поддержке.
Одной из самых частых ошибок является избыточное использование ЛЕВОЕ СОЕДИНЕНИЕ там, где можно получить данные через разыменование ссылок. Однако важно соблюдать баланс. Если вы обращаетесь к реквизитам через точку, платформа делает это удобно для вас, но при массовой обработке данных лучше использовать соединения.
Рассмотрим пример правильного запроса к регистру сведений. Вместо того чтобы строить сложную цепочку, мы можем получить данные в один проход:
ВЫБРАТЬ
РС.ЛицевойСчет КАК ЛС,
РС.ОтветственныйВладелец КАК Собственник,
РС.ОтветственныйВладелец.ФизЛицо.Пол КАК Пол
ИЗ
РегистрСведений.УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчета.СрезПоследних(&Дата) КАК РС
ГДЕ
РС.ЛицевойСчет В (&СписокВыбранныхЛС)
Обратите внимание: мы используем точку для получения пола физического лица. Это допустимо, если тип данных в поле ОтветственныйВладелец позволяет это сделать однозначно.
При получении данных из регистров накопления крайне важно правильно работать с виртуальными таблицами остатков. Нельзя просто передать дату через КонецДня(), так как документы начислений могут быть проведены в последние секунды суток (например, в 23:59:59). Если не учесть этот момент, часть данных просто «выпадет» из отчета.
Всегда используйте объект Граница:
ДатаГраницы = Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая);
Запрос.УстановитьПараметр("Дата", ДатаГраницы);
Также важно передавать отборы (например, список лицевых счетов) не в секцию ГДЕ основного запроса, а непосредственно в параметры виртуальной таблицы. Это позволяет СУБД отсечь ненужные записи еще на этапе обращения к физическим таблицам базы данных, что кратно увеличивает скорость работы.
Программирование — это не только работающий алгоритм, но и удобный для чтения код. Давайте разберем, как писать лучше:
Если ПереносСтраницы = ИСТИНА Тогда — это лишний код. Достаточно написать Если ПереносСтраницы Тогда.ЗначениеЗаполнено(). Это универсальный метод, который корректно обработает Неопределено, пустую ссылку и пустую строку. Это надежнее, чем прямые проверки на Пустая().ЗаполнитьЗначенияСвойств(). Вместо того чтобы вручную присваивать каждое поле макета из результата запроса, используйте этот метод. Если имена параметров в макете совпадают с именами полей в выборке, код сокращается в разы:
ЗаполнитьЗначенияСвойств(Шапка.Параметры, РезультатЗапросаОрганизации);
Никогда не выполняйте Запрос.Выполнить() внутри цикла Для каждого ... Цикл. Это критическая ошибка, которая делает отчет крайне медленным при большом количестве лицевых счетов. Все необходимые данные должны быть собраны одним или двумя запросами до цикла вывода. Вывод макета должен происходить только после получения всех данных в выборку.
Хотя написание внешних отчетов напрямую — хороший опыт для обучения, помните о системе компоновки данных (СКД). В профессиональной разработке 1С большинство отчетов строится на СКД. Она берет на себя рутину: выводы, разрывы страниц, группировки и настройки пользователя. Если ваша задача становится сложнее, чем просто вывод списка, обязательно изучите возможности СКД.
Также всегда придерживайтесь логики типовых решений. Если разработчики конфигурации используют свои функции для получения контактной информации, попробуйте понять их принцип, но не бойтесь оптимизировать — если типовой метод вызывает запрос внутри цикла, лучше написать свой запрос, который соберет данные сразу для всех необходимых объектов.
Следуя этим правилам, вы сделаете свои отчеты профессиональными, быстрыми и легкими в поддержке!