- Temel ve etkileşimli haklarla roller tasarlamak ve hakları kodda denetlemek
- Oturum parametreleriyle bir RLS kısıtlaması kurmak ve etkilerini açıklamak
- JSON/XML ile çalışmak, bir HTTP servisi oluşturmak ve harici bir HTTP API çağırmak
Gerçek bir projede kod yazmak işin yalnızca yarısıdır. Depocu Murad yalnızca kendi deposunun belgelerini görmeli, maaşları ise hiç görmemelidir. Bir çevrim içi mağazanın web sitesi stok bilgisini her dakika 1C'den almalı, 1C ise döviz kurlarını bir bankadan yüklemelidir. Bu ders bir 1C geliştiricisinin iki profesyonel becerisine ayrılmıştır: güvenlik ve entegrasyon.
Roller ve erişim hakları
Rol (Общие › Роли), her metadata nesnesi için bir haklar kümesidir. Bir kullanıcıya birden fazla rol verilebilir ve haklar toplanır: rollerden en az biri bir hakkı veriyorsa kullanıcı o hakka sahip olur. “Yasaklayan” rol yoktur; bu yüzden rolleri küçük ve amaca yönelik oluştur: Кладовщик (depocu), Бухгалтер (muhasebeci), ЧтениеСправочников (katalog okuma).
| Hak | Anlamı |
|---|---|
Чтение, Добавление, Изменение, Удаление | temel haklar: kod dahil verilerle her türlü çalışma |
Просмотр, Редактирование, Интерактивное добавление, Интерактивное удаление | etkileşimli haklar: kullanıcının formlarda yapabildikleri |
Проведение, Отмена проведения | belgeleri işleme ve işlemeyi geri alma |
Администрирование, Монопольный режим | konfigürasyon düzeyinde hizmet hakları |
Если Не ПравоДоступа("Изменение", Метаданные.Документы.РасходТовара) Тогда
ВызватьИсключение "Недостаточно прав для изменения документа";
КонецЕсли;
Если РольДоступна("Бухгалтер") Тогда
// показываем дополнительные колонки
КонецЕсли;ПравоДоступа() (AccessRight) belirli bir hakkı, РольДоступна() (IsInRole) bir rolü denetler. Hakkı denetlemek daha güvenilirdir: roller sonradan yeniden adlandırılabilir veya bölünebilir.Kayıt düzeyinde güvenlik (RLS)
Rol “РасходТовара belgeleri okunabilir” der ama “hangileri” demez. Bunun için RLS (kayıt düzeyinde güvenlik) vardır: Чтение, Добавление, Изменение ve Удаление haklarına sorgu diline benzer bir koşul yazılır. Koşulda genellikle oturum parametreleri kullanılır; bunlar oturum başlarken УстановкаПараметровСеанса (SessionParametersSetting) işleyicisinde doldurulur.
// Модуль сеанса
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
// НастройкиПользователей - наш общий модуль
ПараметрыСеанса.ТекущийСклад = НастройкиПользователей.СкладТекущегоПользователя();
КонецПроцедурыГДЕ Склад = &ТекущийСкладКладовщик rolünde РасходТовара belgesinin Чтение hakkına ait kısıtlama metni: kullanıcı yalnızca kendi deposunun belgelerini görür. Birden fazla rolün kısıtlamaları ИЛИ (OR) ile birleşir.RLS'nin iki önemli sonucu vardır. Birincisi, okuma kısıtlaması olan bir tabloya yapılan sorgu, kullanıcının göremeyeceği bir kayda rastlarsa hata verir; yalnızca izin verilen kayıtları sessizce almak için ВЫБРАТЬ РАЗРЕШЕННЫЕ (SELECT ALLOWED) yazılır. İkincisi, platform koşulu her sorguya ekler; bu yüzden karmaşık RLS tabanı yavaşlatabilir. Sunucu kodunun hakları bilerek aşması gerektiğinde УстановитьПривилегированныйРежим(Истина) (SetPrivilegedMode) veya Привилегированный bayraklı bir ortak modül kullanılır.
Depocu Murad yalnızca “Gence” deposunun giriş ve çıkış belgelerini görmeli, oluşturmalı ve işlemeli, ürün kataloğunu ise yalnızca okumalıdır. Erişim yapısını tasarla.
Çözümü gösterÇözümü gizle
Кладовщик rolü: ПриходТовара ve РасходТовара için Чтение, Добавление, Изменение, Просмотр, Редактирование, Проведение; Товары için yalnızca Чтение ve Просмотр.2)
ТекущийСклад oturum parametresi (tür СправочникСсылка.Склады), УстановкаПараметровСеанса içinde kullanıcının ayarlarından doldurulur.3) Belgelerin
Чтение ve Изменение haklarına RLS: ГДЕ Склад = &ТекущийСклад.4) Rapor ve liste sorgularında
ВЫБРАТЬ РАЗРЕШЕННЫЕ.5) Test: Murad olarak giriş yap ve “Bakü” deposuna ait bir belgenin ne görünebildiğinden ne de oluşturulabildiğinden emin ol.
Veri biçimleri: JSON ve XML
Данные = Новый Структура;
Данные.Вставить("code", "0001");
Данные.Вставить("name", "Çay 100 q");
Данные.Вставить("price", 4);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
ТекстJSON = Запись.Закрыть();
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Прочитано = ПрочитатьJSON(Чтение); // Структура
Чтение.Закрыть();
Сообщить(Прочитано.name);Çay 100 q
ЗаписатьJSON (WriteJSON) yapıları, dizileri ve ilkel değerleri metne çevirir, ПрочитатьJSON (ReadJSON) ise geri çevirir.XML için ЗаписьXML (XMLWriter) ve ЧтениеXML (XMLReader) nesneleri, yapılandırılmış alışveriş için ise XDTO mekanizması vardır: СериализаторXDTO bir katalog öğesini ya da belgeyi bütün olarak XML'e yazar. Dağıtık tabanlar arasındaki alışverişte alışveriş planları (Планы обмена) değişiklikleri kendileri izler; tipik konfigürasyonlar ise birbirleriyle EnterpriseData biçiminde veri alışverişi yapar.
HTTP servisleri, web servisleri ve harici API'ler
Bir HTTP servisi (Общие › HTTP-сервисы) 1C'yi bir REST API'ye dönüştürür. Bir kök URL'si (örneğin shop), URL şablonları (örneğin /items/{code}) ve her şablon için yöntemleri (GET, POST…) vardır. Taban bir web sunucusunda yayımlandıktan sonra servis https://server/base/hs/shop/items/0001 gibi bir adreste yanıt verir. Her yöntemin işleyicisi, bir HTTPСервисЗапрос (istek) alan ve bir HTTPСервисОтвет (yanıt) döndüren bir fonksiyondur.
// HTTP-сервис Shop, шаблон URL /items/{code}, метод GET
Функция ItemsGET(Запрос)
Код = Запрос.ПараметрыURL["code"];
Товар = Справочники.Товары.НайтиПоКоду(Код);
Если Товар.Пустая() Тогда
Возврат Новый HTTPСервисОтвет(404);
КонецЕсли;
Данные = Новый Структура("code, name, price", Код, Товар.Наименование, Товар.Цена);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(Запись.Закрыть());
Возврат Ответ;
КонецФункции// Вызов внешнего API из 1С
Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
ЗапросHTTP = Новый HTTPЗапрос("/v1/rates?base=AZN");
Ответ = Соединение.Получить(ЗапросHTTP);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение СтрШаблон("Сервис курсов вернул код %1", Ответ.КодСостояния);
КонецЕсли;
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Курсы = ПрочитатьJSON(Чтение, Истина); // Соответствие
Чтение.Закрыть();HTTPСоединение (HTTPConnection) parametreleri: sunucu, bağlantı noktası, kullanıcı, parola, vekil sunucu, zaman aşımı (saniye) ve güvenli bağlantı (HTTPS).| Yöntem | Ne zaman seçilir |
|---|---|
| HTTP servisi (REST, JSON) | web siteleri, mobil uygulamalar, modern sistemler |
| Web servisi (SOAP, WSDL) | SOAP gerektiren kurumsal ve kamu sistemleri; tüketmek için WS-ссылки (WS referansları) |
| Standart OData arayüzü | kod yazmadan nesnelere REST erişimi (/odata/standard.odata/) |
| Alışveriş planları + XML | şubeler, 1C tabanları arasında eşitleme |
Web sitesi, ürün koduna göre ürünün adını ve fiyatını almalıdır. Servisi, yanıtlarını ve güvenliğini tasarla.
Çözümü gösterÇözümü gizle
Shop, kök URL shop, şablon /items/{code}, yöntem GET, işleyici ItemsGET.2) Yanıtlar: ürün bulundu —
200 ve JSON {"code", "name", "price"}; bulunamadı — 404; kod boş — 400.3) Güvenlik: web sitesi için ayrı bir kullanıcı ve yalnızca
Товары üzerinde Чтение hakkı olan bir APIShop rolü; yalnızca HTTPS.4) Yayımlama:
Администрирование › Публикация на веб-сервере (Web sunucusunda yayımla), HTTP servislerini işaretle.5) Test:
https://server/base/hs/shop/items/0001 adresini bir tarayıcıda veya curl ile aç.Önemli noktalar
- Roller hakları toplar; yasaklayan rol yoktur — rolleri küçük ve amaca yönelik tut.
- RLS koşulları
Чтение/Добавление/Изменение/Удалениеhaklarına eklenir ve oturum parametrelerini kullanır. - RLS olan tablolarda
ВЫБРАТЬ РАЗРЕШЕННЫЕhata yerine yalnızca izin verilen kayıtları döndürür. - JSON:
ЗаписатьJSON/ПрочитатьJSON; alışılmadık anahtarlar içinПрочитатьJSON(Чтение, Истина). - Bir HTTP servisi
/hs/<kök URL>/adresinde REST API sunar; harici API'lerHTTPСоединениеile, zaman aşımı ve HTTPS ile çağrılır.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
Изменение hakkı veriyor, diğeri vermiyor. Sonuç nedir?