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

17.01.13

Разработка - Механизмы типовых конфигураций

Контроль возвратов был реализован без учета скидок (не было необходимости, дописать возможно).
Контроль осуществлен по следующим критериям:
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С 8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данное расширение — это механизм, сделанный при помощи двух модулей из БСП (3.1.11.415), который позволяет динамически добавлять команды (кнопки и не только при желании) на формы управляемого приложения без изменения конфигурации. На примере данного механизма удобно рассмотреть некоторые возможности для расширения функционала объектов, которые подключены к механизму библиотеки стандартных подсистем.

1 стартмани

20.03.2026    835    InFlach    0    

7

Механизмы типовых конфигураций Программист Стажер 1С 8.3 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)

Интервальные регистры в 1С:ЗУП 3.1 заменяют тяжелые срезы последних, ускоряя отчеты по кадровым данным через интервалы ДатаНачала–ДатаОкончания. Разбираем отличия, примеры кода, плюсы и способы синхронизации.

12.03.2026    2261    AlexeyPROSTO_1C    4    

20

Механизмы типовых конфигураций Программист Стажер 1С 8.3 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)

Как в ЗУП работает механизм расстановки времени в регистрах сведений с помощью подписки на события?Рассматривается логика сдвигов для разных типов документов (прием, увольнение, отпуск) и дается инструкция по подключению нового регистра к этому механизму.

03.03.2026    1045    YA_1100893639    1    

7

Механизмы типовых конфигураций Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

В статье рассматривается подход к программной модификации параметров команды внешней обработки заполнения объекта так, чтобы в момент вызова из формы объекта (табличной части документа) она использовалась для открытия вспомогательной формы диалога, а после закрытия вспомогательной формы диалога она использовалась для заполнения объекта (табличной части документа) уже на сервере с контекстом формы документа с использованием введенных данных во вспомогательной форме диалога.

11.08.2025    7272    user1988284    0    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kiv8008 09.12.14 10:48 Сейчас в теме
Спасибо автору, очень пригодился код, всё работает, проверка количества возвращаемого товара работает на отлично, при наличии огромного количества менеджеров, стало появляться огромное количества возвратов, больше чем положено по реализации, отсюда на складах пересортица. Произвел некоторые манипуляции в первую очередь запретив, проведение возврата больше положенного и пользователям с полными правами.
2. user1590105 04.09.21 08:59 Сейчас в теме
Помогите, пожалуйста. У меня выдаёт кучу ошибок на этот код:

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4411,1)}: Переменная не определена (Запрос)
<<?>>Запрос.Текст ="ВЫБРАТЬ (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4423,1)}: Переменная не определена (Запрос)
<<?>>Запрос.УстановитьПараметр("Ссылка",Эл.ДокументПартии); (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4424,1)}: Переменная не определена (Запрос)
<<?>>Запрос.УстановитьПараметр("Номенклатура",Эл.Номенклатура); (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4425,13)}: Переменная не определена (Запрос)
Результат = <<?>>Запрос.Выполнить().Выбрать(); //Запрос на наличие товара в документе партии, если есть то при каких ценах продавалось тоже известно. (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4434,1)}: Переменная не определена (Запрос)
<<?>>Запрос.Текст = "ВЫБРАТЬ (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4450,1)}: Переменная не определена (Запрос)
<<?>>Запрос.УстановитьПараметр("Ссылка",Ссылка); (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4451,1)}: Переменная не определена (Запрос)
<<?>>Запрос.УстановитьПараметр("Номенклатура",Эл.Номенклатура); (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4452,1)}: Переменная не определена (Запрос)
<<?>>Запрос.УстановитьПараметр("ДокументПартии",Эл.ДокументПартии); (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4453,1)}: Переменная не определена (Запрос)
<<?>>Запрос.УстановитьПараметр("Цена",Результат.Цена); (Проверка: Толстый клиент (обычное приложение))

{Документ.ВозвратТоваровОтПокупателя.МодульОбъекта(4454,14)}: Переменная не определена (Запрос)
Результат2 = <<?>>Запрос.Выполнить().Выбрать(); //Запрос на проведённые возвраты, не учитывая текущий документ, с текущей номенклтурой, ценой и документом партии (Проверка: Толстый клиент (обычное приложение))

Код скопировал и вставил в модуль как в описании. База УТП 1.2
Для отправки сообщения требуется регистрация/авторизация