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