Идея дня
- FromStruct(Объект, Данные, Опции?) — безопасно переносит значения из Структуры/Соответствия в реквизиты объекта по именам.
- Поддерживаем маппинг ключей, фильтрацию пустых, нормализацию типов (строки/числа/даты) до записи.
- Не создаём массивы «через строку в конструкторе» — используем
СтрРазделить()или добавляем элементы вручную.
Базовое использование
Процедура ОбновитьНоменклатуруИзСтруктуры(СсылкаНом, Данные) Экспорт
Если 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);
КонецЦикла;
КонецПроцедуры
Анти-паттерны
- Писать в реквизиты «как есть» без нормализации типов — используйте
AsString/NumOrZero/DateOrEmpty. - Перетирать уже заполненные значения «пустыми» входами — фильтруйте через
OnlyNotEmptyилиFromStructIfEmpty. - Падать на незнакомых ключах — лишние поля спокойно игнорируйте/ремапьте.
Практика (15–30 минут)
- Соберите структуру входа для элемента справочника и перенесите значения через
A1sO.FromStruct. - Добавьте карту маппинга ключей (
Title→Наименование,SKU→Код). - Сделайте вариант «не перетирать непустое» и «пропускать пустые».
- Заполните шапку и ТЧ документа из входных структур, включая поиск ссылок по коду/имени.
Чек-лист
- □ Нормализую входные значения (строки/числа/даты) перед записью.
- □ Использую маппинг ключей, если внешние имена отличаются.
- □ Умею пропускать пустые и не перетирать непустые реквизиты.
- □ Ссылочные реквизиты заполняю через безопасный поиск по коду/имени.
Что дальше
День 17: A1sO — Очистка и трансформация структур — компактные приёмы «почистить/переименовать/схлопнуть» данные.