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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С:Предприятие часто возникает задача программно перебрать все реквизиты объекта и считать их значения. Если мы получаем имена реквизитов из метаданных, мы сталкиваемся с тем, что имя — это обычная строка. В этой статье мы разберем, как превратить это строковое имя в реальное значение, хранящееся в документе.

Основы динамического обращения к свойствам

В 1С существует мощный механизм, позволяющий обращаться к свойствам объекта (реквизитам) через строковый идентификатор. Это делается с помощью оператора квадратных скобок. Если у нас есть переменная Объект и строковая переменная ИмяРеквизита, мы можем получить значение так:

Значение = Объект[ИмяРеквизита];

Это самый простой и эффективный способ, если мы заранее не знаем, какой именно реквизит нам нужен в данный момент, или если мы перебираем их в цикле.

Пошаговое решение задачи

Давайте рассмотрим, как правильно организовать такой цикл. Предположим, у нас есть ссылка на документ, и мы хотим вывести в лог значения всех реквизитов документа «Авансовый отчет».

  1. Получение объекта. Важно помнить: чтобы работать с «телом» документа, нам нужно получить его экземпляр. Ссылка на документ (тип ДокументСсылка) не дает прямого доступа к реквизитам, кроме стандартных. Используем метод ПолучитьОбъект().
  2. Перебор метаданных. Мы обращаемся к коллекции Метаданные.Документы.АвансовыйОтчет.Реквизиты, чтобы получить список всех полей, определенных в конфигураторе.
  3. Считывание данных. Внутри цикла мы подставляем имя реквизита в квадратные скобки объекта.

Рассмотрим пример кода для реализации этой задачи:


// Предположим, СсылкаНаДокумент — это переменная, содержащая ссылку на документ
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();

// Перебираем все реквизиты, описанные в конфигураторе для данного документа
Для Каждого Реквизит Из Метаданные.Документы.АвансовыйОтчет.Реквизиты Цикл
    ИмяРеквизита = Реквизит.Имя;
    
    // Получаем значение динамически через квадратные скобки
    Значение = ОбъектДокумента[ИмяРеквизита];
    
    // Выводим результат в окно сообщений или лог
    Сообщить("Значение реквизита " + ИмяРеквизита + " равно: " + Значение);
КонецЦикла;

Важные нюансы и ограничения

Работая с таким подходом, необходимо учитывать несколько критических моментов:

Альтернатива: Использование запросов

Если вам нужно получить значения для большого количества документов (например, в отчете), не рекомендуется вызывать ПолучитьОбъект() для каждого из них, так как это сильно нагрузит систему. В таких случаях лучше использовать Запрос:


ВЫБРАТЬ
    АвансовыйОтчет.Дата,
    АвансовыйОтчет.Номер,
    АвансовыйОтчет.СуммаДокумента,
    АвансовыйОтчет.Валюта
ИЗ
    Документ.АвансовыйОтчет КАК АвансовыйОтчет

Использование запросов позволяет выбрать данные намного быстрее и эффективнее, чем поэкземплярная обработка объектов в цикле. Комбинируйте эти подходы в зависимости от того, редактируете ли вы документ или просто анализируете его содержимое.

← На главную