Группа: Пользователи
Сообщений: 113
Спасибо сказали: 1 раз
Рейтинг: 0
Здравствуйте. 1с 8.3 обычные формы. подскажите пожалуйста как вытащить данные остатков принадлежащих самой нижней группе номенклатуры. группы хранятся в регистре сведений непериодическом, не подчиненном.Есть регистр в котором хранятся группы номенклатуры по которым должен соблюдаться минимальный товарный запас (измеренения группаНоменклатуры и Склад, реквизит минимальный товарный запас и есть регистр ТоварыНаСкладе.Остатки. надо выбрать остатки по определненному складу. и этим товарам надо проставить количество минимального товарного запаса соответственно группе в которой лежит этот товар, в случае пересечения групп, запас выбираеся из самой нижней группы(если у группы запас 3 единицы, у товара должно быть 3 единицы, подскажите пожалуйста как реализовать. ничего не могу придумать запросом не получается. Номенклатура.ПринадлежитЭлементуГруппы);//так определяет соответственно все группы до верхней. не могу никак придумат как реализовать. помогите пожалуйста. заранее благодарен .
Группа: Пользователи
Сообщений: 113
Спасибо сказали: 1 раз
Рейтинг: 0
Цитата(sava1 @ 07.06.22, 9:44)
lolmatrix @ Сегодня, 9:09
, сначала нормально сформулируйте вопрос. я столько буков осилить не смог
вопрос в том как получить уровни иерархии номенклатуры которую я выгружаю запросом в таблицу значений, а родители этой номенклатуры в регистре с ресурсом минимальный товарный остаток, в выгруженную номенклатуру надо добавить этот ресур взяв его из самой нижней группы, не могу придумать как определить принадлежность к группе из второго регистра сведений
lolmatrix @ Сегодня, 10:49
, примерно так получаю
Запрос2 = Новый Запрос; Запрос2.Текст = "ВЫБРАТЬ | ОстаткиОтправителя.Номенклатура |ПОМЕСТИТЬ ВТ_ОстаткиОтправителя |ИЗ | &ОстаткиОтправителя КАК ОстаткиОтправителя |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура, | СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Количество |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | &ДатаОстатков, | Номенклатура В | (ВЫБРАТЬ | ВТ_ОстаткиОтправителя.Номенклатура | ИЗ | ВТ_ОстаткиОтправителя КАК ВТ_ОстаткиОтправителя) | И Склад = &СкладПолучатель | И Номенклатура.ЭтоГруппа = ЛОЖЬ) КАК ТоварыНаСкладахОстатки |ГДЕ | ТоварыНаСкладахОстатки.КоличествоОстаток > 0 | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладахОстатки.Номенклатура"; Запрос2.УстановитьПараметр("ДатаОстатков", ДатаОстатков); Запрос2.УстановитьПараметр("ОстаткиОтправителя", ОстаткиОтправителя); Запрос2.УстановитьПараметр("СкладПолучатель", Объект.СкладПолучатель); РезультатЗапроса2 = Запрос2.Выполнить(); ОстаткиПолучателя = РезультатЗапроса2.Выгрузить();
ТЗСписокМТЗ = Запрос3.Выполнить().Выгрузить(); Для Каждого стрМТЗ Из ТЗСписокМТЗ Цикл ГруппаТМЗ = СтрМТЗ.ГруппаНоменклатуры; Для Каждого стрТЗ Из ОстаткиПолучателя Цикл Товар = стрТЗ.Номенклатура;
Если стрМТЗ.ПорогМТЗ >= стрТЗ.Количество тогда Если Товар.ПринадлежитЭлементу(стрМТЗ.ГруппаНоменклатуры) Тогда
Группа: Пользователи
Сообщений: 113
Спасибо сказали: 1 раз
Рейтинг: 0
Цитата(alex1c @ 07.06.22, 12:43)
В цикле вызывайте Уровень() у элемента спр.
а как я определю, что у полученной группы есть еще вложенные группы
lolmatrix @ Сегодня, 13:46
, Вы имели ввиду? так?
Функция ОпределитьУровенНоменклатуры(ГруппаТМЗ) Выборка = Справочники.Номенклатура.ВыбратьИерархически(ГруппаТМЗ); Пока Выборка.Следующий() Цикл Уровень = Выборка.УровеньВВыборке();
Если у вас какие-то группы выполняют определенную функцию (по ним устанавливаются лимиты остатков), а другие группы не выполняют эту функцию, то мне кажется логично добавить реквизит Булево для группы. И дальше смотрим, если этот признак установлен - то именно эти группы нам и нужны. То что такой признак не был добавлен - породило бардак с группами и вы сейчас по сути боретесь с последствиями
Реализация как найти все группы нижнего уровня
Функция ПолучитьВсеГруппыНижнегоУровня()
Результат = новый Массив;
Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа = ИСТИНА";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если ЭтоГруппаНижнегоУровня(Выборка.Ссылка) Тогда
Результат.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЭтоГруппаНижнегоУровня(Группа)
Запрос = новый Запрос;
Запрос.УстановитьПараметр("Группа", Группа);
Запрос.Текст = "ВЫБРАТЬ | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК КоличествоГрупп |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа = ИСТИНА | И Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)";
Группа: Пользователи
Сообщений: 113
Спасибо сказали: 1 раз
Рейтинг: 0
Цитата(zay @ 08.06.22, 12:57)
Как и sava1 я тоже не уверен что понял вопрос
Если у вас какие-то группы выполняют определенную функцию (по ним устанавливаются лимиты остатков), а другие группы не выполняют эту функцию, то мне кажется логично добавить реквизит Булево для группы. И дальше смотрим, если этот признак установлен - то именно эти группы нам и нужны. То что такой признак не был добавлен - породило бардак с группами и вы сейчас по сути боретесь с последствиями
Реализация как найти все группы нижнего уровня
Функция ПолучитьВсеГруппыНижнегоУровня()
Результат = новый Массив;
Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа = ИСТИНА";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если ЭтоГруппаНижнегоУровня(Выборка.Ссылка) Тогда
Результат.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЭтоГруппаНижнегоУровня(Группа)
Запрос = новый Запрос;
Запрос.УстановитьПараметр("Группа", Группа);
Запрос.Текст = "ВЫБРАТЬ | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК КоличествоГрупп |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа = ИСТИНА | И Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат (Выборка.КоличествоГрупп = 1);
КонецЕсли;
Возврат Ложь;
КонецФункции
извините, не совсмем понял, ваше предложение, не могли бы подробнее объяснить, насчет добавления реквизита, группы по которым устанавливаются лимиты, хранятся в регистре сведений, как им поможет дополнителный реквизит
Группа: Пользователи
Сообщений: 113
Спасибо сказали: 1 раз
Рейтинг: 0
Цитата(lolmatrix @ 13.06.22, 16:47)
alex1c @ 08.06.22, 9:52
,
Спасибо. это очень похоже на то что мне нужно, только там выбираются вышестоящие группы
спасибо всем большое, нижние группы выбраны. тепрь возник вопрос как организовать выбор из более высоких групп, если нет нижней группы, группы родитедей получаю так
Глубина = стрОстатков.Номенклатура.ПолныйКод();
никак не придумаю как организовать выборку из регистра содержащего лимиты, с учетом, что если нет лмитов в группе на один уровень выше, выбирать лимиты из более высокой группы, опыта в программировани почти нет, есть только теория, спасибо всем за ответы
Группа: Пользователи
Сообщений: 2
Спасибо сказали: 0 раз
Рейтинг: 0
lolmatrix @ 17.06.22, 10:02
, Такая функция вернет родителя- группу самого верхнего уровня, но зная глубину можно задать произвольное количество итераций
Функция РодительВерхнегоУровня(Номенклатура.Ссылка); Если Не ЗначениеЗаполнено(Номенклатура.Ссылка.Родитель) Тогда Возврат Номенклатура.Ссылка; Иначе Возврат РодительВерхнегоУровня(Номенклатура.Ссылка.Родитель); КонецЕсли; КонецФункции
и перебрать значения справочника с заполнением ТЗ
ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Группа") ТЗ.Колонки.Добавить("НужнаяГруппа") Для Каждого Элемент из Номенклатура Цикл Если Элемент.ЭтоГруппа Тогда НоваяСтрока =ТЗ.Добавить(); НоваяСтрока.Группа = Элемент; НоавяСтрока.НужныйРодитель = РодительВерхнегоУровня(Элемент.Ссылка); КонецЕсли; КонецЦикла;
а с полученной ТЗ уже делать что надо, так как там все группы (НИЖЕ выбранного уровня) будет связанна с нужной Группой-родителем
Группа: Пользователи
Сообщений: 113
Спасибо сказали: 1 раз
Рейтинг: 0
Цитата(mariorv @ 27.06.22, 22:54)
lolmatrix @ 17.06.22, 10:02
, Такая функция вернет родителя- группу самого верхнего уровня, но зная глубину можно задать произвольное количество итераций
Функция РодительВерхнегоУровня(Номенклатура.Ссылка); Если Не ЗначениеЗаполнено(Номенклатура.Ссылка.Родитель) Тогда Возврат Номенклатура.Ссылка; Иначе Возврат РодительВерхнегоУровня(Номенклатура.Ссылка.Родитель); КонецЕсли; КонецФункции
и перебрать значения справочника с заполнением ТЗ
ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Группа") ТЗ.Колонки.Добавить("НужнаяГруппа") Для Каждого Элемент из Номенклатура Цикл Если Элемент.ЭтоГруппа Тогда НоваяСтрока =ТЗ.Добавить(); НоваяСтрока.Группа = Элемент; НоавяСтрока.НужныйРодитель = РодительВерхнегоУровня(Элемент.Ссылка); КонецЕсли; КонецЦикла;
а с полученной ТЗ уже делать что надо, так как там все группы (НИЖЕ выбранного уровня) будет связанна с нужной Группой-родителем
скажите, Номенклатура.Ссылка.Родитель. в параметре откуда берется не совсем понял логику этого кода откуда все берется и на какой вопрос этот ответ
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!