Перейти к содержанию
Educora
Начальный18 мин6 / 14

Универсальные коллекции и обработка ошибок

Храни данные в памяти с помощью `Массив`, `Структура`, `Соответствие`, `СписокЗначений` и `ТаблицаЗначений`, перехватывай ошибки конструкцией `Попытка … Исключение` и вызывай собственные через `ВызватьИсключение`.

Проверь себя
В этом уроке ты узнаешь
  • Выбирать подходящую универсальную коллекцию и пользоваться её методами
  • Сворачивать, сортировать и подводить итоги в таблице значений
  • Перехватывать, вызывать исключения и записывать их в журнал регистрации

Программе часто нужно временно хранить данные: список городов, «карточку» товара, прайс-лист по кодам, таблицу продаж. Для этого в 1С есть несколько универсальных коллекций. Правильный выбор коллекции может сделать код вдвое короче и быстрее.

Массив

Массив — упорядоченный список значений; индексы начинаются с 0. Основные методы: Добавить() (в конец), Вставить(Индекс, Значение), Количество(), Найти() (индекс или Неопределено), Удалить(Индекс), Очистить(). К элементу обращаются так: Города[1].

1C
Города = Новый Массив;
Города.Добавить("Bakı");
Города.Добавить("Gəncə");
Города.Добавить("Şəki");
Города.Вставить(0, "Sumqayıt");

Сообщить(Города.Количество());
Сообщить(Города[1]);
Сообщить(Города.Найти("Şəki"));

Города.Удалить(0);
Для Каждого Город Из Города Цикл
    Сообщить(Город);
КонецЦикла;
Ожидаемый результат
4
Bakı
3
Bakı
Gəncə
Şəki

Структура и соответствие

Структура хранит пары «ключ → значение» со строковыми ключами; ключ должен быть правильным идентификатором, а к значению обращаются через точку: Товар.Цена. Соответствие принимает ключи любого типа — ссылки, числа, строки с пробелами. Для отсутствующего ключа Получить() возвращает Неопределено.

1C
Товар = Новый Структура("Наименование, Цена", "Çay", 3);
Товар.Вставить("Количество", 10);
Сообщить(Товар.Наименование + ": " + Товар.Цена * Товар.Количество);

Скидка = Неопределено;
Если Товар.Свойство("Скидка", Скидка) Тогда
    Сообщить("Скидка: " + Скидка);
Иначе
    Сообщить("Скидки нет");
КонецЕсли;

Цены = Новый Соответствие;
Цены.Вставить("A-100", 3.5);
Цены.Вставить("B-200", 12);
Сообщить(Цены.Получить("B-200"));
Если Цены.Получить("C-300") = Неопределено Тогда
    Сообщить("Цена не найдена");
КонецЕсли;
Ожидаемый результат
Çay: 30
Скидки нет
12
Цена не найдена
Свойство() проверяет наличие ключа. При обходе Соответствие циклом Для Каждого у каждого элемента есть свойства .Ключ и .Значение.

Список значений и таблица значений

СписокЗначений добавляет к каждому значению представление и пометку — удобно для списков выбора в формах. ТаблицаЗначений — таблица с колонками и строками: основной инструмент для результатов запросов и расчётов. Она умеет сворачивать (Свернуть), сортировать (Сортировать), подводить итог (Итог) и искать (НайтиСтроки).

1C
Продажи = Новый ТаблицаЗначений;
Продажи.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
Продажи.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

Данные = СтрРазделить("Çay:30;Qənd:12;Çay:18", ";");
Для Каждого Элемент Из Данные Цикл
    Части = СтрРазделить(Элемент, ":");
    НоваяСтрока = Продажи.Добавить();
    НоваяСтрока.Товар = Части[0];
    НоваяСтрока.Сумма = Число(Части[1]);
КонецЦикла;

Продажи.Свернуть("Товар", "Сумма");  // группируем по товару, суммируем сумму
Продажи.Сортировать("Сумма Убыв");
Для Каждого Стр Из Продажи Цикл
    Сообщить(Стр.Товар + ": " + Стр.Сумма);
КонецЦикла;
Сообщить("Итого: " + Продажи.Итог("Сумма"));
Ожидаемый результат
Çay: 48
Qənd: 12
Итого: 60
КоллекцияКлюч / доступТипичное применение
Массивиндекс с 0простые списки
Структураключ-идентификаторпараметры, небольшие записи
Соответствиеключ любого типабыстрый поиск: товар → цена
СписокЗначенийиндекс + представлениесписки выбора в формах
ТаблицаЗначенийстроки и колонкирезультаты запросов, расчёты (только на сервере)

Обработка ошибок

Опасный код помещают в блок Попытка. Если возникает ошибка, управление переходит в блок Исключение; ОписаниеОшибки() возвращает текст ошибки, а ИнформацияОбОшибке() — подробный объект. Чтобы вызвать ошибку самому, пишут ВызватьИсключение "Текст";; внутри Исключение вызов ВызватьИсключение; без параметров передаёт перехваченную ошибку выше.

1C
Функция Разделить(Делимое, Делитель)
    Если Делитель = 0 Тогда
        ВызватьИсключение "Делитель не может быть равен нулю";
    КонецЕсли;
    Возврат Делимое / Делитель;
КонецФункции

Процедура Рассчитать()
    Попытка
        Результат = Разделить(10, 0);
        Сообщить(Результат);
    Исключение
        Текст = ОписаниеОшибки();
        ЗаписьЖурналаРегистрации("Расчеты", УровеньЖурналаРегистрации.Ошибка, , , Текст);
        Сообщить("Не удалось посчитать: " + Текст);
    КонецПопытки;
КонецПроцедуры
Ошибка выводится в сообщение и записывается в журнал регистрации, который администратор потом может посмотреть через меню Администрирование.

Когда несколько записей должны сохраниться либо все вместе, либо ни одна, используют транзакцию. По стандартам 1С НачатьТранзакцию() вызывают непосредственно перед Попытка, а при ошибке сначала отменяют транзакцию и только потом передают ошибку дальше:

1C
НачатьТранзакцию();
Попытка
    // несколько записей в базу данных
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;  // передаём ошибку выше
КонецПопытки;

Главное

  • Индексы Массив начинаются с 0; Найти() возвращает Неопределено, если ничего не найдено.
  • У Структура ключи-идентификаторы, у Соответствие — ключи любого типа.
  • ТаблицаЗначений работает только на сервере и умеет Свернуть, Сортировать, Итог, НайтиСтроки.
  • Попытка … Исключение … КонецПопытки перехватывает ошибки, ВызватьИсключение вызывает или пробрасывает их.
  • Транзакция: НачатьТранзакцию() → Попытка → ЗафиксироватьТранзакцию(); при ошибке ОтменитьТранзакцию().

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Какой индекс у первого элемента Массив?