1С Бухгалтерия Предприятия 8.2: подключение 2х и более фискальных регистраторов

Небольшая инструкция по подключению 2х и более фискальных регистраторов в 1С 8.2, работающей в терминальном режиме (Etersoft Wine, Ubuntu Server 10.04).

Заходим в меню Сервис > Служебные > Подключение и настройка торгового оборудования:



Для каждого регистратора будем использовать отдельную обработку, в директории базы данных расположим обработку вида ShtrihMFiscalPrinters_v2.epf, а также ее копии ShtrihMFiscalPrinters_v2-1.epf, ShtrihMFiscalPrinters_v2-2.epf — сколько регистраторов, столько и обработок. Загружаем обработки из директории:



Справочник «Обработки обслуживания ТО» должен выглядеть так:



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



Каждый из регистраторов работает на определенном COM порту. Когда пользователь запускает терминальный режим — стартует openbox а вместе с ним remserial для подключения к регистратором через TCP/IP. На машинах, к которым подключены регистраторы используется Windows и VSPE для проброса COM портов.



Естественно, для того, чтобы обработчики работали (а их разрабатывает 1С, поэтому и искать их нужно на сайте 1С кстати), должен быть установлен драйвер ШТРИХ-М ( \я использую версию 4.9.0.188 ). Регистратор 1:



Регистратор 2:



При создании приходного кассового ордера увидим сообщение для 1 из 2х регистраторов:

ЭЛВЕС-ФР-К: ошибка загрузки обработки обслуживания.
Проверьте корректность указания обработки обслуживания и ее версию.
Произошла ошибка при подключении торгового оборудования


1С пытается подключить все торговое оборудование, но у нас оно подключено к 2м разным компьютерам.

Открываем конфигурацию и правим модуль объекта ТОСервер:



Необходимо закомментировать вывод сообщений об ошибке в функциях ПодключитьКлиента и ПодключитьОборудование.

Функция ПодключитьКлиента(Клиент) Экспорт

	Результат = мНетОшибки;
	КонечныйРезультат = мНетОшибки;

	Клиенты   = ПолучитьПараметрСервераТО("Клиенты", "Соответствие");
	Если Клиенты[Клиент] <> Неопределено Тогда
		Возврат Результат;
	КонецЕсли;

	ВидТО = Неопределено;
	Для Каждого ВидТО Из Перечисления.ВидыТорговогоОборудования Цикл
		Если Клиент.ПоддерживаетсяВидТО(ВидТО) Тогда
			Результат = ПодключитьОборудование(ВидТО, Клиент);
			Если ЗначениеЗаполнено(Результат) Тогда
				КонечныйРезультат = мОшибкаНеизвестно;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	Если ЗначениеЗаполнено(КонечныйРезультат) Тогда
		// Sergei_T
		//ОписаниеОшибки = "Произошла ошибка при подключении торгового оборудования";
		//Ошибка = ПолучитьТекстОшибкиТО(КонечныйРезультат);
		//Сообщить(Ошибка, СтатусСообщения.Важное);
	КонецЕсли;

	Возврат КонечныйРезультат;

КонецФункции // ПодключитьКлиента()


Функция ПодключитьОборудование(Вид, Клиент)

	Результат = мНетОшибки;
	ПоследняяОшибка = мНетОшибки;

	ТО      = ПолучитьТО();
	Клиенты = ПолучитьПараметрСервераТО("Клиенты",      "Соответствие");

	СтруктураПоиска = Новый Структура("Вид", Вид);
	СтрокиТО        = ТО.НайтиСтроки(СтруктураПоиска);
	Если СтрокиТО.Количество() = 0 Тогда
		Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|    РегТО.Идентификатор       КАК Идентификатор,
		|    РегТО.Модель.Наименование КАК Наименование,
		|    РегТО.Модель              КАК Модель,
		|    РегТО.Параметры           КАК Параметры
		|ИЗ
		|    РегистрСведений.ТорговоеОборудование КАК РегТО
		|ГДЕ
		|    РегТО.Вид = &Вид
		|    И РегТО.Компьютер                      = &Компьютер
		|    И РегТО.Подключено
		|");
		Запрос.УстановитьПараметр("Вид"      , Вид);
		Запрос.УстановитьПараметр("Компьютер", ПолучитьИмяКомпьютераТО());
		СтрокиТО = Запрос.Выполнить().Выгрузить();
		СтрокаТО = Неопределено;
		Для Каждого СтрокаТО Из СтрокиТО Цикл
			Идентификатор = СтрокаТО.Идентификатор;
			Наименование  = СтрокаТО.Наименование;
			Обработка     = Неопределено;
			Параметры     = ?(ПустаяСтрока(СтрокаТО.Параметры),
			                  Новый Структура(),
			                  ЗначениеИзСтрокиВнутр(СтрокаТО.Параметры));
			Модель        = СтрокаТО.Модель.Модель;
			мМодельПодключаемогоТО = Модель;

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

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

			Результат = Обработка.Подключить(Объект);
			Если ЗначениеЗаполнено(Результат) Тогда
				мОписаниеОшибки = Объект.ОписаниеОшибки;
				Ошибка = ПолучитьТекстОшибкиТО(Результат);
				Сообщить(мМодельПодключаемогоТО + ": " + Ошибка, СтатусСообщения.Важное);
				ПоследняяОшибка = Результат;
				Продолжить;
			КонецЕсли;

			Оборудование                             = ТО.Добавить();
			Оборудование.Вид                         = Вид;
			Оборудование.Ссылки                      = 1;
			Оборудование.Идентификатор               = Идентификатор;
			Оборудование.Наименование                = Наименование;
			Оборудование.Обработка                   = Обработка;
			Оборудование.Объект                      = Объект;
			Оборудование.ИмяИсточникаВнешнегоСобытия = Обработка.ПолучитьИмяИсточникаВнешнегоСобытия(Объект);

			СообщенияКлиента = Клиенты[Клиент];
			Сообщения        = Обработка.ПолучитьОписаниеСобытий(Объект);
			Сообщения.Колонки.Добавить("Идентификатор");
			Сообщения.Колонки.Добавить("Вид");
			Сообщения.ЗаполнитьЗначения(Идентификатор, "Идентификатор");
			Сообщения.ЗаполнитьЗначения(Вид,           "Вид");

			Если НЕ ЗначениеЗаполнено(СообщенияКлиента) Тогда
				Клиенты[Клиент] = Сообщения;
			Иначе
				Для Каждого СтрокаТаблицыИсточника Из Сообщения Цикл
					СтрокаТаблицыПриемника = Клиенты[Клиент].Добавить();
					ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника, СтрокаТаблицыИсточника);
				КонецЦикла;
			КонецЕсли;

		КонецЦикла;
	Иначе
		СтрокаТО = Неопределено;
		Для Каждого СтрокаТО Из СтрокиТО Цикл
			Если СтрокаТО.Ссылки = 0 Тогда
				мМодельПодключаемогоТО = СтрокаТО.Объект.Модель;
				Результат = СтрокаТО.Обработка.Подключить(СтрокаТО.Объект);

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

			СообщенияКлиента = Клиенты[Клиент];
			Сообщения        = СтрокаТО.Обработка.ПолучитьОписаниеСобытий(СтрокаТО.Объект);
			Сообщения.Колонки.Добавить("Идентификатор");
			Сообщения.Колонки.Добавить("Вид");
			Сообщения.ЗаполнитьЗначения(СтрокаТО.Идентификатор, "Идентификатор");
			Сообщения.ЗаполнитьЗначения(СтрокаТО.Вид,           "Вид");

			Если НЕ ЗначениеЗаполнено(СообщенияКлиента) Тогда
				Клиенты[Клиент] = Сообщения;
			Иначе
				Для Каждого СтрокаТаблицыИсточника Из Сообщения Цикл
					СтрокаТаблицыПриемника = Клиенты[Клиент].Добавить();
					ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника, СтрокаТаблицыИсточника);
				КонецЦикла;
			КонецЕсли;

			СтрокаТО.Ссылки = СтрокаТО.Ссылки + 1;
		КонецЦикла;
	КонецЕсли;

	Возврат ПоследняяОшибка;

КонецФункции // ПодключитьОборудование()


Теперь у каждого из 2х пользователей чек будет пробиваться на том регистраторе, для которого проброшен COM порт. Т.е. на несколько организаций может быть несколько регистраторов.
  • +8
  • 02 января 2011, 13:05
  • Sergei_T

Комментарии (5)

RSS свернуть / развернуть
+
0
Вот это мануалище !
Я всегда тащусь от русскоязычного синтаксиса 1С.
Пишу шабашку на С++ (вся документация к процессору на Аглицком)
и тут такой резкий контраст...
avatar

Markony

  • 02 января 2011, 13:46
+
+2
мы с Серёгой сегодня чуть не плакали глядя на 1С
avatar

Mihael

  • 02 января 2011, 16:59
+
+2
1C гори в аду)))
avatar

Sergei_T

  • 02 января 2011, 18:14
+
0
золотые слова
avatar

FREExLOADER

  • 02 января 2011, 20:04
+
0
Мозги!!!
avatar

ahmetzyanov_d

  • 03 января 2011, 15:01

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.