Имя: Пароль:
1C
1C 7.7
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  

и код короче
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.