A1sCode библиотека 1С

Идея дня

Базовое использование

Если у вас в сборке есть 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 минут)

  1. Сделайте экспорт шапки документа в структуру через A1sO.ToStruct (только нужные поля, список через СтрРазделить).
  2. Добавьте нормализацию типов (AsString/NumOrZero/DateOrEmpty).
  3. Примените фильтр пустых значений и переименование ключей под внешний контракт.
  4. Добавьте «глубокое» поле: Контрагент.Наименование в отдельный ключ.

Чек-лист

Что дальше

День 16: A1sO — Структура в объект (FromStruct) — обратная операция с правилами безопасности.