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

УТ10.3 - Отчеты о розничных продажах (Возвраты)

Автор AIFrame, 21 сен 2017, 10:44

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

AIFrame

В связи с тем, что по новым ККТ есть установка - Возвраты по продажам, прошедшим не в текущем опер.дне, проводить через ККТ, такие возвраты теперь не создаются связкой документов ВозвратТоваровОтПокупателя + РКО, а проводятся чеком возврата и попадают в Отчет о розничных продажах с отрицательным количеством.
Проблема в том, что при проведении отчета о розничных продажах (Далее ОРП) все товары документа идут со статусом "реализация", в том числе и отрицательные "возвраты". Поэтому строки с отрицательным количеством при прохождении через ОбщийМодуль.УправлениеЗапасамиПартионныйУчет просто игнорируются и необходимого движения прихода не создается. Оперативные остатки, при этом, не страдают от этого, т.к. в оперативном учете остаток может быть отрицательным и там по движению минус на минус дает плюс. Если бы и там было то же самое, можно было бы создать ВозвратОтПокупателя при првоедении и дело с концом.

Наша УТ не обновлена, 10.3.29.1, но даже в обновленной УТ не нашел каких-либо дописок про ОРП и возвраты партий.

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

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

Вот тут не уверен, нужно ли это ИЛИ, т.к. ТребуетсяПолучитьОстатки от этого не меняется. Будем считать, что не нужен, но есть.

А вот здесь уже мое решение проблемы.
// Специфические случаи списания :

// АДМ+++ Отчеты о розничных продажах. Не приходуются возвраты от покупателей в партиях.
Если СтрокаДокумента.Количество < 0 И ТипЗнч(СтрокаДокумента.Регистратор)=Тип("ДокументСсылка.ОтчетОРозничныхПродажах") Тогда
СтрокаДокумента.КодОперацииПартииТоваров = СтруктураПараметров.КодыОпераций.ВозвратОтПокупателя;
СтрокаДокумента.Количество = СтрокаДокумента.Количество * -1;

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


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

//Сообщить("" + СтрокаДокумента.Номенклатура + " : " + СтрокаДокумента.Количество + " ::: " + СтрокаДокумента.КодОперацииПартииТоваров);
КонецЕсли;
// АДМ---

                                // 1. Возврат от покупателя
Если СтрокаДокумента.КодОперацииПартииТоваров = СтруктураПараметров.КодыОпераций.ВозвратОтПокупателя Тогда
                                <...>

Сомневаюсь, что все делаю правильно. Как бы да, если речь идет о рознице, искать партию продажи в нашем случае можно только по другим ОРП и в той же организации и с того же склада.
Приход партии создается, но такое ощущение, что я что-то упускаю.

Теги:

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

Рейтинг@Mail.ru

Поиск