- İşleme sırasında ne olduğunu adım adım açıklamak
- Hareketleri kodla ve sihirbazla oluşturmak, bakiyeyi denetlemek
- Nesne modülünü, yönetici modülünü ve olay aboneliklerini yerinde kullanmak
Depocu Elvin bir “Mal satışı” belgesini işliyor. Program iki şey yapmalı: stok bakiyesini azaltmak ve çay yetmiyorsa belgeyi işlememek. Bu derste işlemenin motorunu yazacağız: ОбработкаПроведения prosedürü, register hareketleri ve bakiye kontrolü.
İşleme sırasında ne olur
- Platform bir işlem açar ve belgeyi
Проведен = Истинаile yazar. - Nesne modülünde
ОбработкаПроведения(Отказ, РежимПроведения)(Posting) çağrılır; hareketler burada doldurulur. Записывать = Истинаolan kayıt kümeleri yazılır ve bu belgenin eski hareketlerinin yerine geçer; bu yüzden yeniden işleme verileri ikiye katlamaz.- Kod
Отказ = Истина(Cancel) atadıysa işlem geri alınır: ne belge işlenir ne de hareketler yazılır.
Belgenin Движения (Register kayıtları) sekmesinde Проведение (İşleme) Разрешить (İzin ver) olmalı ve register'lar işaretlenmelidir. Orada ayrıca Удаление движений özelliği bulunur: Удалять автоматически, Удалять автоматически при отмене проведения ya da Не удалять автоматически; işleme iptalinde ve yeniden işlemede eski hareketlere ne olacağını belirler.
Hareketleri oluşturma
- 1Sihirbazı aç
ПриходТовараbelgesininДвиженияsekmesindeОстаткиТоваровregister'ını işaretle veКонструктор движений(Hareket sihirbazı) düğmesine tıkla. - 2Kaynağı ve ifadeleri seç
Tablo bölümü
Товары, hareket türüПриход.Заполнить выражения(İfadeleri doldur) düğmesine tıkla; sihirbaz register alanlarını aynı adlı özniteliklerle eşleştirir, geri kalanını elle yaz. - 3Kodu kontrol et
ОК'e tıkla: nesne modülündeОбработкаПроведенияoluşur. F5 ile bir belge işle ve hareketleriniПерейти › Остатки товаров(Git) ile gör.
// Модуль объекта документа ПриходТовара
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиТоваров.Записывать = Истина;
Для Каждого СтрокаТовары Из Товары Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Товар = СтрокаТовары.Товар;
Движение.Склад = Склад;
Движение.Количество = СтрокаТовары.Количество;
КонецЦикла;
КонецПроцедурыДата, Склад, Товары. Регистратор alanını platform kendisi doldurur.Bakiye kontrolü
РасходТовара belgesi bakiyeyi azaltır. Modern (“yeni”) yöntem şöyledir: önce Расход hareketleri yazılır, ardından tek bir sorguyla bakiyenin eksiye düşmediği kontrol edilir. Yazmadan önce БлокироватьДляИзменения = Истина (LockForUpdate) ayarlanır; böylece paralel çalışan kullanıcılar aynı stoku aynı anda “harcayamaz”. Negatif bakiye bulunursa Отказ = Истина.
// Модуль объекта документа РасходТовара
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиТоваров.Записывать = Истина;
Для Каждого СтрокаТовары Из Товары Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Товар = СтрокаТовары.Товар;
Движение.Склад = Склад;
Движение.Количество = СтрокаТовары.Количество;
КонецЦикла;
Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина;
Движения.ОстаткиТоваров.Записать();
ПроверитьОстатки(Отказ);
КонецПроцедурыПроцедура ПроверитьОстатки(Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Товар КАК Товар,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&Момент, Склад = &Склад) КАК Остатки
|ГДЕ
| Остатки.КоличествоОстаток < 0";
Запрос.УстановитьПараметр("Момент", Новый Граница(МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Склад", Склад);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(СтрШаблон("Товара %1 не хватает: %2", Выборка.Товар, -Выборка.Остаток));
Отказ = Истина;
КонецЦикла;
КонецПроцедурыНовый Граница(…, ВидГраницы.Включая), belgenin kendi hareketlerini de bakiyeye dahil eder. Sorgu dilini bir sonraki modülde ayrıntılı öğreneceğiz.Nesne modülü, yönetici modülü ve olay abonelikleri
| Nerede | Ne yazılır | Örnek |
|---|---|---|
| Nesne modülü | belirli bir nesnenin olayları | ОбработкаПроведения, ПередЗаписью, ОбработкаПроверкиЗаполнения, ОбработкаЗаполнения |
| Yönetici modülü | tüm tür için dışa aktarılan fonksiyonlar | Документы.РасходТовара.ПечатнаяФорма(Ссылка) |
| Olay aboneliği | birçok nesne için tek işleyici | tüm belgelerde tarih kontrolü |
Bir olay aboneliği (Общие › Подписки на события) üç özellikle kurulur: Источник (Kaynak — hangi nesneler), Событие (Olay, örneğin ПередЗаписью) ve Обработчик (İşleyici) — bir sunucu ortak modülündeki dışa aktarılan prosedür. Tipik bir konfigürasyonun nesnelerinin davranışını onların modüllerine dokunmadan genişletmeyi sağlar.
// Общий модуль ПроверкиДокументов (флаг «Сервер»)
Процедура ПроверитьДатуПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат; // при загрузке из обмена проверки не выполняем
КонецЕсли;
Если Источник.Дата > КонецДня(ТекущаяДатаСеанса()) Тогда
Сообщить("Нельзя записать документ будущей датой");
Отказ = Истина;
КонецЕсли;
КонецПроцедурыПередЗаписью (BeforeWrite) olayı için abonelik işleyicisi. ОбменДанными.Загрузка kontrolü, veri alışverişi sırasında denetimleri atlamanın standart yoludur.Önemli noktalar
- İşleme bir işlem içinde yürür:
ОбработкаПроведенияhareketleri doldurur,Отказ = Истинаher şeyi iptal eder. Записывать = Истинаolan kayıt kümeleri belgenin eski hareketlerinin yerine geçer.- Yeni yöntem: hareketleri yaz →
Остаткиsanal tablosuna tek sorguyla negatif bakiyeyi kontrol et. - Nesne modülü — bir nesnenin olayları; yönetici modülü — tüm türün fonksiyonları.
- Olay abonelikleri, nesnelerin modüllerine dokunmadan davranışı genişletir.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.