İçeriğe geç
Educora
Başlangıç18 dk6 / 14

Evrensel koleksiyonlar ve hata yönetimi

Verileri bellekte `Массив`, `Структура`, `Соответствие`, `СписокЗначений` ve `ТаблицаЗначений` ile tut, hataları `Попытка … Исключение` ile yakala ve kendi hatalarını `ВызватьИсключение` ile oluştur.

Kendini test et
Bu derste öğreneceklerin
  • Göreve uygun evrensel koleksiyonu seçmek ve yöntemlerini kullanmak
  • Bir değer tablosunu gruplamak, sıralamak ve toplamını almak
  • İstisnaları yakalamak, oluşturmak ve olay günlüğüne yazmak

Bir programın verileri çoğu zaman geçici olarak tutması gerekir: şehir listesi, bir ürünün “kartı”, koda göre fiyat listesi, satış tablosu. 1C'de bunun için birkaç evrensel koleksiyon vardır. Doğru koleksiyonu seçmek kodu iki kat kısa ve hızlı yapabilir.

Dizi

Массив (Array), değerlerin sıralı bir listesidir; dizinler 0'dan başlar. Temel yöntemler: Добавить() (sona ekle), Вставить(Dizin, Değer), Количество() (Count), Найти() (dizin ya da Неопределено), Удалить(Dizin), Очистить() (Clear). Öğeye Города[1] biçiminde erişilir.

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

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

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

Yapı ve eşleme

Структура (Structure), metin anahtarlı “anahtar → değer” çiftlerini tutar; anahtar bir değişken adı gibi yazılmalıdır, değere nokta ile erişilir: Товар.Цена. Соответствие (Map) ise anahtar olarak her türü kabul eder: referanslar, sayılar, boşluklu metinler. Olmayan bir anahtar için Получить() (Get) Неопределено döndürür.

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

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

Цены = Новый Соответствие;
Цены.Вставить("A-100", 3.5);
Цены.Вставить("B-200", 12);
Сообщить(Цены.Получить("B-200"));
Если Цены.Получить("C-300") = Неопределено Тогда
    Сообщить("Цена не найдена");
КонецЕсли;
Beklenen çıktı
Çay: 30
Скидки нет
12
Цена не найдена
Свойство() (Property) bir anahtarın var olup olmadığını denetler. Соответствие Для Каждого ile dolaşıldığında her öğenin .Ключ (Key) ve .Значение (Value) özellikleri vardır.

Değer listesi ve değer tablosu

СписокЗначений (ValueList), her değere bir gösterim ve bir işaret ekler; formlardaki seçim listeleri için kullanışlıdır. ТаблицаЗначений (ValueTable) ise sütunları ve satırları olan bir tablodur: sorgu sonuçları ve hesaplamalar için temel araçtır. Gruplama (Свернуть), sıralama (Сортировать), toplam (Итог) ve arama (НайтиСтроки) yapabilir.

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

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

Продажи.Свернуть("Товар", "Сумма");  // группируем по товару, суммируем сумму
Продажи.Сортировать("Сумма Убыв");
Для Каждого Стр Из Продажи Цикл
    Сообщить(Стр.Товар + ": " + Стр.Сумма);
КонецЦикла;
Сообщить("Итого: " + Продажи.Итог("Сумма"));
Beklenen çıktı
Çay: 48
Qənd: 12
Итого: 60
KoleksiyonAnahtar / erişimTipik kullanım
Массив0'dan dizinbasit listeler
Структураad biçiminde anahtarparametreler, küçük kayıtlar
Соответствиеher türde anahtarhızlı arama: ürün → fiyat
СписокЗначенийdizin + gösterimformlarda seçim listeleri
ТаблицаЗначенийsatırlar ve sütunlarsorgu sonuçları, hesaplamalar (yalnızca sunucuda)

Hata yönetimi

Riskli kod bir Попытка (Try) bloğuna yazılır. Hata oluşursa kontrol Исключение (Except) bloğuna geçer; ОписаниеОшибки() (ErrorDescription) hata metnini, ИнформацияОбОшибке() (ErrorInfo) ise ayrıntılı bir nesneyi döndürür. Kendi hatanı oluşturmak için ВызватьИсключение "Metin"; (Raise) yazılır; Исключение bloğunda parametresiz ВызватьИсключение; yakalanan hatayı yukarı iletir.

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

Процедура Рассчитать()
    Попытка
        Результат = Разделить(10, 0);
        Сообщить(Результат);
    Исключение
        Текст = ОписаниеОшибки();
        ЗаписьЖурналаРегистрации("Расчеты", УровеньЖурналаРегистрации.Ошибка, , , Текст);
        Сообщить("Не удалось посчитать: " + Текст);
    КонецПопытки;
КонецПроцедуры
Hata hem mesaja hem de olay günlüğüne (Журнал регистрации) yazılır; yönetici bunu daha sonra Администрирование menüsünden görebilir.

Birkaç kaydın ya hep birlikte ya da hiç kaydedilmemesi gerektiğinde bir işlem (transaction) kullanılır. 1C standartlarına göre НачатьТранзакцию() (BeginTransaction) doğrudan Попытка'dan önce çağrılır; hata olursa önce işlem geri alınır, ardından hata yukarı iletilir:

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

Önemli noktalar

  • Массив dizinleri 0'dan başlar; Найти() bir şey bulamazsa Неопределено döndürür.
  • Структура ad biçiminde anahtarlara, Соответствие her türde anahtara sahiptir.
  • ТаблицаЗначений yalnızca sunucuda çalışır ve Свернуть, Сортировать, Итог, НайтиСтроки yöntemlerine sahiptir.
  • Попытка … Исключение … КонецПопытки hataları yakalar; ВызватьИсключение hata oluşturur veya yukarı iletir.
  • İşlem: НачатьТранзакцию() → Попытка → ЗафиксироватьТранзакцию(); hatada ОтменитьТранзакцию().

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Bir Массив'in ilk öğesinin dizini nedir?