Разработка и Конфигурация · 9 мин
Как получить все записи регистра сведений в 1С
Как получить все записи регистра сведений в 1С: выборка через Выбрать(), запрос, СКД и консоль. Примеры кода, отличия периодических регистров, типичные ошибки.
Регистр сведений в 1С хранит данные в разрезе измерений, и задача «получить все записи» возникает при выгрузке, синхронизации, поиске дублей или анализе содержимого. Способов несколько: программная выборка через метод Выбрать(), запрос на встроенном языке запросов, консоль запросов и СКД. Выбор зависит от объёма данных, необходимости отборов и того, где выполняется код — на клиенте или на сервере.
Прежде чем выбирать метод, важно понять структуру конкретного регистра: периодический он или нет, какие у него измерения и ресурсы, подчинён ли регистратору. От этого зависит, какие поля будут в результате и как правильно построить отбор, чтобы не тащить лишние данные.
Что нужно знать о регистре перед выборкой
Откройте конфигуратор и найдите регистр в ветке «Регистры сведений». Посмотрите режим записи: «Независимый» или «Подчинён регистратору». Для независимого регистра записи создаются напрямую, и получить их можно простой выборкой. Для подчинённого каждая запись привязана к документу-регистратору, и часто имеет смысл выбирать данные вместе с полем «Регистратор».
Второй ключевой параметр — периодичность. Периодический регистр хранит значения с датой (периодом), и у него есть виртуальные таблицы «СрезПервых» и «СрезПоследних». Если вам нужны именно все записи за всё время — обращайтесь к основной таблице. Если нужны актуальные значения на дату — используйте срез последних, это отдельная задача.
Получение всех записей запросом
Запрос — универсальный и предпочтительный способ: он выполняется на сервере, возвращает таблицу и позволяет сразу задать отбор, сортировку и соединения. Минимальный пример для получения всех записей:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| *
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют";
Результат = Запрос.Выполнить().Выгрузить();
Переменная Результат будет содержать таблицу значений со всеми записями регистра. Для периодического регистра в таблице появится поле «Период», для подчинённого — «Регистратор» и «НомерСтроки». Если записей много, добавляйте отбор через ГДЕ и ограничивайте список полей вместо * — это снижает нагрузку на память.
Для обхода без выгрузки в таблицу используйте выборку: Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ... КонецЦикла;. Так безопаснее для больших объёмов, потому что записи обрабатываются по одной.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1000 * ИЗ РегистрСведений.КурсыВалют";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обработка записи
КонецЦикла;Программная выборка через метод Выбрать()
Менеджер регистра сведений предоставляет метод Выбрать(), который возвращает выборку записей без написания текста запроса. Это удобно в серверных процедурах и фоновых заданиях:
Выборка = РегистрыСведений.КурсыВалют.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Период) + " — " + Выборка.Валюта);
КонецЦикла;
В параметрах Выбрать() можно передать отбор (структуру по измерениям) и порядок сортировки. Для периодического регистра доступны также границы периода. Учтите: метод выполняется только на сервере, в толстом клиенте или внешнем соединении — в веб-клиенте и тонком клиенте без контекста сервера он недоступен.
Когда Выбрать() лучше запроса
Метод Выбрать() удобен, когда нужна последовательная обработка записей с возможностью модификации — например, обход с удалением дублей. Запрос выигрывает, когда нужны соединения с другими таблицами, группировки или итоги. Для разового просмотра содержимого проще всего консоль запросов или форма списка.
Способы получения записей
Гибкие отборы, соединения, итоги; работает на сервере. Оптимален для большинства задач.
Простой обход записей, отбор по измерениям. Недоступен на тонком клиенте без вызова сервера.
Интерактивный просмотр без кода: Главное меню → Все функции → Регистры сведений. Не подходит для выгрузки.
Когда результат нужен пользователю в виде отчёта с настройками без программирования.
Просмотр всех записей без программирования
Если нужно просто посмотреть содержимое регистра, откройте режим «1С:Предприятие», перейдите в «Все функции» (Главное меню → Все функции; если пункта нет — включите его в Сервис → Параметры). В дереве найдите «Регистры сведений», выберите нужный — откроется форма списка со всеми записями.
Для анализа и выгрузки удобна консоль запросов (внешняя обработка) или стандартный отчёт «Универсальный отчёт» в типовых конфигурациях: выберите регистр сведений как источник, снимите отборы — получите полный список записей с возможностью выгрузить в табличный документ или Excel.
- 1Откройте Главное меню → Все функции (при необходимости включите пункт в Сервис → Параметры).
- 2В дереве раскройте «Регистры сведений» и выберите нужный регистр.
- 3Снимите установленные отборы в форме списка, чтобы видеть все записи.
- 4Для выгрузки используйте «Ещё → Вывести список» и сохраните табличный документ.
Производительность и ограничения при больших объёмах
Выгрузка «всех записей» регистра с сотнями тысяч строк может занять заметное время и память, особенно при Выгрузить() в таблицу значений. Признак проблемы — долгое выполнение и рост потребления памяти сервером. В таких случаях обрабатывайте данные порциями: выборкой с обходом в цикле, пакетным запросом с ограничением «ПЕРВЫЕ N» и смещением по ключу или фоновым заданием.
Не выполняйте тяжёлые выборки в обработчиках формы на клиенте — выносите их в серверные процедуры. Если выборка нужна для разового анализа, делайте её в копии базы или в тестовом контуре, чтобы не блокировать работу пользователей.
Проверка результата и типичные ошибки
После выполнения выборки сверьте количество полученных записей с количеством строк в форме списка регистра — они должны совпадать при отсутствии отборов. Если записей меньше — проверьте, нет ли скрытого отбора в запросе (условие ГДЕ), не обращаетесь ли вы к виртуальной таблице вместо основной и не ограничены ли права текущего пользователя (RLS может незаметно «обрезать» результат).
Как проверить результат
Совпадает с числом строк в форме списка регистра
Меньше — проверьте отборы и права RLS
Присутствуют все измерения и ресурсы (и Период для периодического)
Нет поля Период — обратились к срезу вместо основной таблицы
Запрос отрабатывает за секунды
Минуты и рост памяти — нужна порционная обработка
Часто задаваемые вопросы
Как получить записи регистра сведений, подчинённого регистратору?
Так же — запросом к таблице регистра или методом Выбрать(). В результате будет поле «Регистратор». Чтобы получить записи конкретного документа, добавьте отбор: ГДЕ Регистратор = &Ссылка. Для программного чтения удобен набор записей: РегистрыСведений.Имя.СоздатьНаборЗаписей() с отбором по регистратору и методом Прочитать().
Чем отличается выборка из основной таблицы от СрезаПоследних?
Основная таблица возвращает все записи за все периоды. СрезПоследних — виртуальная таблица, которая для каждой комбинации измерений отдаёт одну, самую позднюю запись на указанную дату. Если нужна история изменений — используйте основную таблицу, если актуальные значения — срез.
Можно ли получить все записи без прав администратора?
Да, если у роли пользователя есть право «Чтение» на этот регистр. При включённом RLS (ограничение доступа на уровне записей) вы увидите только разрешённую часть данных — это нормальное поведение, а не ошибка выборки.
Как выгрузить все записи регистра в Excel?
Откройте форму списка регистра через «Все функции», снимите отборы, затем «Ещё → Вывести список» и сохраните табличный документ в формате Excel. Альтернатива — универсальный отчёт или консоль запросов с выгрузкой результата.
Почему запрос возвращает пустой результат, хотя записи есть?
Проверьте три вещи: имя регистра в тексте запроса, отсутствие условий ГДЕ и права доступа. Также убедитесь, что вы обращаетесь к правильной базе — частая ситуация, когда запрос выполняется в тестовой копии, а записи смотрят в рабочей.
Как получить записи порциями, чтобы не грузить сервер?
Используйте «ВЫБРАТЬ ПЕРВЫЕ N» с сортировкой по ключу (например, по Периоду и измерениям) и условием «больше последнего обработанного ключа» в следующей итерации. Либо обходите результат через Выбрать() в цикле — записи не накапливаются в памяти целиком.
Что важно запомнить
Все записи регистра сведений получают запросом «ВЫБРАТЬ ... ИЗ РегистрСведений.Имя» или методом Выбрать() на сервере. Для просмотра без кода используйте «Все функции» → «Регистры сведений». Не путайте основную таблицу со срезом последних, учитывайте права RLS и обрабатывайте большие объёмы порциями.