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