Имя: Пароль:
1C
1С v8
Как прервать чтение DBF?
0 KUBIK
 
18.07.13
23:27
Коллеги подскажите:

Вот тестовый код в модуле формы:

&НаСервере
Процедура ОткрытьФайлDBF(ИмяФайла)
   Данные = Новый XBase;
   Данные.Кодировка = КодировкаXBase.OEM;
   Данные.ОткрытьФайл(ИмяФайла);
   
   Если Данные.Открыта() Тогда
       Сообщить("ОК!");
   КонецЕсли;
   
   Сч=0;
   ОбъектОбработка = РеквизитФормыВЗначение("Объект");
   Данные.Первая();
   Пока Истина Цикл
       
       ОбъектОбработка.ЧитаемDBF(Данные);
       Сч=Сч+1;
       Если НЕ Данные.Следующая() Тогда
           Прервать;
       КонецЕсли;
   КонецЦикла;    
   
   Данные.ЗакрытьФайл();
   Данные="";
       
   Сообщить("Загрузка завершена");
   
КонецПроцедуры

Файл читается процедурой ЧитаемDBF(Данные) в МО обработки.

Вопрос:

Как грамотно сделать вызов процедуры

ОбработкаПрерыванияПользователя();

которая вызывается из клиента?
1 KUBIK
 
18.07.13
23:30
Да, забыл уточить, вопрос по УФ
2 NcSteel
 
18.07.13
23:33
Возвращать курсор на клиента
3 KUBIK
 
18.07.13
23:34
(2) ??? Поясни, пжста
4 EvgeniuXP
 
18.07.13
23:38
а чем отличается чтение дбф в УФ и не УФ?
5 KUBIK
 
18.07.13
23:40
(4) Речь не о чтении, а возможности прервать чтение = разные коки
6 EvgeniuXP
 
18.07.13
23:42
Если НЕ Данные.Следующая() Тогда
           Прервать;
       КонецЕсли;
Когда этот код сработает? Если система заняла дбф и открыла его - другой пользователь сможет его открыть, чтобы прервать чтение этому пользователю?
7 EvgeniuXP
 
18.07.13
23:42
или удалить файл сможешь?
8 KUBIK
 
18.07.13
23:44
(7) При чем здесь файл????

Задача: при необходимости прервать чтение файла
9 KUBIK
 
18.07.13
23:45
(6) Этот код сработает, когда прочитается последня зщапись DBF
10 EvgeniuXP
 
18.07.13
23:46
если просто читаешь данные из дфф прямо в цикле и напиши обработать прерывание пользователя...

если заносишь данные куда-то, т.е. их записываешь в базу, то перед циклом Начни транзакцию, в конце зафиксируй ее, если прерывание произошло - отмена транзакции - в этом случае все отменится
11 EvgeniuXP
 
18.07.13
23:46
(9) и зачем в конце дбф прерывать? логика какая? если цикл закончился
12 KUBIK
 
18.07.13
23:47
(10) Речь об УФ!
В ОФ у меня все прекрасно работает!
13 EvgeniuXP
 
18.07.13
23:48
вместо пока истина, данные.Следующая() пиши
14 KUBIK
 
18.07.13
23:51
(13) От этого ничего не изменится по существу.
15 EvgeniuXP
 
18.07.13
23:52
(12) так ответь на (11), чем отличается УФ от ОФ - что за код ты пишешь?
16 EvgeniuXP
 
18.07.13
23:57
(14) и как это не изменится, внутри цикла такого напишешь процедуру ОбработкаПрерыванияПользователя, которая действительно при чтении (заметь, не в конце чтения файла) прервет чтение.
17 KUBIK
 
18.07.13
23:58
(15) на (11) смотри внимательно код в (0):
позицирнирую 1 запись
запускаю цикл
обрабатываю запись
проверяю: не последняя?
если нет
иду дальше
если да прерываю
конец цикла

А чем УФ отличается от ОФ - глянь типовые бухии 2.0 и 3.0 = мож чето увидишь
18 KUBIK
 
18.07.13
23:59
Мож ктото по-существу вопроса поможет?
19 EvgeniuXP
 
18.07.13
23:59
кстати, ОбработкаПрерыванияПользователя - тонкий клиент - на сервере не работает :)
20 EvgeniuXP
 
19.07.13
00:01
(17) так нафига прерывать в конце дбф, если и так дошли до конца?
21 KUBIK
 
19.07.13
00:01
(19) Мне нах тонкий клиент не нужен!
22 KUBIK
 
19.07.13
00:02
(20) ???????

Пока Истина Цикл

КонецЦикла;

= Чем прервешь? :))))))))))
23 EvgeniuXP
 
19.07.13
00:04
(22) так тебе говорят, пиши Пока Данные.Следующая() - зачем такой изврат?
24 KUBIK
 
19.07.13
00:04
(23) отдыхай, а?
25 EvgeniuXP
 
19.07.13
00:07
обкуренный
26 EvgeniuXP
 
19.07.13
00:12
стр. 421, том 2 - проф. разработка:

"Листинг 18.17. Пример чтения данных из файла DBF
&НаКлиенте
Процедура ЧтениеДанных(Команда)
Путь = "c:\";
БД = Новый XBase;
БД.ОткрытьФайл(Путь + "nomen.dbf", Путь + "index.cdx");
Сообщение = Новый СообщениеПользователю();
Пока Истина Цикл
Сообщение.Текст = БД.CODE + " " + БД.Name;
Сообщение.Сообщить();
Если Не БД.Следующая() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
БД.ЗакрытьФайл();
КонецПроцедуры"

что не нравится? в книге так? какие еще вопросы тогда?
27 EvgeniuXP
 
19.07.13
00:13
воду мутит тут.
28 ЧеловекДуши
 
19.07.13
00:17
(0) Держи, дарю, прямо от сердца отрываю :)

БД.ЗакрытьФайл();
29 KUBIK
 
19.07.13
00:17
(27) Вникни в суть моего вопроса:

Требуется при необходимости ПРЕРВАТЬ обработку чтения файла DBF по Ctrl+Break

Вопроса про чтение файла не было
30 ЧеловекДуши
 
19.07.13
00:18
(29) Это невозможно, если только ты не организуешь "паузу", которая и будет анализировать команду "Ctrl+Break"
31 ЧеловекДуши
 
19.07.13
00:19
+(29) А так это медленно работающее считывание :)
С паузами :)
32 EvgeniuXP
 
19.07.13
00:20
(27) так ты написал все на сервере, как прервешь то его? ОбработкаПрерыванияПользователя вызывается с клиента! Переписывай все чтение на клиент бей по частям, вызывай колстрок свою обработку - нагружай сеть - если ты это считаешь правильно.
33 KUBIK
 
19.07.13
00:20
(26) Совсем плох?

А как на клиенте запустишь в цикле: см (0) ??????

   ОбъектОбработка = РеквизитФормыВЗначение("Объект");
............

       ОбъектОбработка.ЧитаемDBF(Данные);


Короче: мачтасть учи
34 ЧеловекДуши
 
19.07.13
00:20
+ (29) Следующим вопросом  будет - "Как начать считывать DBF с нужной строки?" :)
35 EvgeniuXP
 
19.07.13
00:22
(33) см. (22) если тебя устраивает - делай как (33). :)))
36 EvgeniuXP
 
19.07.13
00:22
(*35) (33) как в (32)
37 ЧеловекДуши
 
19.07.13
00:22
(35) Да ему нужно прерывание обработки по команде от пользователя :)
Типо делается что-либо и пользователь раз и прервал это :)
38 EvgeniuXP
 
19.07.13
00:24
(33) ну да, клиент сервер не вызвать :) только серверов будешь вызывать столько же сколько и строк в твоей ДбФ, тогда и прервать можешь - если для тебя это так важно - делай так.
39 KUBIK
 
19.07.13
00:26
(37) Спасибо, что объяснил зацикленному на циклах! :))))
40 EvgeniuXP
 
19.07.13
00:27
(39) да вызывай ты внутри цикла серверную процедуру со своей обработкой и делай что хошь.
41 EvgeniuXP
 
19.07.13
00:28
(+40) только все чтение ДБФ идет на клиенте, а не на сервере.

маразм полный.
42 EvgeniuXP
 
19.07.13
00:29
сиди на ОФ и прервешь при чтении в любую секунду.
43 KUBIK
 
19.07.13
00:31
42) "сиди на ОФ" = Нуралиеву напиши про бух 3.0 :)))))
44 EvgeniuXP
 
19.07.13
00:32
для этого есть отмена транзакции и жди когда закончится полное чтение - это УФ.
45 EvgeniuXP
 
19.07.13
00:33
зато сеть не нагружена, либо нагружай сеть по полной - какие проблемы?
46 KUBIK
 
19.07.13
00:36
(45) RDP = наше все!
47 KUBIK
 
19.07.13
00:38
+(45) сеть отдыхает! :))))))
48 EvgeniuXP
 
19.07.13
00:39
УФ и RDP :) круто!
49 KUBIK
 
19.07.13
00:41
(48) ты видимо еще бухию 3.0 не видел?
50 EvgeniuXP
 
19.07.13
00:42
(49) так и делай, чтение дбф весь алгоритм на клиенте, а в цикле вызывай сервер со своей обработкой.
51 EvgeniuXP
 
19.07.13
00:43
и на клиенте ставь ПрерываниеПользователя
52 KUBIK
 
19.07.13
00:49
(51) вроде наччинаешь вникать в суть обозначенной проблемы:
см (37):

При загрузке данных их ДБФ пользователь вдруг решил прервать загрузку.

Я вроде ясно обозначил: как грамотно это сделать с учетом приведеого кода.
53 KUBIK
 
19.07.13
10:16
Решил проблему!
Все просто оказалось!


Цикл чтения записи ДБФ перегнал на клиента, текущую запись перегоняю в структуру СтрДанные и вызываю серверную ОткрытьФайлDBF(СтрДанные) и вставил в цикл

ОбработкаПрерыванияПользователя();


&НаСервере
Процедура ОткрытьФайлDBF(СтрДанные)
   ОбъектОбработка = РеквизитФормыВЗначение("Объект");
   ОбъектОбработка.ЧитаемDBF(СтрДанные);
КонецПроцедуры
54 KUBIK
 
19.07.13
10:17
ОткрытьФайлDBF() = не совсем корректное название: здесь читаем текущую запись дбф
55 KUBIK
 
19.07.13
10:18
Сорри:
здесь читаем текущую запись дбф

= обрабатываем текущую запись
56 EvgeniuXP
 
19.07.13
13:14
(53) когда в (50) уже прямым текстом написал :)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс