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

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

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

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

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

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

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

Просмотр реквизитов в конфигураторе

Самый быстрый способ узнать, какие реквизиты есть у регистра, — открыть конфигуратор, найти в дереве объектов ветку «Регистры накопления» и раскрыть нужный регистр. Внутри него отображаются подветки «Измерения», «Ресурсы» и «Реквизиты». Двойной клик по элементу открывает палитру свойств с типом, длиной, обязательностью заполнения и другими параметрами.

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

Получение реквизитов программно через метаданные

Для универсальных обработок состав реквизитов получают через объект «Метаданные». Коллекция реквизитов конкретного регистра доступна так:

РегистрМД = Метаданные.РегистрыНакопления["ТоварыНаСкладах"];

Для Каждого Реквизит Из РегистрМД.Реквизиты Цикл

Сообщить(Реквизит.Имя + " — " + Строка(Реквизит.Тип));

КонецЦикла;

У объекта описания реквизита доступны свойства: Имя, Синоним, Тип (объект «ОписаниеТипов»), Комментарий. Аналогично обходятся коллекции Измерения и Ресурсы. Если имя регистра заранее неизвестно, можно перебрать всю коллекцию Метаданные.РегистрыНакопления и отобрать регистры по условию.

Типичный сценарий — построение динамического запроса или таблицы выгрузки, где колонки формируются по метаданным. В этом случае сначала собирают имена измерений, ресурсов и реквизитов в массив, а затем подставляют их в текст запроса или в колонки таблицы значений.

bsl
РегистрМД = Метаданные.РегистрыНакопления["ТоварыНаСкладах"];
Для Каждого Реквизит Из РегистрМД.Реквизиты Цикл
    Сообщить(Реквизит.Имя + " | " + Реквизит.Синоним);
КонецЦикла;

Чтение значений реквизитов из движений запросом

Реквизиты хранятся в физической таблице регистра накопления и доступны в запросе наравне с измерениями. Запрос к таблице движений выглядит так:

ВЫБРАТЬ

Движения.Период,

Движения.Регистратор,

Движения.Номенклатура,

Движения.Количество,

Движения.НомерЗаказа КАК НомерЗаказа

ИЗ

РегистрНакопления.ТоварыНаСкладах КАК Движения

ГДЕ

Движения.Регистратор = &Документ

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

Просмотр реквизитов в режиме предприятия без программирования

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

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

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

Получение реквизитов из набора записей в коде

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

НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);

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

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

НомерЗаказа = Запись.НомерЗаказа; // чтение реквизита

КонецЦикла;

При проведении документа движения обычно формируются через коллекцию Движения объекта документа: Движения.ТоварыНаСкладах. Каждая добавленная строка движения позволяет присвоить значение реквизиту так же, как измерению. Если реквизит не заполнить, он останется пустым — платформа не проверяет обязательность реквизитов автоматически, если это не настроено отдельно.

Сравнение способов и типичные ошибки

СпособЧто даётКогда подходитОграничение
КонфигураторСтруктура, типы, свойстваИзучение конфигурацииНужен доступ разработчика
Метаданные в кодеСостав реквизитов программноУниверсальные обработкиТолько описание, без значений
Запрос к таблицеЗначения реквизитов в движенияхОтчёты, выборкиНет реквизитов в таблице «Остатки»
Набор записейЧтение и запись значенийПроведение, обменыТребует осторожности с отбором
Режим предприятияПросмотр значений без кодаАнализ конкретного документаЗависит от прав и интерфейса
Типичные ошибки
01
Выборка реквизита из виртуальной таблицы «Остатки» — платформа сообщает, что поле не найдено; используйте физическую таблицу
02
Чтение набора записей без установки отбора по регистратору — в память загружается вся таблица регистра, что приводит к зависанию на больших базах
03
Хранение аналитики в реквизите вместо измерения — по такому полю невозможно получить остатки и построить эффективные отчёты
04
Обращение к реквизиту по старому имени после переименования в конфигурации — в запросах строкой такая ошибка проявляется только в момент выполнения

Отдельно предупредим о записи наборов вручную. Метод Записать() набора записей с установленным отбором по регистратору полностью замещает существующие движения документа. Если перед изменением не прочитать набор или не сделать резервную копию базы при массовой обработке, движения можно потерять без возможности восстановления, кроме перепроведения документов.

Итог

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

Структуру реквизитов смотрят в конфигураторе или через Метаданные.РегистрыНакопления[Имя].Реквизиты, значения — запросом к физической таблице или через набор записей. В таблице «Остатки» реквизитов нет, а ручная запись наборов требует обязательного отбора по регистратору.

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

Чем реквизит регистра накопления отличается от измерения?

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

Почему в запросе к таблице «Остатки» не виден мой реквизит?

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

Как получить список реквизитов всех регистров накопления сразу?

Переберите коллекцию Метаданные.РегистрыНакопления в цикле, а внутри — коллекцию Реквизиты каждого регистра. Результат удобно собрать в таблицу значений с колонками «Регистр», «ИмяРеквизита», «Тип» для дальнейшего анализа или выгрузки.

Можно ли добавить реквизит в регистр без снятия конфигурации с поддержки?

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

Как узнать, какие документы записывают движения в регистр?

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

Безопасно ли изменять реквизиты движений напрямую через набор записей?

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