Имя: Пароль:
1C
1С v8
Проблема с циклом
, ,
0 Gam_007
 
27.06.14
10:04
Добрый день!
подскажите что делаю не так, надо вывести общую форму если в выборке по пользователь у него нет какого либо элемента из справочника

Процедура ПриНачалеРаботыСистемы()
    
     СТП = ИмяПользователя();
         
     Выборка = Справочники.Служебный.Выбрать();
    
     Запрос = Новый Запрос;
     Запрос.Текст =
    
     "ВЫБРАТЬ
     |    Служебный.Пользователь,
     |    Служебный.Совет
     |ИЗ
     |    Справочник.Служебный КАК Служебный
     |ГДЕ
     |    Служебный.Пользователь = &Пользователь";
    
     СпрПОльзователи = Справочники.Пользователи.НайтиПоНаименованию(СТП);
    
     ЗАпрос.УстановитьПараметр("Пользователь", СпрПОльзователи);
    
    
     Результат = Запрос.Выполнить();
     Выборка = Результат.Выбрать();
    
     СоветыДня = Справочники.СоветыДня.Выбрать();
         пока  СоветыДня.Следующий() цикл
        
                     
         пока Выборка.Следующий() цикл
            
             элентсовет = советыдня.Ссылка;
            
            
            
            
            
             если выборка.совет = элентсовет тогда
                 продолжить;
             иначе
                
                 Форма1=ПолучитьОбщуюФорму("Форма");
                 Форма1.Открыть();

                конецесли;
         конеццикла;
        конецЦикла;            
    
    
КонецПроцедуры
1 rasswet
 
27.06.14
10:09
отладчиком смотри.
2 dj_serega
 
27.06.14
10:11
Цикл в цикле лучше не делать.
А запросом никак не получить эти данные?
3 Ymryn
 
27.06.14
10:12
Если правильно понял, что ты пытаешься сделать, то попробуй вот это.

     Запрос.Текст =
    
     "ВЫБРАТЬ
     |    СоветыДня.Ссылка
     |ИЗ
     |       Справочник.СоветыДня как СоветыДня
     |    Левое Соединение Справочник.Служебный КАК Служебный
     |        ПО Служебный.Совет = СоветыДня.Ссылка
     |          И Служебный.Пользователь = &Пользователь
     |ГДЕ
     |    Служебный.Пользователь ЕСТЬ null";
    
     СпрПОльзователи = Справочники.Пользователи.НайтиПоНаименованию(СТП);
    
     ЗАпрос.УстановитьПараметр("Пользователь", СпрПОльзователи);

     Если  Не Запрос.Выполнить().Пустой() Тогда
     Форма1=ПолучитьОбщуюФорму("Форма");
         Форма1.Открыть();
     КонецЕсли;

Должно делать то, что ты хочешь.
4 Gam_007
 
27.06.14
10:12
смотрел он элементы справочника нормально по порядку берет а из выборки непойми как
5 fmrlex
 
27.06.14
10:12
(0) Открывать формы в цикле? Смеешься?
У тебя есть все основания для запроса по обеим таблицам и для анализа результата.
6 Fish
 
27.06.14
10:13
(4) Как запрос написан, так и берёт. Но тут проблема явно не в упорядочивании.
7 Gam_007
 
27.06.14
10:16
вы меня строго не судите просто пробую изучить 1с, и мог лишнего накрутить и еще что то не знаю. Поэтому к более опытным оброщаюсь
8 Ymryn
 
27.06.14
10:17
(7) пока еще все вежливы, корректны и даже пытаются помогать :) Судить начнем, когда запрос в цикл запихнешь.
9 fmrlex
 
27.06.14
10:18
(7) Тебе в (3) нормальный вариант предложили.
10 Gam_007
 
27.06.14
10:18
не ну до это надеюсь я не догодаюсь))
11 dj_serega
 
27.06.14
10:19
(8) Утро же еще :) Хоть и пятница.
12 Gam_007
 
27.06.14
10:19
fmrlex, как раз пробую его
13 Fish
 
27.06.14
10:19
(7) Выборка = Справочники.Служебный.Выбрать(); - это лишняя строка
14 Ymryn
 
27.06.14
10:22
(13) да ладно, она дополняет картину хаоса и творческого беспорядка кода. Тем самым символизирует желание и стремление разработчика решить задачу и пытливый ум. :)
15 AlexITGround
 
27.06.14
10:24
в цикле формы открывать - это такой писк моды нынче пошел?
16 Ymryn
 
27.06.14
10:24
(10) Ну на моей совести пока что 5 реализаций, где я использовал запрос в цикле, за все время, что я занимаюсь 1С. Это как количество смертей у врача. Сколько раз ты прибегал к этому черному ритуалу. Поэтому не стоит зарекаться. :)
17 AlexITGround
 
27.06.14
10:25
(16) это ты так думаешь, что 5 раз...обращение к БД происходит не только через текст запроса :)
18 Ymryn
 
27.06.14
10:26
(15) посмотри личную карточку, увидишь, что человек учится, съешь шоколадку и стань добрее ^_^.  Доброта.
19 Ymryn
 
27.06.14
10:26
(17) соглашусь. :)
20 elCust
 
27.06.14
10:27
(0) Нет. Так нельзя. Ты не по правильному пути идешь в достижении цели. Начинай сначала.
21 AlexITGround
 
27.06.14
10:27
ТС, подскажи, что ты хочешь сделать с выбранными элементами?
Если хочешь производить обработку элементов, то лучше выгрузить в ТЗ и сделать к-н программную обработку по кнопке, но открывать формы в цикле - ну зачем такое делать...
22 AlexITGround
 
27.06.14
10:28
(18) так я же наоборот помочь хочу, направить на правильный путь так сказать, от того как он напишет свои первые работы - зависит его будущие методы, которые он будет пихать во все случаи
23 kolpak
 
27.06.14
10:28
Выборка = Результат.Выбрать();
Надо поставить перед
пока Выборка.Следующий() цикл
Иначе внутренний цикл выполнится только один раз
24 Ymryn
 
27.06.14
10:30
(23) зачем ты ему объясняешь как правильно стрелять себе в ногу? :) Он же может выстрелить :)
25 AlexITGround
 
27.06.14
10:33
Gam_007, чтобы тебе помочь, надо знать что представляют собой эти два справочника, с какой целью они создавались, какие данные хранят, а так название самих справочников не наталкивают на их смысл
26 Gam_007
 
27.06.14
10:38
AlexITGround, я хочу сделать следующие, 2 справочника с пользователями и с советами в которых хранится какой либо совет (небольшой), при старте системы выдавать один совет пользователю и заносить информ. в третий справочник чтобы можно было отследить какой совет и кому выдовался, а совет выдается на форму
27 Fish
 
27.06.14
10:42
(26) Жуть какая-то. А зачем?
28 fmrlex
 
27.06.14
10:45
(26) Если это в рабочей базе, а не just for fun, то не делай этого.
29 Ymryn
 
27.06.14
10:47
(26) мне любопытно (3) сработало? :)
30 Ymryn
 
27.06.14
10:47
(28) This is for science!
31 DS
 
27.06.14
10:47
(2) >> Цикл в цикле лучше не делать.
Обоснование?
32 Ymryn
 
27.06.14
10:48
(31) можно сделать одним запросом и вообще без циклов :)
33 fmrlex
 
27.06.14
10:50
(31) При большом переборе будут тормоза.
34 AlexITGround
 
27.06.14
11:07
(26) подобные советы лучше выводить в сообщения, а хранить данные по уже сформированным советам каждому пользователю в независимом непериодическом регистре сведений

Думаю, что это в учебной конфе все делается, т.к. никакого смысла практического не несет разработка подобного функционала
35 DS
 
27.06.14
11:15
(32) (33) Это понятно, но ведь суть не в этом.,
Было сказано буквально следующее: "Цикл в цикле лучше не делать", и точка. Хотелось бы знать, почему.
36 dj_serega
 
27.06.14
11:17
(35) Потому что, скорее всего, эту задачу можно сделать запросом и обходом результата.
И итераций будет меньше и читабельней будет.
37 РенеДекарт
 
27.06.14
13:06
(26) твой код делает вот что:
обходит справочник "Советы" и выдает по-порядку только те советы, на которые пользователь "подписан" (указан в справочнике "Советы").
Если будешь менять в этот момент пользователя у советов в этом справочнике (типа, он просмотрел уже совет, давай другой), то все зациклится в непредсказуемой последовательности (она будет определяться, в каком порядке будут читаться в выборку элементы справочника).
Меняй методику.
38 РенеДекарт
 
27.06.14
13:08
(35)>>"Цикл в цикле лучше не делать", и точка. Хотелось бы знать, почему.
потому что если не напишешь - в 1С нет средств от зацикливания и выхода из нужного цикла, минуя остальные.
Т.е. механизм примитивнейший, и легко зациклиться в цикле.