Как правильно получить реквизиты документов разных типов в одном запросе к регистру 1С?

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

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

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

Оптимальный подход: использование конструкции ВЫБОР

Вместо того чтобы соединять виртуальную таблицу регистра с таблицами документов, мы воспользуемся механизмом разыменования полей. Это позволяет обратиться к реквизиту объекта напрямую через точку, если платформа понимает тип этого объекта. В случае составного типа данных мы должны «подсказать» системе, какой именно объект мы обрабатываем в данный момент.

Для этих целей идеально подходит конструкция ВЫБОР КОГДА ... ССЫЛКА ... ТОГДА ... КОНЕЦ. Рассмотрим пошагово, как внедрить этот подход в ваш запрос.

  1. Проверяем тип ссылки в поле с помощью оператора ССЫЛКА.
  2. Если тип совпал, извлекаем нужный реквизит через точку (разыменование).
  3. Если тип не совпал, проверяем следующий возможный тип документа.
  4. Задаем значение NULL или пустое значение для случаев, когда документ не соответствует ни одному из типов.

Пример реализации кода

Представим, что мы работаем с регистром накопления ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов. Нам нужно получить дату платежного поручения из поля ДокументРасчетовСКонтрагентом. Вот как будет выглядеть правильная структура запроса:


ВЫБРАТЬ
    Взаиморасчеты.Период,
    Взаиморасчеты.Регистратор,
    Взаиморасчеты.Контрагент,
    ВЫБОР
        КОГДА Взаиморасчеты.ДокументРасчетовСКонтрагентом ССЫЛКА Документ.ПлатежноеПоручениеВходящее 
            ТОГДА Взаиморасчеты.ДокументРасчетовСКонтрагентом.ДатаВходящегоДокумента
        КОГДА Взаиморасчеты.ДокументРасчетовСКонтрагентом ССЫЛКА Документ.ПлатежноеПоручениеИсходящее 
            ТОГДА Взаиморасчеты.ДокументРасчетовСКонтрагентом.ижДатаВходящегоДокумента
        ИНАЧЕ NULL
    КОНЕЦ КАК ДатаПП
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов КАК Взаиморасчеты
ГДЕ
    Взаиморасчеты.Контрагент = &Контрагент

Почему это решение лучше?

Разберем основные преимущества данного метода:

На что обратить внимание

Важно помнить, что разыменование полей (обращение через точку) — это мощный инструмент, но он имеет свои особенности:

Во-первых, платформа при выполнении запроса все равно выполняет неявное соединение с таблицей документа. Для большинства типовых задач это является абсолютно допустимым и рекомендованным стандартом.

Во-вторых, если поле является составным, обязательно используйте ССЫЛКА. Попытка обратиться к реквизиту объекта напрямую без предварительной проверки типа приведет к ошибке выполнения, так как 1С не сможет однозначно определить структуру данных в этом поле.

В-третьих, если вам нужно искать документы контрагента по каким-то глобальным признакам, не забывайте про Критерии отбора. Это специальный объект метаданных, который помогает находить связанные документы в системе. Однако, если задача состоит именно в выводе данных в отчете или выборке по регистрам, предложенный выше метод с конструкцией ВЫБОР является наиболее подходящим.

Теперь вы можете легко и быстро получать доступ к любым реквизитам документов внутри своих запросов к регистрам, не перегружая систему лишними соединениями!

← На главную