Идея дня
- ToStruct — превращаем объект 1С в Структуру с выбранными полями.
- Удобно для: сериализации (см. День 22/23: JSON/XML), логирования
(
A1sLog), подготовки данных для форм/таблиц. - Комбинируется с
A1sO.Empty/NotEmpty,A1sO.NumOrZero,A1sO.DateOrEmpty(Дни 10–13).
Базовое использование
Если у вас в сборке есть A1sO.ToStruct, используйте её для короткого экспорта.
Ниже — примеры вызова и эталонные паттерны.
Элемент справочника → Структура (минимальный набор)
Эл = Справочники.Номенклатура.НайтиПоНаименованию("Кабель ПВС");
Если A1sO.NotEmpty(Эл) Тогда
Поля = СтрРазделить("Ссылка,Наименование,Код", ",");
Данные = A1sO.ToStruct(Эл, Поля);
A1sLog.Info("Day15", "Элемент:", Данные);
КонецЕсли;
Документ → Структура (шапка)
Док = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000123", '2025-01-15');
Если A1sO.NotEmpty(Док) Тогда
ПоляШапки = СтрРазделить("Ссылка,Дата,Номер,Контрагент,Комментарий", ",");
Шапка = A1sO.ToStruct(Док, ПоляШапки);
A1sLog.Info("Day15", "Док шапка:", Шапка);
КонецЕсли;
Нормализация значений на выходе
Часто нужно «подчистить» типы под сериализацию/отчёт: строки, числа, даты.
Функция ToStructNormalized(Объект, Поля) Экспорт
// Поля — Массив строк с именами реквизитов объекта
Исх = A1sO.ToStruct(Объект, Поля);
Рез = Новый Структура;
Для каждого П Из Исх Цикл
Имя = П.Ключ; Знач = П.Значение;
// Примеры нормализации
Если ТипЗнч(Знач) = Тип("Строка") Тогда
Знач = A1sS.AsString(Знач);
ИначеЕсли ТипЗнч(Знач) = Тип("Число") Тогда
Знач = A1sO.RoundNum(A1sO.NumOrZero(Знач), 2);
ИначеЕсли ТипЗнч(Знач) = Тип("Дата") Тогда
Знач = A1sO.DateOrEmpty(Знач);
КонецЕсли;
Рез.Вставить(Имя, Знач);
КонецЦикла;
Возврат Рез;
КонецФункции
Такую обёртку удобно применять перед сериализацией в JSON (см. День 22).
Пропустить пустые / переименовать ключи
Чистый экспорт: убираем пустые значения и даём «человеческие» ключи для внешних интеграций.
Фильтрация пустых
Функция StructOnlyNotEmpty(СтрВход) Экспорт
СтрВыход = Новый Структура;
Для каждого П Из СтрВход Цикл
Если A1sO.NotEmpty(П.Значение) Тогда
СтрВыход.Вставить(П.Ключ, П.Значение);
КонецЕсли;
КонецЦикла;
Возврат СтрВыход;
КонецФункции
Переименование ключей (map)
Функция StructRemapKeys(СтрВход, Карта) Экспорт
// Карта: Соответствие "ВнутреннееИмя" → "ВнешнийКлюч"
Рез = Новый Структура;
Для каждого П Из СтрВход Цикл
Внешн = ?(Карта.СодержитКлюч(П.Ключ), Карта[П.Ключ], П.Ключ);
Рез.Вставить(Внешн, П.Значение);
КонецЦикла;
Возврат Рез;
КонецФункции
// Использование:
Поля = СтрРазделить("Ссылка,Дата,Номер,Контрагент", ",");
Шапка = A1sO.ToStruct(Док, Поля);
Карта = Новый Соответствие;
Карта.Вставить("Ссылка", "id");
Карта.Вставить("Дата", "date");
Карта.Вставить("Номер", "number");
Карта.Вставить("Контрагент", "partner");
К Экспорту = StructRemapKeys(StructOnlyNotEmpty(Шапка), Карта);
Вытягивание «глубоких» значений
Иногда нужно не ссылка целиком, а, например, Контрагент.Наименование. Используйте безопасные геттеры.
Функция SafeGet(Объект, ИмяСвойства) Экспорт
Попытка
Возврат Объект[ИмяСвойства];
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
Функция ToStructWithDeep(Док) Экспорт
Поля = СтрРазделить("Ссылка,Дата,Номер,Контрагент", ",");
Стр = A1sO.ToStruct(Док, Поля);
Стр.Вставить("КонтрагентИмя", A1sS.AsString(SafeGet(Стр.Получить("Контрагент"), "Наименование")));
Возврат StructOnlyNotEmpty(Стр);
КонецФункции
Подготовка к JSON (предпросмотр)
Собираем чистую структуру и сериализуем (подробнее — День 22).
Поля = СтрРазделить("Ссылка,Дата,Номер,Контрагент,Комментарий", ",");
Стр = ToStructNormalized(Док, Поля);
Стр = StructOnlyNotEmpty(Стр);
Карта = Новый Соответствие;
Карта.Вставить("Ссылка", "id");
Карта.Вставить("Дата", "date");
Карта.Вставить("Номер", "number");
Карта.Вставить("Комментарий", "comment");
Экспорт = StructRemapKeys(Стр, Карта);
// День 22: A1sJ.ToJSON(Экспорт)
Практика (15–30 минут)
- Сделайте экспорт шапки документа в структуру через
A1sO.ToStruct(только нужные поля, список черезСтрРазделить). - Добавьте нормализацию типов (
AsString/NumOrZero/DateOrEmpty). - Примените фильтр пустых значений и переименование ключей под внешний контракт.
- Добавьте «глубокое» поле: Контрагент.Наименование в отдельный ключ.
Чек-лист
- □ Экспортирую ровно нужные реквизиты, без «всего подряд».
- □ Нормализую типы и отфильтровываю пустые значения.
- □ При необходимости переименовываю ключи под внешний интерфейс.
- □ Осторожно вытаскиваю «глубокие» значения (через безопасные геттеры).
Что дальше
День 16: A1sO — Структура в объект (FromStruct) — обратная операция с правилами безопасности.