Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Собрать в массив элементы справочника с одинаковым значением реквизита

v7: Собрать в массив элементы справочника с одинаковым значением реквизита
Я
   ugorchina
 
10.05.18 - 17:31
Можно ли как то без цикла найти все одинаковые элементы по реквизиту в спр? Что бы не перебирать весь спр!
 
 
   Slypower
 
1 - 10.05.18 - 17:32
Запрос
   ugorchina
 
2 - 10.05.18 - 17:35
В 7 есть запросы? ))) Прикольно
   ugorchina
 
3 - 10.05.18 - 17:42
А запрос будет быстрее чем цикл?
   Slypower
 
4 - 10.05.18 - 17:45
(2) Это шутка?
(3) Запросом можно отсечь все ненужное и получить нужный вам вариант. Если элементов справочника около 20, то можно и цикл. А так запрос быстрее
   ugorchina
 
5 - 10.05.18 - 17:47
(2) нет не шутка 7 ку плоховато знаю!
   ugorchina
 
6 - 10.05.18 - 17:47
За (4) спасибо
   Масянька
 
7 - 10.05.18 - 17:51
(5) В конфигураторе сделай обработку (новую), а потом в меню глянь "Конструкторы".
   alxxsssar
 
8 - 10.05.18 - 17:52
(2) есть. только там синтаксис своеобразный
   ugorchina
 
9 - 10.05.18 - 18:02
Да пошутил я )
   ugorchina
 
10 - 10.05.18 - 18:02
Но спасибо
 
 Рекламное место пустует
   Slypower
 
11 - 10.05.18 - 18:07
(9) вот после таких отчетов другим новичкам помогать и перестанут. Шутник, блин)
   ugorchina
 
12 - 10.05.18 - 18:09
)))
   Сияющий в темноте
 
13 - 10.05.18 - 18:22
Установить у реквизита галку отбор,пересчитать индексы и оно само будет
   ugorchina
 
14 - 10.05.18 - 19:40
(13) забыл написать не из формы справочника а из обработки
   ugorchina
 
15 - 10.05.18 - 19:40
(14) в общем меня и запрос усстраивает
   HawkEye
 
16 - 10.05.18 - 19:48
(0) ВыбратьЭлементыПоРеквизиту()
   ugorchina
 
17 - 10.05.18 - 19:57
ТекстЗапроса = "
|SELECT
|  Спр.ID [Элемент $Справочник.Контрагенты],
|  $Спр.ИНН ИНН
|FROM
|  $Справочник.Контрагенты Спр
|WHERE
|  $Спр.ИНН IN
|  (SELECT
|     $Спр1.ИНН
|  FROM
|     $Справочник.Контрагенты Спр1
|  WHERE
|     $Спр1.ИНН <> ‘’
|  GROUP BY
|     $Спр1.ИНН
|  HAVING
|     COUNT(*) > 1)
|ORDER BY
|  $Спр.ИНН";
   ugorchina
 
18 - 10.05.18 - 20:00
НачатьТранзакцию()
Пока Спр.НайтиПоРеквизиту("ИНН",инн)=1 Цикл 
   
КонецЦикла;
ОтменитьТранзакцию();

Так канает?
   ugorchina
 
19 - 10.05.18 - 20:01
Что будет быстрее? (17) или (18) и (18) будет ли вообще работать?
   МимохожийОднако
 
20 - 10.05.18 - 20:04
(19) Секундомер включи и посмотри
   ugorchina
 
21 - 10.05.18 - 20:15
(20) у меня деарея я уже день на толчке сижу компа в туалете нет ))))
   Slypower
 
22 - 10.05.18 - 20:23
(18) СокрЛП(ИИН). Не доверяю я "НайтиПоРеквизиту", часто не находит)
   Ёпрст
 
23 - 10.05.18 - 20:30
(19) в (18) не рабочий код.
   ugorchina
 
24 - 10.05.18 - 20:49
Function  Button()
Сообщить("Ctart");
Spr = CreateObject("Reference.Номенклатура");
    BeginTransaction();
Пока Spr.FindByAttribute("Артикул",TrimAll(ProductSku.Артикул),1) = 1 Цикл 
   Сообщить("Ok"+Spr.Наименование);
КонецЦикла;
RollBackTransaction();

EndFunction

что то не так (
   ugorchina
 
25 - 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
   ugorchina
 
26 - 10.05.18 - 21:06
в общем оба не рабочие )
   Ёпрст
 
27 - 10.05.18 - 21:07
(25) унутрь цикла вставь ЭТО и заработает:

СЗ.ДобавитьЗначение(Спр.ТекущийЭлемент());
Спр.Удалить();

на выходе из цикла будешь иметь в СЗ свои элементы с одинаковым инн
   Ёпрст
 
28 - 10.05.18 - 21:08
но, этот код споткнётся, если кто-то откроет форму элемента, т.е заблокирует объект для мнимого удаления
   ugorchina
 
29 - 10.05.18 - 21:12
Спр.Удалить();?
   Ёпрст
 
30 - 10.05.18 - 21:16
(29) да, что смущает ? У тебя в коде откат транзакции в конце.
Видать код где-то скоммуниздил, но не до конца..
)
   ugorchina
 
31 - 10.05.18 - 21:18
(30) ну конечно скамуниздил )
   ugorchina
 
32 - 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
   ugorchina
 
33 - 10.05.18 - 21:34
(28) если споткнется откат не отработает?
 
 
   ugorchina
 
34 - 10.05.18 - 21:36
аннет все ок просто ругнулся и все
   ugorchina
 
35 - 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  

Всем спасибо
   ugorchina
 
36 - 10.05.18 - 21:47
что то англоязычный код форум не правильно оформляет (
   ADirks
 
37 - 11.05.18 - 08:18
Если есть возможность писать прямые запросы - то пиши, и не жуй моск. И понятнее, и быстрее.

(но если нет индекса - то всё равно full scan)
   1Сергей
 
38 - 11.05.18 - 08:22
(36) не надо писать на англ без острой необходимости
   GreyK
 
39 - 11.05.18 - 08:27
ВыбратьЭлементыПоРеквизиту(<?>,,,)
Синтаксис:
(36) Выдрал страницу из своего СП, должен будешь!
ВыбратьЭлементыПоРеквизиту(<ИмяРеквизита>,<Значение>,<РежимИерархии>,<РежимГрупп>)
Назначение:
Открыть выборку элементов справочника по значению реквизита.
Возвращает: 1 - если действие выполнено и в выборке есть хотя бы один элемент;
0 - если действие не выполнено или в выборке нет ни одного элемента.
Параметры:
<ИмяРеквизита> - строка с именем реквизита, по которому выполняется выборка;
<Значение> - значение реквизита для выборки;
<РежимИерархии> - как выбирать:
1 - выбирать элементы с учетом иерархии,
0 - выбирать элементы без учета иерархии (необязателен, по умолчанию - 1);
<РежимГрупп> - что выбирать:
1 - выбирать среди групп справочника,
0 - выбирать только среди элементов справочника.
Замечание:
Метод можно использовать только для реквизитов с установленным признаком ''Сортировка''.
Метод  можно использовать только для объектов, созданных функцией СоздатьОбъект.
   ugorchina
 
40 - 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;
   GreyK
 
41 - 11.05.18 - 10:24
(40) Простой запрос работает медленнее выборки, но в выборке нельзя удалять, можно только пометить на удаление, ну или вначале закинуть все элементы в список, а потом удалять по списку. Сторонними запросами я стараюсь не пользоваться.
   ugorchina
 
42 - 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  

и код короче


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует