Вопрос № 89949: Здравствуйте! 1с7.7.Компонента"Бухучет"
Проблема такая. Учет контрагентов нужен по принципу сетевого маркетинга.В спр контраг ввела новый реквизит типа спр.Контр-КодРодителя, это тот,кто привел в структуру этого текущего. Самый верхний-...
Вопрос № 89.949
Здравствуйте! 1с7.7.Компонента"Бухучет"
Проблема такая. Учет контрагентов нужен по принципу сетевого маркетинга.В спр контраг ввела новый реквизит типа спр.Контр-КодРодителя, это тот,кто привел в структуру этого текущего. Самый верхний- без кода родителя, все остальные друг под другом, под одним может быть несколько. В конце месяца расчет бонуса. В зависимости от объёма продаж всей структуры под каждым контрагентом распределение в проц. соотношении. Т.е. надо найти объем продаж всей структуры каждого контрагента. Смогла только найти обороты струкруры
непосредсвенно под каждым(первого уровня), дальше никак. Может есть готовые решения, или хоть алгоритм подскажите,please!!
Приложение:
Отправлен: 04.06.2007, 14:00
Вопрос задала: Olia (статус: Посетитель)
Всего ответов: 5 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Dmitry Stashenko
Здравствуйте, Olia!
Готового решения к сожаленью нет:(
Что если в справочник.контрагенты ввести еще КодСамогоВерхнегоРодителя (это родоначальник ветки) и НомерУровня (это уровень лесницы, на котором находится контр, т.е. родоначальник на 1-м, те которых он привел - на 2-м и т.д). Таким образом делая выборку по контру мы можем увидеть родоначальника и сделать анализ продаж контрами с таким же родоначальником. А номер уровня нужен напрмер для того, чтобы знать какой % начислять).
Кстати, если не принципиально КОДродителя, то можно сделать просто Родителя (контра). Просто для лучшей визуализации, удобнее же видеть самого контра, нежели его код
Удачи
Ответ отправил: Dmitry Stashenko (статус: 3-ий класс)
Ответ отправлен: 04.06.2007, 15:16
Отвечает: Elric
Здравствуйте, Olia!
Используйте рекурсию. У Вас есть "цепочки" контрагентов, идите по этому пути. Рассчитайте сначала обороты первого уровня (это Вы сделали), затем у каждого из первого уровня есть ссылка на предыдущий уровень -- повторите аналогичную операцию для них, и т.д. пока ссылок на более верхние уровни уже не останется. Не пытайтесь раскрутить все "за один присест", подымайтесь вверх по структуре шаг за шагом :)
--------- Мирный атом в КАЖДЫЙ дом!
Ответ отправил: Elric (статус: Специалист)
Ответ отправлен: 04.06.2007, 15:56
Отвечает: Ovr1970
Здравствуйте, Olia!
С помощью структуры справочника не получится. Самое главное - это ограничение на количество уровней (максимум 10)
Проще это сделать с помощью подчиненного справочника, в который записывать подчиненных контрагентов (как ссылки на родительский справочник). Естественно в подчиненном справочнике нужно включить уникальность элементов во всем справочнике (для того, чтобы один и тот же контрагент не был выбран дважды).
Дальше пишется процедура (типа рекурсивная), которая по одному родительскому элементу вытаскивает список всех подчиненных.
По полученному списку считаете обороты - все.
Ответ отправил: Ovr1970 (статус: Практикант)
Ответ отправлен: 04.06.2007, 19:57
Отвечает: Шахрайчук Владимир Анатольевич
Здравствуйте, Olia!
Я предлагаю никаких изменений в структуре базы не делать, а обработку добавить так:
1.
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Покупатель");
ТЗ.НоваяКолонка("ЕгоОбороты");
ТЗ.НоваяКолонка("ОборотыПодчиненных1гоуровня");
ТЗ.НоваяКолонка("ОборотыПодчиненных2гоуровня");
2.После того, как заполните ЕгоОбороты, заполняете обороты родителей.
Для Сч=1 По Тз.КоличествоСтрок()=1 Цикл
ТЗ.ПолучитьСтрокуПоНомеру(Сч);
Род=ТЗ.Покупатель.КодРодителя;
Обор=ТЗ.ЕгоОбороты;
Стр=0;
Если ТЗ.НайтиЗначение(Род,Стр,"Покупатель")=1 Тогда
ТЗ.ПолучитьСтрокуПоНомеру(Стр);
ТЗ.ОборотыПодчиненных1гоуровня=ТЗ.ОборотыПодчиненных1гоуровня+Обор
и добавить родителю обороты 1го уровня. От него дальше строить цепочку.
КонецЦикла;
Обратите внимаие, я тут использую цикл Для не зря. Таблица значений внутри цикла постоянно скачет от одного покупателя к другому, к его родителям и т.д. наверх, для того чтобы не сбиться с позиционированием, делается цикл Для.
Отвечает: Игорь К.
Здравствуйте, Olia!
Допустим Контрагент А привел Контрагента B, тот в свою очередь привел Контрагента С.
Контр. С заработал Х денег.
Тогда А и Б тоже заработали по Х денег.
Контр. B заработал заработал Y денег.
Тогда А тоже заработал по Y денег.
Правильно понял?
Тогда Вам нужен еще один цикл.
-------------------------------------------
Если ПустоеЗначение(Би.КорСубконто().КодРодителя)=0 Тогда
тмпКонтра=Би.КорСубконто().КодРодителя;
Пока ПустоеЗначение(тмпКонтра.КодРодителя)=0 Цикл
ТЗ.НоваяСтрока();
ТЗ.Покупатель=тмпКонтра.КодРодителя;
ТЗ.ЕгоОбороты=Би.КорДО();
тмпКонтра=тмпКонтра.КодРодителя;
КонецЦикла;
КонецЕсли;
-------------------------------------------
Не зная как в вашем случае расчитываеся бонус,
предположил что каждый продавец оставляет у себя 50% выручки, остальное отдает "родителю".
Тот в свою очередь оставляет себе половину - остальное отдает выше по иерархии.
Самый верхний оставляет всю полученную сумму себе т.к. "родителя" у него нет.
код в приложении.
Поле Сумма - реально сумма которая ему приходится.
Попробуйте так. Удачи!
Приложение:
--------- Лучше два часа потерять, потом за пять минут долететь
Ответ отправил: Игорь К. (статус: 4-ый класс)
Ответ отправлен: 05.06.2007, 08:50