1С бухгалтерия

В свое время писал статью про подключение сканера к 1С БП 2.0. Тема оказалась очень актуальной. На сегодняшний день довелось мне подключаться к БП 3.0. Ситуация другая, поэтому делюсь опять же своим опытом.

Итак, управляемые формы, 1С 8.3. За основу брал конфигурации:
Бухгалтерия предприятия, редакция 3.0 (3.0.43.124)
Библиотека подключаемого оборудования, редакция 1.2 (1.2.3.4)

В бухгалтерии включаем возможность изменения у общих модулей МенеджерОборудованияКлиентПереопределяемый и МенеджерОборудованияВызовСервераПереопределяемый.

Объединяем с конфигурацией из библиотеки подключаемого оборудования. Я убрал все галки и проставлял нужные мне вручную. Надо поставить галку на объединении с модулями МенеджерОборудованияКлиентПереопределяемый, МенеджерОборудованияВызовСервераПереопределяемый и отфильтровать по нужной подсистеме. В данном случае я отфильтровал(правильнее будет отметил) по подсистеме СканерыШтрихкода. Правда почему-то в моей версии БПО при фильтрации по СканерамШтрихкода не отметился общий модуль ПодключаемоеОборудованиеСканкодСканерыШтрихкодаКлиент(при том что макет с соответствующим драйвером отметился). Пришлось отметить его вручную.
В итоге наша конфигурация дополняется несколькими общими модулями, формами, макетами и картинками, которые связаны с работой сканера штрих кода.

В модуле МенеджерОборудованияКлиентПереопределяемый подправляем функцию ПолучитьОбработчикДрайвера, чтобы убрать лишнее. Мне нужен был только сканер, поэтому я оставил лишь:

Функция ПолучитьОбработчикДрайвера(ОбработчикДрайвера, ЗагружаемыйДрайвер) Экспорт
 
	// Используем универсальный обработчик драйвера по стандарту "1С:Совместимо".
#Если ВебКлиент Тогда
	Результат = ПодключаемоеОборудованиеУниверсальныйДрайверАсинхронноКлиент; 
#Иначе
	Результат = ПодключаемоеОборудованиеУниверсальныйДрайверКлиент;
#КонецЕсли

	// Обработчики драйверов не удовлетворяющие стандарту "1С:Совместимо".
	Если Не ЗагружаемыйДрайвер И ОбработчикДрайвера <> Неопределено Тогда
 
		// Сканеры штрихкода
		Если ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1ССканерыШтрихкода") Тогда
			Возврат ПодключаемоеОборудование1ССканерыШтрихкодаКлиент;
		ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикСканкодСканерыШтрихкода") Тогда
			Возврат ПодключаемоеОборудованиеСканкодСканерыШтрихкодаКлиент;
		ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолСканерыШтрихкода") Тогда
			Возврат ПодключаемоеОборудованиеАтолСканерыШтрихкодаКлиент;
		КонецЕсли;
		// Конец Сканеры штрихкода
 
		// Фискальные регистраторы
		Если ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолФискальныеРегистраторы") Тогда
			Возврат ПодключаемоеОборудованиеАтолФискальныеРегистраторыКлиент;
		ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикВерсияТФискальныеРегистраторы") Тогда
			Возврат ПодключаемоеОборудованиеВерсияТФискальныеРегистраторыКлиент;
		ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикККСФискальныеРегистраторы") Тогда
			Возврат ПодключаемоеОборудованиеККСФискальныеРегистраторыКлиент;
		ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикШтрихМФискальныеРегистраторы") Тогда
			Возврат ПодключаемоеОборудованиеШтрихМФискальныеРегистраторыКлиент;
		ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикОРИОНФискальныеРегистраторы") Тогда
			Возврат ПодключаемоеОборудованиеОРИОНФискальныеРегистраторыКлиент;
		КонецЕсли;
		// Конец Фискальные регистраторы.
 
	КонецЕсли;
 
	Возврат Результат;
 
КонецФункции

Кроме того оставляем строки касаемые фискальника, т.к. он заложен в бухгалтерии.

В модуле МенеджерОборудованияВызовСервераПереопределяемый при объединении я не стал заменять функцию ДоступноИспользованиеРазделенныхДанных.
Подчистил в этом модуле процедуру ОбновитьПоставляемыеДрайвера. Я оставил опять же только то, что касается сканера (плюс фискальник):

Процедура ОбновитьПоставляемыеДрайвера() Экспорт
 
	// Сканеры штрихкода
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикСканкодСканерыШтрихкода, "AddIn.ScancodeScanner", "ДрайверСканкодСканерШтрихкода", Истина);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолСканерыШтрихкода, "AddIn.Scaner45", , Истина);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1ССканерыШтрихкода, "AddIn.Scanner", "Драйвер1ССканерШтрихкода", Ложь);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1ССканерыШтрихкодаNative, "AddIn.InputDevice", "Драйвер1СУстройстваВводаNative", Ложь);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикГексагонСканерыШтрихкода, "AddIn.ProtonScanner", "ДрайверГексагонСканерШтрихкода", Ложь);
	// Конец Сканеры штрихкода
 
	// Фискальные регистраторы
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1СФискальныйРегистраторЭмулятор, "AddIn.EmulatorFP1C", "Драйвер1СФискальныйРегистратор", Ложь);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1СРарусФискальныеРегистраторыФеликс, "AddIn.fr_feliksRMK1c82", "Драйвер1СРарусФискальныеРегистраторыФеликс", Ложь);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1СРарусФискальныеРегистраторыМебиус, "AddIn.fr_moebius1c82", "Драйвер1СРарусФискальныеРегистраторыМебиус", Ложь);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолФискальныеРегистраторы, "AddIn.ATOL_KKM_1C", , Истина, , Истина);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолФискальныеРегистраторыУниверсальный, "AddIn.ATOL_KKM_1C82", "ДрайверАТОЛФискальныеРегистраторы", Ложь, , Истина);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолФискальныеРегистраторы8X, "AddIn.ATOL_KKM_1C82", "ДрайверАТОЛФискальныеРегистраторы8X", Ложь);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикВерсияТФискальныеРегистраторы, "AddIn.KSBFR1K1C", "ДрайверВерсияТФискальныеРегистраторы", Истина);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикККСФискальныеРегистраторы, "AddIn.SparkTF", "ДрайверККСФискальныеРегистраторы", Ложь);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикШтрихМФискальныеРегистраторы, "AddIn.DrvFR1C", , Истина, , Истина);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикШтрихМФискальныеРегистраторыУниверсальный, "AddIn.SMDrvFR1C", "ДрайверШтрихМФискальныеРегистраторы", Ложь);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикОРИОНФискальныеРегистраторы, "AddIn.OrionFR_1C8", "ДрайверОРИОНФискальныеРегистраторы", Истина);
	Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикКристаллСервисФискальныеРегистраторыPirit, "AddIn.PiritK", "ДрайверКристаллСервисФискальныеРегистраторыPirit", Ложь);
	// Конец Фискальные регистраторы.
 
КонецПроцедуры

А так же функцию ПолучитьДоступныеТипыОборудования

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

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

МенеджерОборудованияВызовСервераПереопределяемый.ОбновлениеБиблиотеки(); 

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
 
   ПоддерживаемыеТипыВО = Новый Массив();
   ПоддерживаемыеТипыВО.Добавить("СканерШтрихкода");
   ОповещенияПриПодключении = Новый ОписаниеОповещения("ПодключитьОборудованиеЗавершение", ЭтотОбъект); 
   МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПоТипу(ОповещенияПриПодключении, УникальныйИдентификатор, ПоддерживаемыеТипыВО);
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПодключитьОборудованиеЗавершение(РезультатВыполнения, Параметры) Экспорт
 
   Если Не РезультатВыполнения.Результат Тогда
      ТекстСообщения = НСтр( "ru = 'При подключении оборудования произошла ошибка:""%ОписаниеОшибки%"".'");
      ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ОписаниеОшибки%" , РезультатВыполнения.ОписаниеОшибки);
      Сообщить(ТекстСообщения);
   Иначе
      ТекстСообщения = НСтр("ru = 'Оборудование подключено.'" );
	  //Сообщить(ТекстСообщения);
   КонецЕсли;
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПриЗакрытии()
 
   ПоддерживаемыеТипыВО = Новый Массив();
   ПоддерживаемыеТипыВО.Добавить("СканерШтрихкода");
   ОповещенияПриПодключении = Новый ОписаниеОповещения("ОтключитьОборудованиеЗавершение", ЭтотОбъект); 
   МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПоТипу(ОповещенияПриПодключении, УникальныйИдентификатор, ПоддерживаемыеТипыВО);
 
КонецПроцедуры
 
&НаКлиенте
Процедура ОтключитьОборудованиеЗавершение(РезультатВыполнения, Параметры) Экспорт
 
   Если Не РезультатВыполнения.Результат Тогда
      ТекстСообщения = НСтр( "ru = 'При отключении оборудования произошла ошибка: ""%ОписаниеОшибки%"".'");
      ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ОписаниеОшибки%" , РезультатВыполнения.ОписаниеОшибки);
      Сообщить(ТекстСообщения);
   Иначе
      ТекстСообщения = НСтр("ru = 'Оборудование отключено.'" );
	  //Сообщить(ТекстСообщения);
   КонецЕсли;
 
КонецПроцедуры

Не забываем прописать процедуры ПриОткрытии и ПриЗакрытии в свойствах формы. После этого в данной форме можно ловить ВнешнееСобытие формы.

В типовых конфигурациях и в той же БПО ловится не ВнешнееСобытие, а процедура ОбработкаОповещения. Чтобы работать через ОбработкаОповещения надо в модуле управляемого приложения добавить процедуру из БПО:

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
 
	// ПодключаемоеОборудование
	// Подготовить данные
 
	ОписаниеСобытия = Новый Структура();
	ОписаниеОшибки  = "";
 
	ОписаниеСобытия.Вставить("Источник", Источник);
	ОписаниеСобытия.Вставить("Событие",  Событие);
	ОписаниеСобытия.Вставить("Данные",   Данные);
 
	// Передать на обработку данные.
	Результат = МенеджерОборудованияКлиент.ОбработатьСобытиеОтУстройства(ОписаниеСобытия, ОписаниеОшибки);
	Если Не Результат Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='При обработке внешнего события от устройства произошла ошибка.'")
		                                                 + Символы.ПС + ОписаниеОшибки);
	КонецЕсли;
	// Конец ПодключаемоеОборудование
 
КонецПроцедуры

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

Комментарии

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Добрый день! Сообщите мне на электронку ваш адрес е-майл, есть некоторые вопросы..

admin аватар

Можете написать в разделе контакты.

Спасибо огромное!

admin аватар

Пожалуйста, вот только статья писалась давно и сейчас работа со сканером уже встроена в Бухгалтерию, поэтому данную информацию нужно использовать уже для каких-то других своих нужд.

Да. Искал изначально информацию касательно проблемы связанной с тем, что не удавалось отловить точку останова в процедуре "ВнешнееСобытие", после сканирования устройством штрих кода. Бился над вопросом 2 дня. При помощи вашей статьи и подсказки на счёт программной активации сканера в модуле формы в процедуре "ПриОткрытии", проблему удалось решить. Спасибо ещё раз огромное.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".