Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
13 дек 2024, 06:48

Отчет остатки товаров на складах

Автор Дмитрий357, 17 окт 2021, 10:38

0 Пользователей и 1 гость просматривают эту тему.

Дмитрий357

Добрый день! Имеется два документа ПоступлениеТоваров и РеализацияТоваров. Оба они делают движения по регистру накопления ТоварыНаСкладах, имеющий измерения Номенклатура, Партия (ссылка на документ ПоступлениеТоваров), Склад и ресурсы Количество, Сумма, Себестоимость (возможен не нужен, будет понятно при ответах на эту тему). В документе ПоступлениеТоваров код движения выглядит так:

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Валюта", Валюта);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Партия = Ссылка;
Движение.Сумма = ВыборкаДетальныеЗаписи.Стоимость*ЗначениеКурсаВалютКлиентСервер.РассчитатьПоКурсу(Валюта,Дата);
Движение.Склад=Склад;
Движение.Количество=ВыборкаДетальныеЗаписи.Количество;

В документе РеализацияТоваров так:

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

Запрос.УстановитьПараметр("МоментВремени", МоментВремени ());
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Валюта", Валюта);

РезультатЗапроса = Запрос.Выполнить();
                                                                 
ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаНоменклатура.Следующий() Цикл
Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда
Сообщить ("Недостаточно товара " + ВыборкаНоменклатура.НоменклатураПредставление + ". Недостаточно "+(ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток)+" шт.");
Отказ = Истина;
КонецЕсли;
Если Не Отказ Тогда
ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
ОсталосьСписать = ВыборкаНоменклатура.Количество;
    Пока ВыборкаДетальныеЗаписи.Следующий() И ОсталосьСписать>0 Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Склад=Склад;   
Движение.Количество = мин(ОсталосьСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток);
Если Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстаток*ЗначениеКурсаВалютКлиентСервер.РассчитатьПоКурсу(Валюта, Дата);
Иначе
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*Движение.Количество*ЗначениеКурсаВалютКлиентСервер.РассчитатьПоКурсу(Валюта, Дата);
КонецЕсли;
Движение.Партия=ВыборкаДетальныеЗаписи.Партия;
ОсталосьСписать=ОсталосьСписать-Движение.Количество;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Необходимо создать Отчет остатки товаров на складах с колонками: Склад, Номенклатура, Штрихкод (берется из регистра сведений Штрихкоды), Партия, Количество, Себестоимость. Что должно содержаться в колонке себестоимости? Как она рассчитывается? Какие изменения надо внести в код двух документов? Может ли в колонке себестоимость быть отрицательное число? Не могу понять, помогите.

alexandr_ll

Дмитрий357, Себестоимость - это значение ресурса "Сумма" регистра накопления "Товары на складах". рассчитывать - запросом. В случае нарушения последовательности документов может получиться отрицательное значение. При ведении валютного учета необходимо учитывать суммовую разницу из-за изменения курса валюты.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск