Skip to content
Educora
Beginner18 min6 / 14

Universal collections and error handling

Keep data in memory with `Массив`, `Структура`, `Соответствие`, `СписокЗначений` and `ТаблицаЗначений`, catch errors with `Попытка … Исключение` and raise your own with `ВызватьИсключение`.

Check yourself
In this lesson you will learn
  • Choose the right universal collection for a task and use its methods
  • Group, sort and total a value table
  • Catch, raise and log exceptions

A program often has to keep data temporarily: a list of cities, a product “card”, a price list by code, a table of sales. 1C has several universal collections for this. Choosing the right one can make code twice as short and fast.

Array

Массив (Array) is an ordered list of values; indexes start at 0. Main methods: Добавить() (add to the end), Вставить(Index, Value), Количество() (Count), Найти() (index or Неопределено), Удалить(Index), Очистить() (Clear). An element is accessed as Города[1].

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

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

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

Structure and map

Структура (Structure) holds “key → value” pairs with string keys; a key must look like a variable name, and values are accessed with a dot: Товар.Цена. Соответствие (Map) accepts keys of any type — references, numbers, strings with spaces. For a missing key, Получить() (Get) returns Неопределено.

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

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

Цены = Новый Соответствие;
Цены.Вставить("A-100", 3.5);
Цены.Вставить("B-200", 12);
Сообщить(Цены.Получить("B-200"));
Если Цены.Получить("C-300") = Неопределено Тогда
    Сообщить("Цена не найдена");
КонецЕсли;
Expected output
Çay: 30
Скидки нет
12
Цена не найдена
Свойство() (Property) checks whether a key exists. When you loop over a Соответствие with Для Каждого, each element has .Ключ (Key) and .Значение (Value).

Value list and value table

СписокЗначений (ValueList) adds a presentation and a check mark to each value — handy for choice lists in forms. ТаблицаЗначений (ValueTable) is a table with columns and rows: the main tool for query results and calculations. It can group (Свернуть), sort (Сортировать), total (Итог) and search (НайтиСтроки).

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

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

Продажи.Свернуть("Товар", "Сумма");  // группируем по товару, суммируем сумму
Продажи.Сортировать("Сумма Убыв");
Для Каждого Стр Из Продажи Цикл
    Сообщить(Стр.Товар + ": " + Стр.Сумма);
КонецЦикла;
Сообщить("Итого: " + Продажи.Итог("Сумма"));
Expected output
Çay: 48
Qənd: 12
Итого: 60
CollectionKey / accessTypical use
Массивindex from 0simple lists
Структураname-like keyparameters, small records
Соответствиеkey of any typefast lookup: product → price
СписокЗначенийindex + presentationchoice lists in forms
ТаблицаЗначенийrows and columnsquery results, calculations (server only)

Error handling

Risky code goes into a Попытка (Try) block. If an error occurs, control jumps to the Исключение (Except) block; ОписаниеОшибки() (ErrorDescription) returns the error text and ИнформацияОбОшибке() (ErrorInfo) a detailed object. To raise your own error write ВызватьИсключение "Text"; (Raise); inside Исключение, a bare ВызватьИсключение; passes the caught error up.

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

Процедура Рассчитать()
    Попытка
        Результат = Разделить(10, 0);
        Сообщить(Результат);
    Исключение
        Текст = ОписаниеОшибки();
        ЗаписьЖурналаРегистрации("Расчеты", УровеньЖурналаРегистрации.Ошибка, , , Текст);
        Сообщить("Не удалось посчитать: " + Текст);
    КонецПопытки;
КонецПроцедуры
The error goes to the message and to the event log (Журнал регистрации), which an administrator can view later from the Администрирование menu.

When several writes must be saved all together or not at all, you use a transaction. By the 1C standards, НачатьТранзакцию() (BeginTransaction) is called right before Попытка, and on an error the transaction is rolled back first and the error is passed on after that:

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

Key points

  • Массив indexes start at 0; Найти() returns Неопределено when nothing is found.
  • Структура has name-like keys; Соответствие has keys of any type.
  • ТаблицаЗначений works only on the server and has Свернуть, Сортировать, Итог, НайтиСтроки.
  • Попытка … Исключение … КонецПопытки catches errors; ВызватьИсключение raises or re-raises them.
  • Transaction: НачатьТранзакцию() → Попытка → ЗафиксироватьТранзакцию(); on error ОтменитьТранзакцию().

Check yourself

10 questions. Every correct answer earns XP.

1 / 10
What is the index of the first element of a Массив?