К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как найти запись регистра сведений в 1С

Как найти запись регистра сведений в 1С: через форму списка, отбор, консоль запросов и код. Примеры на встроенном языке, типичные ошибки и способы проверки результата.

Регистр сведений в 1С хранит данные в виде плоской таблицы записей, и найти нужную запись можно несколькими способами: через интерфейс пользователя, отбор в форме списка, консоль запросов или программно на встроенном языке. Выбор способа зависит от задачи: бухгалтеру обычно достаточно отбора в списке, разработчику — запроса или методов менеджера регистра.

Ключевой момент — понимать структуру регистра. Запись регистра сведений идентифицируется измерениями (а для периодических регистров — ещё и периодом). Если вы ищете запись, не зная значений измерений, поиск превращается в перебор, поэтому сначала уточните, какие поля регистра являются измерениями, а какие — ресурсами и реквизитами.

Ниже разобраны все рабочие способы поиска: от интерактивного отбора до кода с примерами, а также типичные ошибки, из-за которых запись «не находится», хотя она существует в базе.

Как устроен поиск по регистру сведений

Регистр сведений состоит из измерений (ключевые поля, по которым запись уникальна), ресурсов (хранимые значения) и реквизитов (дополнительные атрибуты). Для периодического регистра к ключу добавляется поле «Период», для подчинённого регистратору — поле «Регистратор». Найти конкретную запись означает указать значения всех измерений (и периода, если регистр периодический).

Если регистр независимый и непериодический, запись однозначно определяется комбинацией измерений. Например, в регистре «Курсы валют» (периодический) запись ищется по измерению «Валюта» и дате. Если задать только часть измерений, вы получите не одну запись, а набор — и его придётся обходить в цикле или уточнять отбор.

Поиск записи через форму списка в режиме предприятия

Самый простой способ без программирования — открыть список регистра и применить отбор. В типовых конфигурациях регистры сведений доступны через разделы «НСИ и администрирование», «Операции» или через команду «Все функции» (в режиме толстого клиента или при включённой настройке). Если регистр не выведен в интерфейс, откройте его через «Все функции» → «Регистры сведений».

Порядок действий в форме списка: нажмите «Ещё» → «Настроить список», добавьте условия по нужным полям, выберите вид сравнения («Равно», «В списке», «Содержит» для строк) и примените. Для периодических регистров дополнительно задайте дату или диапазон. Результат — отфильтрованный список записей, которые можно открыть и проверить.

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

Когда стандартного отбора недостаточно

Если нужно искать по условию «нет записи» (например, контрагенты без адреса) или сравнивать с данными других таблиц, форма списка не поможет — потребуется консоль запросов или отчёт на СКД. Также форма списка неудобна при больших объёмах: отбор по неиндексированным полям выполняется долго.

Поиск через консоль запросов и встроенный язык

Консоль запросов (внешняя обработка или встроенная в конфигурации для разработчиков) позволяет выполнить запрос к регистру напрямую. Текст запроса к регистру сведений выглядит как обращение к таблице РегистрСведений.ИмяРегистра с условием ГДЕ по измерениям.

Пример запроса для поиска записи по конкретному значению измерения:

ВЫБРАТЬ

КурсыВалют.Период,

КурсыВалют.Валюта,

КурсыВалют.Курс

ИЗ

РегистрСведений.КурсыВалют КАК КурсыВалют

ГДЕ

КурсыВалют.Валюта = &Валюта

И КурсыВалют.Период = &Период

Для периодических регистров часто нужна не запись на точную дату, а срез последних — тогда используют виртуальную таблицу РегистрСведений.ИмяРегистра.СрезПоследних(&Дата, Условие). Аналогично существует таблица СрезПервых. Условие в параметрах виртуальной таблицы работает быстрее, чем отбор в секции ГДЕ, потому что выполняется на уровне построения среза.

bsl
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Валюта = ВалютаСсылка;
МенеджерЗаписи.Период = ДатаКурса;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
	Сообщить("Курс: " + МенеджерЗаписи.Курс);
Иначе
	Сообщить("Запись не найдена");
КонецЕсли;

Программный поиск: менеджер записи и набор записей

Метод СоздатьМенеджерЗаписи() подходит, когда известны все значения ключа записи. После заполнения измерений и вызова Прочитать() проверяйте результат методом Выбран(): он возвращает Истина, если запись существует. Без этой проверки легко принять пустой менеджер за найденную запись и записать в базу пустышку.

Если известна только часть измерений, используйте набор записей с отбором:

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Валюта.Установить(ВалютаСсылка);

НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

Сообщить(Строка(Запись.Период) + " — " + Запись.Курс);

КонецЦикла;

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

Сравнение способов поиска

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

Подходит пользователю без программирования; не работает со сложными условиями и связями таблиц

Менеджер записи

Подходит, когда известен полный ключ записи; нельзя искать по части измерений

Набор записей с отбором

Подходит для частичного ключа; при большом результате читает много данных в память

Запрос

Универсален и быстр на больших объёмах; требует знания языка запросов

Типичные ошибки при поиске записи

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

Вторая группа ошибок — попытка использовать менеджер записи для регистра, подчинённого регистратору. Такие регистры не поддерживают СоздатьМенеджерЗаписи() для самостоятельной записи: их строки существуют только внутри набора записей документа-регистратора. Искать их нужно запросом или набором записей с отбором по регистратору.

Типичные ошибки
01
Вызов Прочитать() без заполнения всех измерений — читается не та запись или пустая выборка
02
Отсутствие проверки Выбран() — пустой менеджер принимается за найденную запись
03
Поиск по дате без учёта времени — запись на 00:00:00 не совпадает с текущей датой сеанса
04
Использование менеджера записи для подчинённого регистратора — ошибка выполнения
05
Отбор по ресурсу вместо измерения в большом регистре — медленное сканирование таблицы

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

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

На больших таблицах (сотни тысяч записей и более) поиск должен идти по измерениям — они входят в индекс регистра. Отбор по ресурсам и реквизитам приводит к полному сканированию. Если такой поиск нужен регулярно, рассмотрите добавление индексации реквизита в конфигураторе (свойство «Индексировать») — но помните, что лишние индексы замедляют запись.

Контрольные точки

Как проверить результат

Метод Выбран() после Прочитать()
Норма

Возвращает Истина, поля ресурсов заполнены

Тревожный признак

Ложь — записи с таким ключом нет

Количество записей в результате
Норма

Одна запись при полном ключе

Тревожный признак

Несколько записей — ключ задан не полностью

Значения измерений в найденной записи
Норма

Совпадают с параметрами поиска

Тревожный признак

Отличаются — неверно задан отбор

Время выполнения запроса
Норма

Мгновенно или секунды на больших таблицах

Тревожный признак

Минуты — отбор идёт по неиндексированному полю

Ограничения и меры предосторожности

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

Учитывайте права доступа: пользователь без прав на регистр не увидит его ни в интерфейсе, ни в запросе — запрос вернёт пустой результат, что легко спутать с отсутствием данных. Проверяйте права через роль пользователя, если данные «пропали» только у части сотрудников.

Итог

Что важно запомнить

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

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

Как найти последнюю запись периодического регистра сведений?

Используйте виртуальную таблицу СрезПоследних в запросе: РегистрСведений.ИмяРегистра.СрезПоследних(&Дата, Измерение = &Значение). Она вернёт по одной записи на каждую комбинацию измерений с максимальным периодом, не превышающим указанную дату. Программно тот же результат даёт метод ПолучитьПоследнее() менеджера регистра.

Почему Прочитать() выполняется без ошибки, но запись пустая?

Метод Прочитать() не вызывает исключение, если записи нет — он просто оставляет менеджер в незаполненном состоянии. Проверяйте результат методом Выбран(): Истина означает, что запись найдена, Ложь — что записи с таким ключом не существует.

Можно ли найти запись регистра, подчинённого регистратору, через менеджер записи?

Нет. Для подчинённых регистров записи существуют только в составе набора записей документа. Ищите их запросом к таблице регистра с отбором по полю Регистратор или читайте набор записей с установленным отбором по регистратору.

Как найти записи, где ресурс пустой или не заполнен?

В запросе добавьте условие вида ГДЕ Ресурс = &ПустоеЗначение, передав в параметр пустую ссылку, Неопределено или пустую строку в зависимости от типа ресурса. Для дат пустое значение — '00010101'. В форме списка используйте вид сравнения «Не заполнено» в настройке отбора.

Что делать, если отбор в форме списка работает очень долго?

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