|
Родитель Группа + подгруппы... | ☑ | ||
---|---|---|---|---|
0
OrenDi
26.09.17
✎
13:50
|
Здравствуйте.
Ситуация в следующем: есть справочник номенклатура, в нем соответственно группы товаров в этих группах может быть множество подгрупп с номенклатурой. У группы или подгруппы можно задать %наценки, но этот процент работает только на номенклатуру которая находится в этой группе, т.е. если у нас еще в этой группе есть несколько подгрупп то на наценка на эти подгруппы не распространяется хотя родитель та группа на которую я установил наценку. Как сделать что бы наценка распространялось не только на номенклатуру в этой группе, но и + на все подгруппы с номенклатурой в этой группе? Благодарю за помощь! Через отладку отслеживаю как запросы идут (обработка наценки), вот один из них: ТПодр=Новый ТаблицаЗначений; ТПодр.Колонки.Добавить("Подразделение"); //НС=ТПодр.Добавить(); СП=vСписок("ПодразделенияДляАвтоматическогоРасчётаЦен"); Если СП.Количество()>0 Тогда Для н=0 По СП.Количество()-1 Цикл НС=ТПодр.Добавить(); НС.Подразделение=СП.Получить(н).Значение; КонецЦикла; Иначе НС=ТПодр.Добавить(); НС.Подразделение=Шоссейная; КонецЕсли; н=0; Для каждого ТС Из ТТовары Цикл Если ТС.Номенклатура.Статус.Наценка<>0 Тогда Для каждого ТТС Из ТПодр Цикл НС=ТЗ.Добавить(); НС.Номенклатура=ТС.Номенклатура; НС.Подразделение=ТТС.Подразделение; НС.НаценкаСтатус=ТС.Номенклатура.Статус.Наценка; НС.НаценкаГруппы=ТС.Номенклатура.Родитель.ПроцентНаценки; НС.Наценка=ТС.Номенклатура.ПроцентНаценки; НС.Н=н; н=н+1; КонецЦикла; Иначе ТНП=ПолучитьНаценкиПоПодразделениям(ТС.Номенклатура); Для каждого ТТС Из ТНП Цикл Если ТТС.ПроцентНаценки+ТС.Номенклатура.Статус.Наценка+ТС.Номенклатура.Родитель.ПроцентНаценки+ТС.Номенклатура.ПроцентНаценки=0 Тогда Продолжить; КонецЕсли; НС=ТЗ.Добавить(); НС.Номенклатура=ТС.Номенклатура; НС.Подразделение=ТТС.Подразделение; НС.НаценкаПоПодразделению=ТТС.ПроцентНаценки; НС.НаценкаСтатус=ТС.Номенклатура.Статус.Наценка; НС.НаценкаГруппы=ТС.Номенклатура.Родитель.ПроцентНаценки; НС.Наценка=ТС.Номенклатура.ПроцентНаценки; НС.Н=н; н=н+1; КонецЦикла; КонецЕсли; КонецЦикла; //ТПодр=ТЗ.Скопировать(); //ТПодр.Свернуть("Подразделение",); Для каждого ТекПодр Из ТПодр Цикл //ИЦ=ПолучитьИзменениеЦен(ТекПодр.Подразделение); ИЦ=Документы.ИзменениеЦен.СоздатьДокумент(); Если ИЦ.Товары.Количество()>0 Тогда ИЦ.Товары.Очистить(); КонецЕсли; ИЦ.Дата=ТекущаяДата(); ИЦ.Организация=ТекПодр.Подразделение.Организация; ИЦ.ПодразделениеКомпанииПолучатель=ТекПодр.Подразделение; ИЦ.ОбработкаЗаполнения(Док.Ссылка); ИЦ.ДатаНачалаДействия=ТекущаяДата(); ИЦ.ОкруглятьДо=vЗначение("ЦеныОкруглятьДо", 5); ИЦ.ДокументОснование=Док.Ссылка; ИЦ.Комментарий="#Создан при проведении поступления товаров"; ИЦ.ПодразделениеКомпанииПолучатель=ТекПодр.Подразделение; Отбор = Новый Структура(); Отбор.Вставить("Подразделение",ТекПодр.Подразделение); Строки = ТЗ.НайтиСтроки(Отбор); Если Строки.Количество() > 0 Тогда //ИЦ.ПодразделениеКомпанииПолучатель=ТекПодр.Подразделение; нКол=ИЦ.Товары.Количество()-1; Для н=0 По нКол Цикл ТС=ИЦ.Товары[нКол-н]; Индекс=Неопределено; Для нн=0 По Строки.ВГраница() Цикл ТекСтр=Строки[нн]["Номенклатура"]; Если ТекСтр=ТС.Номенклатура Тогда Индекс=Строки[нн]["Н"]; Прервать; КонецЕсли; КонецЦикла; //Индекс=Строки.Найти(ТС.Номенклатура); Если Индекс=Неопределено Тогда ИЦ.Товары.Удалить(нКол-н); Иначе Пр=ТЗ[Индекс]; Если Пр.НаценкаСтатус=0 Тогда Если Пр.НаценкаПоПодразделению=0 Тогда Если Пр.Наценка=0 Тогда ТС.ПроцентНаценки=Пр.НаценкаГруппы; Иначе ТС.ПроцентНаценки=Пр.Наценка; КонецЕсли; Иначе ТС.ПроцентНаценки=Пр.НаценкаПоПодразделению; КонецЕсли; Иначе ТС.ПроцентНаценки=Пр.НаценкаСтатус; КонецЕсли; ТС.Цена = ТС.ЦенаБазовая+((ТС.ЦенаБазовая*ТС.ПроцентНаценки)/100); ТС.Цена = Окр(ТС.Цена, 2, РежимОкругления.Окр15как20); Если ТС.Цена>vЗначение("ПорогЦены", 0) Тогда ДельтаОкругления = ?(ИЦ.ОкруглятьДо=0,0,ТС.Цена/ИЦ.ОкруглятьДо); ДельтаОкругленияЦел = Цел(ДельтаОкругления); Если ДельтаОкругления<>ДельтаОкругленияЦел Тогда ТС.Цена = (ДельтаОкругленияЦел+1)*ИЦ.ОкруглятьДо; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; //Форма=ИЦ.ПолучитьФорму("ФормаДокумента"); //Форма.ОткрытьМодально(); Попытка ИЦ.Записать(РежимЗаписиДокумента.Запись); //Состояние(ИЦ.Ссылка); ИЦ.Записать(РежимЗаписиДокумента.Проведение); Исключение Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное); КонецПопытки; КонецЕсли; КонецЦикла; УстановитьПривилегированныйРежим(Ложь); ЗафиксироватьТранзакцию(); |
|||
1
rabbidX
26.09.17
✎
14:36
|
При записи номенклатуры проставляйте значение скидки для подчиненных групп. Или получайте скидку запросом (лучше для всех товаров сразу)
Вообще наценки лучше в периодическом регистре сведений хранить. |
|||
2
OrenDi
27.09.17
✎
08:01
|
Нашел запрос где проставляются наценки из свойства группы по номенклатуре:
Запрос.УстановитьПараметр("НоменклатураГруппа",Ссылка.Родитель); Но если ставлю так: Запрос.УстановитьПараметр("НоменклатураГруппа",Ссылка.Родитель.Родитель); то наценка проставляется только по номенклатуре из подгруппы группы, а по номенклатуре из группы не проставляется... Как сделать что бы проставлялась наценка на номенклатуру из группы и из подгрупп? |
|||
3
OrenDi
27.09.17
✎
09:06
|
Целиком процедура:
Процедура ЗагрузитьНаценки() //Загрузка наценок Запрос=Новый Запрос(" |ВЫБРАТЬ РАЗЛИЧНЫЕ | Подразделения.Ссылка КАК Подразделение, | Подразделения.Наименование КАК Наименование, | Наценки.Статус, | Наценки.НеПересчитыватьНаценку, | Наценки.ПроцентНаценки КАК ПроцентНаценки, | НаценкиГруппы.ПроцентНаценки КАК ПроцентНаценкиГруппы, | Наценки.ДатаНачНепересчит |ИЗ | Справочник.ПодразделенияКомпании КАК Подразделения | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаценкиПоПодразделениям КАК Наценки | ПО Наценки.Номенклатура =&Номенклатура И Подразделения.Ссылка = Наценки.Подразделение | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаценкиПоПодразделениям КАК НаценкиГруппы | ПО НаценкиГруппы.Номенклатура =&НоменклатураГруппа И Подразделения.Ссылка = НаценкиГруппы.Подразделение |ГДЕ | Подразделения.Ссылка<>&Основное |УПОРЯДОЧИТЬ ПО | Наименование |"); Запрос.УстановитьПараметр("Номенклатура",Ссылка); Запрос.УстановитьПараметр("НоменклатураГруппа",Ссылка.Родитель); Запрос.УстановитьПараметр("Основное",Справочники.ПодразделенияКомпании.ОсновноеПодразделение); Наценки=Запрос.Выполнить().Выгрузить(); КонецПроцедуры // ЗагрузитьНаценки() |
|||
4
OrenDi
27.09.17
✎
10:28
|
Ребята помогите плиз с вопросом, в 1С только начинаю разбираться, статьи нахожу, что можно вроде как решить вопрос:
Получение всех родителей элемента В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример: Пример: ТекущийЭлементНоменклатуры = ЭлементНоменклатура; Запрос = Новый Запрос("ВЫБРАТЬ | Номенклатура.Родитель, | Номенклатура.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель |ИЗ | Справочник.Номенклатура КАК Номенклатура | |ГДЕ | Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры"; Но как правильно сделать - не получается( |
|||
5
VladZ
27.09.17
✎
10:34
|
||||
6
Tatitutu
27.09.17
✎
10:34
|
(0) все не то и все не так (с)
Открой для себя СП СправочникСсылка.<Имя справочника> (CatalogRef.<Имя справочника>) ПринадлежитЭлементу (BelongsToItem) Синтаксис: ПринадлежитЭлементу(<Элемент>) Параметры: <Элемент> (обязательный) Тип: СправочникСсылка. Группа (или элемент для иерархического справочника с иерархией элементов), для которой определяется принадлежность элемента. Возвращаемое значение: Тип: Булево. Истина - элемент подчинен группе; Ложь - в противном случае. Если в качестве параметра указать сам элемент, то Ложь. Описание: Определяет подчиненность элемента справочника группе с учетом всех уровней иерархии. Доступность: Сервер, толстый клиент, внешнее соединение. Примечание: Определяет подчиненность группе непосредственно на момент вызова метода путем последовательного считывания всех вышестоящих элементов. Пример: Если ОбъектСсылка.ПринадлежитЭлементу(ЭлементСсылка) Тогда Сообщить("Принадлежит"); КонецЕсли; или вот на этим подумай Номенклатура.Ссылка в(&ВыбГРУППАТовара)"; и найди консоль запросов (и да параметр можент быть не только значение, но еще и список и таблицазначений) |
|||
7
OrenDi
27.09.17
✎
13:03
|
Вставляю такой запрос, с выборкой родителей:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СправочникНоменклатура.Ссылка КАК Номенклатура |ИЗ | Справочник.Номенклатура КАК СправочникНоменклатура |ГДЕ | (СправочникНоменклатура.ЭтоГруппа = ЛОЖЬ) И | (СправочникНоменклатура.Родитель В ИЕРАРХИИ(&Родитель))"; Запрос.УстановитьПараметр("Родитель", СписокГруппРодителей); Ругается на СписокГруппРодителей мало факт. параметров( |
|||
8
Tatitutu
27.09.17
✎
13:28
|
Вот так попробуй
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СправочникНоменклатура.Ссылка КАК Номенклатура |ИЗ | Справочник.Номенклатура КАК СправочникНоменклатура |ГДЕ | НЕ СправочникНоменклатура.ЭтоГруппа | И СправочникНоменклатура.Ссылка В ИЕРАРХИИ(&ВыбРодитель)"; спВыбРодитель = Новый СписокЗначений; //добавить ссылки на группы справочника спВыбРодитель.Добавить(....); Запрос.УстановитьПараметр("ВыбРодитель",спВыбРодитель);/ |
|||
9
OrenDi
28.09.17
✎
10:46
|
Почему не работает?
поставил в запросе: ПО НаценкиГруппы.Номенклатура В ИЕРАРХИИ (&НоменклатураГруппа) И Подразделения.Ссылка = НаценкиГруппы.Подразделение на номенклатуру в группе поставилась наценка, а в подгруппах этой же группы опять нет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |