Доработка УТ 11 для учета агентов
1. Определяем предопределенные значения «Торговый агент» в ПВХ «ДополнительныеРеквизитыИСведения» тип Справочники.Партнер.
2. Назначаем его как доп. реквизит в документах «Заказ клиента» и «Реализация товаров и услуг».
3. Создаем независимый непериодический регистр сведений РазмерКомиссииАгента. Измерение ведущее — Партнер, Ресурс — Процент.
4. Создаем регистр накопления РасчетыСАгентами. Измерение — Партнер, Ресурс — Сумма. Регистраторы: РеализацияТоваровУслуг и РКО.
5. Создаем подписку на событие проведения документов РеализацияТоваровУслуг
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваровУслугДополнительныеРеквизиты.Значение КАК Агент,
| &ЗаказКлиента
|ПОМЕСТИТЬ ДокРеализации
|ИЗ
| &ТЧДополнительныеРеквизиты КАК РеализацияТоваровУслугДополнительныеРеквизиты
|ГДЕ
| РеализацияТоваровУслугДополнительныеРеквизиты.Свойство = &СвойствоТорговыйАгент
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ЗаказКлиентаДополнительныеРеквизиты.Значение КАК Агент,
| ЗаказКлиентаДополнительныеРеквизиты.Ссылка
|ПОМЕСТИТЬ ДокЗаказ
|ИЗ
| Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ЗаказКлиентаДополнительныеРеквизиты
|ГДЕ
| ЗаказКлиентаДополнительныеРеквизиты.Свойство = &СвойствоТорговыйАгент
| И ЗаказКлиентаДополнительныеРеквизиты.Ссылка = &ЗаказКлиента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЕСТЬNULL(ДокРеализации.Агент, ДокЗаказ.Агент) КАК Агент
|ПОМЕСТИТЬ ДанныеПоПродажам
|ИЗ
| ДокРеализации КАК ДокРеализации
| ПОЛНОЕ СОЕДИНЕНИЕ ДокЗаказ КАК ДокЗаказ
| ПО ДокРеализации.ЗаказКлиента = ДокЗаказ.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеПоПродажам.Агент,
| ЕСТЬNULL(РазмерКомиссииАгента.Процент, 0) КАК Процент
|ИЗ
| ДанныеПоПродажам КАК ДанныеПоПродажам
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РазмерКомиссииАгента КАК РазмерКомиссииАгента
| ПО ДанныеПоПродажам.Агент = РазмерКомиссииАгента.Партнер»;
Запрос.УстановитьПараметр(«СвойствоТорговыйАгент», ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ТорговыйАгент);
Запрос.УстановитьПараметр(«РеализацияТоваров», Ссылка);
Запрос.УстановитьПараметр(«ЗаказКлиента», ЗаказКлиента);
Запрос.УстановитьПараметр(«ТЧДополнительныеРеквизиты», ДополнительныеРеквизиты.Выгрузить());
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
СуммаВознаграждения = ВыборкаДетальныеЗаписи.Процент * СуммаДокумента/100;
Если СуммаВознаграждения > 0 Тогда
// регистр РасчетыСТорговымиАгентами Приход
Движения.РасчетыСТорговымиАгентами.Записывать = Истина;
Движения.РасчетыСТорговымиАгентами.БлокироватьДляИзменения = Истина;
Движение = Движения.РасчетыСТорговымиАгентами.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Партнер = ВыборкаДетальныеЗаписи.Агент;
Движение.Сумма = СуммаВознаграждения;
КонецЕсли;
КонецЕсли;
и РасходныйКассовыйОрдер
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПрочиеРасходы Тогда
ТаблЗн = РасшифровкаПлатежа.Выгрузить(,»Сумма, СтатьяРасходов, АналитикаРасходов»);
ТаблЗн.Свернуть(«СтатьяРасходов, АналитикаРасходов», «Сумма»);
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РасходныйКассовыйОрдерРасшифровкаПлатежа.АналитикаРасходов КАК Агент,
| РасходныйКассовыйОрдерРасшифровкаПлатежа.Сумма
|ПОМЕСТИТЬ Оплата
|ИЗ
| &ТЧРасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа
|где
| РасходныйКассовыйОрдерРасшифровкаПлатежа.СтатьяРасходов = &СтатьяРасходов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РасчетыСТорговымиАгентамиОстатки.Партнер,
| РасчетыСТорговымиАгентамиОстатки.СуммаОстаток
|ПОМЕСТИТЬ Долг
|ИЗ
| РегистрНакопления.РасчетыСТорговымиАгентами.Остатки(
| &ДатаОстатка,
| Партнер В
| (ВЫБРАТЬ
| Оплата.Агент
| ИЗ
| Оплата КАК Оплата)) КАК РасчетыСТорговымиАгентамиОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Оплата.Агент,
| Оплата.Сумма КАК СуммаОплаты,
| ЕСТЬNULL(Долг.СуммаОстаток, 0) КАК СуммаДолга,
| ПРЕДСТАВЛЕНИЕ(Оплата.Агент) КАК АгентПредставление
|ИЗ
| Оплата КАК Оплата
| ЛЕВОЕ СОЕДИНЕНИЕ Долг КАК Долг
| ПО Оплата.Агент = Долг.Партнер»;
Запрос.УстановитьПараметр(«ДатаОстатка», МоментВремени());
Запрос.УстановитьПараметр(«ТЧРасшифровкаПлатежа», ТаблЗн);
Запрос.УстановитьПараметр(«СтатьяРасходов», ПланыВидовХарактеристик.СтатьиРасходов.ВознаграждениеТорговымАгентам);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.СуммаОплаты > Выборка.СуммаДолга Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = «Оплата агенту » + Выборка.АгентПредставление + » в сумме: » + Формат(Выборка.СуммаОплаты, «ЧДЦ=2″) + » превышает его долг: » + Формат(Выборка.СуммаДолга, «ЧДЦ=2»);
Сообщение.Сообщить();
Отказ = Истина;
Иначе
Если Не Отказ Тогда
// регистр РасчетыСТорговымиАгентами Расход
Движения.РасчетыСТорговымиАгентами.Записывать = Истина;
Движения.РасчетыСТорговымиАгентами.БлокироватьДляИзменения = Истина;
Движение = Движения.РасчетыСТорговымиАгентами.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Партнер = Выборка.Агент;
Движение.Сумма = Выборка.СуммаОплаты;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Где формируется движения по регистру РасчетыСТорговымиАгентами приход по документу РеализацияТоваровУслуг (сумма документа умноженная на соответствующий процент из регистра РазмерКомиссииАгента) и расход по РКО. Проверяем в момент расхода, Вид операции РКО должен быть «Прочие расходы». Статья расходов «ВознаграждениеТорговымАгентам»(предопределенный-ПВХ_СтатьиРасходов) с вариантом распределения «На направления деятельности», аналитика расходов — Партнер. Сумма остатка в регистре по партнеру агенту должна быть больше или равна сумме в документе РКО.
5.1. Заполнение РКО по остаткам задолженности. Создаем предопределенную Справочник.СтатьюДвиженияДенежныхСредств – АгентскиеУслуги(после Указать в предприятии реквизит ХозОперации-СтатьяРасходов). Для отображение кнопки Подобрать по остаткам:
В модуле ДенежныеСредстваСервер.УстановитьВидимостьПодбораПоОстаткамРасчетов
Добавить строку МассивОпераций.Добавить(Перечисления.ХозяйственныеОперации.ПрочиеРасходы);
Затем в модуле формы документа
&НаКлиенте
Процедура ПодборПоОстаткам(Команда)
Если Объект.ХозяйственнаяОперация = ПредопределенноеЗначение(«Перечисление.ХозяйственныеОперации.ПрочиеРасходы») тогда
Если Объект.СтатьяДвиженияДенежныхСредств = ПредопределенноеЗначение(«Справочник.СтатьиДвиженияДенежныхСредств.АгентскиеУслуги»)тогда
ЗаполнитьПоОстаткамЗадолженностиТП();
Объект.СуммаДокумента = Объект.РасшифровкаПлатежа.Итог(«Сумма»);
КонецЕсли;
Иначе ….(код который был)
КонецЕсли;
&НаСервере
Процедура ЗаполнитьПоОстаткамЗадолженностиТП()
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РасчетыСТорговымиАгентамиОстатки.Партнер КАК АналитикаРасходов,
| РасчетыСТорговымиАгентамиОстатки.СуммаОстаток КАК Сумма,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.СтатьиРасходов.ВознаграждениеТорговымАгентам) КАК СтатьяРасходов,
| РасчетыСТорговымиАгентамиОстатки.Партнер.ОсновнойМенеджер.ТекущееПодразделение КАК Подразделение
|ИЗ
| РегистрНакопления.РасчетыСТорговымиАгентами.Остатки КАК РасчетыСТорговымиАгентамиОстатки»;
Результат = Запрос.Выполнить();
Объект.РасшифровкаПлатежа.Загрузить(Результат.Выгрузить());
КонецПроцедуры
Получите понятные самоучители по 1С бесплатно:
6. Создаем подписку на событие обработки заполнения документа РеализацияТоваровУслуг на основании документа ЗаказКлиента, чтобы автоматически заполнить по заказу в реализации значение доп. реквизита «Торговый агент».
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ЗаказКлиентаДополнительныеРеквизиты.НомерСтроки,
| ЗаказКлиентаДополнительныеРеквизиты.Свойство,
| ЗаказКлиентаДополнительныеРеквизиты.Значение,
| ЗаказКлиентаДополнительныеРеквизиты.ТекстоваяСтрока
|ИЗ
| Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ЗаказКлиентаДополнительныеРеквизиты
|ГДЕ
| ЗаказКлиентаДополнительныеРеквизиты.Ссылка = &Ссылка
| И ЗаказКлиентаДополнительныеРеквизиты.Свойство = &Свойство»;
Запрос.УстановитьПараметр(«Ссылка», ДанныеЗаполнения.ДокументОснование);
Запрос.УстановитьПараметр(«Свойство», ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ТорговыйАгент);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовСтрока = ДополнительныеРеквизиты.Добавить();
ЗаполнитьЗначенияСвойств(НовСтрока, ВыборкаДетальныеЗаписи);
КонецЦикла;
7. Создаем отчет в СКД «Расчеты с торговыми агентами» по регистру РасчетыСАгентами.
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Андрей:
я запрос для события «при проведении» написал такой:
ВЫБРАТЬ
ДополнительныеСведения.Объект,
ДополнительныеСведения.Свойство,
ДополнительныеСведения.Значение
ПОМЕСТИТЬ вт_Сведенья
ИЗ
РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
ГДЕ
ДополнительныеСведения.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ТорговыйАгент)
И ВЫБОР
КОГДА &Ссылка В
(ВЫБРАТЬ
ДополнительныеСведения.Объект
ИЗ
РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
ГДЕ
ДополнительныеСведения.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ТорговыйАгент))
ТОГДА ДополнительныеСведения.Объект = &Ссылка
ИНАЧЕ ИСТИНА
КОНЕЦ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЕСТЬNULL(РеализацияТоваровУслуг.Ссылка.СуммаДокумента, 0) / ЕСТЬNULL(РазмерКомиссииАгента.Процент, 0) * 100 КАК Сумма,
РазмерКомиссииАгента.Партнер,
ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
ВЫБОР
КОГДА ЕСТЬNULL(РеализацияТоваровУслуг.Ссылка.СуммаДокумента, 0) / ЕСТЬNULL(РазмерКомиссииАгента.Процент, 0) * 100 > 0
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ КАК Отказ,
&Период,
0 КАК Вознаграждение
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_Сведенья КАК вт_Сведенья
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РазмерКомиссииАгента КАК РазмерКомиссииАгента
ПО вт_Сведенья.Значение = РазмерКомиссииАгента.Партнер
ПО (вт_Сведенья.Объект В (РеализацияТоваровУслуг.Ссылка, РеализацияТоваровУслуг.ЗаказКлиента))
ГДЕ
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(&Ссылка) = ТИП(Документ.РеализацияТоваровУслуг)
ТОГДА РеализацияТоваровУслуг.Ссылка = &Ссылка
ИНАЧЕ ЛОЖЬ
КОНЕЦ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
СУММА(ЕСТЬNULL(РасходныйКассовыйОрдерРасшифровкаПлатежа.Сумма, 0)),
РасходныйКассовыйОрдерРасшифровкаПлатежа.АналитикаРасходов,
ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход),
ВЫБОР
КОГДА ЕСТЬNULL(РасходныйКассовыйОрдерРасшифровкаПлатежа.Сумма, 0) <= ЕСТЬNULL(РасчетыСАгентамиОстатки.СуммаОстаток, 0)
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ,
&Период,
РасчетыСАгентамиОстатки.СуммаОстаток
ИЗ
Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСАгентами.Остатки(&Период, ) КАК РасчетыСАгентамиОстатки
ПО РасходныйКассовыйОрдерРасшифровкаПлатежа.АналитикаРасходов = РасчетыСАгентамиОстатки.Партнер
ГДЕ
РасходныйКассовыйОрдерРасшифровкаПлатежа.СтатьяРасходов = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СтатьиРасходов.ВознаграждениеТорговымПредставителям)
И ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(&Ссылка) = ТИП(Документ.РасходныйКассовыйОрдер)
ТОГДА ВЫБОР
КОГДА РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПрочиеРасходы)
ТОГДА РасходныйКассовыйОрдерРасшифровкаПлатежа.Ссылка = &Ссылка
ИНАЧЕ ЛОЖЬ
КОНЕЦ
КОНЕЦ
СГРУППИРОВАТЬ ПО
РасходныйКассовыйОрдерРасшифровкаПлатежа.АналитикаРасходов,
РасчетыСАгентамиОстатки.СуммаОстаток,
ВЫБОР
КОГДА ЕСТЬNULL(РасходныйКассовыйОрдерРасшифровкаПлатежа.Сумма, 0) <= ЕСТЬNULL(РасчетыСАгентамиОстатки.СуммаОстаток, 0)
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
Тоесть из 2-х запросов и 20 строк кода сделал 1 запрос.
Как считаете? Есть смысл так делать?