Как правильно использовать поле 'Регистратор' в запросах к виртуальной таблице 'Обороты' регистра накопления?

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

При работе с системой 1С:Предприятие 8.3, особенно при формировании сложных запросов к данным регистров накопления, разработчики часто сталкиваются с вопросом использования поля Регистратор. В частности, возникает недопонимание относительно возможности включения отбора по Регистратору непосредственно в параметры виртуальной таблицы Обороты регистра накопления. Давайте вместе разберем эту ситуацию, выясним причину возникновения затруднений и найдем эффективные способы решения задачи по получению оборотов с учетом конкретного регистратора.

Почему 'Регистратор' нельзя использовать для отбора в параметрах виртуальной таблицы 'Обороты'?

Начнем с фундаментальных принципов работы регистров накопления в 1С. Регистры накопления предназначены для хранения числовых показателей в разрезе измерений. Существуют две основные таблицы для каждого регистра накопления: таблица движений и таблица итогов.

  1. Таблица движений (РегистрНакопления.ИмяРегистра.Движения): Эта таблица содержит детальные записи о каждом отдельном движении, совершенном документом-регистратором. Каждая запись в этой таблице включает полную информацию, в том числе ссылку на документ-регистратор, измерения, ресурсы и период движения.
  2. Таблица итогов (используется виртуальной таблицей Обороты): Эта таблица хранит агрегированные (сгруппированные) данные. Она содержит уже подсчитанные итоги по определенным измерениям и периодам (день, месяц, год). В целях оптимизации производительности и экономии места, в таблице итогов не хранятся ссылки на отдельные документы-регистраторы. Вместо этого, итоги формируются по суммарным значениям за определенные промежутки времени или по измерениям.

Именно из-за этой архитектурной особенности виртуальная таблица Обороты, которая работает с агрегированными данными, не предоставляет возможности отбора по полю Регистратор в своих параметрах. Если мы попытаемся указать Регистратор в параметрах виртуальной таблицы Обороты для отбора, система выдаст ошибку, например, такую как: "Поле не найдено 'Регистратор'". Это совершенно нормальное поведение, соответствующее логике работы платформы 1С.

Часто возникает путаница, связанная с тем, что в параметрах виртуальной таблицы Обороты есть параметр, который также называется Регистратор, но он относится к периодичности, а не к отбору. Разберем этот момент подробнее.

Параметр 'Периодичность' в виртуальной таблице 'Обороты'

Параметр Периодичность является одним из ключевых параметров виртуальной таблицы Обороты. Он определяет, с какой детализацией будут агрегироваться данные в результате запроса. Среди доступных значений для этого параметра могут быть День, Неделя, Месяц, Квартал, Год, Авто, а также Регистратор.

Таким образом, параметр Пегистратор в Оборотах(,,Регистратор,) служит для указания уровня детализации (периодичности), а не для фильтрации данных по конкретной ссылке на документ. Это распространенное заблуждение, которое мы сейчас развеем, предложив корректные способы решения вашей задачи.

Эффективные способы получения оборотов с отбором по 'Регистратору'

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

1. Запрос к таблице движений регистра накопления

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

Алгоритм действий:

  1. Обращаемся к виртуальной таблице Движения регистра накопления (или к основной таблице, если нет нужды в виртуальных).
  2. В секции ГДЕ запроса применяем условие отбора по полю Регистратор, указывая нужный документ или условия на его поля (например, тип документа).
  3. При необходимости агрегируем полученные данные (например, с помощью СУММА()) и группируем их по нужным измерениям.

Пример кода:


ВЫБРАТЬ
    ТоварыОрганизацийДвижения.Организация КАК Организация,
    СУММА(ТоварыОрганизацийДвижения.Количество) КАК КоличествоОборот
ИЗ
    РегистрНакопления.ТоварыОрганизаций.Движения КАК ТоварыОрганизацийДвижения
ГДЕ
    ТоварыОрганизацийДвижения.Регистратор = &СсылкаНаРегистратор
    И ТоварыОрганизацийДвижения.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
    ТоварыОрганизацийДвижения.Организация

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

2. Отбор по полю 'Регистратор' после получения оборотов

Если по какой-то причине вы все же хотите использовать виртуальную таблицу Обороты (например, если она уже включена в более сложный запрос и вы хотите добавить к ней отбор по регистратору), то вы можете получить обороты с периодичностью Регистратор, а затем отфильтровать результат в секции ГДЕ внешнего запроса.

Алгоритм действий:

  1. Используем виртуальную таблицу Обороты с параметром Периодичность = Регистратор.
  2. В секции ГДЕ внешнего запроса применяем условие отбора по полю Регистратор.

Пример кода:


ВЫБРАТЬ
    ТоварыОрганизацийОбороты.Организация КАК Организация,
    ТоварыОрганизацийОбороты.Регистратор КАК Регистратор,
    ТоварыОрганизацийОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
    РегистрНакопления.ТоварыОрганизаций.Обороты(
        &ДатаНачала,
        &ДатаОкончания,
        Регистратор, // Важно: здесь Регистратор - это ПЕРИОДИЧНОСТЬ
        ) КАК ТоварыОрганизацийОбороты
ГДЕ
    ТоварыОрганизацийОрганизацийОбороты.Регистратор = &СсылкаНаРегистратор

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

При использовании этого подхода, если вам нужно обращаться к полям регистратора (например, Регистратор.ВидДвижения или Регистратор.Дата), необходимо будет использовать конструкцию Регистратор ССЫЛКА Документ.ИмяДокумента или выполнять соединение с таблицей документов. При необходимости выполнить такой отбор по строковому УИД или представлению документа можно использовать руководство по сравнению строки с представлением ссылки в запросах.

Давайте рассмотрим пример с проверкой типа документа в поле Регистратор:


ВЫБРАТЬ
    ТоварыОрганизацийОбороты.Организация КАК Организация,
    ТоварыОрганизацийОбороты.Регистратор КАК Регистратор,
    ТоварыОрганизацийОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
    РегистрНакопления.ТоварыОрганизаций.Обороты(
        &ДатаНачала,
        &ДатаОкончания,
        Регистратор,
        ) КАК ТоварыОрганизацийОбороты
ГДЕ
    ТоварыОрганизацийОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг

В этом примере мы фильтруем обороты, оставляя только те, которые были сформированы документами типа ПоступлениеТоваровУслуг. При таком подходе, если у нас миллионы записей движений, система все равно сначала сформирует обороты по всем регистраторам, а затем отфильтрует их, что может быть затратно по времени и ресурсам.

3. Понимание базовых принципов работы с регистрами

Ключевым моментом в работе с регистрами накопления является понимание того, как они хранят данные и какие виртуальные таблицы для чего предназначены. Запомните:

Развитие этих базовых знаний поможет нам избегать подобных ошибок и писать более эффективные и производительные запросы.

Заключение

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

← На главную