Идея дня
- Единые проверки через
A1sO.Empty/NotEmptyперед любыми действиями с коллекциями. - Безопасные извлечения: «верни по умолчанию, если нет» — меньше
Если/Иначев коде. - Преобразования между ТаблицаЗначений ↔ Массив/Соответствие короткими приёмами.
Опросы массивов (создание/объединение/уникальность) — подробно в Днях 24–27 (A1sArrays).
Базовые проверки коллекций
Если A1sO.Empty(Коллекция) Тогда
A1sLog.Info("Day11", "Пустая коллекция — ничего не делаем");
Возврат;
КонецЕсли;
// Коллекция не пустая — продолжаем
Фильтрация массива от «пустых» значений
Функция Compact(ИсхМассив) Экспорт
Если A1sO.Empty(ИсхМассив) Тогда Возврат Новый Массив; КонецЕсли;
Рез = Новый Массив;
Для каждого Э Из ИсхМассив Цикл
Если A1sO.NotEmpty(Э) Тогда Рез.Добавить(Э); КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
Соответствие: безопасное чтение
Частая задача — взять значение по ключу, а если его нет/пусто — вернуть дефолт.
Функция GetOrDefault(Соп, Ключ, ПоУмолчанию = Неопределено) Экспорт
Если A1sO.Empty(Соп) Тогда Возврат ПоУмолчанию; КонецЕсли;
Если НЕ Соп.СодержитКлюч(Ключ) Тогда Возврат ПоУмолчанию; КонецЕсли;
Значение = Соп.Получить(Ключ);
Если A1sO.Empty(Значение) Тогда Возврат ПоУмолчанию; КонецЕсли;
Возврат Значение;
КонецФункции
// Использование:
Профиль = Новый Соответствие;
Профиль.Вставить("Имя", "Кабель ПВС");
Сообщить(GetOrDefault(Профиль, "Имя", "Без имени")); // "Кабель ПВС"
Сообщить(GetOrDefault(Профиль, "Код", 0)); // 0 (дефолт, ключа нет)
Помните: 0 и Ложь — это не «пусто» (см. День 10). Меняйте
GetOrDefault, если нужно иное поведение.
ТаблицаЗначений → Массив/Соответствие
Одной колонкой — в массив
Функция ТабКолонкаВМассив(Таб, ИмяКолонки) Экспорт
Если A1sO.Empty(Таб) Тогда Возврат Новый Массив; КонецЕсли;
Если Таб.Колонки.Найти(ИмяКолонки) = Неопределено Тогда Возврат Новый Массив; КонецЕсли;
Возврат Таб.ВыгрузитьКолонку(ИмяКолонки);
КонецФункции
Две колонки — в соответствие (ключ → значение)
Функция ТабВКарту(Таб, КолКлюч = "ID", КолЗнач = "Name") Экспорт
Карта = Новый Соответствие;
Если A1sO.Empty(Таб) Тогда Возврат Карта; КонецЕсли;
Если Таб.Колонки.Найти(КолКлюч) = Неопределено Тогда Возврат Карта; КонецЕсли;
Если Таб.Колонки.Найти(КолЗнач) = Неопределено Тогда Возврат Карта; КонецЕсли;
Ключи = Таб.ВыгрузитьКолонку(КолКлюч);
Значи = Таб.ВыгрузитьКолонку(КолЗнач);
Для Н = 0 По Ключи.Количество()-1 Цикл
Карта.Вставить(Ключи[Н], Значи[Н]);
КонецЦикла;
Возврат Карта;
КонецФункции
Массив → ТаблицаЗначений
Удобно для передачи «виртуальных таблиц» как параметров (&ВТ) в запросы (см. День 9).
Функция МассивВТаблицу(МассивЗначений, ИмяКолонки = "Значение") Экспорт
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(ИмяКолонки);
Если A1sO.Empty(МассивЗначений) Тогда Возврат ТЗ; КонецЕсли;
Для каждого Э Из МассивЗначений Цикл
Нов = ТЗ.Добавить();
Нов[ИмяКолонки] = Э;
КонецЦикла;
Возврат ТЗ;
КонецФункции
Компактные операции с массивами (зачатки)
Ниже — лёгкие приёмы, не пересекающиеся с будущим модулем A1sArrays.
Map: преобразование каждого элемента
Функция Map(ИсхМассив, Преобразователь) Экспорт
// Преобразователь — процедура/функция: Функция(X) Экспорт Возврат ... КонецФункции
Рез = Новый Массив;
Если A1sO.Empty(ИсхМассив) Тогда Возврат Рез; КонецЕсли;
Для каждого Э Из ИсхМассив Цикл
Рез.Добавить(Преобразователь(Э));
КонецЦикла;
Возврат Рез;
КонецФункции
Filter: оставить только непустые
Функция FilterNotEmpty(ИсхМассив) Экспорт
Возврат Compact(ИсхМассив); // из примера выше
КонецФункции
Работа со строками результата запроса
Комбинируем A1sQ и коллекции: быстро получаем массивы или соответствия для UI.
Таб = A1sQ.Unload("
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
| Ном.Ссылка КАК ID,
| Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Name
", 20);
// Для выпадающего списка:
Имена = ТабКолонкаВМассив(Таб, "Name");
// Для быстрой навигации по ID → Name:
Карта = ТабВКарту(Таб, "ID", "Name");
Анти-паттерны
- Итерироваться по Неопределено или пустой коллекции — сначала
A1sO.NotEmpty. - Считать 0/Ложь пустыми — ломает логику (см. День 10).
- Копировать большие таблицы без нужды — предпочитайте
ВыгрузитьКолонкуи точечные преобразования.
Практика (15–30 минут)
- Реализуйте
GetOrDefaultи используйте его в двух местах чтения Соответствие. - Напишите
Compactи очистите массив от пустых значений. - Преобразуйте результаты запроса в массив имён и карту
ID → Name. - Сделайте
МассивВТаблицуи используйте в параметре &ВТ в одном запросе (см. День 9).
Чек-лист
- □ Везде перед операциями с коллекциями использую
A1sO.Empty/NotEmpty. - □ Безопасно читаю значения из Соответствие с дефолтом.
- □ Умею быстро конвертировать ТаблицаЗначений ↔ Массив/Соответствие.
Что дальше
День 12: A1sO — Даты (Now, DateOrEmpty) — безопасные даты и нормализация периодов.