Имя: Пароль:
1C
1C 7.7
v7: Корректное прерывание работы процедуры
0 Cyr
 
23.05.24
12:19
Есть процедура пакетной печати чеков из документа.
Нужно предусмотреть корректное прерывание этой процедуры.
При этом в документе должно сохраниться количество уже напечатанных чеков.
Как это реализовать? Кнопку "Стоп" я пробовал делать. Но она будет неактивна во время выполнения процедуры... А при нажатии Esc может ведь некорректно печать завершиться (не завершиться)?
1 Волшебник
 
23.05.24
12:51
Каждые N чеков выдавайте окно вопроса "Продолжить?" с таймаутом 5 сек
2 Cyr
 
23.05.24
12:57
(1) не вариант
3 Волшебник
 
23.05.24
12:57
(2) Чё это?
4 Cyr
 
23.05.24
12:59
нужно в любой момент прервать. чаще всего в начале. если ошиблись с параметрами.
5 Волшебник
 
23.05.24
13:02
(4) Тогда выдавайте окно через каждый чек и таймаут 2 сек
6 Волшебник
 
23.05.24
13:03
Можно вначале делать таймауты подольше (по 7 сек), а потом постепенно их уменьшать, но минимум 2 сек
7 Cyr
 
23.05.24
13:03
(5) да меня кассиры проклянут.
8 Волшебник
 
23.05.24
13:04
(7) Нам-то что...
9 Cyr
 
23.05.24
13:04
(6) есть варианты без этого?
10 skafandr
 
23.05.24
13:06
(4)
Вариант 1:  Сделать как советуют в (1) с N=1 :-)
Вариант 2:  Сделать как советуют в (1) для первого чека с вопросом "Проверьте правильность чека. Продолжить?" далее печать без остановок
11 Волшебник
 
23.05.24
13:06
(9) Я в скафандре
12 Cyr
 
23.05.24
13:10
А что в 1С нет возможности во время исполнения процедуры опрашивать кнопку и по её нажатию менять значение переменной? А цикле печати в нужный момент по значению переменной прерывать цикл, записывать и закрывать документ.
13 Волшебник
 
23.05.24
13:15
(12) Во время исполнения кнопку нажать не получится, Вы же сами писали
Кнопку "Стоп" я пробовал делать. Но она будет неактивна во время выполнения процедуры...
14 Климов Сергей
 
23.05.24
13:15
Запамятовал: ОбработкаПрерыванияПользователя() только в 8 появилась?
15 Смотрящий
 
23.05.24
13:16
(14) Нет, и в клюшках есть; по другому обзывается только
16 Волшебник
 
23.05.24
13:17
(14)(15) Она тут не поможет, потому что она не даёт времени среагировать
17 Cyr
 
23.05.24
13:16
(15) а как?
18 Смотрящий
 
23.05.24
13:18
(15) Поможет, только надо весь код в одну процедуру сложить - работает в текущей процедуре
(17) Не помню, а движка 7.7 нет под рукой
19 Ёпрст
 
23.05.24
13:18
(0) только через вк. Можно фоном запустить в активиксе, например. Тм же, прерывание делать
20 Cyr
 
23.05.24
13:21
(13) Я имел ввиду физическую кнопку клавиатуры.
21 Волшебник
 
23.05.24
13:22
(19) Ну уж нет. Я за лишнее проклятие ТС и таймаут
22 Cyr
 
23.05.24
13:24
(16) Вы про какую процедуру говорили?
23 Волшебник
 
23.05.24
13:30
(22) про клавишу Esc.

Вообще Вам должно быть стыдно в 2024 году сидеть на клюшках и отказываться от изучения восьмёрки.
24 Cyr
 
23.05.24
13:31
(23) А что нажатие клавиши Esc можно как-то обработать?
25 Волшебник
 
23.05.24
13:44
(24) Платформа 7.7 это делала за программиста, чтобы прерывать циклы
26 Ёпрст
 
23.05.24
13:46
(24) можно. Даже штатно, можно перехватывать и обрабатывать
27 Волшебник
 
23.05.24
13:47
28 Ёпрст
 
23.05.24
13:46
+26 всего лишь повесив хотекей на невидимую кнопку
29 Cyr
 
23.05.24
14:03
(28) На какую кнопку? Если кнопка на форме документа, то во время выполнения процедуры, хоткей не срабатывает. Так же как и нажать её невозможно. А если процедура не запущена, то да работает, только толку то...
30 Salimbek
 
23.05.24
14:04
(0) В коде процедуры опрашиваешь файловую систему на наличие "стоп"-файла. Пока его нет - твоя процедура крутится. Как только появилась необходимость - запускаешь батник на рабочем столе, который копирует или создает файл с нужным именем в контролируемую папку. Процедура твоя увидит этот файл, удаляет его и останавливает выполнение. Работает универсально.
Второй вариант - это запись в какой-то служебный Справочник или в Регистр из другого сеанса 1С-ки, и мониторинг в твоей процедуре наличия этой записи. Но тут надо подключаться другим сеансом к текущей базе. В случае однопользовательской не сработает.
31 Волшебник
 
23.05.24
14:05
Могу посоветовать оберег от проклятий
32 Kigo_Kigo
 
23.05.24
14:10
(30) п.2 Ну или через константу
33 Ёпрст
 
23.05.24
14:16
(29) на любую. Хот кей от Esc сработает на ней.
34 Irbis
 
23.05.24
14:29
(32) Константа так себе решение, заткнёт выполнение во всех сеансах, которые прочитать успеют. Видел решение с справочником как выше предлагали, так там и пользователь и имя обработки фигурировало.

P.S. Что-то много тем за пару дней по клюшкам стало. Кто-то откопал стюардессу?
35 Волшебник
 
23.05.24
14:30
(34) А Вы разве не слышали? v8 уходит из России
36 Ёпрст
 
23.05.24
14:33
Вот еще баянчик от Рупора
http://avb1c.narod.ru/files/bgmode.zip
37 Cyr
 
23.05.24
14:35
(33) на кнопках только F1-F12 можно выбирать...
Причём здесь Esc?
38 Злопчинский
 
23.05.24
14:46
(4) не надо ошибаться с параметрами.
Перед началом формирования задайте вопрос
- есть ошибочные пара етры да-нет).
Если прибегут с вопросом типа мы жмём Да, а оно не печатает - херачите их лопатой по лицу
39 Ёпрст
 
23.05.24
14:49
(37) да неужели ?! :))))
Если че, можно повесить любой
40 Ёпрст
 
23.05.24
14:49
41 Злопчинский
 
23.05.24
14:57
(29) пилять!
Печать одного чека вынести в отдельную функцию/процедуру. В процедуру-обертку поставить перебор чеков.
Обёртка запускает через форекс обработку ожидания на 30-50-100-300 мсек и завершает работу. Процедура печати по ОО печатает чек, отрубает ОО на процедуру печати и ставит ОО на процедуру обертку. Процедура обёртка толкает очередной чек.
.
Прерывание вешай хоть на энтер, хоть на Fn на кнопку или ыормексрвую обработау клавиш
42 Ёпрст
 
23.05.24
14:59
(41) можно и без вк, вон, рупор еще в начале 2000 написал как..см выше
43 Cyr
 
23.05.24
15:04
(39) каким образом повесить?
44 Irbis
 
23.05.24
15:07
(35) Приходит 9ка?
Или движки компоновки v8 запретили?
45 Cyr
 
23.05.24
15:12
(40) кнопочки там не работают в фоне.
46 Злопчинский
 
23.05.24
15:26
Так нихера и не понял в чем проблема...
47 Cyr
 
23.05.24
15:31
(46) проблема без внешних компонент поймать в работающей процедуре документа нажатие кнопки и в нужном месте цикл этой процедуры прервать.
48 Ёпрст
 
23.05.24
15:39
(47) см (36)
Сделать по аналогии
49 Злопчинский
 
23.05.24
15:45
(47) как определяется "нужное место цикла'.?
50 Cyr
 
23.05.24
15:56
(49) После закрытия чека.
51 Злопчинский
 
23.05.24
16:02
Ну поставь от начала формирования чека до закрытия века блокировку еsc. Формирование века вынеси в отдельную процедуру, далее (41).
52 Cyr
 
23.05.24
16:11
(51) Как поставить блокировку Esc?
53 Злопчинский
 
23.05.24
17:14
Если поставить блокировку-разблоки эскепла, то и даже на отдельные модули разносить не надо будет...
54 Злопчинский
 
23.05.24
17:15
(52) или вк (есть такая) или форексом блокировать
Про отключение ескейпа тема популярная, всплывала
55 Злопчинский
 
23.05.24
17:17
Но разнесение на модули с таймаутом срабатывания увеличивает шансы прервать обработку "побыстрее*
56 Cyr
 
23.05.24
19:40
(55) я не в курсе про таймаут.
57 Cyr
 
23.05.24
19:46
(54) что за форекс такой?
58 Волшебник
 
23.05.24
20:06
(57) (56) Мы разговариваем со стенкой...
59 MWWRuza
 
23.05.24
20:50
форекс = Formex Это просто кто-то описАлся :-)
60 Jackman
 
23.05.24
21:36
Напомнили мне один момент из 90х...

Пришел я как-то на собеседование в одну организацию, а тамошний программист, судя по всему, был личностью креативной. Смотрю, а у него в клавиатуру линейка воткнута, уже не помню, но скорее всего, зажата была кнопка "Enter". Он так реализовал процесс прерывания обработки по перепроведению документов в любой момент. Видно выскакивал вопрос после каждого дока, а зажатая кнопка давала утвердительный ответ.
61 int32i
 
23.05.24
21:48
Напомнило мне один момент из 90-х.
На склад можно было зайти с черного хода. Все кто не попало по предприятию шлялись. На черный ход поставили замок с защелкой чтобы дверь автоматически запиралась. Но нюанс - на черный ход все покурить выбегали. И быстро додумались в створ двери досочку подкладывать - чтобы не защелкивалась..

Мораль - человек всегда найдет способ "подложить дощечку" как ты алгоритм не реализуй.
62 Cyr
 
23.05.24
21:55
(36) так то интересно. Только пока не совсем понятен принцип работы.
Оно кстати не выводит табличку на справочниках с чётным количеством элементов.
63 Ёпрст
 
23.05.24
22:38
(62) вот тут посмотри еще, без вк..типа асинхронность, падают шарики и движение картменом
https://infostart.ru/1c/reports/18820/
64 Злопчинский
 
23.05.24
23:15
(61) всё реализуется при наличии политической воли и желания. Принцип простой: правильная дорога должна быть одна. Всё остальные дороги должны приводить к невозможности продолжить путь. Вариант один - вернуться и начать путь по правильной дороге. Стоимость преднамеренного проникновения в лазейки или попытки вмешаться в правильный режим работы должны приводить к высокой "цене". Когда руководство вставит РЕАЛЬНЫХ пздюлей - желающих выйти покурить через чёрный ход резко поубавится.
.
Как у всякого решения - у такого тоже есть свои минусы. Руководство само выбирает что ему важнее - предсказуемость результата и плановая работа без нервотрепки или ручное управление и затыкание всех дырок.
.
Что здесь для 1сника - выбирает сам одинэсник. Или он НКПР  или он отчасти ЛПР.
65 DCKiller
 
23.05.24
23:25
(0) Можно сделать вариант с кнопкой "Стоп"+использование ОбработкаОжидания.

Объявляешь в модуле формы какую-нибудь переменную, скажем "ПрерваноПользователем". По нажатию кнопки "Печать" устанавливаешь значение этой переменной в 0 и запускаешь обработку ожидания, которая запускает процедуру печати. Один вызов - один чек на печать. кнопка "Стоп" при этом будет у тебя доступна для нажатия. Как только пользователь жмакает на нее - делаешь "ПрерваноПользователем = 1", процедура, вызываемая обработкой ожидания считывает ее и прекращает печать. Ну вот как-то так.
66 Злопчинский
 
23.05.24
23:27
(65) см (41)
смайл
67 DCKiller
 
23.05.24
23:33
(66) Там ВК нужна, а здесь нет...
68 Злопчинский
 
23.05.24
23:41
(67) у тебя может получиться ситуация, когда чек напечатается наполовину и прилетит прерывание по ескейп, чек останется не закрытым...
?
69 Злопчинский
 
23.05.24
23:44
У "меня" Вк нужна только для того, чтобы нельзя было прервать именно блок печати, если это некритично, то и вк не нужна. Стандартная оо - меньше 1 сек не сделать, если жто некритично - то и твой вариантпрактически равен моему, если из моего убрать ВК
70 Cyr
 
24.05.24
05:48
(65) ну я примерно так и хотел сделать. Только про команду ОбработкаОжидания не знал.
71 Cyr
 
24.05.24
05:55
(68) ну при печати чека сначала проверяется, есть ли незакрытый документ. Если есть, он отменяется. Хотя в таком случае можно вообще не заморачиваться и смириться с тем, что количество напечатанных чеков в документе будет неправильным.
72 DJ Anthon
 
24.05.24
06:01
можно проверять наличие стоп-файла. только создавать его сторонними средствами, типа батника на горячую клавишу.
73 Cyr
 
24.05.24
09:10
(63)Да я никак не могу понять как скрипт обхода справочника работает :(
Куда мне вставлять СкриптКонтрол.SendKeys(""),
чтобы можно было нажать кнопку "Стоп"?
74 Ёпрст
 
24.05.24
15:44
(73) это нужно только длятобновления формы
75 Злопчинский
 
24.05.24
16:07
(73) кнопка ескйеп не котируется? ;-)
76 Cyr
 
24.05.24
19:56
(75) да хотелось бы без внешних длл.
77 Злопчинский
 
24.05.24
21:02
(76)  процедуру печати напиши полностью в одну строку. Тогда её прервать по ескейпу не получится и можно будет использовать ескейп для прерывания цикла перебора.
78 Злопчинский
 
24.05.24
21:03
(76) а каким образом кнопка стоп будет полезна? Как без вк заблокировать прерывание по ескейп?
79 Cyr
 
25.05.24
21:37
(77) процедура из множества команд состоит...
(78) я думал обойтись в этом случае без esc.
80 Злопчинский
 
25.05.24
23:23
(79) и как ты планировал обойтись без ескейпа? Заменить ескейп кнопкой стоп? Ну так при этом ескейп вме равно будет работать.
Или я чего-то не понял.
81 Злопчинский
 
25.05.24
23:25
(79) ты не поверишь, но по идее всю процедуру можно записать в одну строку.
И при правильной организации кода процедура печати века не такой уж и длиной будет.
82 Злопчинский
 
25.05.24
23:26
Впрочем, тебе там на месте виднее. И если можно прервать печать века в любой момент и чек останется незакрытым - тогда вообще предмет для обсуждения вообще отсутствует.