Как найти движения конкретного документа: отбор по регистратору в списке, отчёте, запросе и коде

· 10 мин

Содержание

Установить отбор по регистратору в 1С можно четырьмя способами. Пользователю быстрее всего открыть список регистра и задать отбор по полю Регистратор в настройках списка. В отчёте на СКД добавляют поле Регистратор на вкладку отборов. В запросе пишут условие ГДЕ Регистратор = &Документ к физической таблице регистра. В коде вызывают НаборЗаписей.Отбор.Регистратор.Установить(Ссылка).

Механизм общий для платформы 8.3 и одинаково работает в Бухгалтерии, ЗУП, УТ и любой другой конфигурации. Отличаются только имена регистров и документов. Ниже — когда какой способ выбирать и на чём чаще всего спотыкаются.

Где нужен отборСпособКому подходит
Посмотреть движения одного документаСсылка на регистр в форме документа или отбор в списке регистраБухгалтер, пользователь
Отчёт по движениям за период с фильтром по документамОтбор по полю Регистратор в настройках СКДПользователь, аналитик
Выборка в обработке или своём отчётеУсловие в тексте запросаРазработчик
Чтение и перезапись движенийОтбор.Регистратор у набора записейРазработчик

Что такое регистратор и у каких регистров он есть

Регистратор — это ссылка на документ, который создал запись в регистре. Каждая строка движений хранит, кто её записал: поле Регистратор, а рядом НомерСтроки и Период.

Поле есть не у всех регистров:

  • 📦 регистры накопления — всегда подчинены регистратору;
  • 📒 регистры бухгалтерии — тоже всегда;
  • 📊 регистры расчёта — тоже всегда;
  • 📋 регистры сведений — только если в свойствах регистра выбран режим записи «Подчинение регистратору». Независимые регистры сведений (курсы валют, цены, настройки) регистратора не имеют.

Если документ проводит несколько видов документов, поле Регистратор имеет составной тип: «Документ.Реализация», «Документ.Поступление» и так далее. Отсюда главная особенность отбора: сначала выбирают тип документа, потом сам документ.

Регистратор и период — разные вещи. Период записи обычно равен дате документа, но может отличаться: например, при движениях «задним числом» или в регистрах с периодичностью «По позиции регистратора». Отбор по документу всегда делайте по регистратору, а не по дате.

Отбор по регистратору в форме списка регистра

Это способ без программирования. Подходит, когда нужно увидеть, что именно записал документ, или найти все движения нескольких документов.

Самый короткий путь — из формы документа

В интерфейсе «Такси» у проведённого документа есть панель навигации со ссылками на регистры, в которые он сделал движения. Ссылка открывает список регистра, где отбор по регистратору уже установлен на текущий документ.

Если ссылок не видно, раскройте меню Ещё формы документа и проверьте настройку панели навигации: регистры могут быть просто скрыты. В Бухгалтерии 3.0 для проводок есть отдельная кнопка с подписью «ДтКт» — она показывает проводки и движения по остальным регистрам сразу.

Отбор вручную в списке регистра

Когда нужен отбор не по одному документу, а, например, по всем поступлениям за месяц:

  1. Включите полный список объектов: Главное меню → Сервис → Параметры → флажок «Отображать команду «Все функции»».
  2. Откройте Главное меню → Все функции → Регистры накопления (или Регистры сведений, Регистры бухгалтерии) и нужный регистр.
  3. В списке откройте меню Ещё и выберите настройку списка.
  4. На вкладке Отбор добавьте поле Регистратор.
  5. Выберите вид сравнения:
    • Равно — один документ;
    • В списке — несколько конкретных документов;
    • Заполнено — все строки с регистратором (полезно для проверки битых ссылок).
  6. В поле значения нажмите кнопку выбора. Появится окно «Выбор типа данных» — укажите вид документа, затем сам документ.
  7. Нажмите Завершить редактирование.

Тот же отбор можно задать через Ещё → Расширенный поиск (Ctrl+F): в поле «Где искать» выберите Регистратор, в поле «Что искать» — документ.

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

Отбор по регистратору в отчёте на СКД

Большинство отчётов типовых конфигураций построено на системе компоновки данных. Если в наборе данных отчёта есть поле Регистратор, отбор по нему ставится через обычные настройки.

Как настроить пользователю

  1. Откройте отчёт и нажмите Настройки.
  2. Переключитесь в расширенный вид настроек, если доступен только простой.
  3. На вкладке Отборы добавьте поле Регистратор. В некоторых типовых отчётах оно называется «Документ» или «Документ движения» — ищите по слову в окне выбора поля.
  4. Укажите вид сравнения и значение. Как и в списке, сначала выбирается тип документа.
  5. Сформируйте отчёт.

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

Как добавить поле в свой отчёт

Разработчику важно правильно выбрать источник данных в запросе набора:

  • физическая таблица регистра (РегистрНакопления.ТоварыНаСкладах) — поле Регистратор есть всегда;
  • виртуальная таблица Обороты с периодичностью Регистратор или Запись — поле появляется;
  • виртуальная таблица Остатки — регистратора нет и быть не может, это срез на момент времени.

Если в СКД нужен обязательный параметр «Документ», пропишите условие в запросе ГДЕ Движения.Регистратор = &Документ и сделайте параметр видимым в пользовательских настройках. Если отбор необязательный, лучше просто оставить поле доступным для отбора: компоновщик сам добавит условие, когда пользователь его задаст.

Как отобрать по регистратору в запросе

Имена регистров в примерах условные — подставьте свои из дерева конфигурации.

Движения одного документа

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

Поле ВидДвижения (приход или расход) есть только у регистров накопления остатков. Для регистра оборотов уберите его из выборки.

Несколько документов

ГДЕ
    Движения.Регистратор В (&СписокДокументов)

В параметр передайте массив или список значений ссылок.

Все документы одного вида

Чтобы взять движения только от реализаций, сравнивайте тип через оператор ССЫЛКА:

ГДЕ
    Движения.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
    И Движения.Период МЕЖДУ &НачалоПериода И &КонецПериода

ССЫЛКА проверяет только тип ссылки и не соединяется с таблицей документа. Это быстро.

Обороты в разрезе документов

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

Условие на регистратор здесь стоит в ГДЕ, а не в параметрах виртуальной таблицы. В параметр «Условие» виртуальных таблиц можно передавать только условия по измерениям и реквизитам регистра, а регистратор к ним не относится.

Отбор по регистратору программно: набор записей и динамический список

Прочитать движения документа

НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл
    Сообщить(Строка(Запись.Номенклатура) + ": " + Формат(Запись.Количество, "ЧГ=0"));
КонецЦикла;

Внутри модуля самого документа набор уже создан: коллекция Движения.ТоварыНаСкладах заранее отобрана по текущему документу. Достаточно вызвать Движения.ТоварыНаСкладах.Прочитать().

Набор записей с отбором по регистратору при записи полностью заменяет движения этого документа в регистре. Если вы прочитали набор, удалили из него строку и вызвали Записать(), строка исчезнет из базы. Пустой набор, записанный с отбором, стирает все движения документа в этом регистре. Пробуйте такой код только на копии базы.

Открыть список регистра с отбором

Стандартная форма списка принимает параметр Отбор:

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Регистратор", ДокументСсылка));
ОткрытьФорму("РегистрНакопления.ТоварыНаСкладах.ФормаСписка", ПараметрыФормы);

Отбор, переданный так, пользователь видит в форме и не может снять — это удобно для команд «Показать движения».

Отбор в динамическом списке своей формы

Если форма собственная и в ней есть динамический список по регистру, отбор добавляют через компоновщик:

&НаСервере
Процедура УстановитьОтборПоРегистратору(ДокументСсылка)

    ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Регистратор");
    ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = ДокументСсылка;
    ЭлементОтбора.Использование  = Истина;

КонецПроцедуры

В конфигурациях на БСП то же самое делает одна строка: ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Регистратор", ДокументСсылка). Процедура сама найдёт уже существующий элемент и не создаст дубль при повторном вызове.

Регистры накопления, сведений и бухгалтерии: в чём разница при отборе

Вид регистраЕсть ли РегистраторГде брать для отбораОсобенности
Накопления (остатки)ДаФизическая таблица, Обороты, ОстаткиИОбороты с периодичностью РегистраторВ Остатки поля нет
Накопления (обороты)ДаФизическая таблица, ОборотыНет поля ВидДвижения
Сведений, подчинённый регистраторуДаФизическая таблицаСрезПоследних и СрезПервых регистратор не возвращают
Сведений, независимыйНет—Отбор по документу невозможен
БухгалтерииДаФизическая таблица, ДвиженияССубконтоПроводка хранит счета Дт и Кт в одной строке
РасчётаДаФизическая таблицаСвязан с документом-начислением

Регистр бухгалтерии

В Бухгалтерии 3.0 проводки хранятся в регистре «Хозрасчетный». Для запроса удобна виртуальная таблица ДвиженияССубконто: она сразу отдаёт субконто по дебету и кредиту. Отбор по регистратору ставят в ГДЕ:

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

Пользователю проще: проводки одного документа открываются кнопкой «ДтКт» в его форме, а детализация по документам за период — в стандартном отчёте «Карточка счёта».

Ошибки при отборе по регистратору

Диагностика: выберите симптом

Как ускорить отбор по регистратору

Физическая таблица регистра в базе индексируется по регистратору: так платформа быстро находит движения документа при перепроведении. Поэтому условие Регистратор = &Документ к физической таблице само по себе работает быстро даже на больших регистрах. Тормоза возникают из-за того, что идёт рядом.

  • 🐢 Разыменование составного регистратора. Запись Движения.Регистратор.Контрагент заставляет платформу соединить регистр со всеми таблицами документов, которые могут быть регистраторами. Если их 40, будет 40 соединений. Решение — привести тип явно: ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.РеализацияТоваровУслуг).Контрагент.
  • 🐢 Длинный список в В (&СписокДокументов). Тысячи ссылок в параметре раздувают текст запроса для СУБД. Положите документы во временную таблицу с индексом и соединяйтесь с ней.
  • 🐢 Отбор по полю документа вместо регистратора. Условие Движения.Регистратор.Дата МЕЖДУ … медленнее, чем Движения.Период МЕЖДУ …: период хранится в самом регистре.
  • 🐢 Обороты с периодичностью Регистратор за большой период. Такая таблица читает движения, а не итоги. Сузьте период и задайте условия по измерениям в параметрах виртуальной таблицы — они отработают до группировки.
  • 🐢 Проверка типа через разыменование. ТИПЗНАЧЕНИЯ(Движения.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг) работает, но ССЫЛКА читается проще и тоже не обращается к таблице документа.

Пример с временной таблицей:

ВЫБРАТЬ
    Документы.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    Документ.РеализацияТоваровУслуг КАК Документы
ГДЕ
    Документы.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    И Документы.Проведен
ИНДЕКСИРОВАТЬ ПО
    Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Движения.Регистратор,
    Движения.Номенклатура,
    Движения.Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Движения
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Документы КАК ВТ
        ПО Движения.Регистратор = ВТ.Ссылка

Частые вопросы

Можно ли поставить отбор по регистратору в оборотно-сальдовой ведомости?
Нет. ОСВ строится по итогам регистра бухгалтерии, документы в них свёрнуты. Для расшифровки по документам используйте «Карточку счёта» или откройте из ОСВ расшифровку по нужной строке.
Как узнать, какие виды документов вообще пишут в регистр?
Откройте регистр в Конфигураторе и посмотрите вкладку «Регистраторы». Без Конфигуратора поможет запрос ВЫБРАТЬ РАЗЛИЧНЫЕ ТИПЗНАЧЕНИЯ(Регистратор) ИЗ <физическая таблица регистра>.
Почему в независимом регистре сведений нельзя отобрать по документу?
Записи такого регистра не принадлежат документу, поля Регистратор в них нет. Если документ всё же пишет туда данные, связь с ним можно хранить только в отдельном реквизите регистра.
Отбор по регистратору учитывает права доступа?
Да. Если у пользователя нет права чтения на документ какого-то вида или RLS ограничивает его, движения этих документов в списке и отчётах не появятся, даже при правильном отборе.
Чем отбор по регистратору отличается от отчёта о движениях документа?
Отчёт о движениях показывает все регистры одного документа сразу. Отбор по регистратору работает в одном регистре, зато сразу по множеству документов и с дополнительными условиями.