Как найти движения конкретного документа: отбор по регистратору в списке, отчёте, запросе и коде
Содержание
Установить отбор по регистратору в 1С можно четырьмя способами. Пользователю быстрее всего открыть список регистра и задать отбор по полю Регистратор в настройках списка. В отчёте на СКД добавляют поле Регистратор на вкладку отборов. В запросе пишут условие ГДЕ Регистратор = &Документ к физической таблице регистра. В коде вызывают НаборЗаписей.Отбор.Регистратор.Установить(Ссылка).
Механизм общий для платформы 8.3 и одинаково работает в Бухгалтерии, ЗУП, УТ и любой другой конфигурации. Отличаются только имена регистров и документов. Ниже — когда какой способ выбирать и на чём чаще всего спотыкаются.
| Где нужен отбор | Способ | Кому подходит |
|---|---|---|
| Посмотреть движения одного документа | Ссылка на регистр в форме документа или отбор в списке регистра | Бухгалтер, пользователь |
| Отчёт по движениям за период с фильтром по документам | Отбор по полю Регистратор в настройках СКД | Пользователь, аналитик |
| Выборка в обработке или своём отчёте | Условие в тексте запроса | Разработчик |
| Чтение и перезапись движений | Отбор.Регистратор у набора записей | Разработчик |
Что такое регистратор и у каких регистров он есть
Регистратор — это ссылка на документ, который создал запись в регистре. Каждая строка движений хранит, кто её записал: поле Регистратор, а рядом НомерСтроки и Период.
Поле есть не у всех регистров:
- 📦 регистры накопления — всегда подчинены регистратору;
- 📒 регистры бухгалтерии — тоже всегда;
- 📊 регистры расчёта — тоже всегда;
- 📋 регистры сведений — только если в свойствах регистра выбран режим записи «Подчинение регистратору». Независимые регистры сведений (курсы валют, цены, настройки) регистратора не имеют.
Если документ проводит несколько видов документов, поле Регистратор имеет составной тип: «Документ.Реализация», «Документ.Поступление» и так далее. Отсюда главная особенность отбора: сначала выбирают тип документа, потом сам документ.
Регистратор и период — разные вещи. Период записи обычно равен дате документа, но может отличаться: например, при движениях «задним числом» или в регистрах с периодичностью «По позиции регистратора». Отбор по документу всегда делайте по регистратору, а не по дате.
Отбор по регистратору в форме списка регистра
Это способ без программирования. Подходит, когда нужно увидеть, что именно записал документ, или найти все движения нескольких документов.
Самый короткий путь — из формы документа
В интерфейсе «Такси» у проведённого документа есть панель навигации со ссылками на регистры, в которые он сделал движения. Ссылка открывает список регистра, где отбор по регистратору уже установлен на текущий документ.
Если ссылок не видно, раскройте меню Ещё формы документа и проверьте настройку панели навигации: регистры могут быть просто скрыты. В Бухгалтерии 3.0 для проводок есть отдельная кнопка с подписью «ДтКт» — она показывает проводки и движения по остальным регистрам сразу.
Отбор вручную в списке регистра
Когда нужен отбор не по одному документу, а, например, по всем поступлениям за месяц:
- Включите полный список объектов:
Главное меню → Сервис → Параметры → флажок «Отображать команду «Все функции»». - Откройте
Главное меню → Все функции → Регистры накопления(илиРегистры сведений,Регистры бухгалтерии) и нужный регистр. - В списке откройте меню
Ещёи выберите настройку списка. - На вкладке Отбор добавьте поле
Регистратор. - Выберите вид сравнения:
Равно— один документ;В списке— несколько конкретных документов;Заполнено— все строки с регистратором (полезно для проверки битых ссылок).
- В поле значения нажмите кнопку выбора. Появится окно «Выбор типа данных» — укажите вид документа, затем сам документ.
- Нажмите Завершить редактирование.
Тот же отбор можно задать через Ещё → Расширенный поиск (Ctrl+F): в поле «Где искать» выберите Регистратор, в поле «Что искать» — документ.
Команда «Все функции» показывает служебные объекты. Смотреть движения так безопасно, а вот редактировать записи регистров руками в рабочей базе нельзя: проведение документа их перезапишет, а итоги до перепроведения будут расходиться с документами.
Отбор по регистратору в отчёте на СКД
Большинство отчётов типовых конфигураций построено на системе компоновки данных. Если в наборе данных отчёта есть поле Регистратор, отбор по нему ставится через обычные настройки.
Как настроить пользователю
- Откройте отчёт и нажмите Настройки.
- Переключитесь в расширенный вид настроек, если доступен только простой.
- На вкладке Отборы добавьте поле
Регистратор. В некоторых типовых отчётах оно называется «Документ» или «Документ движения» — ищите по слову в окне выбора поля. - Укажите вид сравнения и значение. Как и в списке, сначала выбирается тип документа.
- Сформируйте отчёт.
Если поля Регистратор в списке нет — значит, отчёт берёт данные из виртуальных таблиц остатков или оборотов с группировкой по периоду. Там движения уже свёрнуты, и документа в данных нет. Такой отчёт отбор по регистратору не поддерживает.
Как добавить поле в свой отчёт
Разработчику важно правильно выбрать источник данных в запросе набора:
- физическая таблица регистра (
РегистрНакопления.ТоварыНаСкладах) — полеРегистраторесть всегда; - виртуальная таблица
Оборотыс периодичностьюРегистраторилиЗапись— поле появляется; - виртуальная таблица
Остатки— регистратора нет и быть не может, это срез на момент времени.
Если в СКД нужен обязательный параметр «Документ», пропишите условие в запросе ГДЕ Движения.Регистратор = &Документ и сделайте параметр видимым в пользовательских настройках. Если отбор необязательный, лучше просто оставить поле доступным для отбора: компоновщик сам добавит условие, когда пользователь его задаст.
Как отобрать по регистратору в запросе
Имена регистров в примерах условные — подставьте свои из дерева конфигурации.
Движения одного документа
ВЫБРАТЬ
Движения.Период,
Движения.Регистратор,
Движения.НомерСтроки,
Движения.ВидДвижения,
Движения.Номенклатура,
Движения.Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК Движения
ГДЕ
Движения.Регистратор = &Документ
УПОРЯДОЧИТЬ ПО
Движения.НомерСтроки
Поле ВидДвижения (приход или расход) есть только у регистров накопления остатков. Для регистра оборотов уберите его из выборки.
Несколько документов
ГДЕ
Движения.Регистратор В (&СписокДокументов)
В параметр передайте массив или список значений ссылок.
Все документы одного вида
Чтобы взять движения только от реализаций, сравнивайте тип через оператор ССЫЛКА:
ГДЕ
Движения.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
И Движения.Период МЕЖДУ &НачалоПериода И &КонецПериода
ССЫЛКА проверяет только тип ссылки и не соединяется с таблицей документа. Это быстро.
Обороты в разрезе документов
ВЫБРАТЬ
Обороты.Регистратор,
Обороты.Номенклатура,
Обороты.КоличествоОборот
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК Обороты
ГДЕ
Обороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
Условие на регистратор здесь стоит в ГДЕ, а не в параметрах виртуальной таблицы. В параметр «Условие» виртуальных таблиц можно передавать только условия по измерениям и реквизитам регистра, а регистратор к ним не относится.
Отбор по регистратору программно: набор записей и динамический список
Прочитать движения документа
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Сообщить(Строка(Запись.Номенклатура) + ": " + Формат(Запись.Количество, "ЧГ=0"));
КонецЦикла;
Внутри модуля самого документа набор уже создан: коллекция Движения.ТоварыНаСкладах заранее отобрана по текущему документу. Достаточно вызвать Движения.ТоварыНаСкладах.Прочитать().
Набор записей с отбором по регистратору при записи полностью заменяет движения этого документа в регистре. Если вы прочитали набор, удалили из него строку и вызвали Записать(), строка исчезнет из базы. Пустой набор, записанный с отбором, стирает все движения документа в этом регистре. Пробуйте такой код только на копии базы.
Открыть список регистра с отбором
Стандартная форма списка принимает параметр Отбор:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Регистратор", ДокументСсылка));
ОткрытьФорму("РегистрНакопления.ТоварыНаСкладах.ФормаСписка", ПараметрыФормы);
Отбор, переданный так, пользователь видит в форме и не может снять — это удобно для команд «Показать движения».
Отбор в динамическом списке своей формы
Если форма собственная и в ней есть динамический список по регистру, отбор добавляют через компоновщик:
&НаСервере
Процедура УстановитьОтборПоРегистратору(ДокументСсылка)
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Регистратор");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ДокументСсылка;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
В конфигурациях на БСП то же самое делает одна строка: ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Регистратор", ДокументСсылка). Процедура сама найдёт уже существующий элемент и не создаст дубль при повторном вызове.
Регистры накопления, сведений и бухгалтерии: в чём разница при отборе
| Вид регистра | Есть ли Регистратор | Где брать для отбора | Особенности |
|---|---|---|---|
| Накопления (остатки) | Да | Физическая таблица, Обороты, ОстаткиИОбороты с периодичностью Регистратор | В Остатки поля нет |
| Накопления (обороты) | Да | Физическая таблица, Обороты | Нет поля ВидДвижения |
| Сведений, подчинённый регистратору | Да | Физическая таблица | СрезПоследних и СрезПервых регистратор не возвращают |
| Сведений, независимый | Нет | — | Отбор по документу невозможен |
| Бухгалтерии | Да | Физическая таблица, ДвиженияССубконто | Проводка хранит счета Дт и Кт в одной строке |
| Расчёта | Да | Физическая таблица | Связан с документом-начислением |
Регистр бухгалтерии
В Бухгалтерии 3.0 проводки хранятся в регистре «Хозрасчетный». Для запроса удобна виртуальная таблица ДвиженияССубконто: она сразу отдаёт субконто по дебету и кредиту. Отбор по регистратору ставят в ГДЕ:
ВЫБРАТЬ
Проводки.Регистратор,
Проводки.СчетДт,
Проводки.СчетКт,
Проводки.Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&НачалоПериода, &КонецПериода, , , ) КАК Проводки
ГДЕ
Проводки.Регистратор = &Документ
Пользователю проще: проводки одного документа открываются кнопкой «ДтКт» в его форме, а детализация по документам за период — в стандартном отчёте «Карточка счёта».
Ошибки при отборе по регистратору
Остатки, СрезПоследних или к независимому регистру сведений. Переключитесь на физическую таблицу регистра или на Обороты с периодичностью Регистратор. Для независимого регистра сведений отбор по документу невозможен в принципе.Движения.Регистратор.Дата ЕСТЬ NULL и разберитесь с ними через тестирование и исправление базы на копии.Как ускорить отбор по регистратору
Физическая таблица регистра в базе индексируется по регистратору: так платформа быстро находит движения документа при перепроведении. Поэтому условие Регистратор = &Документ к физической таблице само по себе работает быстро даже на больших регистрах. Тормоза возникают из-за того, что идёт рядом.
- 🐢 Разыменование составного регистратора. Запись
Движения.Регистратор.Контрагентзаставляет платформу соединить регистр со всеми таблицами документов, которые могут быть регистраторами. Если их 40, будет 40 соединений. Решение — привести тип явно:ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.РеализацияТоваровУслуг).Контрагент. - 🐢 Длинный список в
В (&СписокДокументов). Тысячи ссылок в параметре раздувают текст запроса для СУБД. Положите документы во временную таблицу с индексом и соединяйтесь с ней. - 🐢 Отбор по полю документа вместо регистратора. Условие
Движения.Регистратор.Дата МЕЖДУ …медленнее, чемДвижения.Период МЕЖДУ …: период хранится в самом регистре. - 🐢
Оборотыс периодичностьюРегистраторза большой период. Такая таблица читает движения, а не итоги. Сузьте период и задайте условия по измерениям в параметрах виртуальной таблицы — они отработают до группировки. - 🐢 Проверка типа через разыменование.
ТИПЗНАЧЕНИЯ(Движения.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)работает, ноССЫЛКАчитается проще и тоже не обращается к таблице документа.
Пример с временной таблицей:
ВЫБРАТЬ
Документы.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Документы
ИЗ
Документ.РеализацияТоваровУслуг КАК Документы
ГДЕ
Документы.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И Документы.Проведен
ИНДЕКСИРОВАТЬ ПО
Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Движения.Регистратор,
Движения.Номенклатура,
Движения.Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК Движения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Документы КАК ВТ
ПО Движения.Регистратор = ВТ.Ссылка
Частые вопросы
Можно ли поставить отбор по регистратору в оборотно-сальдовой ведомости?
Как узнать, какие виды документов вообще пишут в регистр?
ВЫБРАТЬ РАЗЛИЧНЫЕ ТИПЗНАЧЕНИЯ(Регистратор) ИЗ <физическая таблица регистра>.Почему в независимом регистре сведений нельзя отобрать по документу?
Регистратор в них нет. Если документ всё же пишет туда данные, связь с ним можно хранить только в отдельном реквизите регистра.