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

Идея дня

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


Процедура ОбновитьНоменклатуруИзСтруктуры(СсылкаНом, Данные) Экспорт
    Если A1sO.Empty(СсылкаНом) Тогда Возврат; КонецЕсли;

    Э = СсылкаНом.ПолучитьОбъект();
    // Нормализация входа (строки/числа/даты)
    Норм = Новый Структура;
    Норм.Вставить("Наименование", A1sS.AsString(Данные.Получить("Наименование")));
    Норм.Вставить("Код",          A1sS.AsString(Данные.Получить("Код")));
    Норм.Вставить("Комментарий",  A1sS.AsString(Данные.Получить("Комментарий")));
    Норм.Вставить("Цена",         A1sO.NumOrZero(Данные.Получить("Цена")));      // День 13
    Норм.Вставить("ДатаИзм",      A1sO.DateOrEmpty(Данные.Получить("ДатаИзм"))); // День 12

    // FromStruct: переносим совпадающие по имени реквизиты
    A1sO.FromStruct(Э, Норм);

    Э.Записать();
КонецПроцедуры
      

Если нужно создать новый объект — сначала СоздатьЭлемент()/СоздатьДокумент(), затем FromStruct, затем Записать().

Маппинг ключей «вход → реквизит»

Когда внешние имена не совпадают с реквизитами объекта — применяем карту переименования до FromStruct.


Функция RemapKeys(Данные, Карта) Экспорт
    // Карта: Соответствие "ВнешнееИмя" → "ИмяРеквизитаОбъекта"
    Рез = Новый Структура;
    Для каждого П Из Данные Цикл
        ИмяОбъект = ?(Карта.СодержитКлюч(П.Ключ), Карта[П.Ключ], П.Ключ);
        Рез.Вставить(ИмяОбъект, П.Значение);
    КонецЦикла;
    Возврат Рез;
КонецФункции

// Использование:
Карта = Новый Соответствие;
Карта.Вставить("Title",  "Наименование");
Карта.Вставить("SKU",    "Код");
Карта.Вставить("Comment","Комментарий");

НормВнеш = RemapKeys(ВходныеДанные, Карта);
A1sO.FromStruct(Элемент, НормВнеш);
      

Правила заполнения: «не перетирать непустое», «пропускать пустые»

Частая необходимость — не затирать уже заполненные поля и/или игнорировать пустые входные значения.


Функция OnlyNotEmpty(Данные) Экспорт
    Рез = Новый Структура;
    Для каждого П Из Данные Цикл
        Если A1sO.NotEmpty(П.Значение) Тогда Рез.Вставить(П.Ключ, П.Значение); КонецЕсли;
    КонецЦикла;
    Возврат Рез;
КонецФункции

Процедура FromStructIfEmpty(Объект, Данные) Экспорт
    // Переносим только если у объекта поле пусто
    Для каждого П Из Данные Цикл
        Имя = П.Ключ; Знач = П.Значение;
        Попытка
            Уже = Объект[Имя];
            Если A1sO.Empty(Уже) И A1sO.NotEmpty(Знач) Тогда
                Объект[Имя] = Знач;
            КонецЕсли;
        Исключение
            // Нет такого реквизита — игнор
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

// Примеры:
A1sO.FromStruct(Элемент, OnlyNotEmpty(Норм)); // не записываем пустые
FromStructIfEmpty(Элемент, Норм);             // непустые — только в пустые поля
      

Заполнение ссылочных реквизитов

Если во входе приходит «код/имя», а реквизит — ссылка, найдём ссылку безопасно.


Функция НайтиГруппуНоменклатуры(Код = "", Имя = "") Экспорт
    Если A1sO.NotEmpty(Код) Тогда
        Возврат Справочники.Номенклатура.НайтиПоКоду(Код);
    ИначеЕсли A1sO.NotEmpty(Имя) Тогда
        Возврат Справочники.Номенклатура.НайтиПоНаименованию(Имя);
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

Процедура УстановитьГруппуЕслиЕсть(Элемент, КодГр, ИмяГр) Экспорт
    Сс = НайтиГруппуНоменклатуры(КодГр, ИмяГр);
    Если A1sO.NotEmpty(Сс) Тогда Элемент.Родитель = Сс; КонецЕсли;
КонецПроцедуры

// Использование:
УстановитьГруппуЕслиЕсть(Элемент, Данные.Получить("ГруппаКод"), Данные.Получить("ГруппаИмя"));
      

Шапка документа из структуры


Процедура ЗаполнитьШапкуРеализации(ДокОбъект, Данные) Экспорт
    // Нормализуем даты/строки
    Норм = Новый Структура;
    Норм.Вставить("Комментарий", A1sS.AsString(Данные.Получить("Комментарий")));
    Норм.Вставить("Дата",        A1sO.DateOrEmpty(Данные.Получить("Дата")));
    Если A1sO.Empty(Норм.Дата) Тогда Норм.Дата = A1sO.Now(); КонецЕсли;

    // Контрагент — ссылочный
    ИмяКт = A1sS.AsString(Данные.Получить("КонтрагентИмя"));
    КодКт = A1sS.AsString(Данные.Получить("КонтрагентКод"));
    Контр = Неопределено;
    Если A1sO.NotEmpty(КодКт) Тогда
        Контр = Справочники.Контрагенты.НайтиПоКоду(КодКт);
    ИначеЕсли A1sO.NotEmpty(ИмяКт) Тогда
        Контр = Справочники.Контрагенты.НайтиПоНаименованию(ИмяКт);
    КонецЕсли;
    Если A1sO.NotEmpty(Контр) Тогда Норм.Вставить("Контрагент", Контр); КонецЕсли;

    A1sO.FromStruct(ДокОбъект, Норм);
КонецПроцедуры
      

Табличная часть: из массива структур

Добавляем строки в ТЧ, нормализуя числа и подтягивая ссылки по коду/имени.


Процедура ЗаполнитьТЧТовары(ДокОбъект, МассивПозиции) Экспорт
    Если A1sO.Empty(МассивПозиции) Тогда Возврат; КонецЕсли;

    Для каждого П Из МассивПозиции Цикл
        СтрТЧ = ДокОбъект.Товары.Добавить();
        // Номенклатура
        Код = A1sS.AsString(П.Получить("Код"));
        Имя = A1sS.AsString(П.Получить("Имя"));
        Ном = Неопределено;
        Если A1sO.NotEmpty(Код) Тогда
            Ном = Справочники.Номенклатура.НайтиПоКоду(Код);
        ИначеЕсли A1sO.NotEmpty(Имя) Тогда
            Ном = Справочники.Номенклатура.НайтиПоНаименованию(Имя);
        КонецЕсли;
        Если A1sO.NotEmpty(Ном) Тогда СтрТЧ.Номенклатура = Ном; КонецЕсли;

        // Количество/Цена
        СтрТЧ.Количество = A1sO.RoundNum(A1sO.NumOrZero(П.Получить("Кол")), 3);
        СтрТЧ.Цена       = A1sO.RoundNum(A1sO.NumOrZero(П.Получить("Цена")), 2);
    КонецЦикла;
КонецПроцедуры
      

Анти-паттерны

Практика (15–30 минут)

  1. Соберите структуру входа для элемента справочника и перенесите значения через A1sO.FromStruct.
  2. Добавьте карту маппинга ключей (Title→Наименование, SKU→Код).
  3. Сделайте вариант «не перетирать непустое» и «пропускать пустые».
  4. Заполните шапку и ТЧ документа из входных структур, включая поиск ссылок по коду/имени.

Чек-лист

Что дальше

День 17: A1sO — Очистка и трансформация структур — компактные приёмы «почистить/переименовать/схлопнуть» данные.