1C formunda "Hızlı Eylemler"e kendi düğmenizi uzantı ile nasıl eklersiniz?
1C standart formuna özel bir "hızlı eylem" eklemek için, uzantıda bir form komutu oluşturmak, bunu komut panelinde bir düğme olarak (veya "Diğer" menüsünde) göstermek ve bir işleyici yazmak yeterlidir: istemci tarafında bağlam/seçim toplama, sunucu tarafında ise temel iş mantığını yürütme.
İçindekiler
1C'de "hızlı eylem" olarak ne kabul edilir?
Pratikte "hızlı eylemler", aşağı şekilde görüntülenen form komutlarıdır:
- komut panelinde bir düğme olarak;
- "Diğer" menüsünde bir öğe olarak;
- bazen de panelde ayrı bir eylem grubu olarak.
Teknik bağlantı neredeyse her zaman aynıdır: Form Komutu → arayüz öğesi (düğme/menü öğesi) → form modülündeki işleyici.
Hangi yöntemi seçmeli: devralma yoluyla mı yoksa programatik olarak mı?
Komut ekleme yaklaşımlarının karşılaştırılması
| Yaklaşım | Nasıl yapılır? | Avantajlar | Riskler/Dezavantajlar |
|---|---|---|---|
| A. Formu devralma | Uzantıdaki forma komut ve düğme eklersiniz | Öngörülebilir, "standarta uygun", UI ayarlarını/haklarını yönetmek daha kolay | Uzantı, formun yapısına bağlıdır (konfigürasyonu doğrudan değiştirmeye kıyasla daha az olsa da) |
| B. Açılışta programatik | Form olayında komut/düğme oluşturursunuz | Yapıya minimum müdahale, hızlı entegrasyonlar için kullanışlı | Form öğelerinin adları/hiyerarşisi değiştiğinde bozulabilir |
Eylem, önemli bir kullanıcı senaryosunun parçasıysa ve formda uzun süre kalması gerekiyorsa, genellikle Yaklaşım A tercih edilir. Yaklaşım B, zarif bir "eklenti" olarak iyidir ancak Bul(...) kontrolleri konusunda disiplin gerektirir.
Yöntem A: Devralınan formda komut ve düğme
- Formu uzantıya devralın (genellikle liste formu veya nesne formu yeterlidir).
- Forma bir Form Komutu ekleyin, örneğin
BenimHizliEylemim, başlık ve ipucu belirleyin. - Komutu komut panelinde bir düğme olarak veya "Diğer" menüsünde bir öğe olarak görüntüleyin.
- İşleyiciyi uygulayın: istemci tarafı seçimi/bağlamı toplar, sunucu tarafı veri değişikliklerini gerçekleştirir.
Örnek iskelet (liste formu: seçimle çalışıyoruz):
&НаКлиенте
Процедура МоеБыстроеДействие(Команда)
Ссылки = ПолучитьВыделенныеСсылки();
Если Ссылки.Количество() = 0 Тогда
Сообщить("Выберите хотя бы одну строку.");
Возврат;
КонецЕсли;
Если Не Вопрос("Выполнить действие для выбранных: " + Ссылки.Количество() + "?", РежимДиалогаВопрос.ДаНет) Тогда
Возврат;
КонецЕсли;
ВыполнитьДействиеНаСервере(Ссылки);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьДействиеНаСервере(Ссылки) Экспорт
// Здесь — запись/проведение/регистры/создание объектов.
// Обязательно учитывайте права и валидируйте входные данные.
КонецПроцедуры
Seçimi alma işlemi, belirli formdaki liste öğesine bağlıdır (ad farklı olabilir):
&НаКлиенте
Функция ПолучитьВыделенныеСсылки()
Результат = Новый Массив;
ЭлСписок = Элементы.Найти("Список");
Если ЭлСписок = Неопределено Тогда
Возврат Результат;
КонецЕсли;
Для каждого Стр Из ЭлСписок.ВыделенныеСтроки Цикл
Если Стр.Свойство("Ссылка") Тогда
Результат.Добавить(Стр.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
"Başka bir formda/güncellemeden sonra çalışmıyor" sorununun başlıca nedeni, yanlış liste öğesi adıdır. Her zaman Elemanlar.Bul(...) ile kontrol edin ve adı gerçek forma göre belirleyin.
Yöntem B: Komut ve düğmeyi programatik olarak ekleme
Bu yaklaşım, yapılandırıcıda formun yapısını değiştirmek istemediğinizde kullanışlıdır: komut ve düğme, form oluşturulurken "anında" oluşturulur.
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Если Команды.Найти("МоеБыстроеДействие") = Неопределено Тогда
Ком = Команды.Добавить("МоеБыстроеДействие");
Ком.Заголовок = "Сделать действие";
Ком.Действие = "МоеБыстроеДействие";
КонецЕсли;
Панель = Элементы.Найти("КоманднаяПанель");
Если Панель <> Неопределено И Элементы.Найти("КнопкаМоеБыстроеДействие") = Неопределено Тогда
Кнопка = Элементы.Добавить("КнопкаМоеБыстроеДействие", Тип("КнопкаФормы"), Панель);
Кнопка.Команда = Команды.МоеБыстроеДействие;
Кнопка.Заголовок = "Сделать действие";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура МоеБыстроеДействие(Команда)
Сообщить("Команда выполнена!");
КонецПроцедуры
Düğmenin "akıllı" olması için, işleyicide hata vermek yerine komutun erişilebilirliğini yönetmek daha uygundur:
&НаКлиенте
Процедура ОбновитьДоступностьКоманд()
Команды.МоеБыстроеДействие.Доступность = (ПолучитьВыделенныеСсылки().Количество() > 0);
КонецПроцедуры
Programatik ekleme yaparken her zaman Komutlar.Bul(...) ve Elemanlar.Bul(...) kontrollerini yapın, aksi takdirde formu tekrar açtığınızda yinelenen öğeler veya hatalar alırsınız.
Sık yapılan hatalar
- Tüm mantığın istemci tarafında olması. Sonuç: haklar ve güvenlik sorunları. Veri değişikliklerini sunucuda yapın.
- Seçim yerine yalnızca geçerli satırla çalışma. Listeler için
SeciliSatirlar'ı açıkça işleyin. - Panel/grup adına sıkı bağımlılık. Öğeleri
Bul(...)ile arayın ve "yumuşak reddi" öngörün (panel yoksa düğme de olmaz). - Komut herkes tarafından görülüyor ama çalıştırılamıyor. Komutu haklara göre gizleyin/devre dışı bırakın veya sunucuda izin verilmediğinde anlaşılır bir mesaj gösterin.
SSS
Formu hiç devralmadan hızlı eylem eklenebilir mi?
Evet: programatik ekleme ile (Yöntem B). Ancak, standart formun öğe adlarını/yapısını değiştirebileceğini unutmayın.
Hangisi daha iyi: form komutu mu yoksa genel komut mu?
Form bağlamına (satır seçimi, geçerli nesne) bağlı eylemler için genellikle form komutu daha iyidir. Genel komutlar, küresel hizmet eylemleri için uygundur.
Haklar nerede kontrol edilmeli?
Kritik olan — verileri değiştirmeden önce sunucuda (ve istisnaları işlemek). İstemci tarafında, daha iyi bir kullanıcı deneyimi için komutun erişilebilirliğini ek olarak yönetebilirsiniz.