Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как опредилить уровень группы
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
lolmatrix
Здравствуйте. 1с 8.3 обычные формы. подскажите пожалуйста как вытащить данные остатков принадлежащих самой нижней группе номенклатуры. группы хранятся в регистре сведений непериодическом, не подчиненном.Есть регистр в котором хранятся группы номенклатуры по которым должен соблюдаться минимальный товарный запас (измеренения группаНоменклатуры и Склад, реквизит минимальный товарный запас и есть регистр ТоварыНаСкладе.Остатки. надо выбрать остатки по определненному складу. и этим товарам надо проставить количество минимального товарного запаса соответственно группе в которой лежит этот товар, в случае пересечения групп, запас выбираеся из самой нижней группы(если у группы запас 3 единицы, у товара должно быть 3 единицы, подскажите пожалуйста как реализовать.
ничего не могу придумать запросом не получается. Номенклатура.ПринадлежитЭлементуГруппы);//так определяет соответственно все группы до верхней. не могу никак придумат как реализовать. помогите пожалуйста.
заранее благодарен
.
lolmatrix
как жаль, что не осталось на этом форуме отзывчивых людей, помочь никто не может
sava1
lolmatrix @ Сегодня, 9:09 необходимо зарегистрироваться для просмотра ссылки ,
сначала нормально сформулируйте вопрос.
я столько буков осилить не смог
lolmatrix
Цитата(sava1 @ 07.06.22, 9:44) необходимо зарегистрироваться для просмотра ссылки
lolmatrix @ Сегодня, 9:09 необходимо зарегистрироваться для просмотра ссылки ,
сначала нормально сформулируйте вопрос.
я столько буков осилить не смог


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

lolmatrix @ Сегодня, 10:49 необходимо зарегистрироваться для просмотра ссылки ,
примерно так получаю
Запрос2 = Новый Запрос;
    Запрос2.Текст = "ВЫБРАТЬ
                    |    ОстаткиОтправителя.Номенклатура
                    |ПОМЕСТИТЬ ВТ_ОстаткиОтправителя
                    |ИЗ
                    |    &ОстаткиОтправителя КАК ОстаткиОтправителя
                    |;
                    |
                    |////////////////////////////////////////////////////////////////////////////////
                    |ВЫБРАТЬ
                    |    ТоварыНаСкладахОстатки.Номенклатура,
                    |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Количество
                    |ИЗ
                    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
                    |            &ДатаОстатков,
                    |            Номенклатура В
                    |                    (ВЫБРАТЬ
                    |                        ВТ_ОстаткиОтправителя.Номенклатура
                    |                    ИЗ
                    |                        ВТ_ОстаткиОтправителя КАК ВТ_ОстаткиОтправителя)
                    |                И Склад = &СкладПолучатель
                    |                И Номенклатура.ЭтоГруппа = ЛОЖЬ) КАК ТоварыНаСкладахОстатки
                    |ГДЕ
                    |    ТоварыНаСкладахОстатки.КоличествоОстаток > 0
                    |
                    |СГРУППИРОВАТЬ ПО
                    |    ТоварыНаСкладахОстатки.Номенклатура";
    Запрос2.УстановитьПараметр("ДатаОстатков", ДатаОстатков);
    Запрос2.УстановитьПараметр("ОстаткиОтправителя", ОстаткиОтправителя);
    Запрос2.УстановитьПараметр("СкладПолучатель", Объект.СкладПолучатель);
    РезультатЗапроса2 = Запрос2.Выполнить();
    ОстаткиПолучателя = РезультатЗапроса2.Выгрузить();

    
    #КонецОбласти
    
    /////////////////////////////////////////////////////////////////////////    
    Запрос3 = Новый Запрос;
    Запрос3.Текст =
    "ВЫБРАТЬ
    |    МО_МинимальныеТоварныеЗапасы.ГруппаНоменклатуры,
    |    МО_МинимальныеТоварныеЗапасы.Склад,
    |    МО_МинимальныеТоварныеЗапасы.КоличествоМТЗ,
    |    МО_МинимальныеТоварныеЗапасы.ПорогМТЗ
    |ИЗ
    |    РегистрСведений.МО_МинимальныеТоварныеЗапасы КАК МО_МинимальныеТоварныеЗапасы";
    
    ТЗСписокМТЗ = Запрос3.Выполнить().Выгрузить();
Для Каждого стрМТЗ Из ТЗСписокМТЗ Цикл
    ГруппаТМЗ = СтрМТЗ.ГруппаНоменклатуры;
    Для Каждого стрТЗ Из ОстаткиПолучателя Цикл
    Товар = стрТЗ.Номенклатура;
    
    Если стрМТЗ.ПорогМТЗ >= стрТЗ.Количество тогда
        Если   Товар.ПринадлежитЭлементу(стрМТЗ.ГруппаНоменклатуры)  Тогда
alex1c
В цикле вызывайте Уровень() у элемента спр.
lolmatrix
Цитата(alex1c @ 07.06.22, 12:43) необходимо зарегистрироваться для просмотра ссылки
В цикле вызывайте Уровень() у элемента спр.

а как я определю, что у полученной группы есть еще вложенные группы

lolmatrix @ Сегодня, 13:46 необходимо зарегистрироваться для просмотра ссылки ,
Вы имели ввиду? так?
Функция  ОпределитьУровенНоменклатуры(ГруппаТМЗ)
Выборка = Справочники.Номенклатура.ВыбратьИерархически(ГруппаТМЗ);
Пока Выборка.Следующий() Цикл
    Уровень = Выборка.УровеньВВыборке();
    
КонецЦикла;
Возврат  Уровень;
КонецФункции

alex1c
lolmatrix @ Сегодня, 12:49 необходимо зарегистрироваться для просмотра ссылки ,
Посмотрите как определяется счет учета для номенклатуры в УТП напрмер.
lolmatrix
alex1c @ Сегодня, 17:40 необходимо зарегистрироваться для просмотра ссылки ,
УТП это управление транспортным предприятием?
lolmatrix
alex1c @ Сегодня, 17:40 необходимо зарегистрироваться для просмотра ссылки ,
и если можно подробней, где посмотреть
alex1c
lolmatrix @ Вчера, 20:13 необходимо зарегистрироваться для просмотра ссылки ,
УТП - управление торговым предприятием.
смотрите такое.
СчетаУчета = БухгалтерскийУчет.ПолучитьСчетаУчетаНоменклатуры(Организация, СтрокаТЧ.Номенклатура, ?(мУказаниеСкладовВТЧ, СтрокаТЧ.Склад, Склад));
lolmatrix
alex1c @ Сегодня, 9:52 необходимо зарегистрироваться для просмотра ссылки ,
а есть такая конфигурация? нахожу только управление торговлей
zay
Как и sava1 я тоже не уверен что понял вопрос

Если у вас какие-то группы выполняют определенную функцию (по ним устанавливаются лимиты остатков), а другие группы не выполняют эту функцию, то мне кажется логично добавить реквизит Булево для группы. И дальше смотрим, если этот признак установлен - то именно эти группы нам и нужны. То что такой признак не был добавлен - породило бардак с группами и вы сейчас по сути боретесь с последствиями

Реализация как найти все группы нижнего уровня
Функция ПолучитьВсеГруппыНижнегоУровня()
    
    Результат = новый Массив;
    
    Запрос = новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ИСТИНА";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        Если ЭтоГруппаНижнегоУровня(Выборка.Ссылка) Тогда
            
            Результат.Добавить(Выборка.Ссылка);
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

Функция ЭтоГруппаНижнегоУровня(Группа)
    
    Запрос = новый Запрос;
    
    Запрос.УстановитьПараметр("Группа", Группа);
    
    Запрос.Текст =
        "ВЫБРАТЬ
        |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК КоличествоГрупп
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ИСТИНА
        |    И Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        
        Возврат (Выборка.КоличествоГрупп = 1);
            
    КонецЕсли;
    
    Возврат Ложь;
    
КонецФункции

alex1c
Цитата(lolmatrix @ 08.06.22, 10:40) необходимо зарегистрироваться для просмотра ссылки
а есть такая конфигурация? нахожу только управление торговлей

А вы где ищете?
lolmatrix
alex1c @ Сегодня, 13:42 необходимо зарегистрироваться для просмотра ссылки ,
в интернете конечно же
lolmatrix
Цитата(zay @ 08.06.22, 12:57) необходимо зарегистрироваться для просмотра ссылки
Как и sava1 я тоже не уверен что понял вопрос

Если у вас какие-то группы выполняют определенную функцию (по ним устанавливаются лимиты остатков), а другие группы не выполняют эту функцию, то мне кажется логично добавить реквизит Булево для группы. И дальше смотрим, если этот признак установлен - то именно эти группы нам и нужны. То что такой признак не был добавлен - породило бардак с группами и вы сейчас по сути боретесь с последствиями

Реализация как найти все группы нижнего уровня
Функция ПолучитьВсеГруппыНижнегоУровня()
    
    Результат = новый Массив;
    
    Запрос = новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ИСТИНА";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        Если ЭтоГруппаНижнегоУровня(Выборка.Ссылка) Тогда
            
            Результат.Добавить(Выборка.Ссылка);
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

Функция ЭтоГруппаНижнегоУровня(Группа)
    
    Запрос = новый Запрос;
    
    Запрос.УстановитьПараметр("Группа", Группа);
    
    Запрос.Текст =
        "ВЫБРАТЬ
        |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК КоличествоГрупп
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ИСТИНА
        |    И Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        
        Возврат (Выборка.КоличествоГрупп = 1);
            
    КонецЕсли;
    
    Возврат Ложь;
    
КонецФункции


извините, не совсмем понял, ваше предложение, не могли бы подробнее объяснить, насчет добавления реквизита, группы по которым устанавливаются лимиты, хранятся в регистре сведений, как им поможет дополнителный реквизит
lolmatrix
alex1c @ 08.06.22, 9:52 необходимо зарегистрироваться для просмотра ссылки ,

Спасибо. это очень похоже на то что мне нужно, только там выбираются вышестоящие группы
lolmatrix
Цитата(lolmatrix @ 13.06.22, 16:47) необходимо зарегистрироваться для просмотра ссылки
alex1c @ 08.06.22, 9:52 необходимо зарегистрироваться для просмотра ссылки ,

Спасибо. это очень похоже на то что мне нужно, только там выбираются вышестоящие группы

спасибо всем большое, нижние группы выбраны. тепрь возник вопрос как организовать выбор из более высоких групп, если нет нижней группы, группы родитедей получаю так
Глубина = стрОстатков.Номенклатура.ПолныйКод();

никак не придумаю как организовать выборку из регистра содержащего лимиты, с учетом, что если нет лмитов в группе на один уровень выше, выбирать лимиты из более высокой группы, опыта в программировани почти нет, есть только теория, спасибо всем за ответы
lolmatrix
lolmatrix @ 13.06.22, 15:01 необходимо зарегистрироваться для просмотра ссылки ,

ZAY

ваш запрос почему-то выбирает не все нижние группы
mariorv
lolmatrix @ 17.06.22, 10:02 необходимо зарегистрироваться для просмотра ссылки ,
Такая функция вернет родителя- группу самого верхнего уровня, но зная глубину можно задать произвольное количество итераций

Функция  РодительВерхнегоУровня(Номенклатура.Ссылка);
  Если Не ЗначениеЗаполнено(Номенклатура.Ссылка.Родитель) Тогда
     Возврат Номенклатура.Ссылка;
  Иначе
     Возврат РодительВерхнегоУровня(Номенклатура.Ссылка.Родитель);
  КонецЕсли;
КонецФункции


и перебрать значения справочника с заполнением ТЗ
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Группа")
ТЗ.Колонки.Добавить("НужнаяГруппа")
   Для Каждого Элемент из Номенклатура Цикл
        Если  Элемент.ЭтоГруппа Тогда
                        НоваяСтрока =ТЗ.Добавить();
                        НоваяСтрока.Группа     = Элемент;
            НоавяСтрока.НужныйРодитель =  РодительВерхнегоУровня(Элемент.Ссылка);
        КонецЕсли;
    КонецЦикла;


а с полученной ТЗ уже делать что надо, так как там все группы (НИЖЕ выбранного уровня) будет связанна с нужной Группой-родителем
lolmatrix
Цитата(mariorv @ 27.06.22, 22:54) необходимо зарегистрироваться для просмотра ссылки
lolmatrix @ 17.06.22, 10:02 необходимо зарегистрироваться для просмотра ссылки ,
Такая функция вернет родителя- группу самого верхнего уровня, но зная глубину можно задать произвольное количество итераций

Функция  РодительВерхнегоУровня(Номенклатура.Ссылка);
  Если Не ЗначениеЗаполнено(Номенклатура.Ссылка.Родитель) Тогда
     Возврат Номенклатура.Ссылка;
  Иначе
     Возврат РодительВерхнегоУровня(Номенклатура.Ссылка.Родитель);
  КонецЕсли;
КонецФункции


и перебрать значения справочника с заполнением ТЗ
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Группа")
ТЗ.Колонки.Добавить("НужнаяГруппа")
   Для Каждого Элемент из Номенклатура Цикл
        Если  Элемент.ЭтоГруппа Тогда
                        НоваяСтрока =ТЗ.Добавить();
                        НоваяСтрока.Группа     = Элемент;
            НоавяСтрока.НужныйРодитель =  РодительВерхнегоУровня(Элемент.Ссылка);
        КонецЕсли;
    КонецЦикла;


а с полученной ТЗ уже делать что надо, так как там все группы (НИЖЕ выбранного уровня) будет связанна с нужной Группой-родителем


скажите, Номенклатура.Ссылка.Родитель. в параметре откуда берется не совсем понял логику этого кода откуда все берется и на какой вопрос этот ответ
mariorv
lolmatrix @ Сегодня, 9:17 необходимо зарегистрироваться для просмотра ссылки ,

Насколько понял есть справочник номенклатуры иерархия, регистр остатков с измерением Номенклатура.Группа, есть необходимость выделить определенную номенклатуру в зависимости от уровня вложения(принадлежности к той или иной группе номенклатуры), с последующей обработкой/анализом на наличие остатков на складе при формировании движений. Когда- то делал что -то подобное вот и писнул по памяти . Через код, как мне кажеться, можно получить таблицу значений в которой номенклатура будет сопоставлена с "нужная группой" в иерархии. А поле родитель - стандартное поле, указывающее на группу, к которой относиться элемент, или не о том вопрос.
Вопрос на который отвечал видел здесь
Цитата(lolmatrix @ 04.06.22, 21:31) необходимо зарегистрироваться для просмотра ссылки
Есть регистр в котором хранятся группы номенклатуры по которым должен соблюдаться минимальный товарный запас (измеренения группаНоменклатуры и Склад, реквизит минимальный товарный запас и есть регистр ТоварыНаСкладе.Остатки. надо выбрать остатки по определненному складу. и этим товарам надо проставить количество минимального товарного запаса соответственно группе в которой лежит этот товар, в случае пересечения групп, запас выбираеся из самой нижней группы(если у группы запас 3 единицы, у товара должно быть 3 единицы

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