Внешнее событие в модальной форме

1. d.zhukov 1392 22.09.20 09:54 Сейчас в теме
Добрый день.
Проблема: Перед записью документа открывается модальная форма (обычные формы) для ввода штрихкода пользователя. Штрихкод подхватывается внешним событием (в сканере все настроено как надо). В итоге когда сканируем ШК ничего не происходит, либо срабатывает ВС из основной формы.
В соседних темах читал про подобный косяк. там пишут, что обработка ожидания нужна для запуска модальных форм, только как ее применить не понял.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
9. FilippovRI 71 23.09.20 15:45 Сейчас в теме +5 $m
(3) ЭтаФормаПросмотр=Истина;
или
Создайте глобальную переменную Флаг и пусть она будет управлять
d.zhukov; +1 Ответить
15. d.zhukov 1392 25.09.20 09:49 Сейчас в теме
(9) спасибо) глобальная переменная решает)
В общем добавил в модуль объекта экспортную переменную НеВыполнятьВС и ставлю ей значение "истина" перед открытием мод.окна и возвращаю "ложь" после его закрытия. В ВС основной формы проверяю данную переменную
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. dandykry 10 22.09.20 10:07 Сейчас в теме
(1)

Во время вызова модальной формы, в основной вызвать
ЗаблокироватьДанныеФормыДляРедактирования();

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

ВводДоступен()

http://prntscr.com/ullfxo - типовой код управляемых форм
зы после обработки не забыть разблокировать

РазблокироватьДанныеФормыДляРедактирования()
3. d.zhukov 1392 22.09.20 10:38 Сейчас в теме
(2)
ЗаблокироватьДанныеФормыДляРедактирования();

На обычных формах по моему такой метод недоступен
4. dandykry 10 22.09.20 10:49 Сейчас в теме
(3) Возможно. Введите переменную.

НеОбрабатыватьВЭтойФормеВнешнееСобытие = Истина;
Результат = ОткрытьФормуМодально(ИмяФормы);
НеОбрабатыватьВЭтойФормеВнешнееСобытие = Ложь;


в ОбработкаОповещения:

Если Источник = "ПодключаемоеОборудование" И НеОбрабатыватьВЭтойФормеВнешнееСобытие = Ложь Тогда
		Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
			ОбработатьШтрихкоды(МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр));
		КонецЕсли;
	КонецЕсли;
5. d.zhukov 1392 22.09.20 10:57 Сейчас в теме
(4)
Если Источник = "ПодключаемоеОборудование" И НеОбрабатыватьВЭтойФормеВнешнееСобытие = Ложь Тогда
Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
ОбработатьШтрихкоды(МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр));
КонецЕсли;
КонецЕсли;


Обработка оповещения в основной форме? или в модальной?
6. dandykry 10 22.09.20 11:25 Сейчас в теме
(5) Это в основной.

Подключаемое оборудование при получении данных из компоненты устанавливает переменную глПодключаемоеОборудованиеСобытиеОбработано = Ложь, и оповещает все формы о событии. Первая форма, которая обработает событие, установит глобальную переменную глПодключаемоеОборудованиеСобытиеОбработано = Истина; (возможно в вашей конфигурации переменная несколько иначе называется), чтобы это событие не обрабатывалось повторно.

Смысл того, что я написал в том, чтобы основная форма не обрабатывала событие, пока открыта модальная. Сомневаюсь, что какие то обработчики ожидания помогут вам решить вашу проблему. Если можете, пришлите ссылку на эту тему, я прочитаю и подумаю, что там предлагают
12. d.zhukov 1392 24.09.20 13:01 Сейчас в теме
(6)
Если можете, пришлите ссылку на эту тему, я прочитаю и подумаю, что там предлагают

Извините. что с запозданием. Был занят
https://forum.infostart.ru/forum9/topic138505/
14. dandykry 10 24.09.20 13:18 Сейчас в теме
(12)

Если речь шла об этом

у себя обошел эту проблему открытием формы модально, но из обработчика ожидания.
т.е. даем завершится внешнему событию.
Подключаем в нем обработчик ожидания на открытие модальной формы. И все работает.


то видимо человек ловит внешнее событие и сразу после него пытается открыть модальное окно.
Если я правильно вас понял, то у вас уже открыто модальное окно, и в нем нужно обработать внешнее событие.

К слову, где то ниже сказали о том, что в основной форме хорошо бы отключить ТО. Т.е в событии при закрытии должна быть строчка, которая отключает ТО от формы. Ее бы тоже вызвать не мешало бы перед открытием модальной формы, а после вызвать подключение ТО назад.
9. FilippovRI 71 23.09.20 15:45 Сейчас в теме +5 $m
(3) ЭтаФормаПросмотр=Истина;
или
Создайте глобальную переменную Флаг и пусть она будет управлять
d.zhukov; +1 Ответить
13. d.zhukov 1392 24.09.20 13:02 Сейчас в теме
(9)
ЭтаФормаПросмотр=Истина;

Доступность формы никак не влияет на внешнее событие
15. d.zhukov 1392 25.09.20 09:49 Сейчас в теме
(9) спасибо) глобальная переменная решает)
В общем добавил в модуль объекта экспортную переменную НеВыполнятьВС и ставлю ей значение "истина" перед открытием мод.окна и возвращаю "ложь" после его закрытия. В ВС основной формы проверяю данную переменную
7. user5300 1000 22.09.20 11:51 Сейчас в теме
(1)
Штрихкод подхватывается внешним событием

У ВС есть дополнительные параметры, добавь условие чтоб отработало только в открытой форме
8. FilippovRI 71 23.09.20 15:43 Сейчас в теме
Должно быть

По примеру УТ из Реализации Товаров и услуг можно посмотреть как делается
При открытии
ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);



При закрытии
	
	ПолучитьСерверТО().ОтключитьКлиента(ЭтаФорма);
	
	


Внешнее событие вставляешь условие

	Если Источник="Сканер штрихкода" и Событие="ПолученШтрихкод" Тогда
	ПолучитьСерверТО().ОбработатьВведенныйШтрихкод(Штрихкод, ЭтаФорма);



Типовой код обработки штрихкода
Функция ПоддерживаетсяВидТО(Вид) Экспорт
	
	Результат = Ложь;
	
	Если Вид = Перечисления.ВидыТорговогоОборудования.СканерШтрихКода
		Или Вид = Перечисления.ВидыТорговогоОборудования.СчитывательМагнитныхКарт
		Или Вид = Перечисления.ВидыТорговогоОборудования.ТерминалСбораДанных
		Или Вид = Перечисления.ВидыТорговогоОборудования.СчитывательRFIDМеток
		Или Вид = Перечисления.ВидыТорговогоОборудования.ККТ Тогда
		Результат = Истина;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции 

Функция СШКНоменклатура(Номенклатура, Характеристика, Серия, Качество,
	Единица, Количество, СШК) Экспорт
	
	Результат        = Истина;
	СтруктураПодбора = РаботаСТорговымОборудованием.СформироватьСтруктуруПодбора(неопределено, Номенклатура, Характеристика,
	Серия, неопределено, Единица,
	Количество, неопределено,
	Неопределено, неопределено,
	неопределено, , неопределено, неопределено);
	
	Возврат Результат;
КонецФункции // СШКНоменклатура()

Функция СШКНеизвестныйКод(Штрихкод, ТипКода, СШК) Экспорт
	
	Возврат Ложь;
	
КонецФункции // СШКНеизвестныйКод()

Процедура СШКОшибка(Ошибка, Штрихкод, ТипШК, СШК) Экспорт
	ГлобПроверкаОшибки=Ложь;
	Текст = ПолучитьСерверТО().ПолучитьТекстОшибкиСШКТО(Ошибка, Штрихкод, ТипШК);
	ОшибочныйШтрихкод=Текст;
	Сигнал();
	Если Вопрос(Текст,РежимДиалогаВопрос.ОК) = КодВозвратаДиалога.ОК тогда
    ГлобПроверкаОшибки=Истина;
		КонецЕсли;
	
	
	КонецПроцедуры // СШКОшибка()
Показать
11. FilippovRI 71 23.09.20 17:17 Сейчас в теме
(8) забыл
Добавить реквизиты формы ИспользоватьПодключаемоеОборудование (Булево), ПоддерживаемыеТипыПодключаемогоОборудования (Строка).
10. Sph1nX 23.09.20 16:57 Сейчас в теме
Если срабатывает процедура ВнешнееСобытие в основной форме, видимо там после этого происходит что-то блокирующее.
Обычно происходит вызов этой процедуры во всех открытых формах, где она прописана в свойствах. (Но глюки тоже случаются, не редко)

Как уже писали выше, в модуле основной формы добавить ВводДоступен()

Например так
Процедура ВнешнееСобытие(Источник, Событие, Данные)
	Если Не ВводДоступен() Тогда
		Возврат;
	КонецЕсли;


Ну и в свойствах формы ввода ШК в разделе Событий, проверьте выбрана ли процедура для ВнешнегоСобытия.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)