09:32 Задачи 1.8 | |
В справочнике подразделения добавим реквизит ПроцентНадбавки тип число .2 след код Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры Для докум Расходная добавляем в шапку реквизит Перемещение (Тип Булево) реквизит Подразделение спр Подразделения в модуле объекта Расходной след код: Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Если Перемещение Тогда ПеремещениеТовара(Отказ); Иначе СписаниеТовара(Отказ); КонецЕсли; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры Процедура ПеремещениеТовара(Отказ) //Установим исключительную блокировку на те записи регистров, по которым осуществляется чтение, а потом - запись //только на записи по отделу закупок Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.УстановитьЗначение("Подразделение", Справочники.Подразделения.ОтделЗакупок); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ СписокНоменклатуры |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Количество, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток |ИЗ | СписокНоменклатуры КАК СписокНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | СписокНоменклатуры.Номенклатура | ИЗ | СписокНоменклатуры) | И Подразделение = &Подразделение) КАК ОстаткиНоменклатурыОстатки | ПО СписокНоменклатуры.Номенклатура.Ссылка = ОстаткиНоменклатурыОстатки.Номенклатура.Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Подразделение", Справочники.Подразделения.ОтделЗакупок); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Движения.ОстаткиНоменклатуры.Записывать = Истина; Пока Выборка.Следующий() Цикл Если Выборка.Количество<=Выборка.КоличествоОстаток Тогда // регистр ОстаткиНоменклатуры Расход По ОтделЗакупок Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Справочники.Подразделения.ОтделЗакупок; Движение.Количество = Выборка.Количество; Движение.Сумма = Выборка.Количество*Выборка.СуммаОстаток/Выборка.КоличествоОстаток; // регистр ОстаткиНоменклатуры Приход По ТорговойТочке Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Подразделение; Движение.Количество = Выборка.Количество; Движение.Сумма = (Выборка.Количество*Выборка.СуммаОстаток/Выборка.КоличествоОстаток)*(Подразделение.ПроцентНадбавки/100); Иначе Сообщить("Товара " + Выборка.Номенклатура + " недостаточно, в наличии " + Выборка.КоличествоОстаток + ", необходимо " + Выборка.Количество + "."); Отказ = истина; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура СписаниеТовара(Отказ) //Установим исключительную блокировку на те записи регистров, по которым осуществляется чтение, а потом - запись //по всем записям как по отделу закупок, так и по торговой точке Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ СписокНоменклатуры |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Количество, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиПоТочке.КоличествоОстаток, 0) КАК КоличествоОстатокПоТочке, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиПоТочке.СуммаОстаток, 0) КАК СуммаОстатокПоТочке, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиПоОтделуЗакупок.КоличествоОстаток, 0) КАК КоличествоОстатокПоОтделуЗакупок |ИЗ | СписокНоменклатуры КАК СписокНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | СписокНоменклатуры.Номенклатура | ИЗ | СписокНоменклатуры) | И Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ОтделЗакупок)) КАК ОстаткиНоменклатурыОстаткиПоОтделуЗакупок | ПО СписокНоменклатуры.Номенклатура.Ссылка = ОстаткиНоменклатурыОстаткиПоОтделуЗакупок.Номенклатура.Ссылка | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | СписокНоменклатуры.Номенклатура | ИЗ | СписокНоменклатуры) | И Подразделение = &Подразделение) КАК ОстаткиНоменклатурыОстаткиПоТочке | ПО СписокНоменклатуры.Номенклатура.Ссылка = ОстаткиНоменклатурыОстаткиПоТочке.Номенклатура.Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Подразделение", Подразделение); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); //Создадим документ перемещение ДокПеремещение = Документы.РасходнаяНакладная.СоздатьДокумент(); ДокПеремещение.Дата = Дата-1; ДокПеремещение.Перемещение=Истина; ДокПеремещение.Подразделение = Подразделение; //Контролируем хватает ли товара на точке, если нет - заполняем докунт на перемещение из отдела закупок Пока Выборка.Следующий() Цикл Если Выборка.Количество<=Выборка.КоличествоОстатокПоТочке+Выборка.КоличествоОстатокПоОтделуЗакупок Тогда Если Выборка.Количество>Выборка.КоличествоОстатокПоТочке Тогда //Товара не хватает на точке, переместить из отдела закупок Товар = ДокПеремещение.СписокНоменклатуры.Добавить(); Товар.Номенклатура = Выборка.Номенклатура; Товар.Количество = Выборка.Количество-Выборка.КоличествоОстатокПоТочке; КонецЕсли; Иначе //Товара нехватает ни на точке ни в отделе закупок Сообщить("Товара " + Выборка.Номенклатура + " недостаточно, в наличии " + (Выборка.КоличествоОстатокПоТочке+Выборка.КоличествоОстатокПоОтделуЗакупок) + ", необходимо " + Выборка.Количество + "."); Отказ = истина; КонецЕсли; КонецЦикла; //Если нужно переместить товар, то проводим документ перемещение Если ДокПеремещение.СписокНоменклатуры.Количество() Тогда ДокПеремещение.Записать(РежимЗаписиДокумента.Проведение); КонецЕсли; Если Не Отказ Тогда //Получим текущие остатки по точке Запрос.Текст = "ВЫБРАТЬ | СписокНоменклатуры.Номенклатура, | СписокНоменклатуры.Количество, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиПоТочке.КоличествоОстаток, 0) КАК КоличествоОстатокПоТочке, | ЕСТЬNULL(ОстаткиНоменклатурыОстаткиПоТочке.СуммаОстаток, 0) КАК СуммаОстатокПоТочке |ИЗ | СписокНоменклатуры КАК СписокНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | СписокНоменклатуры.Номенклатура | ИЗ | СписокНоменклатуры) | И Подразделение = &Подразделение) КАК ОстаткиНоменклатурыОстаткиПоТочке | ПО СписокНоменклатуры.Номенклатура.Ссылка = ОстаткиНоменклатурыОстаткиПоТочке.Номенклатура.Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Подразделение", Подразделение); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Движения.ОстаткиНоменклатуры.Записывать = Истина; Пока Выборка.Следующий() Цикл // регистр ОстаткиНоменклатуры Расход По ТорговойТочке Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Подразделение = Подразделение; Движение.Количество = Выборка.Количество; Движение.Сумма = Выборка.Количество*Выборка.СуммаОстатокПоТочке/Выборка.КоличествоОстатокПоТочке; КонецЦикла; КонецЕсли; КонецПроцедуры Отчет:Дижение товаров пишем запрос: ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Подразделение, ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СуммаНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.СуммаПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход, ОстаткиНоменклатурыОстаткиИОбороты.СуммаРасход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.СуммаКонечныйОстаток ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК ОстаткиНоменклатурыОстаткиИОбороты Группировки Подразделения Детальные записи Параметры НачДата КонДата Задача Решена | |
|
Всего комментариев: 0 | |