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