Как оптимизировать поиск дублей входящих номеров документов поступления в 1С:Бухгалтерия 3.0?

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

При разработке отчетов и контрольных процедур в конфигурации «1С:Бухгалтерия предприятия 3.0» разработчики нередко сталкиваются с падением скорости выполнения запросов по таблицам документов Документ.ПоступлениеТоваровУслуг. Возникает стереотип: «выборка по регистрам всегда работает быстрее, чем по документам». Давайте разберем, насколько оправдан такой подход при поиске дубликатов входящих номеров, выясним структуру типовых регистров и рассмотрим оптимальные варианты ускорения запросов.

Миф об универсальности регистров и регистр «ДанныеПервичныхДокументов»

Проанализируем структуру хранения данных. В конфигурации «Бухгалтерия предприятия 3.0» существует независимый регистр сведений ДанныеПервичныхДокументов. Он используется для быстрого отображения списков и печати первичных документов.

В этом регистре присутствуют следующие поля:

  1. Организация — организация документа;
  2. Документ — ссылка составного типа (включая ДокументСсылка.ПоступлениеТоваровУслуг);
  3. Номер и Дата — системные номер и дата документа;
  4. НомерВходящегоДокумента и ДатаВходящегоДокумента — реквизиты входящего документа контрагента.

Однако реквизита Ответственный в регистре сведений ДанныеПервичныхДокументов нет. Если перед нами стоит задача найти дубликаты входящих номеров именно в разрезе ответственных менеджеров или пользователей, обращение к регистру приведет к необходимости левого соединения с таблицей самого документа. В таком случае выигрыш в производительности исчезает, а нагрузка на СУБД возрастает из-за лишних соединений с составным типом данных.

Почему прямой запрос к документам может выполняться медленно?

Выясним главные причины медленной работы запросов к табличной части документов:

  1. Ограничения прав на уровне записей (RLS): Если запрос выполняется в контексте обычного пользователя без привилегированного режима, платформа 1С автоматически дописывает в итоговый SQL-запрос проверки прав доступа по организациям, подразделениям и контрагентам, что многократно увеличивает план выполнения.
  2. Отсутствие индексации: Поля НомерВходящегоДокумента и Ответственный в типовой конфигурации не индексируются. Поиск по ним на больших объемах данных вызывает полное сканирование таблицы (Full Table Scan).
  3. Неоптимальные фильтры: Отсутствие явного ограничения по датам вынуждает СУБД анализировать всю историческую базу документов за все годы.

Способ 1. Оптимизированный агрегатный запрос по документам

Рассмотрим, как правильно составить запрос к таблице Документ.ПоступлениеТоваровУслуг для выявления дублей на уровне сервера базы данных. Чтобы минимизировать передаваемый объем данных, используем группировку и фильтрацию с помощью предложения ИМЕЮЩИЕ.


ВЫБРАТЬ
    Поступление.Организация КАК Организация,
    Поступление.Контрагент КАК Контрагент,
    Поступление.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
    Поступление.Ответственный КАК Ответственный,
    КОЛИЧЕСТВО(Поступление.Ссылка) КАК КоличествоДублей
ИЗ
    Документ.ПоступлениеТоваровУслуг КАК Поступление
ГДЕ
    Поступление.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И Поступление.НомерВходящегоДокумента <> ""
    И НЕ Поступление.ПометкаУдаления
СГРУППИРОВАТЬ ПО
    Поступление.Организация,
    Поступление.Контрагент,
    Поступление.НомерВходящегоДокумента,
    Поступление.Ответственный
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Поступление.Ссылка) > 1

Разберем ключевые моменты этого запроса:

  1. Ограничение по индексированному полю: Условие Дата МЕЖДУ &ДатаНачала И &ДатаОкончания отсекает чтение лишних страниц данных, так как стандартный реквизит Дата проиндексирован платформой.
  2. Отсечение пустых номеров: Проверка НомерВходящегоДокумента <> "" исключает из тяжелой группировки документы без входящего номера.
  3. Агрегация на сервере СУБД: Конструкция ИМЕЮЩИЕ КОЛИЧЕСТВО(Поступление.Ссылка) > 1 возвращает только те строки, где действительно есть дубли.

Способ 2. Выполнение в привилегированном режиме

Если отчет или обработка запускается пользователем с ограниченными правами, RLS существенно снижает скорость. Чтобы исключить наложение сложных условий проверки прав, выполним процедуру формирования на сервере с отключением контроля доступа.

Посмотрим на пример серверного кода:


&НаСервереБезКонтекста
Функция ПолучитьТаблицуДублей(ДатаНачала, ДатаОкончания)
    
    УстановитьПривилегированныйРежим(Истина);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Поступление.Организация КАК Организация,
        |   Поступление.Контрагент КАК Контрагент,
        |   Поступление.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
        |   Поступление.Ответственный КАК Ответственный,
        |   КОЛИЧЕСТВО(Поступление.Ссылка) КАК КоличествоДублей
        |ИЗ
        |   Документ.ПоступлениеТоваровУслуг КАК Поступление
        |ГДЕ
        |   Поступление.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |   И Поступление.НомерВходящегоДокумента <> """"
        |   И НЕ Поступление.ПометкаУдаления
        |СГРУППИРОВАТЬ ПО
        |   Поступление.Организация,
        |   Поступление.Контрагент,
        |   Поступление.НомерВходящегоДокумента,
        |   Поступление.Ответственный
        |ИМЕЮЩИЕ
        |   КОЛИЧЕСТВО(Поступление.Ссылка) > 1";
        
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    
    Возврат Запрос.Выполнить().Выгрузить();

КонецФункции

Способ 3. Индексация реквизитов через расширение конфигурации

Если база данных содержит сотни тысяч документов за выбранный период и запрос продолжает работать долго, добавим индекс для реквизита без снятия конфигурации с поддержки:

  1. Создаем расширение конфигурации с назначением Адаптация или Дополнение.
  2. Добавляем в расширение документ ПоступлениеТоваровУслуг.
  3. Для реквизита НомерВходящегоДокумента устанавливаем свойство Индексировать в значение Индексировать.
  4. Применяем расширение. СУБД автоматически создаст индекс по данному полю, что многократно ускорит поиск и фильтрацию.

Типовые средства платформы

Напомним, что в типовой конфигурации «1С:Бухгалтерия предприятия 3.0» уже предусмотрены встроенные средства работы с дублями:

  1. Обработка «Поиск и удаление дублей»: Расположена в разделе Администрирование — Обслуживание — Корректировка данных. Позволяет находить и объединять повторяющиеся элементы справочников и документов.
  2. Автоматический контроль при вводе: При записи документа программа проверяет совпадение полей Организация, Контрагент и НомерВходящегоДокумента, информируя пользователя предупреждающим сообщением.
← На главную