Как отобрать документы, по которым отсутствуют записи в регистре сведений?

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

При разработке отчетов и обработок в 1С часто возникает задача найти документы определенного вида, для которых еще не созданы записи в регистре сведений. Например, нам нужно отобрать все АктСверкиВзаиморасчетов, в которых не заполнено определенное дополнительное сведение. Давайте разберем, как реализовать такой запрос наиболее эффективно и быстро.

Решение 1: Однопроходной запрос через левое соединение

Самый простой и эффективный способ решить эту задачу — использовать ЛЕВОЕ СОЕДИНЕНИЕ. Суть метода заключается в том, чтобы присоединить таблицу регистра сведений к таблице документов и отфильтровать те записи, для которых не нашлось соответствия (т.е. поле регистра вернуло NULL).

Рассмотрим пример кода для такой задачи:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    АктСверкиВзаиморасчетов.Ссылка КАК Ссылка
    |ИЗ
    |    Документ.АктСверкиВзаиморасчетов КАК АктСверкиВзаиморасчетов
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
    |        ПО АктСверкиВзаиморасчетов.Ссылка = ДополнительныеСведения.Объект
    |ГДЕ
    |    АктСверкиВзаиморасчетов.Организация = &Организация
    |    И АктСверкиВзаиморасчетов.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    |    И ДополнительныеСведения.Объект ЕСТЬ NULL";

Преимущества данного метода:

  1. Запрос выполняется в один проход, что существенно экономит время процессора.
  2. Код получается лаконичным и легко читаемым.
  3. Отсутствует необходимость в сложных вложенных конструкциях.

Решение 2: Использование временных таблиц

Если объем данных очень велик, а регистр сведений содержит миллионы записей, иногда бывает полезно разбить задачу на несколько этапов, используя временные таблицы. Это помогает оптимизатору СУБД работать более предсказуемо.

Разберем алгоритм действий по шагам:

  1. Выбираем из регистра сведений только те записи, которые относятся к нашему типу документов, и помещаем их во временную таблицу.
  2. Индексируем временную таблицу по полю Объект. Это критически важно для скорости поиска при соединении.
  3. Выполняем основной запрос к документам, делая ЛЕВОЕ СОЕДИНЕНИЕ уже с проиндексированной временной таблицей.

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

Важные замечания по оптимизации

Анализируя производительность, важно учитывать несколько технических нюансов:

В завершение, рекомендуем всегда отдавать предпочтение однопроходным запросам с левым соединением, если они показывают приемлемое время выполнения. Это «золотой стандарт» для большинства задач поиска отсутствующих данных в регистрах сведений 1С.

← На главную