Имя: Пароль:
1C
1С v8
Выполнение метода в фоне (На клиенте)
,
0 Alex_
Alexsin_2020
 
31.03.21
16:01
Доброго дня

ПОдскажите как сделать следующее!

мне необходимо постояно следить за каталогом и если в нем появился файл помещать сперва инфу в ТЗ а затем печатать ее

смысл в том что оборудование для печати работает только на тонком клиенте и НаКлиенте

следовательно ника кане могу догнать как ассинхронно ее выполнять?

при всем при этом печать чека идет из текстового файла и необходимо на линиях разрыва выдавать предупреждение типа Оторвите чек

и только после нажатия ввода можно продолжать печать (
1 hhhh
 
31.03.21
16:08
(0) чего это у вас такая допотопная касса? Купите кассу, чтобы чек сам обрезался.
2 Garykom
 
гуру
31.03.21
16:10
(0) ВК написать
3 Alex_
Alexsin_2020
 
31.03.21
16:10
куплена ужо

СентоЛАН не умеет обрезать (
4 Alex_
Alexsin_2020
 
31.03.21
16:10
(2) серьезно?

вообще никак?
5 Garykom
 
гуру
31.03.21
16:13
(4) фоновые на клиенте только в МП выполняются
6 Garykom
 
гуру
31.03.21
16:13
(5)+ но если у тебя локальная файловая то клиент=сервер
7 Alex_
Alexsin_2020
 
31.03.21
16:14
(5) МП  что етсь?

(6) Серверная
8 Garykom
 
гуру
31.03.21
16:15
с подобным уровнем знаний вам пока рано решать эту задачу
9 Alex_
Alexsin_2020
 
31.03.21
16:17
(8) Вы серьезно? ))

а по существу ответить?
10 Alex_
Alexsin_2020
 
31.03.21
16:20
Обратите внимание на мою полосочку под ником )

и сравните со своей )

у меня меньше а следовательно я редко задаю вопросы

я самоучка )

и да я многого не знаю от того и иду спросить совета

ответьте пож. что такое МП
11 Жан Пердежон
 
31.03.21
16:28
ПодключитьОбработчикОжидания()
12 Kassern
 
31.03.21
16:32
(10) наверное в контексте данной ветки имелось в виду мобильное приложение (МП)
13 fisher
 
31.03.21
16:37
(0) На клиенте только один поток. Поэтому асинхронности не будет. Но подозреваю, что (11) тебе подойдет.
14 fisher
 
31.03.21
16:40
Соврал. Асинхронность будет. Фонового выполнения не будет.
15 Garykom
 
гуру
31.03.21
16:43
(14) на клиенте фоновое только через ВК
16 DGorgoN
 
31.03.21
16:57
Я за ПодключитьОбработчикОжидания()
17 fisher
 
31.03.21
17:05
(15) Логично :) Я просто поправил себя же, потому что асинхронность <> многопоточность.
18 Garykom
 
гуру
31.03.21
17:31
(17) Теоретически можно попробовать для фона на клиенте извратиться через ПолеHTML и JS где вроде как есть многопоточность
https://developer.mozilla.org/ru/docs/Web/API/Web_Workers_API/Using_web_workers

Но хз как это в 1С и в какой последовательности будет обрабатываться когда из JS будет дергаться
https://infostart.ru/public/398366/

Но будет ли реально фоново хз
19 MouHacTaBHuk
 
31.03.21
17:48
(1) (3) (16) я за попытку номер 2. Купить нормальный аппарат, который будет просто работать, а не висеть на бесконечной поддержке программиста
20 sikuda
 
31.03.21
18:39
(18) Не учите молодого сразу извращениям. Обычно JS не имеет доступ к локальному диска компьютера для безопасности.
21 Garykom
 
гуру
31.03.21
18:46
(20) js дёргает функцию в 1С которая имеет
22 PuhUfa
 
31.03.21
19:17
(0) >>на линиях разрыва выдавать предупреждение типа Оторвите чек
и кто будет отрывать чек? специально обученный сотрудник? а если он на обеде?
23 Alex_
Alexsin_2020
 
01.04.21
10:03
(19) какая же программная касса по доступной цене у Нас В Беларуси есть?

)) которая может работать в режиме фискальника и для которой нету необхоимости сертифицировать по?
24 Alex_
Alexsin_2020
 
01.04.21
10:04
(22) :-) это так поржать? ))))))))
25 Alex_
Alexsin_2020
 
01.04.21
10:05
(16) пробовал но он вешает прогу (

я решил сделать проще захотели отчеты с терминала печатать просто жмают кнопачку прога вешается и ждет файлов от терминала

видимо много поточности я не добьюсь (

всем спасибо )
26 VladZ
 
01.04.21
10:17
Странная, конечно реализация.
Я бы попробовал разбить задачу на две части:
- добавил фоновое задание, которое "забирает" данные из файла и пишет в регистр сведений.
- вторая часть - эта  сама обработка. Смотрит, какие данные не отработаны в регистре сведений и печатает из регистра. С любыми вопросами в любом месте.
27 Alex_
Alexsin_2020
 
01.04.21
10:43
(26) проблема в том что
1. файл лежит в каталоге пользователя на клиенте (у меня серверная БД)
было бы классно конечно реализовать прослушку каталога в фоне что бы обойтись одним методом но можно и не заморачиваться (
28 fisher
 
01.04.21
11:29
(25) > пробовал но он вешает прогу
У всех не вешает, а у тебя вешает. Беда.
29 Garykom
 
гуру
01.04.21
11:44
(28) так он видать в цикле начинает проверку хреначить не отпуская основной поток
30 Alex_
Alexsin_2020
 
01.04.21
11:51
(28)
&НаКлиенте
Процедура Печать()
    КассаПараметры = Новый Структура();
    КассаПараметры.Вставить("Источник","Пользователь");
    КассаПараметры.Вставить("ИмяСобытия","ПечатьНеФиск");
    ВыполнитьОбработкуОповещения(Новый ОписаниеОповещения("ПечатьФискальнойИНефискальнойИнформации",ЭтотОбъект,КассаПараметры));
КонецПроцедуры

&НаКлиенте
Процедура ПечатьФискальнойИНефискальнойИнформации(Результат, Параметр) Экспорт
    //Здесь Цикл лежал я его убрал который всегда проверял наличие файла
    //И это вешало прогу
    
    //внутри этого цикла при условии что файл есть выполнялось все что ниже
    
    ТЗЧЕКОВ = СобытияПодключенияКассовогоОборудованияСервер.СоздатьТЗ();
    ТЗЧЕКОВ.Колонки.Добавить("ВидЧека"); //Для Клиента / для банка
    ТЗЧЕКОВ.Колонки.Добавить("ВидСтроки"); //1 начало / 0 конец
    ТЗЧЕКОВ.Колонки.Добавить("Строка");
    
    ////Рабоаем на кассе читаем файл
    порт = 3;
    скорость = 9600;
    
    ИмяФайла = глДрайверКассовогоОборудования.ПутьДляОтчетовСТерминала+"tusson.txt";
    
    ОбъектДрайвераОбработки = глДрайверКассовогоОборудования.ДрайверКассы;
    
    Текст = Новый ЧтениеТекста(ИмяФайла);
    
    Строка = Текст.ПрочитатьСтроку();

    Пока Строка <> Неопределено Цикл //строки читаются до символа       перевода строки
        
        //читаем строку и печатаем текст                
        Если СокрЛП(Строка) = "|" Тогда
            НовыйЧек = 0;
            СТрТЗ = ТЗЧЕКОВ.Добавить();
            Если НовыйЧек = 1 Тогда
                СТрТЗ.ВидЧека = "ДляКлиента";
            Иначе
                СТрТЗ.ВидЧека = "ДляБанка";
            КонецЕсли;
            
            Если СокрЛП(Строка) <> "|" И СокрЛП(Строка) <> "" Тогда
                СТрТЗ.Строка  = Строка;
            КонецЕсли;
            
            Если СОКРЛП(Строка) = "НЕДОСТАТОЧНО СРЕДСТВ" Тогда
                СообщениеКассиру = "НЕДОСТАТОЧНО СРЕДСТВ";
            ИначеЕсли  СОКРЛП(Строка) = "еще какое то сообщение" Тогда
                СообщениеКассиру = "------";
            КонецЕсли;
            
            Строка = Текст.ПрочитатьСтроку();
            
        Иначе
            
            СТрТЗ = ТЗЧЕКОВ.Добавить();
            Если НовыйЧек = 1 Тогда
                СТрТЗ.ВидЧека = "ДляКлиента";
            Иначе
                СТрТЗ.ВидЧека = "ДляБанка";
            КонецЕсли;
            Если СокрЛП(Строка) <> "|" И СокрЛП(Строка) <> "" Тогда
                СТрТЗ.Строка  = Строка;
            КонецЕсли;
            Если СОКРЛП(Строка) = "НЕДОСТАТОЧНО СРЕДСТВ" Тогда
                СообщениеКассиру = "НЕДОСТАТОЧНО СРЕДСТВ";
            ИначеЕсли  СОКРЛП(Строка) = "еще какое то сообщение" Тогда
                СообщениеКассиру = "------";
            КонецЕсли;
            Строка = Текст.ПрочитатьСтроку();
            
        КонецЕсли;
    КонецЦикла;
    
    Текст.Закрыть();
    
    ошибка = ОбъектДрайвераОбработки.Текст(порт,скорость,0,"");    
    
    Для каждого СтрТЗ из ТЗЧЕКОВ Цикл
        Если СтрТЗ.ВидЧека = "ДляКлиента" Тогда
            ошибка =      ОбъектДрайвераОбработки.Текст(порт,скорость,1,СтрТЗ.Строка);            
        КонецЕсли;
    КонецЦикла;
    
    ошибка =      ОбъектДрайвераОбработки.Текст(порт,скорость,6,"");
    
    //Предупреждение("Оторвите чек!");
    
    
    ошибка = ОбъектДрайвераОбработки.Текст(порт,скорость,0,"");
    
    Для каждого СтрТЗ из ТЗЧЕКОВ Цикл
        Если СтрТЗ.ВидЧека = "ДляБанка" Тогда
            ошибка =      ОбъектДрайвераОбработки.Текст(порт,скорость,1,СтрТЗ.Строка);
        КонецЕсли;
    КонецЦикла;
    ошибка =      ОбъектДрайвераОбработки.Текст(порт,скорость,6,"");

    //Предупреждение("Оторвите чек!");

    
    ошибка = глДрайверКассовогоОборудования.ДрайверТерминала.УдалитьФ();     

КонецПроцедуры
31 Alex_
Alexsin_2020
 
01.04.21
11:54
(29) а как еще можно проверить наличие файла?

не отрицаю возможно я что то делаю не так (
32 Garykom
 
гуру
01.04.21
11:56
(31) Поиском по маске, если нет то закончили не надо в цикле крутить
И в следующую сработку ПодключитьОбработчикОжидания снова один раз проверь
33 fisher
 
01.04.21
12:41
Я бы сделал так.
Обработка ожидания с нужной периодичностью (скажем, несколько секунд) проверяет наличие новых файлов и если они есть - бьет по чекам и подсасывает их в память (файлы при этом лучше не удалять безвозвратно, а перемещать в архивный каталог - чтобы можно было восстановиться при сбое). Естественно, без циклов. Есть файлы - подсосали и вышли. Нету - сразу вышли. Разбиение по чекам - ключевой момент, чтобы предупреждение об отрыве задавать немодально и не вешать интерфейс.
Другая обработка ожидания анализирует очередь чеков в памяти и если очередь непустая - печатает очередной чек, удаляет его из памяти и выдает немодальное предупреждение об отрыве чека. Тут наверное нужно будет предусмотреть флаг блокировки интерфейса, чтобы пока пользователь не среагирует на предупреждение - очередь не обрабатывалась.
34 fisher
 
01.04.21
12:50
То есть одновременно с выдачей немодального предупреждения устанавливать флажок в клиентской переменной модуля и пока он взведен - не обрабатывать очередь (сразу выходить из обработчика очереди). А когда пользователь асинхронно подтвердит отрыв чека - флаг сбрасывать и сразу запускать очередную выборку чека из очереди (чтобы не дожидаться срабатывания обработчика).
35 Kassern
 
01.04.21
12:51
Сколько же извращений ради чеков...
36 fisher
 
01.04.21
12:53
Если подумать, то лучше очередь чеков делать не в памяти, а разбивать их на файлики в том же каталоге (с другим расширением). Это если я правильно понял и в одном файлике может быть несколько чеков.
Тогда один обработчик будет разбивать на чеки, а второй будет их печатать и требовать отрыва.
37 Alex_
Alexsin_2020
 
01.04.21
13:04
(32) дайте пример я что то не понимаю (
38 fisher
 
01.04.21
13:07
(37) Что тут понимать? При подключении обработчика ожидания ты можешь указать цикличность с которой платформа будет его вызывать. Получится тот же самый цикл только с паузами между итерациями, во время которых программа висеть не будет.
39 Галахад
 
гуру
01.04.21
13:08
Хм. Одного не понимаю, если база серверная, то наверное задание на печать формируется этой же самой базе.
40 Галахад
 
гуру
01.04.21
13:09
Зачем через файлик-то?
41 fisher
 
01.04.21
13:13
(40) У него какая-то программная касса, в которую он по API шлет задания, а она при фиксации чека выплевывает файликами их бумажные образы. Я так понял :)
42 Галахад
 
гуру
01.04.21
13:17
(41) О, как. Интересное решение. Получается в ККТ ничего не печатается.
43 Конструктор1С
 
01.04.21
13:21
(0) не пытайся сделать всё и сразу. Пускай регламентное задание шерстит расшаренный каталог, в случае чего стягивает файл и записывает данные в промежуточное хранилище. Когда прочитал возводи какой-нибудь флаг. Это флаг будет читать клиент и выводить данные на печать
44 Alex_
Alexsin_2020
 
01.04.21
13:28
(41) да именно так только не касса а терминал выплевывает файлы

а затем читаем этот файл и печатаем на кассу
45 fisher
 
01.04.21
13:32
(44) "Терминал" - это типа фискальная часть, обделенная печатающим устройством?
46 fisher
 
01.04.21
13:33
(44) А как это чудо хоть выглядит? Кинь ссылку :)
47 fisher
 
01.04.21
13:35
А, дошло. POS-терминал.
48 fisher
 
01.04.21
13:37
То есть на POS-терминале теперь еще и 1С для печати чеков? Жесть.
49 fisher
 
01.04.21
13:40
Хоть убей не пойму, как это все можно сертифицированно использовать.
50 Жан Пердежон
 
01.04.21
19:12
(37) выбирай из 6 вариантов:

НачатьПоискФайлов();
НайтиФайлы();
НайтиФайлыАсинх();

ФФ = Новый Файл(ИмяФайла);
ФФ.НачатьПроверкуСуществования();
ФФ.Существует();
ФФ.СуществуетАсинх();
51 Alex_
Alexsin_2020
 
02.04.21
12:14
(45) да Верно!
52 Alex_
Alexsin_2020
 
02.04.21
12:15
53 Alex_
Alexsin_2020
 
02.04.21
12:25
В общем модуле

Прописал такую строчку

ПодключитьОбработчикОжидания("ЕстьФайлПечати", 60);


и написал Метод

Процедура ЕстьФайлПечати() Экспорт
    ВыбФайл = Новый Файл(глДрайверКассовогоОборудования.ПутьДляОтчетовСТерминала+"tusson.txt");
    Если ВыбФайл.Существует() = Истина Тогда
        вмвм = "";
    КонецЕсли;    
КонецПроцедуры


программа ругается на первый параметр ЕстьФайлПечати что не так то?

в моуле стоит флаг для клиента

что ему надо то?
54 Alex_
Alexsin_2020
 
02.04.21
12:28
(49) прогу для управления этим оборудованием не нужно сертифицировать
55 Kondarat
 
02.04.21
12:38
ПодключитьОбработчикОжидания (AttachIdleHandler)
Синтаксис:
ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
.
.
.
Описание:
Подключает вызов указанной процедуры модуля приложения (модуля обычного приложения) или глобального общего модуля через определенный интервал времени.
56 Alex_
Alexsin_2020
 
02.04.21
12:41
(5) да спасибо я уже нашел (не успел написать )
57 Alex_
Alexsin_2020
 
02.04.21
12:44
(Кто там советовал ПодключитьОбработчикОжидания)

Да это работает спасибо! :-)

я почему то не дочитал и подумал о методе ВыполнитьОбработкуОповещения вот она и вешала окно (