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