Настройка системы инвентаризации ВЭАМ: Инвентаризация имущества государственного учреждения для работы в 1С 8.2

в 9:11, , рубрики: Песочница, Программирование, Программное обеспечение, системное администрирование, Софт, метки: , ,

Здравствуйте! В этой статье я расскажу, как настроить систему ВЭАМ: Инвентаризация имущества государственного учреждения для работы в связке с 1С: Бухгалтерия государственного учреждения 8.2. Актуальность этой статьи обусловлена тем, что многие государственные учреждения автоматизируют процесс проведения инвентаризации и тем, что данное решение для инвентаризации не работает из коробки.

Для начала опишем, что у нас есть. У нас есть учетная система 1С: Бухгалтерия государственного учреждения, система автоматизации инвентаризации ВЭАМ: Инвентаризация имущества государственного учреждения, терминал сбора данных CipherLab 8001 от фирмы Scancity и принтер этикеток Godex 1300i. Данный набор позволит нам автоматизировать процесс проведения инвентаризации и классификации основных средств и материалов в организации.

Система ВЭАМ: Инвентаризация имущества государственного учреждения вопреки уверениям технической поддержки работает только с терминалами сбора данных (ТСД) с прошивкой от фирмы Scancode. Если вы купили ТСД в другой фирме (например, Scancity), то вас ждут увлекательные часы переписывания конфигурации и общения с технической поддержкой, которая будет уверять вас в том, что проблемы на вашей стороне. Целью данной статьи является описать процесс настройки ТСД от других фирм и помочь сэкономить время людям, которые мучаются с такой же проблемой.

Для начала нужно обновить платформу 1С до последнего релиза и конфигурацию БГУ до релиза не ниже 1.0.13. Далее нужно скачать набор обработок торгового оборудования для терминалов сбора данных.

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

Отдохнули? Отлично! Теперь будем переписывать код, исправлять замечательное творение программистов из ВЭАМ.

Сначала найдём модуль формы списка журнала документов «ВЭАМ_ДанныеИнвентаризаций». В этом модуле нужно найти процедуру «ВыгрузитьДанныеНажатие» и заменить код процедуры на нижеприведенный:

// Обработка выгрузки данных 
	Если База>3 или База<1 Тогда
		Сообщить("Указан неверный номер базы данных !!!");
		Возврат;
	КонецЕсли;
	Если ОбработкаТерминала.Пустая() Тогда
Сообщить("Не указана обработка выгрузки в терминал сбора данных !!!");
		Возврат;
	КонецЕсли;
Если ВыгрузкаОС.Количество()=0 и
ВыгрузкаКомплекта.Количество()=0 и 		ВыгрузкаМЗ.Количество()=0 Тогда
				Сообщить("Нет данных для выгрузки !!!");
				Возврат;
		КонецЕсли;
	ОбработкаСканкод=Неопределено;
	ПроверкаПодключения=ПодключитьОбъект(ОбработкаСканкод);
	Если НЕ ПроверкаПодключения Тогда
Сообщить("Неудачная попытка подключения терминала !!!");
		Возврат;
	КонецЕсли;
	ИдФормы     = ОбработкаСканкод.ПолучитьФорму();
	ТЗОС=ВыгрузкаОС.Скопировать();
	ТЗМЗ=ВыгрузкаМЗ.Скопировать();
	ТЗКМ=ВыгрузкаКомплекта.Скопировать();
	//формируем таблицу значений для выгрузки
	КолвоСтрок = 0;

	ТаблицаДляТСД = Новый ТаблицаЗначений;
	ТаблицаДляТСД.Колонки.Добавить("Штрихкод", Новый ОписаниеТипов("Строка", ,
	Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
	ТаблицаДляТСД.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", ,
	Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
	ТаблицаДляТСД.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("Строка", ,
	Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
	ТаблицаДляТСД.Колонки.Добавить("ХарактеристикаНоменклатуры", Новый ОписаниеТипов("Строка", ,
	Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
	ТаблицаДляТСД.Колонки.Добавить("СерияНоменклатуры", Новый ОписаниеТипов("Строка", ,
	Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
	ТаблицаДляТСД.Колонки.Добавить("Качество", Новый ОписаниеТипов("Строка", ,
	Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
	ТаблицаДляТСД.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число",
	Новый КвалификаторыЧисла(7, 2, ДопустимыйЗнак.Любой)),"Колич.");
	ТаблицаДляТСД.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",
	Новый КвалификаторыЧисла(7, 2, ДопустимыйЗнак.Любой)),"Колич.");
	
	//цикл для формирования таблицы значений для выгрузки
	Для каждого Стр из ТЗОС Цикл
		НовСтр = ТаблицаДляТСД.Добавить();
		НовСтр.Штрихкод                   = Стр[2];
		НовСтр.Наименование               = ""+Стр[0];
		НовСтр.ЕдиницаИзмерения           = "";
		НовСтр.ХарактеристикаНоменклатуры = "";
		НовСтр.СерияНоменклатуры          = "";
		НовСтр.Качество                   = "";
		НовСтр.Цена                       = Стр[4]/Стр[3];
		НовСтр.Количество                 = 0;
	КонецЦикла;
	
	Если Малооценка Тогда
		Для каждого Стр из ТЗМЗ Цикл
			НовСтр = ТабТМЦ.Добавить();
			Для Сч=0 по ВсегоКолонок-1 цикл 
				НовСтр[Сч]=Стр[Сч];
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	//
	Если ВыгружатьКомплектующие Тогда
		Для каждого Стр из ТЗКМ Цикл
			НовСтр = ТабТМЦ.Добавить();
			Для Сч=0 по ВсегоКолонок-1 цикл 
				НовСтр[Сч]=Стр[Сч];
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	Состояние("Осуществляется выгрузка данных в терминал....");
	/////////////////// ВЫПОЛНЕНИЕ ОБРАБОТКИ ОБСЛУЖИВАНИЯ //////////////////
	Сообщить(Объект.ИДУстройства);
	Сообщить(Объект.Параметры.НомерБазы);
	ОбработкаСканкод.ВыгрузитьТаблицу(Объект,ТаблицаДляТСД);
	ОбработкаСканкод.Отключить(Объект);
	Предупреждение("Выгрузка успешно завершена!");

Далее найдём модуль формы документа «ИнветаризацияВсехТМЦ». Здесь нужно будет сделать несколько действий:
1. Перейдём на вкладку «Реквизиты» и добавим новый реквизит «ОбработкаТерминала» с типом «СправочникСсылка.ВЭАМ_Терминалы»;
2. Перейдём обратно к коду и добавим глобальную переменную «Объект».
3. Найдём процедуру «ПриОткрытии» и добавим туда инструкцию: «ОбработкаТерминала=ВосстановитьЗначение(«Обработка»);».
4. Теперь добавим новую функцию:

Функция ПодключитьОбъект(ИсхОбработка)
	НетОшибок=Ложь;
	Если Не ОбработкаТерминала.Пустая() Тогда
		НетОшибок = Истина;
		ВидыТО    = Новый Соответствие();
		Если Не ПолучитьСерверТО().ОтключитьОбработкиОбслуживания() Тогда
			ТекстОшибки = "Перед выполнением проверки необходимо закрыть все формы, использующие торговое оборудование.";
			Сообщить(ТекстОшибки, СтатусСообщения.Важное);
			Возврат Ложь;
		КонецЕсли;
		Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|    РегТО.Модель    КАК Модель,
		|    РегТО.Параметры КАК Параметры,
		|    РегТО.Вид       КАК Вид
		|ИЗ
		|    РегистрСведений.ВЭАМ_ТерминалыСканкод КАК РегТО
		|ГДЕ
		|    РегТО.Компьютер = &Компьютер
		|    И РегТО.Подключено
		|	 И РегТО.Модель.ОбработкаОбслуживания = &ОбработкаОбслуживания");
		Запрос.УстановитьПараметр("Компьютер", ПолучитьСерверТО().ПолучитьИмяКомпьютераТО());
		Запрос.УстановитьПараметр("ОбработкаОбслуживания",ОбработкаТерминала.ОбработкаОбслуживания);
		РезультатЗапроса = Запрос.Выполнить();
		Обработка        = Неопределено;
		Объект           = Неопределено;
		ДопИнфо          = "";
		Если Не РезультатЗапроса.Пустой() Тогда
			Выборка = РезультатЗапроса.Выбрать();
			Пока Выборка.Следующий() Цикл
				ДопИнфо          = "";
				Результат = РаботаСТорговымОборудованием.ПолучитьОбработкуОбслуживанияТО(Выборка.Модель, Обработка);
				ВидыТО[Выборка.Вид] = Истина;
				Если НЕ ЗначениеЗаполнено(Результат) Тогда
					Форма     = Обработка.ПолучитьФорму();
					Параметры = ?(ПустаяСтрока(Выборка.Параметры),
					Новый Структура(),
					ЗначениеИзСтрокиВнутр(Выборка.Параметры));
					Результат = Форма.СоздатьОбъектДрайвера(Объект,
					Выборка.Модель.Модель,
					Параметры);
					Если НЕ ЗначениеЗаполнено(Результат) или Результат=Перечисления.ВЭАМ_ТООшибкиОбщие.НетОшибок Тогда
						Объект.ОписаниеОшибки = "";
						Результат = Форма.Подключить(Объект);
						ДопИнфо = Объект.ОписаниеОшибки;
						ИсхОбработка=Форма;
					КонецЕсли;
				КонецЕсли;
				Если ЗначениеЗаполнено(Результат)И  Результат<>Перечисления.ВЭАМ_ТООшибкиОбщие.НетОшибок Тогда
					НетОшибок  = Ложь;
					ТекстОшибки = """" + Выборка.Модель + """:
					|" + ПолучитьСерверТО().ПолучитьТекстОшибкиТО(Результат);
					ТекстОшибки = ТекстОшибки + "
					|" + ДопИнфо;
					Сообщить(ТекстОшибки, СтатусСообщения.Важное);
				КонецЕсли;
				Прервать;
			КонецЦикла;
		Иначе
			Сообщить("Ошибка подключения терминала "+ОбработкаТерминала.Модель);
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;
	Возврат НетОшибок;
КонецФункции

5. Теперь добавим еще одну функцию:

Функция ПолучитьДанныеИзТерминала(ТЗТерминала,ПутьКФайлам,Фирмы,КБК,КВД,СчетаУчета,Балансы) Экспорт
	ТЗШК=Новый ТаблицаЗначений;
	ТЗШК.Колонки.Добавить("Штрихкод",Новый ОписаниеТипов("Строка", ,
	Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная)));
	ТЗШК.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число",
	Новый КвалификаторыЧисла(7, 2, ДопустимыйЗнак.Любой)),"Колич.");
	//ОбработкаСканера(ТЗШК,ПутьКФайлам);
	
	ОбработкаСканкод=Неопределено;
	ПроверкаПодключения=ПодключитьОбъект(ОбработкаСканкод);
	Если НЕ ПроверкаПодключения Тогда
		Сообщить("Неудачная попытка подключения терминала !!!");
		//Возврат;
	КонецЕсли;
	
	ОбработкаСканкод.ЗагрузитьТаблицу(Объект,ТЗШК);
	ОбработкаСканкод.Отключить(Объект);
	
	Сообщить("Покажем данные:");
	Для каждого Стр Из ТЗШК цикл
		Сообщить("Штрихкод: "+Стр.Штрихкод);
		Сообщить("Количество: "+Стр.Количество);
	КонецЦикла;
	
	ТЗШК.Свернуть("Штрихкод","Количество");
	
	Сообщить("Покажем данные после:");
	Для каждого Стр Из ТЗШК цикл
		Сообщить("Штрихкод: "+Стр.Штрихкод);
		Сообщить("Количество: "+Стр.Количество);
	КонецЦикла;

	Запрос=Новый Запрос;
	Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
	Запрос.Текст = "ВЫБРАТЬ
	|	ТЗ.Штрихкод КАК Штрихкод,
	|	ЕСТЬNULL(ТЗ.Количество, 1) КАК Количество
	|ПОМЕСТИТЬ ТЗ100
	|ИЗ
	|	&ТЗШК КАК ТЗ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Штрихкоды.Организация,
	|	Штрихкоды.Владелец,
	|	Штрихкоды.Баланс,
	|	Штрихкоды.ИнвентарныйНомер как ИнвНомер,
	|	Штрихкоды.СчетУчета КАК СчетУчета,
	|	Штрихкоды.КВД КАК КВД,
	|	Штрихкоды.КБК КАК КБК,
	|	ЕСТЬNULL(ТЗ.Количество, 0) КАК Количество,
	|    0 КАК СуммаСостЧасти
	|ИЗ
	|	РегистрСведений.ВЭАМ_Штрихкоды КАК Штрихкоды
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ100 КАК ТЗ
	|		ПО Штрихкоды.Штрихкод = ТЗ.Штрихкод
	|ГДЕ
	|	Штрихкоды.СчетУчета В (&Счета)
	|	И Штрихкоды.Баланс  В (&Балансы)
	|	И Штрихкоды.КБК  В (&КБК)
	|	И Штрихкоды.КВД  В (&КВД)
	|	И Штрихкоды.Организация В(&Фирмы)";
	
	Запрос.УстановитьПараметр("Фирмы",Фирмы);
	Запрос.УстановитьПараметр("Счета",СчетаУчета);
	Запрос.УстановитьПараметр("КБК",КБК);
	Запрос.УстановитьПараметр("КВД",КВД);
	Запрос.УстановитьПараметр("Балансы",Балансы);
	Запрос.УстановитьПараметр("ТЗШК",ТЗШК);
	
	ТЗТерминала=Запрос.Выполнить().Выгрузить();
	ТЗТерминала.Свернуть("Владелец,ИнвНомер,Баланс,КБК,КВД,СчетУчета","Количество,СуммаСостЧасти");
	Для каждого Стр из ТЗТерминала Цикл
		Если ТипЗНЧ(Стр.Владелец)= ТИП("СправочникСсылка.ВЭАМ_СоставныеЧасти") Тогда
			Если НЕ Стр.Владелец.ОсновнаяЧасть Тогда
				Стр.Количество=0;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	// Получили таблицу штрихкодов, колонки "Штрихкод и Кол"
	Возврат ТЗТерминала;
КонецФункции

6. Далее найдём процедуру «ЗаполнитьНаличиеОперативногоДокумента» и в ней найдём код: «СведенияОНаличии=ВЭАМ_РаботаСоШтрихКодами.ПолучитьДанныеИзТерминала», уберём обращение к общему модулю, т.е. удалим «ВЭАМ_РаботаСоШтрихКодами.».
7. В этой же процедуре найдём большой запрос в самом конце, в котором присутствует следующий код:

|ИЗ
|	Документ.ВЭАМ_ИнвентаризацияВсехТМЦ."+ИмяТЧ+" КАК ТЧ
|		ЛЕВОЕ СОЕДИНЕНИЕ СКАНЕР КАК СКАНЕР
|		ПО ТЧ.ОС = СКАНЕР.ОС
|			И ТЧ.ИнвНомер = СКАНЕР.ИнвНомер
|			И ТЧ.Баланс = СКАНЕР.Баланс
|			И ТЧ.КБК = СКАНЕР.КБК
|			И ТЧ.КВД = СКАНЕР.КВД
|			И ТЧ.Счет = СКАНЕР.СчетУчета

И добавим к нему следующее:

|ГДЕ
|	ТЧ.Ссылка = &Док

Это условие необходимо, что бы при инвентаризации обрабатывался только текущий документ, а не все. Такое простейшее условие было пропущено разработчиками и подарило автору незабываемые часы поиска бага. Хотелось бы отдельно за это поблагодарить гениев из ВЭАМ.

С исправлением кода мы разобрались. Остался последний этап – настройка ТСД в 1С. Для начала нужно установить драйвера для ТСД в Windows. Скачать их можно на сайте Scancity. Далее необходимо установить ТСД в 1С. Для этого щелкнем на кнопку «Штрихкодирование» и в появившемся окне перейдем на закладку «Сервисы» и выберем там «Терминал сбора данных».

Вот и все, выполнение этих шагов позволит вам настроить ТСД с прошивкой отличной от Scancode для работы системы инвентаризации ВЭАМ: Инвентаризация имущества государственного учреждения.

Автор: kirillius_khv

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js