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