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

Программист IT и автоматизация бизнеса
← На главную

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

Выясним причину: почему Обработка не может быть Регистратором?

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

В системе "1С:Предприятие" Регистратор — это объект, который документально подтверждает и фиксирует хозяйственную операцию, создавая при этом соответствующие записи (движения) в регистрах. Главная задача регистратора — привязать движения к конкретному моменту времени и обеспечить хронологическую целостность данных. В 99.9% случаев в качестве регистраторов выступают объекты типа Документ. Именно документы, такие как «Реализация товаров и услуг» или «Поступление на расчетный счет», отражают факты хозяйственной жизни предприятия.

А что же такое Обработка? Это вспомогательный, сервисный инструмент. Ее предназначение — выполнение различных действий над данными: от формирования сложных отчетов и печати форм до пакетного изменения данных и заполнения справочников по определенному алгоритму. Обработка не является объектом, который фиксирует операцию во времени, у нее нет поля «Дата», и она не предназначена для хранения истории событий. Поэтому платформа 1С не позволяет использовать обработки в качестве регистраторов.

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

Разбираем правильные способы отбора по типу Регистратора в запросе

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

Способ 1. Использование оператора ССЫЛКА

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

Посмотрим на пример. Допустим, нам нужно получить все суммы из регистра бухгалтерии Хозрасчетный, которые были сделаны только документами «РеализацияТоваровУслуг».

Пример кода:


ВЫБРАТЬ
    Хозрасчетный.Сумма,
    Хозрасчетный.Регистратор
ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
    Хозрасчетный.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг

В этом запросе условие ГДЕ Хозрасчетный.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг однозначно говорит системе: "выбери только те записи, у которых регистратор — это документ типа «РеализацияТоваровУслуг»". Это просто, понятно и эффективно.

Способ 2. Использование функций ТИПЗНАЧЕНИЯ и ТИП

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

Пример кода:


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

Как видим, результат будет абсолютно идентичен первому способу. Выбор между ССЫЛКА и ТИПЗНАЧЕНИЯ — это чаще всего вопрос личных предпочтений или стандартов кодирования в команде. Однако конструкция с ССЫЛКА считается более идиоматичной для языка запросов 1С и встречается в типовых конфигурациях гораздо чаще.

Важный нюанс: как Обработка все-таки может изменять записи регистра

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

Обработка выступает лишь как инструмент для манипуляции данными, а не как их источник. Для изменения записей регистра используется специальный объект НаборЗаписей. Если вам нужно оперативно поправить данные вручную, может пригодиться универсальная обработка для работы с регистрами.

  1. Создание набора записей. В коде обработки мы создаем объект-менеджер нужного нам набора записей. Например, РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей().
  2. Установка отбора. Это ключевой момент! Чтобы система поняла, к какой именно "порции" данных мы хотим получить доступ, мы обязательно должны установить отбор по полям, которые являются измерениями регистра. Если мы работаем с регистром, подчиненным регистратору, то отбор по регистратору является обязательным.
    
    НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    // Мы привязываем наш набор записей к конкретному существующему документу!
    НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
    
  3. Чтение и модификация. После установки отбора мы можем прочитать существующие записи (НаборЗаписей.Прочитать()), очистить их, добавить новые программно созданные записи (Движение = НаборЗаписей.Добавить()) и заполнить их поля.
  4. Запись набора. После всех манипуляций мы вызываем метод НаборЗаписей.Записать(). В этот момент все наши изменения сохраняются в базе данных.

Что в итоге получается? Обработка прочитала движения, сделанные конкретным документом, изменила их и записала обратно. Но во всех этих измененных или новых записях в поле Регистратор по-прежнему будет стоять ссылка на тот самый документ, который мы указали в отборе. Таким образом, обработка выступила лишь в роли "редактора", но автором (регистратором) записей остался документ.

Надеемся, это подробное объяснение помогло вам разобраться в роли регистраторов и в том, как правильно фильтровать данные в запросах. Запомните простое правило: регистратор — это документ, а для отбора по его типу используйте оператор ССЫЛКА.

← На главную