gifts2017

Контроль возвратов товаров от покупателей для Управление Торговлей 10.3

Опубликовал Иван Дудоров (dud_ivan) в раздел Программирование - Практика программирования

Контроль возвратов был реализован без учета скидок (не было необходимости, дописать возможно).
Контроль осуществлен по следующим критериям:
1. Контроль цены в документе продажи и документе возврата(должна быть одинаковой(!!!скидки не учитываются, требуется дописка)).
2. Контроль на заполнение документа реализации (ДокументПартии).
3. Контроль количества номенклатуры возврата и количества номенклатуры в документе реализации, с учетом уже возвращенного товара.
4. Контроль даты документа. Возврат можно осуществить в течении 15 суток.
5. Контроль наличия номенклатуры в документе реализации.

Код разделён на две части, так как при перепроведении документов(если вдруг кто накатит на существующую конфигурацию) могут возникнуть ошибки по заполнению документов при проведении (наличие документа партии, разница дат не более 15 дней).

На скриншоте 1 отображен контроль осуществляемый оработкой проведения. Документ ЧП00000001 пытаемся провести, документ

ЧП00000002 ранее вернул товар такой же как в документе ЧП00000001 (строка №2).

Строка 3 успешно прошла проверку.

 

 

Пояснения в коде.

В модуле документа ВозвратТоваровОтПокупателя в "ОбработкеПроведения" необходимо прописать следующий код:

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

А так же следующий код в модуле "ФормыДокумента" документа ВозвратТоваровОтПокупателя: 

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Илья Кудашкин (kiv1980) 09.12.14 10:48
Спасибо автору, очень пригодился код, всё работает, проверка количества возвращаемого товара работает на отлично, при наличии огромного количества менеджеров, стало появляться огромное количества возвратов, больше чем положено по реализации, отсюда на складах пересортица. Произвел некоторые манипуляции в первую очередь запретив, проведение возврата больше положенного и пользователям с полными правами.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа