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