[Специалист профессионал 1С 8.2 8.3 ]

15:09
Задача 1.5
 
и в этой задаче  списание партий будет по фифо лифо,средняя

фиксироваться учетная политика будет отдельным документом  ИзменениеУчетнойПолитики

в этом документе 1 реквизит УчетнаяПолитика = ПеречислениеСсылка.УчетнаяПолитика.

также добавим в  перечисление учетная политика новое значение ПоСредней

1) в приходной код:


 

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиНоменклатуры.Записывать = Истина;
////////////////////////////////////////////////////
УчетнаяПолитика = РегистрыСведений.УчетныеПолитики.ПолучитьПоследнее(МоментВремени(),).УчетнаяПолитика;
////////////////////////////////////////////////////
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Если УчетнаяПолитика = ПредопределенноеЗначение("Перечисление.УчетнаяПолитика.ПоСредней") Тогда
Движение.Партия = Документы.ПриходнаяНакладная.ПустаяСсылка();
Иначе
Движение.Партия = Ссылка;
КонецЕсли;
Движение.Партия = Ссылка;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
Движение.Стоимость = ТекСтрокаСписокНоменклатуры.Сумма;
КонецЦикла;
//////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////
КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры



2) В документе ИзменитьУчетнуюПолитику 

след код:



Процедура ОбработкаПроведения(Отказ, РежимПроведения)
////////////////////////////////////////
Движения.УчетныеПолитики.Записывать = Истина;
Движение = Движения.УчетныеПолитики.Добавить();
Движение.Период = Дата;
Движение.УчетнаяПолитика = УчетнаяПолитика;
///////////////////////////////////////////
Движения.ОстаткиНоменклатуры.Записать();
////////////////////////////////////////////////////////////////////////////////////////////////////////
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
/////////////////////////////////////////////////////////////
Если УчетнаяПолитика = Перечисления.УчетнаяПолитика.ПоСредней Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
| ОстаткиНоменклатурыОстатки.Партия,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
| ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК СтоимостьОстаток
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, ) КАК ОстаткиНоменклатурыОстатки
|ИТОГИ
| СУММА(КоличествоОстаток),
| СУММА(СтоимостьОстаток)
|ПО
| Номенклатура";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаИтог.Следующий() Цикл
/////////////////////////////////////////////////////////////
Движение = Движения.ОстаткиНоменклатуры.ДобавитьПриход();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаИтог.Номенклатура;
Движение.Партия = Документы.ПриходнаяНакладная.ПустаяСсылка();
Движение.Количество = ВыборкаИтог.КоличествоОстаток;
Движение.Стоимость = ВыборкаИтог.СтоимостьОстаток;
///////////////////////////////////////////////////////////
Выборка = ВыборкаИтог.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаИтог.Номенклатура;
Движение.Партия = Выборка.Партия;
Движение.Количество = Выборка.КоличествоОстаток;
Движение.Стоимость = Выборка.СтоимостьОстаток;
КонецЦикла;
КонецЦикла;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
КонецЕсли;
КонецПроцедуры



В документе Расходная пишем след очумелый  код:



Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
/////////////////////////////////////////////////
Движения.ОстаткиНоменклатуры.Записать();
Движения.Продажи.Записать();
/////////////////////////////////////////////////
УчетнаяПолитика = РегистрыСведений.УчетныеПолитики.ПолучитьПоследнее(МоментВремени(), ).УчетнаяПолитика;
/////////////////////////////////////////////////
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Элемент.ИсточникДанных = СписокНоменклатуры;
Элемент.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();
/////////////////////////////////////////////////
Если УчетнаяПолитика = ПредопределенноеЗначение("Перечисление.УчетнаяПолитика.ПоСредней") Тогда
Запрос = ЗапросПоСреднему();
Выборка = Запрос.Выбрать();
Пока Выборка.Следующий() Цикл
Себестоимость = 0;
Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не хватает товара - " + Выборка.Номенклатура + 
".Требуется - " + Выборка.Количество + ", в наличии - " + Выборка.КоличествоОстаток;
Сообщение.Поле = "СписокНоменклатуры[" + (Выборка.НомерСтроки - 1) + "].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
Продолжить;
КонецЕсли;
////////////////////////
Если Отказ Тогда
Возврат;
КонецЕсли;
///////////////////////////////////////////////////////////////////////////////////////////
Если Выборка.ВидНоменклатуры = ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Товар") Тогда
Себестоимость = Выборка.СтоимостьОстаток * Выборка.Количество / Выборка.КоличествоОстаток;
///////////////////////////////////////////////////////////////////////////////////////////
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Партия = Документы.ПриходнаяНакладная.ПустаяСсылка();
Движение.Количество = Выборка.Количество;
Движение.Стоимость = Себестоимость;
//////////////////////////////////////////////////////////////
КонецЕсли;
//////////////////////////////////////////////////////////
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Количество = Выборка.Количество;
Движение.Себестоимость = Себестоимость;
Движение.Продажа = Выборка.Сумма;
/////////////////////////////////////////////////////////
КонецЦикла;
Иначе
Если УчетнаяПолитика = ПредопределенноеЗначение("Перечисление.УчетнаяПолитика.ФИФО") Тогда
Упорядочивание = "ВОЗР";
ИначеЕсли УчетнаяПолитика = ПредопределенноеЗначение("Перечисление.УчетнаяПолитика.ЛИФО") Тогда
Упорядочивание = "УБЫВ";
КонецЕсли;
/////////////////////////////////////////////
Запрос = ЗапросПоФИФОЛИФО(Упорядочивание);
ВыборкаИтог = Запрос.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаИтог.Следующий() Цикл
Нехватка =ВыборкаИтог.Количество - ВыборкаИтог.КоличествоОстаток;
СебестоимостьИтоговая = 0;
Если ВыборкаИтог.ВидНоменклатуры = ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Товар") Тогда
Если ВыборкаИтог.Количество > ВыборкаИтог.КоличествоОстаток Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не хватает товара - " + (ВыборкаИтог.Номенклатура) + 
" в количестве - " + Нехватка;
Сообщение.Поле = "СписокНоменклатуры[" + (ВыборкаИтог.НомерСтроки - 1) + "].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
Продолжить;
КонецЕсли;
//////////////////////////////
Если Отказ Тогда
Возврат;
КонецЕсли;
///////////////////////////////////
КСписанию = ВыборкаИтог.Количество;
///////////////////////////////////
Выборка = ВыборкаИтог.Выбрать();
Пока Выборка.Следующий() И КСписанию > 0 Цикл
Списать = Мин(КСписанию, Выборка.КоличествоОстаток);
Себестоимость = Выборка.СтоимостьОстаток * Списать / Выборка.КоличествоОстаток;
////////////////////////////////////////////////////////////////////////////////
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Партия = Выборка.Партия;
Движение.Количество = Списать;
Движение.Стоимость = Себестоимость;
///////////////////////////////////////////////////////////////
КСписанию = КСписанию - Списать;
СебестоимостьИтоговая = СебестоимостьИтоговая + Себестоимость;
///////////////////////////////////////////////////////////////
КонецЦикла;
КонецЕсли;
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаИтог.Номенклатура;
Движение.Количество = ВыборкаИтог.Количество;
Движение.Себестоимость = СебестоимостьИтоговая;
Движение.Продажа = ВыборкаИтог.Сумма;
КонецЦикла;
КонецЕсли;
/////////////////////////////////////////////////
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Продажи.Записывать = Истина;
/////////////////////////////////////////////////
КонецПроцедуры

Функция ЗапросПоСреднему()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
              | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
              | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
              | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,
              | МАКСИМУМ(РасходнаяНакладнаяСписокНоменклатуры.НомерСтроки) КАК НомерСтроки
              |ПОМЕСТИТЬ ДокТЧ
              |ИЗ
              | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
              |ГДЕ
              | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
              |
              |СГРУППИРОВАТЬ ПО
              | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
              |
              |ИНДЕКСИРОВАТЬ ПО
              | Номенклатура,
              | НомерСтроки
              |;
              |
              |////////////////////////////////////////////////////////////////////////////////
              |ВЫБРАТЬ
              | ДокТЧ.Номенклатура,
              | ДокТЧ.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
              | ДокТЧ.Количество,
              | ДокТЧ.Сумма,
              | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
              | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток,
              | ДокТЧ.НомерСтроки
              |ИЗ
              | ДокТЧ КАК ДокТЧ
              | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
              | &МоментВремени,
              | Номенклатура В
              | (ВЫБРАТЬ
              | Т.Номенклатура
              | ИЗ
              | ДокТЧ КАК Т)) КАК ОстаткиНоменклатурыОстатки
              | ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса;
/////////////////////////////////////////////////
КонецФункции // ЗапросПоСреднему()

 Функция ЗапросПоФИФОЛИФО(Упорядочивание)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
              | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
              | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
              | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,
              | МАКСИМУМ(РасходнаяНакладнаяСписокНоменклатуры.НомерСтроки) КАК НомерСтроки
              |ПОМЕСТИТЬ ДокТЧ
              |ИЗ
              | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
              |ГДЕ
              | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
              |
              |СГРУППИРОВАТЬ ПО
              | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
              |
              |ИНДЕКСИРОВАТЬ ПО
              | Номенклатура,
              | НомерСтроки
              |;
              |
              |////////////////////////////////////////////////////////////////////////////////
              |ВЫБРАТЬ
              | ДокТЧ.Номенклатура КАК Номенклатура,
              | ДокТЧ.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
              | ДокТЧ.Количество КАК Количество,
              | ДокТЧ.Сумма КАК Сумма,
              | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
              | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток,
              | ДокТЧ.НомерСтроки КАК НомерСтроки,
              | ОстаткиНоменклатурыОстатки.Партия
              |ИЗ
              | ДокТЧ КАК ДокТЧ
              | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
              | &МоментВремени,
              | Номенклатура В
              | (ВЫБРАТЬ
              | Т.Номенклатура
              | ИЗ
              | ДокТЧ КАК Т)) КАК ОстаткиНоменклатурыОстатки
              | ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
              |
              |УПОРЯДОЧИТЬ ПО
              | ОстаткиНоменклатурыОстатки.Партия.Дата УБЫВ
              |ИТОГИ
              | МАКСИМУМ(Количество),
              | МАКСИМУМ(Сумма),
              | СУММА(КоличествоОстаток),
              | СУММА(СтоимостьОстаток),
              | МАКСИМУМ(НомерСтроки)
              |ПО
              | Номенклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
//////////////////////////////////////////////////////////////////
Запрос.Текст = СтрЗаменить(Запрос.Текст, "УБЫВ", Упорядочивание);
//////////////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса;
////////////////////////////////////////////////////////////////////
КонецФункции // ЗапросПоФИФОЛИФО()



Отчеты снова такие же как в задачах 1.1 1.2 

Задача решена.

Просмотров: 3989 | Добавил: moshefoo | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *: