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