Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Выполнение метода в фоне (На клиенте)

Выполнение метода в фоне (На клиенте)
Я
   Alex_Alexsin_2020
 
31.03.21 - 16:01
Доброго дня

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

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

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

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

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

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

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

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

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

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

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

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

я самоучка )

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

ответьте пож. что такое МП
   Жан Пердежон
 
11 - 31.03.21 - 16:28
ПодключитьОбработчикОжидания()
   Kassern
 
12 - 31.03.21 - 16:32
(10) наверное в контексте данной ветки имелось в виду мобильное приложение (МП)
   fisher
 
13 - 31.03.21 - 16:37
(0) На клиенте только один поток. Поэтому асинхронности не будет. Но подозреваю, что (11) тебе подойдет.
   fisher
 
14 - 31.03.21 - 16:40
Соврал. Асинхронность будет. Фонового выполнения не будет.
   Garykom
 
15 - 31.03.21 - 16:43
(14) на клиенте фоновое только через ВК
   DGorgoN
 
16 - 31.03.21 - 16:57
Я за ПодключитьОбработчикОжидания()
   fisher
 
17 - 31.03.21 - 17:05
(15) Логично :) Я просто поправил себя же, потому что асинхронность <> многопоточность.
   Garykom
 
18 - 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/

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

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

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

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

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

&НаКлиенте
Процедура ПечатьФискальнойИНефискальнойИнформации(Результат, Параметр) Экспорт
    //Здесь Цикл лежал я его убрал который всегда проверял наличие файла

    //И это вешало прогу

    
    //внутри этого цикла при условии что файл есть выполнялось все что ниже

    
    ТЗЧЕКОВ = СобытияПодключенияКассовогоОборудованияСервер.СоздатьТЗ();
    ТЗЧЕКОВ.Колонки.Добавить("ВидЧека");//Для Клиента / для банка

    ТЗЧЕКОВ.Колонки.Добавить("ВидСтроки");//1 начало / 0 конец

    ТЗЧЕКОВ.Колонки.Добавить("Строка");
    
    ////Рабоаем на кассе читаем файл

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

    Пока Строка <> Неопределено Цикл//строки читаются до символа       перевода строки

        
        //читаем строку и печатаем текст                

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

    
     
    ошибка = ОбъектДрайвераОбработки.Текст(порт,скорость,0,"");
    
    Для каждого СтрТЗ из ТЗЧЕКОВ Цикл
        Если СтрТЗ.ВидЧека = "ДляБанка" Тогда
            ошибка =      ОбъектДрайвераОбработки.Текст(порт,скорость,1,СтрТЗ.Строка);
        КонецЕсли;
    КонецЦикла;
    ошибка =      ОбъектДрайвераОбработки.Текст(порт,скорость,6,""); 

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


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

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

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

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

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

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

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

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


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

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


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

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

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

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


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