15:09 Задача 1.5 | |
и в этой задаче списание партий будет по фифо лифо,средняя фиксироваться учетная политика будет отдельным документом ИзменениеУчетнойПолитики в этом документе 1 реквизит УчетнаяПолитика = ПеречислениеСсылка.УчетнаяПолитика. также добавим в перечисление учетная политика новое значение ПоСредней 1) в приходной код: Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОстаткиНоменклатуры.Записывать = Истина; //////////////////////////////////////////////////// УчетнаяПолитика = РегистрыСведений.УчетныеПолитики.ПолучитьПоследнее(МоментВремени(),).УчетнаяПолитика; //////////////////////////////////////////////////// Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Если УчетнаяПолитика = ПредопределенноеЗначение("Перечисление.УчетнаяПолитика.ПоСредней") Тогда Движение.Партия = Документы.ПриходнаяНакладная.ПустаяСсылка(); Иначе Движение.Партия = Ссылка; КонецЕсли; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; ////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// КонецПроцедуры Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры 2) В документе ИзменитьУчетнуюПолитику след код: Процедура ОбработкаПроведения(Отказ, РежимПроведения) //////////////////////////////////////// Движения.УчетныеПолитики.Записывать = Истина; Движение = Движения.УчетныеПолитики.Добавить(); Движение.Период = Дата; Движение.УчетнаяПолитика = УчетнаяПолитика; /////////////////////////////////////////// Движения.ОстаткиНоменклатуры.Записать(); //////////////////////////////////////////////////////////////////////////////////////////////////////// Блокировка = Новый БлокировкаДанных; Элемент = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); Элемент.Режим = РежимБлокировкиДанных.Исключительный; Блокировка.Заблокировать(); ///////////////////////////////////////////////////////////// Если УчетнаяПолитика = Перечисления.УчетнаяПолитика.ПоСредней Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.Партия, | ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК СтоимостьОстаток |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, ) КАК ОстаткиНоменклатурыОстатки |ИТОГИ | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); РезультатЗапроса = Запрос.Выполнить(); ВыборкаИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаИтог.Следующий() Цикл ///////////////////////////////////////////////////////////// Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаИтог.Номенклатура; Движение.Партия = Документы.ПриходнаяНакладная.ПустаяСсылка(); Движение.Количество = ВыборкаИтог.КоличествоОстаток; Движение.Стоимость = ВыборкаИтог.СтоимостьОстаток; /////////////////////////////////////////////////////////// Выборка = ВыборкаИтог.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаИтог.Номенклатура; Движение.Партия = Выборка.Партия; Движение.Количество = Выборка.КоличествоОстаток; Движение.Стоимость = Выборка.СтоимостьОстаток; КонецЦикла; КонецЦикла; Движения.ОстаткиНоменклатуры.Записывать = Истина; КонецЕсли; КонецПроцедуры В документе Расходная пишем след очумелый код: Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма"); КонецПроцедуры Процедура ОбработкаПроведения(Отказ, РежимПроведения) ///////////////////////////////////////////////// Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записать(); ///////////////////////////////////////////////// УчетнаяПолитика = РегистрыСведений.УчетныеПолитики.ПолучитьПоследнее(МоментВремени(), ).УчетнаяПолитика; ///////////////////////////////////////////////// Блокировка = Новый БлокировкаДанных; Элемент = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); Элемент.Режим = РежимБлокировкиДанных.Исключительный; Элемент.ИсточникДанных = СписокНоменклатуры; Элемент.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); ///////////////////////////////////////////////// Если УчетнаяПолитика = ПредопределенноеЗначение("Перечисление.УчетнаяПолитика.ПоСредней") Тогда Запрос = ЗапросПоСреднему(); Выборка = Запрос.Выбрать(); Пока Выборка.Следующий() Цикл Себестоимость = 0; Если Выборка.Количество > Выборка.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не хватает товара - " + Выборка.Номенклатура + ".Требуется - " + Выборка.Количество + ", в наличии - " + Выборка.КоличествоОстаток; Сообщение.Поле = "СписокНоменклатуры[" + (Выборка.НомерСтроки - 1) + "].Количество"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; //////////////////////// Если Отказ Тогда Возврат; КонецЕсли; /////////////////////////////////////////////////////////////////////////////////////////// Если Выборка.ВидНоменклатуры = ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Товар") Тогда Себестоимость = Выборка.СтоимостьОстаток * Выборка.Количество / Выборка.КоличествоОстаток; /////////////////////////////////////////////////////////////////////////////////////////// Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Партия = Документы.ПриходнаяНакладная.ПустаяСсылка(); Движение.Количество = Выборка.Количество; Движение.Стоимость = Себестоимость; ////////////////////////////////////////////////////////////// КонецЕсли; ////////////////////////////////////////////////////////// Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Количество = Выборка.Количество; Движение.Себестоимость = Себестоимость; Движение.Продажа = Выборка.Сумма; ///////////////////////////////////////////////////////// КонецЦикла; Иначе Если УчетнаяПолитика = ПредопределенноеЗначение("Перечисление.УчетнаяПолитика.ФИФО") Тогда Упорядочивание = "ВОЗР"; ИначеЕсли УчетнаяПолитика = ПредопределенноеЗначение("Перечисление.УчетнаяПолитика.ЛИФО") Тогда Упорядочивание = "УБЫВ"; КонецЕсли; ///////////////////////////////////////////// Запрос = ЗапросПоФИФОЛИФО(Упорядочивание); ВыборкаИтог = Запрос.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаИтог.Следующий() Цикл Нехватка =ВыборкаИтог.Количество - ВыборкаИтог.КоличествоОстаток; СебестоимостьИтоговая = 0; Если ВыборкаИтог.ВидНоменклатуры = ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Товар") Тогда Если ВыборкаИтог.Количество > ВыборкаИтог.КоличествоОстаток Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не хватает товара - " + (ВыборкаИтог.Номенклатура) + " в количестве - " + Нехватка; Сообщение.Поле = "СписокНоменклатуры[" + (ВыборкаИтог.НомерСтроки - 1) + "].Количество"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; Продолжить; КонецЕсли; ////////////////////////////// Если Отказ Тогда Возврат; КонецЕсли; /////////////////////////////////// КСписанию = ВыборкаИтог.Количество; /////////////////////////////////// Выборка = ВыборкаИтог.Выбрать(); Пока Выборка.Следующий() И КСписанию > 0 Цикл Списать = Мин(КСписанию, Выборка.КоличествоОстаток); Себестоимость = Выборка.СтоимостьОстаток * Списать / Выборка.КоличествоОстаток; //////////////////////////////////////////////////////////////////////////////// Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Партия = Выборка.Партия; Движение.Количество = Списать; Движение.Стоимость = Себестоимость; /////////////////////////////////////////////////////////////// КСписанию = КСписанию - Списать; СебестоимостьИтоговая = СебестоимостьИтоговая + Себестоимость; /////////////////////////////////////////////////////////////// КонецЦикла; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаИтог.Номенклатура; Движение.Количество = ВыборкаИтог.Количество; Движение.Себестоимость = СебестоимостьИтоговая; Движение.Продажа = ВыборкаИтог.Сумма; КонецЦикла; КонецЕсли; ///////////////////////////////////////////////// Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; ///////////////////////////////////////////////// КонецПроцедуры Функция ЗапросПоСреднему() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | МАКСИМУМ(РасходнаяНакладнаяСписокНоменклатуры.НомерСтроки) КАК НомерСтроки |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДокТЧ.Номенклатура, | ДокТЧ.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, | ДокТЧ.Количество, | ДокТЧ.Сумма, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ДокТЧ.НомерСтроки |ИЗ | ДокТЧ КАК ДокТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ДокТЧ КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); РезультатЗапроса = Запрос.Выполнить(); Возврат РезультатЗапроса; ///////////////////////////////////////////////// КонецФункции // ЗапросПоСреднему() Функция ЗапросПоФИФОЛИФО(Упорядочивание) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | МАКСИМУМ(РасходнаяНакладнаяСписокНоменклатуры.НомерСтроки) КАК НомерСтроки |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, | НомерСтроки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДокТЧ.Номенклатура КАК Номенклатура, | ДокТЧ.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, | ДокТЧ.Количество КАК Количество, | ДокТЧ.Сумма КАК Сумма, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток, | ДокТЧ.НомерСтроки КАК НомерСтроки, | ОстаткиНоменклатурыОстатки.Партия |ИЗ | ДокТЧ КАК ДокТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | Т.Номенклатура | ИЗ | ДокТЧ КАК Т)) КАК ОстаткиНоменклатурыОстатки | ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.Дата УБЫВ |ИТОГИ | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток), | МАКСИМУМ(НомерСтроки) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); ////////////////////////////////////////////////////////////////// Запрос.Текст = СтрЗаменить(Запрос.Текст, "УБЫВ", Упорядочивание); ////////////////////////////////////////////////////////////////// РезультатЗапроса = Запрос.Выполнить(); Возврат РезультатЗапроса; //////////////////////////////////////////////////////////////////// КонецФункции // ЗапросПоФИФОЛИФО() Отчеты снова такие же как в задачах 1.1 1.2 Задача решена. | |
|
Всего комментариев: 0 | |