"Вечный" цикл в 1С #121956


#0 by Stio
В общем у нас есть классический "вечный" цикл, то есть: пока истина цикл ... конеццикла; Вешаю этот цикла на кнопку формы во Внешней обработке. При выполнении цикла программа входит в "ступор" и использовать другие элементы формы становится невозможно, а следовательно невозможно сделать выход из этого цикла путём выполнения какого-либо условия (при нажатии другой кнопки, например). В Delphi это решается так: либо в цикле Application.ProcessMessages (при вызове этой процедуры система даёт программе (форме) кванты времени на обмен окна с системой) или вообще создаётся новый поток (нить, thread) для выполнения поставленной задачи, и форма по выполнению получает результат работы потока по его выполнению. Вопрос: Как подобное реализовать в 1С? Возможно ли это?
#1 by Волшебник
вызывай ОбработкаПрерыванияПользователя внутри цикла по Ctrl-Break можно будет прервать
#2 by Stio
Сейчас посмотрю. Тут же вопрос: Как сделать пассивную (чтобы не нагружала процессор) паузу? (delay, sleep).
#3 by Волшебник
Через WSH или ПодключитьОбработчикОжидания
#4 by АЛьФ
Меня всегда жутко интересовало практическое применение этой "пассивой паузы". Зачем она нужна людям?
#5 by Волшебник
Кстати, 8.0 позволяет запустить столько сеансов с одной базой, сколько нужно. В каждом из сеансов можно запустить длительную обработку, а в ещё одном делать свои дела.
#6 by alexb
Тоесть если я правильно понимаю, захожу в 1с, запускаю обработку и тут же не выходя и не заходя еще раз под этим же логином делать дела. Это как ?
#7 by Волшебник
Два раза запускай 1С и в каждом делай то, что тебе нужно.
#8 by Волшебник
Ты умеешь два блокнота запускать? Вот так же.
#9 by alexb
А, ну, так то да, а я то подумал можно как то одновременно, не запускаясь второй раз.
#10 by Волшебник
Можно что?
#11 by alexb
Да, ведь Вы уже написали что:" столько сеансов с одной базой, сколько нужно. В каждом из сеансов можно запустить длительную обработку, а в ещё одном делать...". Не внимательный...:)
#12 by Волшебник
В идеале должно быть так. Работает пользователь, открывает какие-то окошки, отчеты формирует... Затем он запустил длительный отчет и ему понадобился второй сеанс с точно таким же окружением. Он нажимает кнопку "Clone" (которая всегда доступна) и видит второй процесс 1С с точно таким же окружением. Причём некоторое приближение к идеалу можно сделать штатными средствами 1С 8.0.
#13 by Волшебник
Хотя я не прав. В идеале все отчеты должны формироваться моментально. А если какой-то отчёт и затянулся на десяток секунд, то пользователь должен иметь возможность продолжать работать в том же сеансе.
#14 by alexb
Я в инете видел обработку, она как демонстрауионный пример. Открываешь её и она как бы клонируется, тоесть сразу несколько отчетов например запускаются, несколько обработок забыл как называется...наверное Вы про это и говорите...
#15 by alexb
Как понять моментально ?
#16 by Волшебник
После нажатия на кнопку Сформировать проходит менее 0.1 секунды.
#17 by alexb
Ну это ихмо слишком... Меня вот например давно мучает вопрос, как работает НайтиПоКоду физически. Просто у меня в базе 20 000 наименований, а находит мгновенно. Не понимаю я этого, если не сложно расталкуйте в двух словах.
#18 by Волшебник
Индекс. В таблице реляционной базы данных данные обычно хранятся в том же порядке, в котором их ввели в таблицу. Хотя такой способ хранения и позволяет Вам быстро вводить новые данные, но поиск нужной строки в таблице представляется трудным. Например, в таблице MOVIE могут храниться тысячи названий фильмов в том порядкке, в котором эти фильмы закупались фирмой проката видеопродукции. Если Вам нужно найти какой-то определенный фильм, например “Танцы с волками”, он может храниться в любом месте таблицы MOVIE в зависимости от того, когда его приобрели и ввели в базу данных. Представьте себе, сколько времени может занять поиск “Танцев с волками”, если просматривать по порядку все строки в таблице. Чтобы решить эту проблему поиска данных, СУБД использует особый тип файла, называемый индексом. Точно так же, как содержание (Index) книги помогает Вам быстро найти информацию, поскольку содержит все номера страниц книги, посвященных конкретной теме, так и в базе данных, если информация, хранящаяся в колонке, индексирована, то индекс указывает на все строки, в которых хранится конкретное значение колонки. Например, если фирма проката видеопродукции нуждается в быстром поиске фильмов по их названию, то Вы можете создать индекс по колонке movie_name таблицы MOVIE. В индексе movie-name названия фильмов отсортированы в алфавитном порядке. Для каждого названия фильма индекс ссодержит ссылку, указывающую, в каком месте таблицы хранится этот фильм. Когда Вам нужно найти какой-то фильм, Вы вводите соответствующий критерий поиска (movie-name=“Танцы с волками”), как выражение в запросе. При выполнении запроса СУБД просматривает индекс, чтобы найти, где хранится нужный фильм, вместо того чтобы просматривать по порядку все строки таблицы MOVIE. Поскольку значения в индесе хранятся в определенном порядке и нужно просматривать значительно меньший объем данных, использование индекса для поиска нужной информации гораздо быстрее, чем просмотр требуемых таблиц базы данных.
#19 by Волшебник
Поиск на форуме использует так называемый "полнотекстовый индекс". База форума составляет почти 1 млн сообщений, а поиск по этой базе производится в пределах 30 секунд. У Яндекса объемы еще выше, а время поиска - моментально. У Google возможно еще быстрее.
#20 by alexb
сенкс
#21 by alexb
Так в идеале моментальные отчеты, должны использовать примерно тоже самое - индексы, так ?
#22 by Волшебник
Возможно индексов будет мало. Нужны OLAP-кубы. Нечто похожее на регистры с уже рассчитанными итогами по всем измерениям. Ищи в Яндексе.
#23 by Волшебник
+ Кстати, изобретатель OLAP - тот же самый человек, который изобрёл реляционные базы данных - доктор Е.Ф. Кодд. И концепцию OLAP он предложил ещё в 1993 году. Тогда даже 1С ещё не было.
#24 by Stio
2Волшебник Спасибо за ОбработкуПрерыванияПользователя. Это конечно не отдельная кнопка прерывания, но всё же лучше чем ничего. Кстати, не совсем понимаю, цитата справки: "Прерывания выполнения допускается если оно инициировано определенным интерактивным действием пользователя. К таким действиям относятся: нажатие кнопки в форме; и т.д.". Но ведь кнопки всё равно нельзя нажимать даже при вставке ОбработкиПрерыванияПользователя в цикл!? Что-то сразу не вижу как здесь WSH можно пристроить (точнее вообще незнаю :).    ПодключитьОбработчикОжидания - я так понимаю это что-то типа таймера, как в JavaScript'е - SetTimer, передаём название процедуры для вызова и время через которое нужно её вызвать, сам процессор при ожидании, естественно, не загружен. (Сейчас посмотрю).     Мне нужно сделать эмуляцию работы пользователя с базой 1С :) Ну это прямо лекция 2-го курса предмета "Структуры и алгоритмы обработки данных" :)
#25 by Волшебник
Пользователь нажимает кнопку, затем запускается твой цикл, в котором вызывается эта процедура. в WSH есть метод Sleep Эмуляция? зачем?
#26 by Stio
То есть в справке имеется ввиду имено это (кнопка старта цикла), а не кнопка его завершения? А почему бы не сделать включение (одной кнопкой) и выключение (другой кнопкой) через ПодключениеОбработчикаОжидания, тем более что ожидание в "вечном" цикле ИМХО в моём случае будет больше по длительности чем его поэтапная работа. О WSH: понятно, думаю это будет громоздко, тем более то что нужно можно сделать с помощью подключения обработчика ожидания. Эмуляция для проведения тестирования нагрузки на сервер при большом количестве активно работающих пользователей.
#27 by Stio
В общем главное правильно юзать таймеры :)
#28 by romix
Всю ветку не читал Через WSH в 7.7 мне не удалось поюзать метод Sleep (просто невозможно, и все тут). Зато можно сделать это через простейшую ВК. (с дельфийским исходником) Практическое применение - чтобы у всех юзеров не выскакивало красное окошко "транзакция ...", когда на сервере выполняется длительная обработка (например, перепроведение документов). Также мне один раз потребовалось юзать это в комплекте с SendKeys/AppActivate, чтобы сграбить инфу с дисков ИТС, или зачем-то еще, уже не помню. :-) Короче вставить паузу, чтобы окошко успело открыться, и только потом посылать в него клавиши. Юзать Предупреждение("",1); тоже можно, но имхо неаккуратно.
#29 by цикл
в одной специализированной конфигурации ряд документов проводился построчно и общее время проведения составляло от 5 сек до 2 мин. Для файлового режима оказалась приемлемой конструкция Процедура ЗаписьСтроки(Док)
#30 by romix
А юзерам-то не легче... Я бы не жмотился и по любому делал паузу, скажем, секунду. Чтобы транзакции юзеров могли провестись. Время проведения замедлится, скажем, вдвое, но другие пользователи не будут испытывать затруднений в своей работе с 1С.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С