Как оптимизировать код в 1С и избавиться от запросов в цикле?

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

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

1. Главное правило: минимизация обращений к базе данных

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

Когда вы внутри цикла Для Каждого обращаетесь к базе данных, система вынуждена каждый раз отправлять отдельный запрос к SQL-серверу. Если строк в таблице 1000, сервер выполнит 1000 обращений, что критически замедлит выполнение задачи. Вместо этого, нужно получить все необходимые данные одним запросом перед началом цикла, загрузить их в оперативную память (например, в ТаблицаЗначений или выборку) и уже там обрабатывать результат.

2. Как правильно работать с запросами и итогами

Если вам нужно получить данные по объектам (например, по лицевым счетам или товарам) с учетом какой-либо группировки, используйте секцию ИТОГИ. Это позволяет структурировать выборку так, что обход по ней становится максимально простым и читаемым.

Рассмотрим пример использования итогов:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | ЛицевыеСчета.Ссылка КАК ЛицевойСчет,
               | ЛицевыеСчетаДополнительныеРеквизиты.Свойство КАК Свойство
               |ИЗ Справочник.ЛицевыеСчета КАК ЛицевыеСчета
               |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЛицевыеСчета.ДополнительныеРеквизиты КАК Рег
               |ПО Рег.Ссылка = ЛицевыеСчета.Ссылка
               |ИТОГИ ПО ЛицевойСчет";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСсылка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСсылка.Следующий() Цикл
    // Работаем с данными текущего лицевого счета
    ВыборкаДетальныеЗаписи = ВыборкаСсылка.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Обработка детальных записей
    КонецЦикла;
КонецЦикла;

3. Оптимизация заполнения табличных частей

При заполнении табличных частей документа не нужно вручную присваивать каждое поле, если названия колонок в запросе и в ТЧ совпадают. Используйте метод ЗаполнитьЗначенияСвойств() — это не только ускоряет написание кода, но и делает его надежнее.

Вместо многократного присваивания:


// Плохой подход:
НоваяСтрока = Объект.ТЧ.Добавить();
НоваяСтрока.Сумма = Выборка.Сумма;
НоваяСтрока.Цена = Выборка.Цена;

// Оптимальный подход:
ЗаполнитьЗначенияСвойств(Объект.ТЧ.Добавить(), Выборка);

4. Использование структуры для работы с параметрами

Если вы выводите данные в печатную форму, часто требуется дополнительная обработка (например, ЧислоПрописью()). Чтобы не загромождать основной код, используйте Структура для подготовки параметров перед выводом области макета.


ПараметрыОбласти = Новый Структура("Парам1, Парам2, СуммаПрописью");
ЗаполнитьЗначенияСвойств(ПараметрыОбласти, Выборка);
ПараметрыОбласти["СуммаПрописью"] = ЧислоПрописью(Выборка.Сумма);
ОбластьПечати.Параметры.Заполнить(ПараметрыОбласти);

5. Практические советы по архитектуре кода

  1. Выносите константы из цикла: Поиск пользователя, поиск организации или получение даты — делайте это 1 раз до начала цикла, а не 1000 раз внутри него.
  2. Проверяйте условия в запросе: Если вы фильтруете данные, делайте это на уровне языка запросов, а не проверяйте условие Если внутри цикла Пока.
  3. Используйте Замер производительности: Всегда проверяйте свои изменения встроенным в Конфигуратор инструментом «Замер производительности». Это единственный способ объективно увидеть, какой участок кода тормозит систему.
  4. Откажитесь от объектной модели в циклах: Обращение к реквизитам объекта (например, Документ.Товары[i].Номенклатура.Цена) внутри цикла каждый раз вызывает считывание данных из базы. Замените это на запрос.

Оптимизация — это всегда баланс. Не стоит усложнять код, если он работает за приемлемое время. Однако, как только вы видите, что задача занимает много времени или нагружает сервер, начинайте с анализа запросов. Помните: «Правильный запрос — залог быстрой работы системы».

← На главную