- 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].
Города = Новый Массив;
Города.Добавить("Bakı");
Города.Добавить("Gəncə");
Города.Добавить("Şəki");
Города.Вставить(0, "Sumqayıt");
Сообщить(Города.Количество());
Сообщить(Города[1]);
Сообщить(Города.Найти("Şəki"));
Города.Удалить(0);
Для Каждого Город Из Города Цикл
Сообщить(Город);
КонецЦикла;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 Неопределено.
Товар = Новый Структура("Наименование, Цена", "Çay", 3);
Товар.Вставить("Количество", 10);
Сообщить(Товар.Наименование + ": " + Товар.Цена * Товар.Количество);
Скидка = Неопределено;
Если Товар.Свойство("Скидка", Скидка) Тогда
Сообщить("Скидка: " + Скидка);
Иначе
Сообщить("Скидки нет");
КонецЕсли;
Цены = Новый Соответствие;
Цены.Вставить("A-100", 3.5);
Цены.Вставить("B-200", 12);
Сообщить(Цены.Получить("B-200"));
Если Цены.Получить("C-300") = Неопределено Тогда
Сообщить("Цена не найдена");
КонецЕсли;Ç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 (НайтиСтроки).
Продажи = Новый ТаблицаЗначений;
Продажи.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
Продажи.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
Данные = СтрРазделить("Çay:30;Qənd:12;Çay:18", ";");
Для Каждого Элемент Из Данные Цикл
Части = СтрРазделить(Элемент, ":");
НоваяСтрока = Продажи.Добавить();
НоваяСтрока.Товар = Части[0];
НоваяСтрока.Сумма = Число(Части[1]);
КонецЦикла;
Продажи.Свернуть("Товар", "Сумма"); // группируем по товару, суммируем сумму
Продажи.Сортировать("Сумма Убыв");
Для Каждого Стр Из Продажи Цикл
Сообщить(Стр.Товар + ": " + Стр.Сумма);
КонецЦикла;
Сообщить("Итого: " + Продажи.Итог("Сумма"));Çay: 48 Qənd: 12 Итого: 60
| Collection | Key / access | Typical use |
|---|---|---|
Массив | index from 0 | simple lists |
Структура | name-like key | parameters, small records |
Соответствие | key of any type | fast lookup: product → price |
СписокЗначений | index + presentation | choice lists in forms |
ТаблицаЗначений | rows and columns | query 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.
Функция Разделить(Делимое, Делитель)
Если Делитель = 0 Тогда
ВызватьИсключение "Делитель не может быть равен нулю";
КонецЕсли;
Возврат Делимое / Делитель;
КонецФункции
Процедура Рассчитать()
Попытка
Результат = Разделить(10, 0);
Сообщить(Результат);
Исключение
Текст = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Расчеты", УровеньЖурналаРегистрации.Ошибка, , , Текст);
Сообщить("Не удалось посчитать: " + Текст);
КонецПопытки;
КонецПроцедурыЖурнал регистрации), 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:
НачатьТранзакцию();
Попытка
// несколько записей в базу данных
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение; // передаём ошибку выше
КонецПопытки;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.
Массив?