Имя: Пароль:
1C
1С v8
Родитель Группа + подгруппы...
,
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
(4) В Яндексе забанили?

https://its.1c.ru/db/metod8dev/content/2659/hdoc
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
Почему не работает?

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

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

на номенклатуру в группе поставилась наценка, а в подгруппах этой же группы опять нет.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший