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