Версия для печати темы (https://pro1c.org.ua/index.php?s=a0f3dc9b0e35e855e23662e9d2b1c9ce&showtopic=66991)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ как опредилить уровень группы

Автор: lolmatrix 04.06.22, 20:31

Здравствуйте. 1с 8.3 обычные формы. подскажите пожалуйста как вытащить данные остатков принадлежащих самой нижней группе номенклатуры. группы хранятся в регистре сведений непериодическом, не подчиненном.Есть регистр в котором хранятся группы номенклатуры по которым должен соблюдаться минимальный товарный запас (измеренения группаНоменклатуры и Склад, реквизит минимальный товарный запас и есть регистр ТоварыНаСкладе.Остатки. надо выбрать остатки по определненному складу. и этим товарам надо проставить количество минимального товарного запаса соответственно группе в которой лежит этот товар, в случае пересечения групп, запас выбираеся из самой нижней группы(если у группы запас 3 единицы, у товара должно быть 3 единицы, подскажите пожалуйста как реализовать.
ничего не могу придумать запросом не получается. Номенклатура.ПринадлежитЭлементуГруппы);//так определяет соответственно все группы до верхней. не могу никак придумат как реализовать. помогите пожалуйста.
заранее благодарен
.

Автор: lolmatrix 07.06.22, 8:09

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

Автор: sava1 07.06.22, 8:44

lolmatrix @ Сегодня, 9:09 * ,
сначала нормально сформулируйте вопрос.
я столько буков осилить не смог

Автор: lolmatrix 07.06.22, 9:52

Цитата(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 07.06.22, 11:43

В цикле вызывайте Уровень() у элемента спр.

Автор: lolmatrix 07.06.22, 12:49

Цитата(alex1c @ 07.06.22, 12:43) *
В цикле вызывайте Уровень() у элемента спр.

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

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


Автор: alex1c 07.06.22, 16:40

lolmatrix @ Сегодня, 12:49 * ,
Посмотрите как определяется счет учета для номенклатуры в УТП напрмер.

Автор: lolmatrix 07.06.22, 19:06

alex1c @ Сегодня, 17:40 * ,
УТП это управление транспортным предприятием?

Автор: lolmatrix 07.06.22, 20:13

alex1c @ Сегодня, 17:40 * ,
и если можно подробней, где посмотреть

Автор: alex1c 08.06.22, 8:52

lolmatrix @ Вчера, 20:13 * ,
УТП - управление торговым предприятием.
смотрите такое.
СчетаУчета = БухгалтерскийУчет.ПолучитьСчетаУчетаНоменклатуры(Организация, СтрокаТЧ.Номенклатура, ?(мУказаниеСкладовВТЧ, СтрокаТЧ.Склад, Склад));

Автор: lolmatrix 08.06.22, 10:40

alex1c @ Сегодня, 9:52 * ,
а есть такая конфигурация? нахожу только управление торговлей

Автор: zay 08.06.22, 11:57

Как и sava1 я тоже не уверен что понял вопрос

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

Реализация как найти все группы нижнего уровня

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

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


Автор: alex1c 08.06.22, 12:42

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

А вы где ищете?

Автор: lolmatrix 08.06.22, 13:09

alex1c @ Сегодня, 13:42 * ,
в интернете конечно же

Автор: lolmatrix 13.06.22, 14:01

Цитата(zay @ 08.06.22, 12:57) *
Как и sava1 я тоже не уверен что понял вопрос

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

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

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


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

Автор: lolmatrix 13.06.22, 15:47

alex1c @ 08.06.22, 9:52 * ,

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

Автор: lolmatrix 17.06.22, 9:02

Цитата(lolmatrix @ 13.06.22, 16:47) *
alex1c @ 08.06.22, 9:52 * ,

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

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

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

Автор: lolmatrix 18.06.22, 11:22

lolmatrix @ 13.06.22, 15:01 * ,

ZAY

ваш запрос почему-то выбирает не все нижние группы

Автор: mariorv 27.06.22, 21:54

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

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


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


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

Автор: lolmatrix 29.06.22, 8:17

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

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


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


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


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

Автор: mariorv 29.06.22, 13:38

lolmatrix @ Сегодня, 9:17 * ,

Насколько понял есть справочник номенклатуры иерархия, регистр остатков с измерением Номенклатура.Группа, есть необходимость выделить определенную номенклатуру в зависимости от уровня вложения(принадлежности к той или иной группе номенклатуры), с последующей обработкой/анализом на наличие остатков на складе при формировании движений. Когда- то делал что -то подобное вот и писнул по памяти . Через код, как мне кажеться, можно получить таблицу значений в которой номенклатура будет сопоставлена с "нужная группой" в иерархии. А поле родитель - стандартное поле, указывающее на группу, к которой относиться элемент, или не о том вопрос.
Вопрос на который отвечал видел здесь

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


Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua