Вход | Регистрация

1С:Предприятие ::

Метки: 

Родитель Группа + подгруппы...

Я
   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)*ИЦ.ОкруглятьДо;
                        КонецЕсли; 
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            
            //Форма=ИЦ.ПолучитьФорму("ФормаДокумента");

            //Форма.ОткрытьМодально();

            
            Попытка
     
                 ИЦ.Записать(РежимЗаписиДокумента.Запись);
                //Состояние(ИЦ.Ссылка);

                 ИЦ.Записать(РежимЗаписиДокумента.Проведение);
     
             Исключение
                 Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
             КонецПопытки;
        КонецЕсли;
    КонецЦикла;
    
    УстановитьПривилегированныйРежим(Ложь);
    ЗафиксироватьТранзакцию();
 
  Рекламное место пустует
   rabbidX
 
1 - 26.09.17 - 14:36
При записи номенклатуры проставляйте значение скидки для подчиненных групп. Или получайте скидку запросом (лучше для всех товаров сразу)

Вообще наценки лучше в периодическом регистре сведений хранить.
   OrenDi
 
2 - 27.09.17 - 08:01
Нашел запрос где проставляются наценки из свойства группы по номенклатуре:

Запрос.УстановитьПараметр("НоменклатураГруппа",Ссылка.Родитель);

Но если ставлю так:
    Запрос.УстановитьПараметр("НоменклатураГруппа",Ссылка.Родитель.Родитель);

то наценка проставляется только по номенклатуре из подгруппы группы, а по номенклатуре из группы не проставляется...
Как сделать что бы проставлялась наценка на номенклатуру из группы и из подгрупп?
   OrenDi
 
3 - 27.09.17 - 09:06
Целиком процедура:

Процедура ЗагрузитьНаценки()
    //Загрузка наценок

    Запрос=Новый Запрос("
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    Подразделения.Ссылка КАК Подразделение,
    |    Подразделения.Наименование КАК Наименование,
    |    Наценки.Статус,
      |    Наценки.НеПересчитыватьНаценку,
    |    Наценки.ПроцентНаценки КАК ПроцентНаценки,
    |    НаценкиГруппы.ПроцентНаценки КАК ПроцентНаценкиГруппы,
    |    Наценки.ДатаНачНепересчит
    |ИЗ
    |    Справочник.ПодразделенияКомпании КАК Подразделения
    |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаценкиПоПодразделениям КАК Наценки
    |    ПО Наценки.Номенклатура =&Номенклатура И Подразделения.Ссылка = Наценки.Подразделение  
    |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаценкиПоПодразделениям КАК НаценкиГруппы
    |    ПО НаценкиГруппы.Номенклатура =&НоменклатураГруппа И Подразделения.Ссылка = НаценкиГруппы.Подразделение  
    |ГДЕ
    |    Подразделения.Ссылка<>&Основное
    |УПОРЯДОЧИТЬ ПО
    |    Наименование
    |");
    Запрос.УстановитьПараметр("Номенклатура",Ссылка);
    Запрос.УстановитьПараметр("НоменклатураГруппа",Ссылка.Родитель);
    Запрос.УстановитьПараметр("Основное",Справочники.ПодразделенияКомпании.ОсновноеПодразделение);
    Наценки=Запрос.Выполнить().Выгрузить();
КонецПроцедуры// ЗагрузитьНаценки()
   OrenDi
 
4 - 27.09.17 - 10:28
Ребята помогите плиз с вопросом, в 1С только начинаю разбираться, статьи нахожу, что можно вроде как решить вопрос:

Получение всех родителей элемента

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

Пример:

ТекущийЭлементНоменклатуры = ЭлементНоменклатура;

Запрос = Новый Запрос("ВЫБРАТЬ 
                      | Номенклатура.Родитель, 
                      | Номенклатура.Родитель.Родитель, 
                      | Номенклатура.Родитель.Родитель.Родитель, 
                      | Номенклатура.Родитель.Родитель.Родитель.Родитель, 
                      | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель 
                      |ИЗ 
                      | Справочник.Номенклатура КАК Номенклатура 
                      |
                      |ГДЕ 
                      | Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры"; 

Но как правильно сделать - не получается(
   VladZ
 
5 - 27.09.17 - 10:34
(4) В Яндексе забанили?

https://its.1c.ru/db/metod8dev/content/2659/hdoc
   Tatitutu
 
6 - 27.09.17 - 10:34
(0) все не то и все не так (с)
Открой для себя СП

СправочникСсылка.<Имя справочника> (CatalogRef.<Имя справочника>)
ПринадлежитЭлементу (BelongsToItem)
Синтаксис:

ПринадлежитЭлементу(<Элемент>)
Параметры:

<Элемент> (обязательный)

Тип: СправочникСсылка.
Группа (или элемент для иерархического справочника с иерархией элементов), для которой определяется принадлежность элемента.
Возвращаемое значение:

Тип: Булево.
Истина - элемент подчинен группе; Ложь - в противном случае.
Если в качестве параметра указать сам элемент, то Ложь.
Описание:

Определяет подчиненность элемента справочника группе с учетом всех уровней иерархии.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Определяет подчиненность группе непосредственно на момент вызова метода путем последовательного считывания всех вышестоящих элементов.
Пример:

Если ОбъектСсылка.ПринадлежитЭлементу(ЭлементСсылка) Тогда
    Сообщить("Принадлежит");
КонецЕсли;
 
или вот на этим подумай

Номенклатура.Ссылка в(&ВыбГРУППАТовара)";


и найди консоль запросов (и да параметр можент быть не только значение, но еще и список и таблицазначений)
   OrenDi
 
7 - 27.09.17 - 13:03
Вставляю такой запрос, с выборкой родителей:

Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    СправочникНоменклатура.Ссылка КАК Номенклатура
    |ИЗ
    |    Справочник.Номенклатура КАК СправочникНоменклатура
    |ГДЕ
    |    (СправочникНоменклатура.ЭтоГруппа = ЛОЖЬ) И
    |    (СправочникНоменклатура.Родитель В ИЕРАРХИИ(&Родитель))";
    Запрос.УстановитьПараметр("Родитель", СписокГруппРодителей);
 
Ругается на СписокГруппРодителей мало факт. параметров(
   Tatitutu
 
8 - 27.09.17 - 13:28
Вот так попробуй        

Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    СправочникНоменклатура.Ссылка КАК Номенклатура
    |ИЗ
    |    Справочник.Номенклатура КАК СправочникНоменклатура
    |ГДЕ
    |    НЕ СправочникНоменклатура.ЭтоГруппа
    |    И СправочникНоменклатура.Ссылка В ИЕРАРХИИ(&ВыбРодитель)";
    
    спВыбРодитель = Новый СписокЗначений;
        //добавить ссылки на группы справочника    

        спВыбРодитель.Добавить(....);
    Запрос.УстановитьПараметр("ВыбРодитель",спВыбРодитель);/
   OrenDi
 
9 - 28.09.17 - 10:46
Почему не работает?

поставил в запросе:

ПО НаценкиГруппы.Номенклатура В ИЕРАРХИИ (&НоменклатураГруппа) И Подразделения.Ссылка = НаценкиГруппы.Подразделение

на номенклатуру в группе поставилась наценка, а в подгруппах этой же группы опять нет.


Список тем форума
  Рекламное место пустует
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует