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

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

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

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

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

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

Что нужно знать о регистре перед выборкой

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

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

Получение всех записей запросом

Запрос — универсальный и предпочтительный способ: он выполняется на сервере, возвращает таблицу и позволяет сразу задать отбор, сортировку и соединения. Минимальный пример для получения всех записей:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| *

|ИЗ

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

Результат = Запрос.Выполнить().Выгрузить();

Переменная Результат будет содержать таблицу значений со всеми записями регистра. Для периодического регистра в таблице появится поле «Период», для подчинённого — «Регистратор» и «НомерСтроки». Если записей много, добавляйте отбор через ГДЕ и ограничивайте список полей вместо * — это снижает нагрузку на память.

Для обхода без выгрузки в таблицу используйте выборку: Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ... КонецЦикла;. Так безопаснее для больших объёмов, потому что записи обрабатываются по одной.

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1000 * ИЗ РегистрСведений.КурсыВалют";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	// обработка записи
КонецЦикла;

Программная выборка через метод Выбрать()

Менеджер регистра сведений предоставляет метод Выбрать(), который возвращает выборку записей без написания текста запроса. Это удобно в серверных процедурах и фоновых заданиях:

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

Пока Выборка.Следующий() Цикл

Сообщить(Строка(Выборка.Период) + " — " + Выборка.Валюта);

КонецЦикла;

В параметрах Выбрать() можно передать отбор (структуру по измерениям) и порядок сортировки. Для периодического регистра доступны также границы периода. Учтите: метод выполняется только на сервере, в толстом клиенте или внешнем соединении — в веб-клиенте и тонком клиенте без контекста сервера он недоступен.

Когда Выбрать() лучше запроса

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

Способы получения записей

Запрос (ВЫБРАТЬ ИЗ)

Гибкие отборы, соединения, итоги; работает на сервере. Оптимален для большинства задач.

Метод Выбрать()

Простой обход записей, отбор по измерениям. Недоступен на тонком клиенте без вызова сервера.

Форма списка регистра

Интерактивный просмотр без кода: Главное меню → Все функции → Регистры сведений. Не подходит для выгрузки.

СКД / отчёт

Когда результат нужен пользователю в виде отчёта с настройками без программирования.

Просмотр всех записей без программирования

Если нужно просто посмотреть содержимое регистра, откройте режим «1С:Предприятие», перейдите в «Все функции» (Главное меню → Все функции; если пункта нет — включите его в Сервис → Параметры). В дереве найдите «Регистры сведений», выберите нужный — откроется форма списка со всеми записями.

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

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

Производительность и ограничения при больших объёмах

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

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

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Использование СрезПоследних вместо основной таблицы — получаете одну запись на комбинацию измерений, а не все записи.
02
Вызов Выбрать() на тонком клиенте — ошибка выполнения; переносите код на сервер.
03
Выгрузить() без отбора по огромному регистру — переполнение памяти; обходите выборкой.
04
Игнорирование RLS — результат у разных пользователей отличается, и это принимают за потерю данных.
05
Перебор записей через СоздатьМенеджерЗаписи() и Прочитать() в цикле — в разы медленнее выборки.
Контрольные точки

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

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

Совпадает с числом строк в форме списка регистра

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

Меньше — проверьте отборы и права RLS

Поля результата
Норма

Присутствуют все измерения и ресурсы (и Период для периодического)

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

Нет поля Период — обратились к срезу вместо основной таблицы

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

Запрос отрабатывает за секунды

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

Минуты и рост памяти — нужна порционная обработка

Часто задаваемые вопросы

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

Так же — запросом к таблице регистра или методом Выбрать(). В результате будет поле «Регистратор». Чтобы получить записи конкретного документа, добавьте отбор: ГДЕ Регистратор = &Ссылка. Для программного чтения удобен набор записей: РегистрыСведений.Имя.СоздатьНаборЗаписей() с отбором по регистратору и методом Прочитать().

Чем отличается выборка из основной таблицы от СрезаПоследних?

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

Можно ли получить все записи без прав администратора?

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

Как выгрузить все записи регистра в Excel?

Откройте форму списка регистра через «Все функции», снимите отборы, затем «Ещё → Вывести список» и сохраните табличный документ в формате Excel. Альтернатива — универсальный отчёт или консоль запросов с выгрузкой результата.

Почему запрос возвращает пустой результат, хотя записи есть?

Проверьте три вещи: имя регистра в тексте запроса, отсутствие условий ГДЕ и права доступа. Также убедитесь, что вы обращаетесь к правильной базе — частая ситуация, когда запрос выполняется в тестовой копии, а записи смотрят в рабочей.

Как получить записи порциями, чтобы не грузить сервер?

Используйте «ВЫБРАТЬ ПЕРВЫЕ N» с сортировкой по ключу (например, по Периоду и измерениям) и условием «больше последнего обработанного ключа» в следующей итерации. Либо обходите результат через Выбрать() в цикле — записи не накапливаются в памяти целиком.

Итог

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

Все записи регистра сведений получают запросом «ВЫБРАТЬ ... ИЗ РегистрСведений.Имя» или методом Выбрать() на сервере. Для просмотра без кода используйте «Все функции» → «Регистры сведений». Не путайте основную таблицу со срезом последних, учитывайте права RLS и обрабатывайте большие объёмы порциями.