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


Форумы на Кубань.Ру


1С:Предприятие ::

Метки:

Как запретить юзерам прерывать выполнение отчета или обработки?

Ø
Я
   &rey
03.08.00 - 10:10
Когда формируется отчет юзер кликает на Esc и он ебстественно останавливается, как запретить это сделать. Или хотя бы, что как программно отловить этот момент?
 
 
   BigHarry
1 - 03.08.00 - 11:26
Еще работая в 7.5 просил 1С-ников сделать возможность отмены прерывания обработок/запросов или хоть как-то дать возможность отследить это - они забили на эту просьбу, гады.
   &rey
2 - 03.08.00 - 11:40
Вот блин, а что же делать. У меня при формировании отчета обновляется информация в справочнике. А козлы юзеры рубят его когда хотят. А потом этой инфо пользуются другие. Лучше было бы сделать обновление документом, но жалко времени. Процесс идет минут 15, да и информация нужна оперативная.
   Русич
3 - 03.08.00 - 11:47
Можно использовать систему сообщений внутри 1с, типа "Всем стоять (сидеть), Руки вверх на 15 минут!"! Если у тебя НТ, то подключай эмулятор терминала и блокируй их Клаву! Да много еще есть чего...))))
   &rey
4 - 03.08.00 - 11:51
Русик ты или диктатор или мазохист. Отчет формируется 15 минут. Работают одновременно человек 15 (в среднем). Ты представляешь, что начнется при таких репрессиях? Ну их на фиг
   BigHarry
5 - 03.08.00 - 12:04
Можно при обновлении справочника использовать механизм транзакций - тогда при обрыве отчета в справочнике не будет некорректной информации - но при этом возможны тормоза - 15 минут работа со справочником будет блокирована.
   TeNTeN
6 - 03.08.00 - 12:06
У меня есть робот, он когда надо просыпается , считает , а после засыпает. И никаких репрессий.
   Птенец
7 - 03.08.00 - 12:06
Все равно подобные отчеты требуют специальных мер от
возможных прерываний, напр.транзакции.
   &rey
8 - 03.08.00 - 12:52
Выполнять транзакцию 15 минут - это же никто не сможет ничего делать. Вою будет выше крыши.
   Доктор Шанс М.Г.
9 - 03.08.00 - 13:03
Смею предположить, что желательно что-нибудь переделать или в отчете , или в технологии документов. Я думаю, что отчетд ля "обновляется информация в справочникена" 15 минут может делаться ночью (роботом), а если это оперативная информация, то почему ее так много?
   &rey
10 - 03.08.00 - 13:16
Понятие "много" относительное. В ходе отчета выполняется сложный расчет так называемой средневзвешенной цены, причем она должна расчитываться с учетом нескольких мест хранения. Запись в справочник выполняется несколько раз в ходе выполнения отчета.
 
  Рекламное место пустует
   Wlad
11 - 03.08.00 - 21:55
Надо делать записи во вспомогательный справочник, а в конце, если не вырубили с помощью транзакции в основной.
   Птенец
12 - 04.08.00 - 10:18
Еще из способов - делать обработки из внешних програм, напр.ACCESSа,а
в 1С уже готовое закачивать.
   Вадим
13 - 04.08.00 - 10:40
В отчете формируй таблицу значений, а потом из нее выгружай в справочник. Это быстрее будет, потому что: во-первых, не надо по нескольку раз делать запись в справочник, во-вторых, чтение данных из виртуальной таблицы с готовыми данными пройдет опять же быстрее, и при использовании транзакции время записи будет сокращено. Возможно при этом методе несколько возрастет общее время выполнения, но, думаю, незначительно. Использовать транзакции обязательно: пока транзакция не закончится, никаких изменений в справочник не будет внесено, и если кто-то прервет обработку, то ничего не случится.
   &rey
14 - 04.08.00 - 10:49
ТО Вадим
Под таблицей значений надо понимать СписокЗначений или базу данных?
   Вадим
15 - 04.08.00 - 10:56
Нет. Именно Таблицу значений. Это такой объект в 1С. Ее можно в формы вводить, а можно создавать с помощью процедуры СоздатьОбъект(). Во втором случае такая таблица просто размещеается в памяти и не видна, но работать с ней можно так же как и с таблицей в форме. Т.е. добавлять колонки, строки и т.п. Вообще ее структуру сам создаешь. Подробнее читай в доке.
   Sasa
16 - 04.08.00 - 10:59
Табл = СоздатьОбъект("ТаблицаЗначений");
   &rey
17 - 04.08.00 - 11:08
То 15-16
Это все конечно хорошо, если бы работал на 7.7 В 7.5 такого объекта метаданных нэту.
   Вадим
18 - 04.08.00 - 11:18
Тогда действительно для каждого изменяемого элемента создай свой спиок значений, и еще один для элементов справочника. В общем-то получится некое подобие таблицы, а потом "задача сводится к предыдущей". Главное создать список в памяти компа до начала изменений реквизитов справочника, а потом уже используй транзакции.
   АЛьФ
19 - 04.08.00 - 11:19
Если в 7.5 , то советую вместо Таблицы значений создать в конфиге специальный документ, табличная часть которого будет использоваться как таблица значений, а сам он никогда не запивается. В табличной части можно описать все нужные колонки. Код на подобе:
Док = СоздатьОбъект("Документ.Вспомегательный");
Док.Новый();// заполнение табличной части данными
...
НачатьТранзакцию();// перенос данных в справочник
...
ЗафиксироватьТранзакцию();
Док = 0;
Должно сработать.
   Вадим
20 - 04.08.00 - 11:20
Вдогонку. А почему не хочешь на 7.7 перейти. В ней что есть свои прелести?
Спрашиваю потому что работал с ней совсем мало, а потом сразу сиганул на 7.7.
   &rey
21 - 04.08.00 - 11:27
То АЛьФ
Неплохая идея надо попробовать.
То Вадим
Моего желания мало - преприятие скупое. У нас на переферии еще не научились тратить деньги на ПО.
   Sheridan
22 - 04.08.00 - 11:36
Теоретически, можно с помощью внешней компоненты перехатывать сообщения посылаемые ядром Windows программе и отменять их или перенаправлять.
   &rey
23 - 04.08.00 - 11:43
А может тогда проще каким-нибудь образом блокировать клаву?
   Вадим
24 - 04.08.00 - 12:26
То &rey. Поставь ломаную, благо их в инете - море
   TeNTeN
25 - 04.08.00 - 12:33
Предположение(сам не пробовал): можно поверх отчета открывать модельно мальенкую формочку, на ней написать мол "идет обсчтет" и как только отчет готов закрывать эту модальную форму. Но в принципе зачем это весь гимор, если юзер спокойно используя фигуру из трех пальцев("Ctr"+"Alt"+"Del") шлепнет задачу.
   Вадим
26 - 04.08.00 - 12:42
Слушайте, а чего мы говорим об этой задаче так, будто сторонний пользователь может прервать процесс на моей машине. Если запустил его (процесс) у себя, то я же его и прерву, если, опять же, мне надо. Зачем рассылать пользователям сообщения типа "Стой! Стрелять буду"?
   Alex
27 - 04.08.00 - 12:44
Считаю наиболее простым, правильным и реальным предложение Вадима. А если нет возможности использовать таблицу значений - надо использовать несколько списков. Синхронизировать их - никаких проблем.
А то можно дойти до перепрограммирования клавиатуры, переписывания операционной системы, разработки нового процессора и т.д.
Проблемы 1С необходимо решать ее же средсвами, что удается почти всегда (правда часто при этом изрядно поматерится).
   &rey
28 - 04.08.00 - 12:57
ТО Вадим
Мне что-то не охота выполнять работу пользователей и по каждому их желанию запускать какие-либо процедуры. Своей работы хватает
   Вадим
29 - 04.08.00 - 13:03
Извини, не понял. А зачем выполнять работу пользователей? У них есть свои кнопки, пусть на них и давят. Зачем тебе этим заниматься. Сделал отчет, протестировал, показал юзерам как им пользоваться и все. Дальше - их проблемы.
   &rey
30 - 04.08.00 - 13:10
Может я чё не понял, "Если запустил его (процесс) у себя, то я же его и прерву". Я так понял ты себя имеешь ввиду. А если речь о юзере, то надо учесть, что те данные, которые заносятся в ходе отчета потом пользуют другие, не подозревая правильные они или нет.
   Jak
31 - 04.08.00 - 13:11
Используй транзакцию.
   Вадим
32 - 04.08.00 - 13:14
То 30. Все. Понял. Тогда, действительно, пошли сообщение, что, дескать, подождите, щас пересчитаем кое-что, и будете работать. А ежели кто-то не внял просьбе, так - сам дурак.
   &rey
33 - 04.08.00 - 13:17
Повторяю для тех кто не видел предыдущие серии:
В справочнике инфо обновляется в фоде отчета несколько раз, поэтому если использовать транзации в лоб, то похоже надо делать примерно так:
НачатьТранзакцию()
    НачатьТранзакцию()//первое обновление
    ЗафиксироватьТранзакцию();
    НачатьТранзакцию()//второе обновление
    ЗафиксироватьТранзакцию();
    НачатьТранзакцию()//третье обновление
    ЗафиксироватьТранзакцию();//последнее обновление
ЗафиксироватьТранзакцию();
Отчет идет минут 15. И все это время остальные - курят.
 
  Рекламное место пустует
   Аlex
34 - 04.08.00 - 13:19
"Сам дурак" не покатит. Либо мы имеем в системе правильные даные, либо очень скоро придется искать другую работу. За пользователей работать не надо - это однозначно. Но надо не давать делать ошибки, насколько это возможно.
   &rey
35 - 04.08.00 - 13:21
То 32
Если бы все было так просто.
   TeNTeN
36 - 04.08.00 - 13:21
Вариант решения ч/з 1С.
Есть робот, то бишь машина на которой крутится пользователь робот и доступ к ней имеют толь админы.
Пользователь открывает отчет, нажымает кнопку, запрос уходит к роботу, он его обрабатывает и отдает пользователю. Пользователь в это время пусть хоть застрелится, но формирование отчета остановить будет сложно (может конечно и индексы попортить).
   Делитант
37 - 04.08.00 - 13:34
TeNTen, извини за глупый вопрос, но как передать обработку на другую машину. Я баран в этом.
   Alex
38 - 04.08.00 - 13:35
Предлагаю вернутся к 13 позиции.
Давайте все-таки разберемся - что творится в течении 15 мин:
1) если обработка значений - это одно.
2) если само обновление справочника - это другое.
Второе маловероятно - сколько ж тогда в нем элементов? Или я не прав?
Первый пункт более реален - долго происходит вычисление каких-то значений.
Значит вывод - долго готовим данные и потом быстренько запускаем транзакцию.
Вариант предложен - таблица значений, список значений. Или массив в конце концов.
   Вадим
39 - 04.08.00 - 13:42
Согласен с Alex. У нас порядка 15000 записей в справочнике товаров, плюс еще справочник скидок для каждого товара. Всего наверное тысяч 50 записей. Временами изменяются цены, скажем на 1%. С использованием транзакции вся обработка проскакивает за 5 минут максимум (даже при загруженной сети).
   &rey
40 - 04.08.00 - 13:55
Действительно долго выполняется сам расчет, но в ходе расчета несколько раз (примерно раз 10-15) обновляются данные в справочнике. И последнее обновление в конце расчета.
   Alex
41 - 04.08.00 - 14:05
Как я понимаю - данные из справочника использются для хранения промежуточных итогов. И бог с ним - выгружаешь справочник в таблицу значений (списки, массив), юзаешь его до посинения и получаешь конечный итог, который записываешь обратно.
   &rey
42 - 04.08.00 - 14:13
А если вместо того же массива использовать дбф -файл. Это сильно будет тормозиить?
   Alex
43 - 04.08.00 - 14:22
Тоже вариант. По скорости не скажу - не пробовал. Но по любому операции в памяти выполняютя намного быстрее. У меня вообще стойкое отвращения к использования DBF-файлов.
Методов работы с таблицами и списками вполне достаточно. Хотя если это 7.5 и количество обрабатываемых реквизитов большое - возможно это лучшее решение.
Может уважаемые участники конференции что скажут?
   Mazzy
44 - 04.08.00 - 14:40
DBF-файл? Тогда либо надо будет гарантировать что новый экземпляр обработки не сможет запускаться пока работает другой экземпляр, либо для каждого экземпляра обработки создавать свой DBF...
Не. К терапевту.
   &rey
45 - 04.08.00 - 14:54
Это проблема решена. Во время обработки ставится блокировка, и другой юзер ту же процедуру не запустит.
   TeNTeN
46 - 04.08.00 - 15:09
Для Делитанта: да все просто, есть процедура ОбработкаОжидания() она постоянно крутится у робота , которая проверяет есть ли у робота задания. Нужно передать какое-то значение роботу, можно это делать ч/з справочник, если у тебя робот "умный"(робот выполняет разные задания), если потупей, то можно через переменную в гл. модуле. Робот обнаруживает задание, выполняет,сохраняет результат ,сообщает что все готово, опять же можно это делать через справочник.У юзера тоже вертится эта ОбработкаОжидания() из нее ему и сообщается что мол "твой запрос выполнен/не выполнен".
   Mazzy
47 - 04.08.00 - 15:16
Согласен, что блокировка и пр...
Я и говорю, что надо будет гарантировать, ограничивать и пр. ...
Не понятно, зачем это делать в сетевой версии.
Сам подход не есть правильный. :-)
   Делитант
48 - 04.08.00 - 15:41
To TeNTen
Так а робот - это есть что, не врублюсь никак. Я правда еще новичок в этом деле. Его надо писать самому? Если не сложно можно его где-нибудь мыльнуть?
   &rey
49 - 04.08.00 - 15:45
Mazzy
Не пойму твоих доводов. Причем здесь версия. Какая разница в какой делать подобную операцию.
 
 
   Stiv
50 - 04.08.00 - 16:24
А ты уверен что тебе эти данные надо в справочник записывать. вожет их в то время когда они требуються вычислять. или в регистре каком кибуть хранить в виде остатка. Сделай нормальное описание выполняемой задачи. И может ее можно нормально решить, а не по сто раз даные обновлять да еще так что в случае прерывания все данные изчезаит. Или обьясни пользователям что так нельзя в начале отчета заносиш пользователя в черный списак в конце удаляеш. Береш список и к начальству и применяете административные меры.
   IgorKL
51 - 05.08.00 - 14:10
У меня на справочнике ~10000 позиций при _правильном_ написании алгоритма изменения нужных ревкизитов вся работа занимает сек.30., при неправильном - мин.20. Ты просто сначала сформируй нужный отчет, запихни его результаты в таблицу (список) значений, а потом эти результаты под транзакцией перепиши в справочник.
   BigHarry
52 - 05.08.00 - 16:21
Про 30 сек и 10000 позиций - ты загнул.
У меня 2560 позиции - только последовательная выборка занимает минуту с половиной - а если будет запись - и того дольше.
Хотя, если версия ЦКЛ - тады может и быстрее.
   TeNTeN
53 - 07.08.00 - 08:01
Для Делитанта: :о) робот это пользователь такой. В процедуре ПриНачалеРаботыСистемы() ты проверяешь что пользователь это робот, если да тогда впуливаешь ему процедуру ОбработкаОжидания(НужнаяПроцедура,ДцатьМинут) и НужнаяПроцедура "просыпается" каждые ДцатьМинут.
   Юрий
54 - 08.08.00 - 17:22
Привет!
А как насчет следующего:
1. В фороме создаешь реквизит текстового вида, с формулой
ПриОбновленииФормы()
2.Создаешь в форме переменную:
Перем ОбработкаНеЗакончена;
3.В начале и в конце своей длительной процедуры пишешь:
ОбработкаНеЗакончена=1;
...
...
ОбработкаНеЗакончена=0;
4.И в самой функции пишешь
Если ОбработкаНеЗакончена=1 Тогда
ЗаписьЖурналаРегистрации("Не закончена процедура"+ИмяКомпьютера()+"  "+ИмяПользователя(),"Обработка","");
ОбработкаНеЗакончена=0;
КонецЕсли;
Можно еще круче:
Передавать управление основной обработке.
А можно еще КРУЧЕЕ:
Передавать управление основной обработке в режиме ПРОДОЛЖЕНИЯ.
Но это требует многого ума при ее написании :)
Пока...




Список тем форума

Форум Территория 1С

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