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