- Выбирать подходящую универсальную коллекцию и пользоваться её методами
- Сворачивать, сортировать и подводить итоги в таблице значений
- Перехватывать, вызывать исключения и записывать их в журнал регистрации
Программе часто нужно временно хранить данные: список городов, «карточку» товара, прайс-лист по кодам, таблицу продаж. Для этого в 1С есть несколько универсальных коллекций. Правильный выбор коллекции может сделать код вдвое короче и быстрее.
Массив
Массив — упорядоченный список значений; индексы начинаются с 0. Основные методы: Добавить() (в конец), Вставить(Индекс, Значение), Количество(), Найти() (индекс или Неопределено), Удалить(Индекс), Очистить(). К элементу обращаются так: Города[1].
Города = Новый Массив;
Города.Добавить("Bakı");
Города.Добавить("Gəncə");
Города.Добавить("Şəki");
Города.Вставить(0, "Sumqayıt");
Сообщить(Города.Количество());
Сообщить(Города[1]);
Сообщить(Города.Найти("Şəki"));
Города.Удалить(0);
Для Каждого Город Из Города Цикл
Сообщить(Город);
КонецЦикла;4 Bakı 3 Bakı Gəncə Şəki
Структура и соответствие
Структура хранит пары «ключ → значение» со строковыми ключами; ключ должен быть правильным идентификатором, а к значению обращаются через точку: Товар.Цена. Соответствие принимает ключи любого типа — ссылки, числа, строки с пробелами. Для отсутствующего ключа Получить() возвращает Неопределено.
Товар = Новый Структура("Наименование, Цена", "Çay", 3);
Товар.Вставить("Количество", 10);
Сообщить(Товар.Наименование + ": " + Товар.Цена * Товар.Количество);
Скидка = Неопределено;
Если Товар.Свойство("Скидка", Скидка) Тогда
Сообщить("Скидка: " + Скидка);
Иначе
Сообщить("Скидки нет");
КонецЕсли;
Цены = Новый Соответствие;
Цены.Вставить("A-100", 3.5);
Цены.Вставить("B-200", 12);
Сообщить(Цены.Получить("B-200"));
Если Цены.Получить("C-300") = Неопределено Тогда
Сообщить("Цена не найдена");
КонецЕсли;Çay: 30 Скидки нет 12 Цена не найдена
Свойство() проверяет наличие ключа. При обходе Соответствие циклом Для Каждого у каждого элемента есть свойства .Ключ и .Значение.Список значений и таблица значений
СписокЗначений добавляет к каждому значению представление и пометку — удобно для списков выбора в формах. ТаблицаЗначений — таблица с колонками и строками: основной инструмент для результатов запросов и расчётов. Она умеет сворачивать (Свернуть), сортировать (Сортировать), подводить итог (Итог) и искать (НайтиСтроки).
Продажи = Новый ТаблицаЗначений;
Продажи.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
Продажи.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
Данные = СтрРазделить("Çay:30;Qənd:12;Çay:18", ";");
Для Каждого Элемент Из Данные Цикл
Части = СтрРазделить(Элемент, ":");
НоваяСтрока = Продажи.Добавить();
НоваяСтрока.Товар = Части[0];
НоваяСтрока.Сумма = Число(Части[1]);
КонецЦикла;
Продажи.Свернуть("Товар", "Сумма"); // группируем по товару, суммируем сумму
Продажи.Сортировать("Сумма Убыв");
Для Каждого Стр Из Продажи Цикл
Сообщить(Стр.Товар + ": " + Стр.Сумма);
КонецЦикла;
Сообщить("Итого: " + Продажи.Итог("Сумма"));Çay: 48 Qənd: 12 Итого: 60
| Коллекция | Ключ / доступ | Типичное применение |
|---|---|---|
Массив | индекс с 0 | простые списки |
Структура | ключ-идентификатор | параметры, небольшие записи |
Соответствие | ключ любого типа | быстрый поиск: товар → цена |
СписокЗначений | индекс + представление | списки выбора в формах |
ТаблицаЗначений | строки и колонки | результаты запросов, расчёты (только на сервере) |
Обработка ошибок
Опасный код помещают в блок Попытка. Если возникает ошибка, управление переходит в блок Исключение; ОписаниеОшибки() возвращает текст ошибки, а ИнформацияОбОшибке() — подробный объект. Чтобы вызвать ошибку самому, пишут ВызватьИсключение "Текст";; внутри Исключение вызов ВызватьИсключение; без параметров передаёт перехваченную ошибку выше.
Функция Разделить(Делимое, Делитель)
Если Делитель = 0 Тогда
ВызватьИсключение "Делитель не может быть равен нулю";
КонецЕсли;
Возврат Делимое / Делитель;
КонецФункции
Процедура Рассчитать()
Попытка
Результат = Разделить(10, 0);
Сообщить(Результат);
Исключение
Текст = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Расчеты", УровеньЖурналаРегистрации.Ошибка, , , Текст);
Сообщить("Не удалось посчитать: " + Текст);
КонецПопытки;
КонецПроцедурыАдминистрирование.Когда несколько записей должны сохраниться либо все вместе, либо ни одна, используют транзакцию. По стандартам 1С НачатьТранзакцию() вызывают непосредственно перед Попытка, а при ошибке сначала отменяют транзакцию и только потом передают ошибку дальше:
НачатьТранзакцию();
Попытка
// несколько записей в базу данных
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение; // передаём ошибку выше
КонецПопытки;Главное
- Индексы
Массивначинаются с 0;Найти()возвращаетНеопределено, если ничего не найдено. - У
Структураключи-идентификаторы, уСоответствие— ключи любого типа. ТаблицаЗначенийработает только на сервере и умеетСвернуть,Сортировать,Итог,НайтиСтроки.Попытка … Исключение … КонецПопыткиперехватывает ошибки,ВызватьИсключениевызывает или пробрасывает их.- Транзакция:
НачатьТранзакцию()→Попытка→ЗафиксироватьТранзакцию(); при ошибкеОтменитьТранзакцию().
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.
Массив?