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

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

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

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

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

Главное отличие регистра сведений от справочника — записи могут быть подчинены регистратору (документу) или быть независимыми, а также вести историю по периодам. Это определяет, какие методы доступны и как строить отбор: по периоду, по регистратору, по измерениям или по всем записям сразу.

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

Как устроен регистр сведений и что влияет на выборку

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

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

Для регистра, подчинённого регистратору, записи создаются и удаляются только документом-регистратором. Извлекать их можно теми же запросами, но фильтр по регистратору позволяет получить движения конкретного документа.

Способ 1. Получить данные запросом

Запрос — основной и самый производительный способ. Он выполняется на сервере СУБД и не тащит лишние записи в память. Минимальный пример для непериодического регистра:

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

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

Пока Результат.Следующий() Цикл

Сообщить(Строка(Результат.Валюта) + " — " + Результат.Курс);

КонецЦикла;

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

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

"ВЫБРАТЬ

| Срез.Валюта,

| Срез.Курс

|ИЗ

| РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК Срез";

Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());

Запрос.УстановитьПараметр("Валюта", НужнаяВалюта);

Отбор в параметрах виртуальной таблицы (в скобках) работает быстрее, чем условие в секции ГДЕ, потому что применяется до соединения таблиц. Ставьте условия на измерения именно там, когда выбираете из виртуальной таблицы.

Способ 2. Программная выборка методом Выбрать()

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

Отбор = Новый Структура("Валюта", НужнаяВалюта);

Выборка = РегистрыСведений.КурсыВалют.Выбрать(НачалоМесяца(ТекущаяДатаСеанса()),

КонецМесяца(ТекущаяДатаСеанса()), Отбор);

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

Сообщить(Строка(Выборка.Период) + ": " + Выборка.Курс);

КонецЦикла;

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

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

Способ 3. Выгрузить данные без программирования

Если задача разовая, код писать не обязательно. В типовых конфигурациях список регистра сведений открывается через «Все функции» → «Регистры сведений». Открывшийся список можно вывести в табличный документ: правый клик по таблице → «Вывести список». Полученный документ сохраняется в Excel или CSV через «Файл → Сохранить как».

Консоль запросов (внешняя обработка) позволяет выполнить произвольный запрос и выгрузить результат в табличный документ или таблицу значений. Это удобно, когда нужен отбор, которого нет в стандартной форме списка.

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

Разовая выгрузка без кода
  1. 1
    Откройте «Все функции» → «Регистры сведений» → нужный регистр
  2. 2
    Настройте отбор и сортировку в форме списка
  3. 3
    Правый клик по списку → «Вывести список» → сформировать табличный документ
  4. 4
    Сохраните: Файл → Сохранить как → формат Excel или CSV
  5. 5
    Проверьте количество строк и корректность отбора

Способ 4. Передать данные наружу: файлы, JSON, COM

Для обмена с внешними системами результат запроса выгружают в файл. Табличный документ сохраняется методом Записать() в форматы MXL, XLSX, CSV. Для интеграций чаще используют JSON: обход результата запроса с записью через ЗаписьJSON даёт структурированный файл, который легко разобрать на стороне приёмника.

Прямой доступ извне возможен через COM-соединение (V83.COMConnector) или через HTTP-сервисы и стандартный OData-интерфейс, если он включён в настройках публикации базы. OData позволяет читать регистры сведений обычными HTTP-запросами вида /odata/standard.odata/InformationRegister_КурсыВалют с фильтрами в строке запроса.

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

Как проверить, что выгружены правильные данные

Сверьте количество записей: выполните запрос с КОЛИЧЕСТВО(*) с теми же отборами и сравните с числом строк в выгрузке. Расхождение означает, что часть данных потерялась при сохранении файла (например, из-за ограничений формата) или отбор применился не так, как ожидалось.

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

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

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

Количество строк в выгрузке
Норма

Совпадает с КОЛИЧЕСТВО(*) по тем же отборам

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

Строк меньше — потеря при сохранении или лишний отбор

Срез последних
Норма

Одна запись на комбинацию измерений, период максимальный

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

Дубли измерений или устаревшие записи

Значения ресурсов
Норма

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

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

Пустые или сдвинутые колонки — ошибка маппинга полей

Типичные ошибки и ограничения

Частая ошибка — забыть про периодичность: запрос к основной таблице вместо среза возвращает всю историю, и в отчёте появляются устаревшие значения. Вторая — отбор в секции ГДЕ вместо параметров виртуальной таблицы: запрос работает, но медленно на больших объёмах.

Третья группа ошибок связана с типами данных. При выгрузке в CSV даты и числа могут сохраниться в региональном формате и потом не распарситься в приёмнике — используйте явное форматирование или XLSX. При передаче через JSON помните, что даты сериализуются в формат ISO, и согласуйте это с принимающей стороной.

Типичные ошибки
01
Запрос к основной таблице вместо СрезПоследних — в выгрузке вся история и дубли измерений
02
Отбор в ГДЕ вместо параметров виртуальной таблицы — медленная работа на больших регистрах
03
Выборка всех записей без отбора — долгое выполнение и переполнение памяти
04
Сохранение в CSV без контроля форматов — даты и числа ломаются при импорте
05
Игнорирование прав доступа при внешнем подключении — ошибка чтения регистра

Какой способ выбрать под задачу

Разовый просмотр и выгрузка в Excel — форма списка и «Вывести список». Аналитика с группировками — универсальный отчёт или СКД. Программная обработка внутри базы — запрос с параметрами. Чтение одной записи по ключу — Получить(). Интеграция с внешней системой — JSON через обработку, HTTP-сервис или OData.

Сравнение вариантов

Запрос с параметрами

Универсально и быстро; требует написания кода или консоли запросов

Форма списка + вывод списка

Без программирования; ограниченные отборы, не подходит для больших объёмов

Менеджер записи / Получить()

Идеально для одной записи по ключу; не для массовой выгрузки

OData / HTTP

Для внешних систем без кода в 1С; требует публикации и настройки прав

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

Итог

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

Для актуальных данных периодического регистра используйте СрезПоследних, отборы ставьте в параметрах виртуальной таблицы, разовую выгрузку делайте через форму списка, интеграцию — через JSON или OData, а результат всегда сверяйте по количеству записей и контрольным строкам.

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

Как получить только актуальные курсы валют, а не всю историю?

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

Почему запрос к регистру сведений выполняется очень долго?

Чаще всего отбор задан в секции ГДЕ вместо параметров виртуальной таблицы, либо отбора нет вовсе и выбираются миллионы записей. Перенесите условия на измерения в скобки виртуальной таблицы и убедитесь, что по ним есть индексы (по умолчанию измерения индексируются).

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

Да, теми же запросами и методами. Дополнительно доступен отбор по полю Регистратор — так можно получить все записи, созданные конкретным документом. Учтите, что программно изменять такие записи напрямую нельзя: они перезаписываются при перепроведении документа.

Как выгрузить регистр сведений в Excel без доступа к конфигуратору?

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

Чем отличается Выбрать() от запроса?

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

Как дать внешней системе доступ к регистру без написания кода в 1С?

Включите публикацию стандартного интерфейса OData на веб-сервере и отметьте регистр в списке объектов, доступных через OData (в конфигураторе или через настройку состава). Внешняя система сможет читать данные HTTP-запросами с фильтрами $filter. Ограничьте права пользователя, под которым идёт доступ, только чтением нужных объектов.