Имя: Пароль:
1C
1C 7.7
v7: Вроде простая обработка, а не получается
0 Масянька
 
26.07.12
14:51
День добрый!

Есть обработка: формирование ценников.
На ней есть кнопка "Заполнить цены из прайса". На кнопке - процедура:
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(гТабВыборка,        "Данные");
Параметры.ДобавитьЗначение(ДокументПрайсЛист,    "Прайс");
ОткрытьФормуМодально("Обработка.ПоискЦен", Параметры);


Обработка - ПоискЦен
Перем МожноЗакрыть;

Процедура Выполнить(РабочаяТаблица, ДокументПрайсЛист)
   
   Если РабочаяТаблица.КоличествоСтрок() = 0 Тогда
       Предупреждение("Заполните табличную часть.");
       Возврат;
   Иначе

       РабочаяТаблица.ВыбратьСтроки();

       Если СокрЛП(ДокументПрайсЛист) = "" Тогда
           Предупреждение("Укажите прайс-лист.");
           Активизировать("ДокументПрайсЛист");
           Возврат;
       КонецЕсли;
       
       Excel                = СоздатьОбъект("Excel.Application");
       Книга                = Excel.Workbooks.Open(ДокументПрайсЛист);
       Лист                = Книга.WorkSheets(1);
       Колонки            = Лист.Columns(1);
       мПоследняяСтрока    = Лист.UsedRange.Rows.Count;
       мТекЯчейка            = Лист.Range("D1:D" + Лист.UsedRange.Rows.Count).Address();
       Диапазон            = Лист.Range("D1:" + мТекЯчейка);

       Пока РабочаяТаблица.ПолучитьСтроку() = 1 Цикл
           
           мАртикулПрайс = СокрЛП(РабочаяТаблица.АртикулПрайс);
           Попытка
               
               Нашли = Диапазон.Find(мАртикулПрайс, Диапазон.Cells(1,1), -4123,1,1,1,0,0);
               НашлиАдрес = Нашли.Address;
               НашлиСтрока = Нашли.Row;
               НашлиКолонка = Нашли.Column;
               НоваяКолонка = НашлиКолонка + 2;
               
               Цена = Окр(Лист.Cells(НашлиСтрока,НоваяКолонка).Value);
               РабочаяТаблица.ЦенаИзПрайса = Цена;        
           СтрокаСостояния    = СтрокаСостояния + ".";
           Исключение
               Сообщить("Номенклатура с артикулом - " + мАртикулПрайс + " не найдена в прайс-листе.");    
           КонецПопытки;    
           
       КонецЦикла;
       Excel.DisplayAlerts = 0;
       Excel.Quit();
   КонецЕсли;
   
   МожноЗакрыть = 1;
   Форма.Закрыть(0);
   
КонецПроцедуры    // ПослеОткрытия

Процедура ПриОткрытии()
   
   МожноЗакрыть = 0;
   
   РабочаяТаблица        = Форма.Параметр.Получить("Данные");
   ДокументПрайсЛист    = Форма.Параметр.Получить("Прайс");

   Выполнить(РабочаяТаблица, ДокументПрайсЛист);
   
КонецПроцедуры    // ПриОткрытии

Процедура ПриЗакрытии()
   
   СтатусВозврата(МожноЗакрыть);
   
КонецПроцедуры    // ПриЗакрытии

На форме обработки "ПоискЦен" - текстовой поле "идет поиск.....". Так вот: поиск происходит, все, что надо заполняется, а вот форма не отображается. Почему?
Спасибо.
1 NS
 
26.07.12
14:52
Форма отображается только когда ей передается управление - то есть когда завершается выполнение кода.
2 akaBrr
 
26.07.12
14:53
(0)


   МожноЗакрыть = 1;
   Форма.Закрыть(0);


  СтатусВозврата(МожноЗакрыть);

она не открывается
3 Масянька
 
26.07.12
14:54
Бляха-муха....
А как сделать, чтобы сначала отобразилась форма, а потом началось выполнение. без доп. движений пальцами?
4 akaBrr
 
26.07.12
14:55
(3) через повторное открытие
5 akaBrr
 
26.07.12
14:55
не пойму Ёпрст в отпуске что-ли?
6 Масянька
 
26.07.12
14:55
(4) Это как?
7 Масянька
 
26.07.12
14:56
(5) Да, блин! Где он?
8 NS
 
26.07.12
14:56
(3) Форма.обработкаОжидания("Сформировать",5)
9 Масянька
 
26.07.12
14:57
(8) ПриОткрытии?
10 NS
 
26.07.12
14:58
(2) Форма.Закрыть() обрабатывается только после завершения работы кода.
11 akaBrr
 
26.07.12
14:58
(8) точно, форма то модальная, не уследил
(10) ага, но форма не откроется
12 NS
 
26.07.12
14:59
(11) И при чем тут (2)?
13 Масянька
 
26.07.12
14:59
Скажите, куда пихать ОбработкуОжидания?
14 NS
 
26.07.12
15:00
(13) Ей богу, не удержусь и скажу :)
15 akaBrr
 
26.07.12
15:00
(12) в ПриОткрытии вызывается закрытие формы
16 Масянька
 
26.07.12
15:01
(14) Скажи! Только не русском матерном :))))
17 NS
 
26.07.12
15:02
(16) У тебя есть другие варианты, кроме как в при открытии?
Если нет, то значит естественно туда.
18 akaBrr
 
26.07.12
15:02
+(15) форма откроется когда закончится работа ПриОткрытии, а там пшик
19 NS
 
26.07.12
15:04
(15) Попробуй в обработку, в приОткрытии(), добавить одну всего строку - форма.Закрыть(), и убедишься что форма будет открываться.
20 akaBrr
 
26.07.12
15:07
(19) попробовал, не открывается
21 NS
 
26.07.12
15:07
(20) Не ври пожалуйста.
22 Масянька
 
26.07.12
15:08
В ПриОткрытии сделала:
.....
Форма.ОбработкаОжидания("Выполнить(РабочаяТаблица, ДокументПрайсЛист)",5);
//Выполнить(РабочаяТаблица, ДокументПрайсЛист);

Теперь висит форма с надписью, не заполняется, не закрывается....
23 NS
 
26.07.12
15:11
Форма.ОбработкаОжидания("Выполнить",5);
24 Масянька
 
26.07.12
15:12
(23) Без параметров?
Или сначала Ожидание, а потом с параметрами?
25 NS
 
26.07.12
15:13
перем рабочаяТаблица;
перем прайслист;
Процедура Выполнить()
...
Процедура ПриОткрытии()
   
   МожноЗакрыть = 0;
   
   РабочаяТаблица         = Форма.Параметр.Получить("Данные");
   ДокументПрайсЛист     = Форма.Параметр.Получить("Прайс");

   Выполнить();
26 NS
 
26.07.12
15:13
(24) Буква в букву как я написал.
27 NS
 
26.07.12
15:13
перем документпрайслист; Виноват.
28 Масянька
 
26.07.12
15:14
А где Ожидание?
29 NS
 
26.07.12
15:15
(28) Вместо Выполнить() в приоткрытии()
30 Масянька
 
26.07.12
15:17
А говоришь - буква в букву....
31 Масянька
 
26.07.12
15:22
Нету Выполнить....... Висит форма.....
32 NS
 
26.07.12
15:25
(31) Выложи полностью текущий код
И форму надеюсь не модально вызываешь?
33 akaBrr
 
26.07.12
15:28
(32) модально
34 akaBrr
 
26.07.12
15:29
(21) не вру
35 NS
 
26.07.12
15:30
И в Выполнить() нужно добавить форма.обработкаожидания("",0);
первой строчкой.
В модальных формах форма.обработкаожидания() не работает.
но есть другой способ - через форма.Закрыть() и выполнить в процедуре приЗакрытии()
36 Масянька
 
26.07.12
15:31
(31) Модально.
37 akaBrr
 
26.07.12
15:31
(35) судя по всему автор и пытался так сделать
38 NS
 
26.07.12
15:31
(34) Извини, но врешь.
форма.Закрыть() ничего не закрывает, а только выставляет флаг закрытия, который отрабатывается после выполнения кода, и полного открытия формы. Даже если сработает быстро, форма мелькнет на экране.
39 akaBrr
 
26.07.12
15:32
иначе нафига было играться со статусом возврата
40 akaBrr
 
26.07.12
15:32
(38) ну так мелькнула, так что не вру, у нас просто нет договоренности о терминах :)
41 akaBrr
 
26.07.12
15:33
и у автора она 100% мелькала, но не "открылась"
42 Масянька
 
26.07.12
15:33
(41) Мелькала.
43 akaBrr
 
26.07.12
15:34
(42) убери Форма.Закрыть()
44 NS
 
26.07.12
15:35
(40) Теперь еще один простой вопрос - она мелькала из-за того что форма закрылась, или из-за того что она не открылась перед выполнением кода?
45 Масянька
 
26.07.12
15:36
Все. Сделала ПриЗакрытии. мне нравится :))))))
СПАСИБО!
46 akaBrr
 
26.07.12
15:36
(44) согласен, от того что открытая форма закрылась
47 NS
 
26.07.12
15:38
(46) У неё она и должна закрыться по окончании обработки.
А проблема в том что у неё открывалась только после окончания обработки, а должна была открываться до. И при чем тут ПриЗакрытии()?
48 akaBrr
 
26.07.12
15:39
(47) понятия не имею, нафиг было Форма.Закрыть() вставлять?
49 NS
 
26.07.12
15:42
(48) Чтоб по окончании обработки форма закрылась.
50 akaBrr
 
26.07.12
15:44
(49) а зачем? мы же тогда ничего можем не увидеть
51 akaBrr
 
26.07.12
15:45
я так понял нужно чтобы форма открылась и табличка заполнилась
52 Масянька
 
26.07.12
15:50
Поиск в прайсе - большой файл, несколько минут происходит. Хочется, чтобы на время поиска висело окошко "Идет поиск....", а потом само закрылось.
53 Масянька
 
26.07.12
15:51
Нормально.

PS Сижу ем мороженое - хорошо :)))))
54 akaBrr
 
26.07.12
16:01
(52) может тогда на форму прогрессбар нарисовать?
55 Масянька
 
26.07.12
16:10
(54) Каким макаром? Поиск по Excel'ю - Find. Красивого прогрессбара не получится :(((
56 akaBrr
 
26.07.12
16:12
(55) цикл то есть Пока РабочаяТаблица.ПолучитьСтроку() = 1 Цикл
57 NS
 
26.07.12
16:12
(55) Допиши после
Пока РабочаяТаблица.ПолучитьСтроку() = 1 Цикл
состояние(окр(Рабочаятаблица.номерстроки*100/рабочаятаблица.количествострок(),0));

и убедишься что всё там нормально.
58 Ахиллес
 
26.07.12
16:16
Обработка - ПоискЦен
//Перем МожноЗакрыть; //У кого мне надо спросить разрешение, чтоб закрыть форму? Убери эту чушь.
Перем     РабочаяТаблица, ДокументПрайсЛист;

*
*
*
*
Процедура ПриОткрытии()
   
   МожноЗакрыть = 0;
   
   РабочаяТаблица         = Форма.Параметр.Получить("Данные");
   ДокументПрайсЛист     = Форма.Параметр.Получить("Прайс");

   // Выполнить(РабочаяТаблица, ДокументПрайсЛист); впадлу самому кнопочку нажать?
   
КонецПроцедуры    // ПриОткрытии

Процедура ПриЗакрытии()
   
  //  СтатусВозврата(МожноЗакрыть); Это бред. МожноЗакрыть никогда не принимает значение отличное от 1
   
КонецПроцедуры    // ПриЗакрытии
59 NS
 
26.07.12
16:18
Кто-то немного тормозит...
60 Масянька
 
26.07.12
16:19
(57) Попробовала: пару минут - тишина, потом быстренько пробежали цифирки.
Я же говорю: позиций для поиска около 100, а в прайсе - около 70 страниц. И где какая позиция - вопрос. Мне больше нравится окошко. :)))
(58) Высокие отношения.......
61 Ахиллес
 
26.07.12
16:24
(59) А зачем вообще вызывать форму обработки, если не предполагается, что пользователь с ней взаимодействует? Весь код из обработки "ПоискЦен" в "формирование ценников" добавить, да и не морочить голову.
Запихивать Выполнить в ПриЗакрытии() это плохо.
62 NS
 
26.07.12
16:26
(61) Чем плохо?
63 Ахиллес
 
26.07.12
16:29
(62) Не логично. Выскочила какая то форма, пользователь перепугался и чтоб чего то не поломать решил её закрыть от греха подальше. А обработка возьми да начни выполнять чего то. Так и до инфаркта можно довести юзера. Когда программа делает не то,что от неё ожидают это всегда плохо.
64 NS
 
26.07.12
16:30
(63) Ничего не понял. На обработке написано что она делает, и как пользователь закроет обработку без доступа к форме?
65 Масянька
 
26.07.12
16:31
(63) Логично..... Еще более логично, прежде чем, "тыкать" в какую-то форму, хорошенько подумать: "А оно мне надо?"
66 Ахиллес
 
26.07.12
16:34
(65) Обработки предполагают, что с ними пользователь интерактивно взаимодействует и как то может повлиять на результат работы. Если в данном случае это так, то пусть сам жмёт батон "Выполнить", не переломится. Если от юзера ничего такого не требуется, то просто необходимый код добавь в "формирование ценников".
67 NS
 
26.07.12
16:36
(66) Да ладно? Зайди в prnforms, и подумай с чем там пользователь взимодействует.
68 Масянька
 
26.07.12
16:38
(66) Мда..... Зашибись...... И Вы еще меня учите не ковыряться в носу.....

PS Пойду я еще мороженное съем. Блин, у нас +38. На улице - как в парилке. Только веника не хватает.....
69 Ахиллес
 
26.07.12
16:45
(67) От это нафига? "Бляха-муха....
А как сделать, чтобы сначала отобразилась форма, а потом началось выполнение. без доп. движений пальцами?"
Либо пользователь видит форму и сам решает на какую кнопку жать, либо форма даже не открывается, обработка всё делает сама.
А чтоб юзер тупо пялился на пустую форму, такого не видел.
70 NS
 
26.07.12
16:46
(69) то есть, если обработка фоном считает без сообщений, а программа не отвечает - это нормально.
А если при этом форма на экране, и написано выполняется такая-то обработка - это зло? :)
71 Ахиллес
 
26.07.12
16:51
В Состояние или Сообщить выводить для юзера не достаточно?
72 chief accountant
 
26.07.12
16:57
Хм, мне тоже стало интересно.
(70) У меня некоторые отчеты из реготчетности формируются 20-30 мин. и никто не тупит над тем, что перед ним пустая форма
73 NS
 
26.07.12
16:59
(71) Ты не ответил на вопрос - чем плохо сообщение о выполнении обработки в виде модальной формы на экране?
74 Масянька
 
26.07.12
17:14
(72) Повезло с юзерями. А мои просят. "Она работает или висит?"
(71) Сообщить не всегда красиво отображается - может прикрывать форму. И потом его (окно сообщений) закрывать надо. Состояние (в данном случае) - мне не нравится.

И чего вы придираетесь?
75 akaBrr
 
26.07.12
17:26
(74) баньтики дело такое, на вкус и цвет разные, как фломастеры :)
76 Масянька
 
26.07.12
17:27
(75) Согласна :)
Независимо от того, куда вы едете — это в гору и против ветра!