В мире разработки на платформе 1С:Предприятие 7.7 существует понятие «черных запросов» — это стандартные запросы, написанные на встроенном языке с использованием объекта Запрос. Несмотря на кажущуюся простоту, этот механизм таит в себе серьезные архитектурные недостатки, которые могут приводить к катастрофическому падению производительности при росте объема данных. В этой статье мы подробно разберем, как именно движок 1С обрабатывает эти запросы, почему он игнорирует индексы и какие существуют альтернативные способы получения данных.
Проанализируем механику работы DBF-версии 1С 7.7. Исследования и опыт разработчиков показывают, что при исполнении запроса движок практически полностью игнорирует существующие индексы, если фильтрация данных описана в секции Условие().
Рассмотрим ситуацию: нам нужно выбрать подмножество записей из справочника «Номенклатура», где реквизит ВидТовара равен определенному значению. Если мы напишем стандартный запрос, система поведет себя следующим образом:
.dbf.Важный нюанс заключается в том, что 1С считывает запись целиком. Если длина строки в таблице составляет, например, 500 символов, а в запросе вам нужны только два поля общей длиной 30 символов, система все равно будет «прокачивать» через память все 500 символов для каждой строки. Это создает огромную нагрузку на дисковую подсистему и локальную сеть.
Многие полагают, что переход на SQL-версию 1С 7.7 автоматически решает проблемы производительности запросов. Однако это не так. Рассмотрим, почему «черные запросы» могут тормозить даже на мощном SQL-сервере. Выясним причину: в ряде случаев движок 1С не может транслировать сложный запрос в один эффективный SELECT.
Вместо этого система часто прибегает к механизму «прокачки» данных. Она считывает необходимые таблицы из SQL, выгружает их в локальный каталог временных файлов пользователя в формате DBF и затем обрабатывает их своим стандартным (медленным) движком. Особенно часто это происходит при использовании конструкции Когда или при попытке построения сложных агрегатных отчетов по регистрам.
Если нам необходимо получить данные с фильтром по конкретному индексируемому полю, мы можем значительно ускорить процесс, отказавшись от объекта Запрос в пользу стандартных методов объектов метаданных. В отличие от запросов, эти методы гарантированно используют индексы.
Рассмотрим пример замены медленного запроса на эффективную выборку для справочника:
// Вместо черного запроса используем объектную выборку
Спр = СоздатьОбъект("Справочник.Номенклатура");
// Если на реквизите ВидТовара стоит галка "Сортировка" или "Отбор"
Спр.ВыбратьЭлементыПоРеквизиту("ВидТовара", ВыбВидТовара, 0, 0);
Пока Спр.ПолучитьЭлемент() = 1 Цикл
// Обработка данных
Сообщить(Спр.Наименование);
КонецЦикла;
Для реализации выборки в диапазоне «от–до» (например, по коду или другому индексируемому полю) проанализируем совместное использование методов установки порядка:
Спр.ПорядокРеквизита("Артикул");
Спр.ВыбратьЭлементы(); // Дальше можно программно прервать цикл при выходе из диапазона
В конфигураторе 1С 7.7 у реквизитов есть две важные настройки: «Сортировка» и «Отбор». Посмотрим, на что они влияют на самом деле:
НайтиПоРеквизиту() и ВыбратьЭлементыПоРеквизиту().Важно: наличие этих галок никак не помогает «черному запросу» работать быстрее в секции Условие(), но они критически важны для работы «прямых запросов» и объектных выборок.
Самым эффективным способом работы с данными в 1С 7.7 на сегодняшний день является использование внешних компонент, таких как 1С++ или 1SQLite. Они позволяют писать запросы на чистом диалекте SQL (T-SQL для MS SQL или синтаксис SQLite для DBF-баз).
Преимущества прямого подхода очевидны:
Проанализируем пример логики, которую используют опытные разработчики: вынесение бизнес-логики во внешние компоненты или использование SQLite в качестве временного хранилища. Это позволяет хранить промежуточные расчеты в оперативной памяти, что на порядки быстрее работы с физическими DBF-файлами.
Подводя итог, разберем по шагам, что нужно сделать, если ваш отчет в 1С 7.7 работает недопустимо долго:
Условие() по реквизитам справочников или документов — это первый кандидат на оптимизацию.ВыбратьЭлементыПоРеквизиту() или ВыбратьДокументы() с последующей фильтрацией в цикле, если это позволяет сузить выборку на начальном этапе.Помните, что мир штатных механизмов 1С 7.7 действительно бывает жесток к производительности, но понимание внутренней архитектуры позволяет обходить эти ограничения и создавать быстрые, современные решения даже на этой почтенной платформе.