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