|
v7: Собрать в массив элементы справочника с одинаковым значением реквизита | ☑ | ||
---|---|---|---|---|
0
ugorchina
10.05.18
✎
17:31
|
Можно ли как то без цикла найти все одинаковые элементы по реквизиту в спр? Что бы не перебирать весь спр!
|
|||
1
Slypower
10.05.18
✎
17:32
|
Запрос
|
|||
2
ugorchina
10.05.18
✎
17:35
|
В 7 есть запросы? ))) Прикольно
|
|||
3
ugorchina
10.05.18
✎
17:42
|
А запрос будет быстрее чем цикл?
|
|||
4
Slypower
10.05.18
✎
17:45
|
(2) Это шутка?
(3) Запросом можно отсечь все ненужное и получить нужный вам вариант. Если элементов справочника около 20, то можно и цикл. А так запрос быстрее |
|||
5
ugorchina
10.05.18
✎
17:47
|
(2) нет не шутка 7 ку плоховато знаю!
|
|||
6
ugorchina
10.05.18
✎
17:47
|
За (4) спасибо
|
|||
7
Масянька
10.05.18
✎
17:51
|
(5) В конфигураторе сделай обработку (новую), а потом в меню глянь "Конструкторы".
|
|||
8
alxxsssar
10.05.18
✎
17:52
|
(2) есть. только там синтаксис своеобразный
|
|||
9
ugorchina
10.05.18
✎
18:02
|
Да пошутил я )
|
|||
10
ugorchina
10.05.18
✎
18:02
|
Но спасибо
|
|||
11
Slypower
10.05.18
✎
18:07
|
(9) вот после таких отчетов другим новичкам помогать и перестанут. Шутник, блин)
|
|||
12
ugorchina
10.05.18
✎
18:09
|
)))
|
|||
13
Сияющий в темноте
10.05.18
✎
18:22
|
Установить у реквизита галку отбор,пересчитать индексы и оно само будет
|
|||
14
ugorchina
10.05.18
✎
19:40
|
(13) забыл написать не из формы справочника а из обработки
|
|||
15
ugorchina
10.05.18
✎
19:40
|
(14) в общем меня и запрос усстраивает
|
|||
16
HawkEye
10.05.18
✎
19:48
|
(0) ВыбратьЭлементыПоРеквизиту()
|
|||
17
ugorchina
10.05.18
✎
19:57
|
ТекстЗапроса = "
|SELECT | Спр.ID [Элемент $Справочник.Контрагенты], | $Спр.ИНН ИНН |FROM | $Справочник.Контрагенты Спр |WHERE | $Спр.ИНН IN | (SELECT | $Спр1.ИНН | FROM | $Справочник.Контрагенты Спр1 | WHERE | $Спр1.ИНН <> ‘’ | GROUP BY | $Спр1.ИНН | HAVING | COUNT(*) > 1) |ORDER BY | $Спр.ИНН"; |
|||
18
ugorchina
10.05.18
✎
20:00
|
НачатьТранзакцию()
Пока Спр.НайтиПоРеквизиту("ИНН",инн)=1 Цикл КонецЦикла; ОтменитьТранзакцию(); Так канает? |
|||
19
ugorchina
10.05.18
✎
20:01
|
Что будет быстрее? (17) или (18) и (18) будет ли вообще работать?
|
|||
20
Мимохожий Однако
10.05.18
✎
20:04
|
(19) Секундомер включи и посмотри
|
|||
21
ugorchina
10.05.18
✎
20:15
|
(20) у меня деарея я уже день на толчке сижу компа в туалете нет ))))
|
|||
22
Slypower
10.05.18
✎
20:23
|
(18) СокрЛП(ИИН). Не доверяю я "НайтиПоРеквизиту", часто не находит)
|
|||
23
Ёпрст
10.05.18
✎
20:30
|
(19) в (18) не рабочий код.
|
|||
24
ugorchina
10.05.18
✎
20:49
|
Function Button()
Сообщить("Ctart"); Spr = CreateObject("Reference.Номенклатура"); BeginTransaction(); Пока Spr.FindByAttribute("Артикул",TrimAll(ProductSku.Артикул),1) = 1 Цикл Сообщить("Ok"+Spr.Наименование); КонецЦикла; RollBackTransaction(); EndFunction что то не так ( |
|||
25
ugorchina
10.05.18
✎
20:54
|
Каму интересн бесконечный цикл вот держите )
Function Button() Message("Ctart"); Spr = CreateObject("Reference.Номенклатура"); BeginTransaction(); Пока Spr.FindByAttribute("Артикул",TrimAll(ProductSku.Артикул),1) = 1 Цикл Message("Ok"+Spr.Description+" CODE - "+Spr.Code); КонецЦикла; RollBackTransaction(); EndFunction |
|||
26
ugorchina
10.05.18
✎
21:06
|
в общем оба не рабочие )
|
|||
27
Ёпрст
10.05.18
✎
21:07
|
(25) унутрь цикла вставь ЭТО и заработает:
СЗ.ДобавитьЗначение(Спр.ТекущийЭлемент()); Спр.Удалить(); на выходе из цикла будешь иметь в СЗ свои элементы с одинаковым инн |
|||
28
Ёпрст
10.05.18
✎
21:08
|
но, этот код споткнётся, если кто-то откроет форму элемента, т.е заблокирует объект для мнимого удаления
|
|||
29
ugorchina
10.05.18
✎
21:12
|
Спр.Удалить();?
|
|||
30
Ёпрст
10.05.18
✎
21:16
|
(29) да, что смущает ? У тебя в коде откат транзакции в конце.
Видать код где-то скоммуниздил, но не до конца.. ) |
|||
31
ugorchina
10.05.18
✎
21:18
|
(30) ну конечно скамуниздил )
|
|||
32
ugorchina
10.05.18
✎
21:33
|
Вот работает
(30) спасибо! да скамуниздил но удивило Удалить от того и сам удрал из кода ))) вот результат Procedure Button() SZ = CreateObject("ÑïèñîêÇíà÷åíèé"); Message("Start "+CurrentTime()); Spr = CreateObject("Reference.Íîìåíêëàòóðà"); BeginTransaction(); Ïîêà Spr.FindByAttribute("Àðòèêóë",TrimAll(ProductSku.Àðòèêóë),1) = 1 Öèêë SZ.AddValue(Spr.CurrentItem()); Spr.Delete(); ÊîíåöÖèêëà; RollBackTransaction(); If SZ.GetListSize() > 0 then For ch=1 To SZ.GetListSize() Do Message("Ok"+" Name "+SZ.GetValue(ch).Description+" Code "+SZ.GetValue(ch).Code); EndDo; EndIf; Message("END "+CurrentTime()); EndProcedure и вот результат работы кода Start 21:31:02 Ok Name Бумага IQ Color зеленый Code 000008051 Ok Name Бумага IQ Color зеленый Code 000009049 Ok Name Бумага IQ Color неон зеленый Code 000009734 Ok Name Бумага IQ Color неон желтый Code 000015123 Ok Name Бумага IQ Color желтый Code 000016431 END 21:31:02 |
|||
33
ugorchina
10.05.18
✎
21:34
|
(28) если споткнется откат не отработает?
|
|||
34
ugorchina
10.05.18
✎
21:36
|
аннет все ок просто ругнулся и все
|
|||
35
ugorchina
10.05.18
✎
21:43
|
вот код что бы не спотыкался
Procedure Button() SZ = CreateObject("СписокЗначений"); Message("Start "+CurrentTime()); Spr = CreateObject("Reference.Номенклатура"); BeginTransaction(); Пока Spr.FindByAttribute("Артикул",TrimAll(ProductSku.Артикул),1) = 1 Цикл Try Spr.Delete(); SZ.AddValue(Spr.CurrentItem()); Except Message("Object directory element someone open ask to close the directory element"); Break; EndTry КонецЦикла; RollBackTransaction(); If SZ.GetListSize() > 0 then For ch=1 To SZ.GetListSize() Do Message("Ok"+" Name "+SZ.GetValue(ch).Description+" Code "+SZ.GetValue(ch).Code); EndDo; EndIf; Message("END "+CurrentTime()); EndProcedure Всем спасибо |
|||
36
ugorchina
10.05.18
✎
21:47
|
что то англоязычный код форум не правильно оформляет (
|
|||
37
ADirks
11.05.18
✎
08:18
|
Если есть возможность писать прямые запросы - то пиши, и не жуй моск. И понятнее, и быстрее.
(но если нет индекса - то всё равно full scan) |
|||
38
1Сергей
11.05.18
✎
08:22
|
(36) не надо писать на англ без острой необходимости
|
|||
39
GreyK
11.05.18
✎
08:27
|
ВыбратьЭлементыПоРеквизиту(<?>,,,)
Синтаксис: (36) Выдрал страницу из своего СП, должен будешь! ВыбратьЭлементыПоРеквизиту(<ИмяРеквизита>,<Значение>,<РежимИерархии>,<РежимГрупп>) Назначение: Открыть выборку элементов справочника по значению реквизита. Возвращает: 1 - если действие выполнено и в выборке есть хотя бы один элемент; 0 - если действие не выполнено или в выборке нет ни одного элемента. Параметры: <ИмяРеквизита> - строка с именем реквизита, по которому выполняется выборка; <Значение> - значение реквизита для выборки; <РежимИерархии> - как выбирать: 1 - выбирать элементы с учетом иерархии, 0 - выбирать элементы без учета иерархии (необязателен, по умолчанию - 1); <РежимГрупп> - что выбирать: 1 - выбирать среди групп справочника, 0 - выбирать только среди элементов справочника. Замечание: Метод можно использовать только для реквизитов с установленным признаком ''Сортировка''. Метод можно использовать только для объектов, созданных функцией СоздатьОбъект. |
|||
40
ugorchina
11.05.18
✎
10:13
|
(39)
Спасибо Вам но я бы хотел услышать от Вас + и - какие по вашему + или - есть у этого While Spr.FindByAttribute("Артикул",TrimAll(ProductSku.Артикул),1) = 1 Do Try SZ.AddValue(Spr.CurrentItem()); Spr.Delete(); Except Message("Object directory element someone open ask to close the directory element"); Break; EndTry EndDo; |
|||
41
GreyK
11.05.18
✎
10:24
|
(40) Простой запрос работает медленнее выборки, но в выборке нельзя удалять, можно только пометить на удаление, ну или вначале закинуть все элементы в список, а потом удалять по списку. Сторонними запросами я стараюсь не пользоваться.
|
|||
42
ugorchina
11.05.18
✎
10:26
|
(41) спасибо Да вы правы так намного лучше и быстрее!
Function BuhIT(CurrentItem) Count = 0; BI = CreateObject("БухгалтерскиеИтоги"); BI.UseSubconto(SubcontoKinds.Номенклатура,CurrentItem); BI.UseSubconto(SubcontoKinds.МестаХранения,StorageLocation); BI.UseSubconto(SubcontoKinds.Партии); BI.DoQuery(,CurDate(),AccountByCode("41.1"),,,1,,); BI.SelectSubconto(1); While BI.GetSubconto(1) = 1 Do If BI.FDB("К") > 0 Then Count = BI.FDB("К"); BI.SelectSubconto(2); While BI.GetSubconto(2) = 1 Do //warehouse BI.SelectSubconto(3); While BI.GetSubconto(3) = 1 Do //parties EndDo; EndDo; EndIf; EndDo; Return Count; EndFunction Procedure Button() Message("Start "+CurrentTime()); Spr = CreateObject("Reference.Номенклатура"); If Spr.SelectItemsByAttribute("Артикул",TrimAll(ProductSku.Артикул),0,0) = 1 Then While Spr.GetItem() = 1 Do Count = 0; Count = BuhIT(Spr.CurrentItem()); Message("Ok"+" Name "+Spr.Description+" Code "+Spr.Code+ "Count "+Count); EndDo; EndIf; Message("END "+CurrentTime()); EndProcedure и код короче |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |