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

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

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

Основные принципы доступа к метаданным

Для того чтобы система могла динамически «узнать», какие реквизиты есть у выбранного пользователем документа, мы обращаемся к коллекции Метаданные. Это позволяет писать универсальный код, который будет работать независимо от того, какой именно тип документа выбрал пользователь.

Разберем алгоритм получения реквизитов по шагам:

  1. Получаем объект документа из ссылки. Помните, что Ссылка — это лишь адрес, а для чтения данных нам нужен Объект.
  2. Используем цикл Для Каждого для обхода коллекции реквизитов, описанных в конфигурации.
  3. Обращаемся к значению реквизита через имя, полученное из метаданных.

Посмотрим на пример базового кода для обхода всех реквизитов документа:


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

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

Работа со стандартными реквизитами

Важно помнить, что Метаданные.Реквизиты содержат только те поля, которые добавили вы. Стандартные поля, такие как Дата, Номер, Проведен или ПометкаУдаления, живут в отдельной коллекции СтандартныеРеквизиты. Если ваша цель — полное копирование объекта, их обязательно нужно учитывать в процессе обхода.

Как обрабатывать табличные части?

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

  1. Получаем список табличных частей через Метаданные.ТабличныеЧасти.
  2. Для каждой найденной табличной части обращаемся к самому объекту через Объект[ИмяТабличнойЧасти].
  3. Внутри организуем цикл по строкам этой коллекции.

Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
    СтрокиТЧ = ДокументОбъект[ТЧ.Имя];
    Для Каждого СтрокаТЧ Из СтрокиТЧ Цикл
        // Перебираем колонки (реквизиты) текущей строки
        Для Каждого Колонка Из ТЧ.Реквизиты Цикл
            ЗначениеКолонки = СтрокаТЧ[Колонка.Имя];
            // Обработка данных
        КонецЦикла;
    КонецЦикла;
КонецЦикла;

Рекомендации по реализации собственного формата

Если вы решили отказаться от стандартного XML в пользу собственного текстового формата с разделителями, будьте готовы столкнуться с проблемой типов данных:

В качестве более надежного альтернативного подхода рекомендуем рассмотреть использование СериализатораXDTO. Даже если вы не хотите использовать чистый XML, понимание того, как платформа упаковывает данные в поток, поможет вам создать более надежный и расширяемый механизм экспорта.

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

← На главную