Узнать номер позиции из списка значений в которой сработала команда Принадлежит()
Имеется список значений с группами справочника Номенклатура - СпГруппТоваров.
Штатно никак. Может кто-то знает способ через внешние компоненты?
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если СпГруппТоваров.Принадлежит(Товар) = 1 Тогда
// Собственно вопрос: как узнать номер позиции в СпГруппТоваров где сработало Принадлежит()?
КонецЕсли;
КонецЦикла;
Штатно никак. Может кто-то знает способ через внешние компоненты?
По теме из базы знаний
Найденные решения
(33)
Потому что перебирать весь справочник для каждой строки ТЧ - г...внокод.
Первое, что просится - установить в справочнике СкидкиПоГруппамТоваров сортировку по реквизиту "Товар" и использовать НайтиПоРеквизиту().
Реализовано через так
Слово "так" надо заменить на другое, из (24). ;-P
Потому что перебирать весь справочник для каждой строки ТЧ - г...внокод.
Первое, что просится - установить в справочнике СкидкиПоГруппамТоваров сортировку по реквизиту "Товар" и использовать НайтиПоРеквизиту().
Остальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(11)
Поэтому ваш код, безусловно, правильный, только надо (автору!) вставить в цикл поиск родителя текущего уровня.
Но это, опять-таки, телепатия, которая сегодня у меня сбоит. ;-)
Подскажу только как найти корневого родителя для группы
Вангую: через десяток-другой сообщений автора выяснится, что в СпГруппТоваров есть как элементы, так и группы разных уровней.
Поэтому ваш код, безусловно, правильный, только надо (автору!) вставить в цикл поиск родителя текущего уровня.
Но это, опять-таки, телепатия, которая сегодня у меня сбоит. ;-)
(10) Ручками перебирай элементы списка и для каждого ПринадлежитГруппе или равен в зависимости от ЭтоГруппа.
По другому никак - твоя хотелка противоречит назначению оптимизации метода Принадлежит, там оно под капотом все за один запрос пытается выполнится, а тебе разные нужны.
По другому никак - твоя хотелка противоречит назначению оптимизации метода Принадлежит, там оно под капотом все за один запрос пытается выполнится, а тебе разные нужны.
(1)
Надеюсь. не оскорбил ваши религиозные чувства?
Может кто-то знает способ через внешние компоненты?
А тупо создать переменную и инкрементировать ее в цикле - религия не позволяет?
НомерПозиции = 0;
Ном = 0;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Ном = Ном + 1;
Если СпГруппТоваров.Принадлежит(Товар) = 1 Тогда
// Собственно вопрос: как узнать номер позиции в СпГруппТоваров где сработало Принадлежит()?
НомерПозиции = Ном;
КонецЕсли;
КонецЦикла;
ПоказатьНадеюсь. не оскорбил ваши религиозные чувства?
Напишу чуть подробнее.
Например, в переменной СпГруппТоваров есть 3 значения.
1. Группа номенклатуры "Хлеб"
2. Группа номенклатуры "Стройматериалы"
3. Группа номенклатуры "Автозапчасти"
Выбираем строки документа.
В строке №1 документа в реквизите "Номенклатура" записан элемент справочника "Гвозди 2.5х50", который находится в группе "Гвозди строительные", которая находится в группе "Метизы", которая находится в группе "Стройматериалы".
СпГруппТоваров.Принадлежит(Товар) даст результат 1.
Но как мне узнать, что эта 1 (единица) из-за того, что гвозди сработали во второй позиции списка значений?
Например, в переменной СпГруппТоваров есть 3 значения.
1. Группа номенклатуры "Хлеб"
2. Группа номенклатуры "Стройматериалы"
3. Группа номенклатуры "Автозапчасти"
Выбираем строки документа.
В строке №1 документа в реквизите "Номенклатура" записан элемент справочника "Гвозди 2.5х50", который находится в группе "Гвозди строительные", которая находится в группе "Метизы", которая находится в группе "Стройматериалы".
СпГруппТоваров.Принадлежит(Товар) даст результат 1.
Но как мне узнать, что эта 1 (единица) из-за того, что гвозди сработали во второй позиции списка значений?
Папа = Товар.Родитель;
поз = СпГруппТоваров.НайтиЗначение(Папа);
Пока поз = 0 Цикл
Папа = Папа.Родитель;
поз = СпГруппТоваров.НайтиЗначение(Папа);
КонецЦикла;
Сообщить("Товар "+Товар +" найден в позиции "+поз+", по группе "+Папа);
поз = СпГруппТоваров.НайтиЗначение(Папа);
Пока поз = 0 Цикл
Папа = Папа.Родитель;
поз = СпГруппТоваров.НайтиЗначение(Папа);
КонецЦикла;
Сообщить("Товар "+Товар +" найден в позиции "+поз+", по группе "+Папа);
(19)
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если СпГруппТоваров.Принадлежит(Товар) = 1 Тогда
Для Каждого ГруппаТоваров Из СпГруппТоваров Цикл
Сч = 0;
Если Товар.ПринадлежитЭлементу(ГруппаТоваров) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Сч;
Сообщение.Сообщить();
КонецЕсли;
Сч = Сч+1;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Показать
(26) Вы тут языки объединили, но принцип я понял. Так и сделано. Но в момент выполнения строки с кодом по замеру времени уходит от 5 до 20 секунд (в зависимости от уровня товара). Вот эту строку и пытаюсь оптимизировать.
Если Товар.ПринадлежитГруппе(ГруппаТоваров) = 1 Тогда
(28) возможно, надо посмотреть не на текущую реализацию, а на задачу - которая потребовала текущей реализации - под другим углом?
.
СЗ.НайтиЗначение - самый быстрый метод.
ю
может быть - окажется что притекущей реализации вариант в (15) для каждого товара из ТЧ суммарно окажется менее затратным чем Принадлежит и потом (15). По сути применение (15) полностью покрывает задачу "принадлежности" и СЗ.Принадлежит можно не использовать вообще.
.
СЗ.НайтиЗначение - самый быстрый метод.
ю
может быть - окажется что притекущей реализации вариант в (15) для каждого товара из ТЧ суммарно окажется менее затратным чем Принадлежит и потом (15). По сути применение (15) полностью покрывает задачу "принадлежности" и СЗ.Принадлежит можно не использовать вообще.
Давайте пойдем не от Списка значений, а от справочников.
Имеем:
1) Справочник Номенклатура
2) Справочник Контрагенты
Это всё типовое, для ТиС 9.2
Также имеем:
3) справочник СкидкиПоГруппамТоваров, подчиненный справочнику Контрагенты.
Реквизиты справочника:
Товар - справочник Номенклатура
ПроцОпт - Число.
В Накладной расходной после завершения подбора товара надо все подобранные товары прогнать по справочнику СкидкиПоГруппамТоваров и, если товары входят в какую-то из групп, то применить скидку для этой группы товаров.
Реализовано через так:
И вот тут строка с кодом
выполняется очень долго. Последний замер - для трех номенклатурных позиций, включенных в подбор, время выполнения этой строки 4 секунды.
Попытка закинуть все группы товаров и их скидок в Таблицу значений, а ту в Список значений привела меня в тупик. Как выйти на скидку из Списка значений?
Принадлежит() срабатывает быстро. Но в Списке значений нет скидок. А в Таблице значений только группы товаров. И как в ней найти ту самую строку?
Имеем:
1) Справочник Номенклатура
2) Справочник Контрагенты
Это всё типовое, для ТиС 9.2
Также имеем:
3) справочник СкидкиПоГруппамТоваров, подчиненный справочнику Контрагенты.
Реквизиты справочника:
Товар - справочник Номенклатура
ПроцОпт - Число.
В Накладной расходной после завершения подбора товара надо все подобранные товары прогнать по справочнику СкидкиПоГруппамТоваров и, если товары входят в какую-то из групп, то применить скидку для этой группы товаров.
Реализовано через так:
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
СкидкиПоГруппамТоваров.ВыбратьЭлементы();
Пока СкидкиПоГруппамТоваров.ПолучитьЭлемент() = 1 Цикл
Если Товар.ПринадлежитГруппе(СкидкиПоГруппамТоваров.Товар) = 1 Тогда
ПроцентСкидки = СкидкиПоГруппамТоваров.ПроцОпт;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПоказатьИ вот тут строка с кодом
Если Товар.ПринадлежитГруппе(СкидкиПоГруппамТоваров.Товар) = 1 Тогда
выполняется очень долго. Последний замер - для трех номенклатурных позиций, включенных в подбор, время выполнения этой строки 4 секунды.
Попытка закинуть все группы товаров и их скидок в Таблицу значений, а ту в Список значений привела меня в тупик. Как выйти на скидку из Списка значений?
Принадлежит() срабатывает быстро. Но в Списке значений нет скидок. А в Таблице значений только группы товаров. И как в ней найти ту самую строку?
(33)
Потому что перебирать весь справочник для каждой строки ТЧ - г...внокод.
Первое, что просится - установить в справочнике СкидкиПоГруппамТоваров сортировку по реквизиту "Товар" и использовать НайтиПоРеквизиту().
Реализовано через так
Слово "так" надо заменить на другое, из (24). ;-P
Потому что перебирать весь справочник для каждой строки ТЧ - г...внокод.
Первое, что просится - установить в справочнике СкидкиПоГруппамТоваров сортировку по реквизиту "Товар" и использовать НайтиПоРеквизиту().
(37)
Пациент безнадежен...
В списке значений содержатся группы справочника Номенклатура. А ищем элемент справочника.
А что такое, по-вашему, родители элемента, нахождение цепочки которых вам продемонстрировали в (15)? Открою секрет: это и есть группы - сюрприз!
Пациент безнадежен...
(39) Я не понимаю, почему при обсуждении какого-то кода, надо обязательно переходить на личности и оскорблять человека? Что это? Завышенное ЧСВ? Или просто характер говеный? Почему вы позволяете себе общаться со мной с высокомерием?
Как рассказывается в анекдоте: "Какой из тебя Наполеон? Ты - жалкий, презренный червь!".
Но идею вашу осознаю. О результатах замеров отпишусь.
Как рассказывается в анекдоте: "Какой из тебя Наполеон? Ты - жалкий, презренный червь!".
Но идею вашу осознаю. О результатах замеров отпишусь.
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если СпГруппТоваров.Принадлежит(Товар) = 1 Тогда
// Собственно вопрос: как узнать номер позиции в СпГруппТоваров где сработало Принадлежит()?
_Родитель=Товар;
Пока ПустоеЗначение(_Родитель)=0 Цикл
_Позиция=спГруппТоваров.НайтиЗначение(_Родитель);
Если _Позиция>0 Тогда
Сообщить(_Позиция);
Прервать;
КонецЕсли;
_Родитель=_Родитель.Родитель;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ПоказатьТак тоже долго?
(45) условие
Если СпГруппТоваров.Принадлежит(Товар) = 1 Тогда
убрать вообще.
принадлежит или нет - станет известно в результате прохода цикла по родителям.
конкретный результат зависит от соотносшения числа элементов в ТЧ дока и в СЗ.
а то может в ТЧ = 500 строк, в СЗ - 2 значения - это будет "долго", если ТЧ =2 строки, СЗ = 500 значений - это будет "быстро"
Если СпГруппТоваров.Принадлежит(Товар) = 1 Тогда
убрать вообще.
принадлежит или нет - станет известно в результате прохода цикла по родителям.
конкретный результат зависит от соотносшения числа элементов в ТЧ дока и в СЗ.
а то может в ТЧ = 500 строк, в СЗ - 2 значения - это будет "долго", если ТЧ =2 строки, СЗ = 500 значений - это будет "быстро"
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)