18.01.2007
//////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ // // Процедура обработчик проведения документа // Процедура ОбработкаПроведения(Отказ, Режим) //Получение данных состава документа, номенклатуры и остатков Запрос = Новый Запрос; Если Режим = РежимПроведенияДокумента.Оперативный Тогда //Блокировка остатков на складах БлокировкаДанных = Новый БлокировкаДанных; ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрНакопления.УчетНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Склад", Склад); ЭлементБлокировки.ИсточникДанных = Состав; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); БлокировкаДанных.Заблокировать(); Запрос.Текст = "ВЫБРАТЬ | Док.Номенклатура, | Док.Количество, | ОстаткиСкл.КоличествоОстаток КАК КоличествоСкл |ИЗ | Документ.РасходнаяНакладная.Состав КАК Док | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки( | , | Номенклатура В (&ПарНоменклатура) | И Склад = &ПарСклад) КАК ОстаткиСкл | ПО Док.Номенклатура = ОстаткиСкл.Номенклатура |ГДЕ | Док.Ссылка = &Ссылка | |ДЛЯ ИЗМЕНЕНИЯ | РегистрНакопления.УчетНоменклатуры.Остатки"; Запрос.УстановитьПараметр("ПарСклад", Склад); Запрос.УстановитьПараметр("ПарНоменклатура", Состав.ВыгрузитьКолонку("Номенклатура")); Иначе Запрос.Текст = "ВЫБРАТЬ | Док.Номенклатура, | Док.Количество |ИЗ | Документ.РасходнаяНакладная.Состав КАК Док |ГДЕ | Док.Ссылка = &Ссылка"; КонецЕсли; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); //Обход результата запроса СтрокаСостава = Результат.Выбрать(); Пока СтрокаСостава.Следующий() Цикл //Проверка остатка при оперативном проведении Если Режим = РежимПроведенияДокумента.Оперативный Тогда Остаток = ?(СтрокаСостава.КоличествоСкл = Null, 0, СтрокаСостава.КоличествоСкл); Если Остаток < СтрокаСостава.Количество Тогда Сообщить("Товара " + СокрЛП(СтрокаСостава.Номенклатура) + " имеется только " + Остаток); Отказ = Истина; Продолжить; КонецЕсли; КонецЕсли; //Запись движения номенклатуры Движение = Движения.УчетНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = СтрокаСостава.Номенклатура; Движение.Склад = Склад; Движение.Количество = СтрокаСостава.Количество; КонецЦикла; Для Каждого ТекСтрокаСостав Из Состав Цикл // регистр Основной Движение = Движения.Основной.Добавить(); Движение.СчетДт = ПланыСчетов.Основной.Покупатели; Движение.СчетКт = ПланыСчетов.Основной.НоменклатураНаСкладах; Движение.Период = Дата; Если Валюта.Пустая() Тогда Движение.Сумма = ТекСтрокаСостав.Сумма; Иначе Движение.ВалютаДт = Валюта; Движение.ВалютнаяСуммаДт = ТекСтрокаСостав.Сумма; Движение.Сумма = ТекСтрокаСостав.Сумма * ОбщиеФункции.ПолучитьКурс(Дата, Валюта); КонецЕсли; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСостав.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Движение.КоличествоКт = ТекСтрокаСостав.Количество; КонецЦикла; Если Не Отказ Тогда Движения.УчетНоменклатуры.Записать(); КонецЕсли; КонецПроцедуры // ОбработкаПроведения(Отказ, Режим)