Friday, December 30, 2011

Быстрая синхронизация УникальныйИдентификаторов 1С с помощью скрипта MS SQL

Столкнулся с одной проблемой, если две базы перекачавшиеся с 7 в 8 УТ, фактически наименование справочников совпадает, даже часть кодов одинакова, а вот гуиды разные. Для этого был реализован следующий скрипт:
if OBJECT_id('temp.dbo.#TTable') is not null
drop table dbo.#TTable;
go
 
use RL_Retail;
SET NOCOUNT ON
DECLARE @tablename sysname;
DECLARE @columnname sysname;
declare @SRef binary(16);
declare @TRef binary(16);
declare @inSRef binary(16);
declare @inTRef binary(16);
declare @sql nvarchar(max);
declare @sSRef nvarchar(34);
declare @sTRef nvarchar(34);
 
 
SELECT  Target._IDRRef as [T_IDRRef]
,Source._IDRRef as [S_IDRRef]
into dbo.#TTable    
FROM RL_Retail.dbo._Reference56 AS Target
join rl_distrib.dbo._Reference56 as Source ON Source._Description = Target._Description
where (not Target._IDRRef is null) and (not Target._IDRRef=Source._IDRRef)
 
 
DECLARE cur_name CURSOR SCROLL FOR
SELECT table_name=sysobjects.name,
column_name=syscolumns.name
--datatype=systypes.name,
--length=syscolumns.length
FROM sysobjects
JOIN syscolumns ON sysobjects.id = syscolumns.id
JOIN systypes ON syscolumns.xtype=systypes.xtype
WHERE sysobjects.xtype='U' and systypes.name='binary' and syscolumns.length=16 and Right(syscolumns.name,3)='Ref'
ORDER BY sysobjects.name,syscolumns.colid
OPEN cur_name
FETCH NEXT FROM cur_name INTO @tablename, @columnname
while @@FETCH_STATUS = 0
BEGIN
set @sSRef = Convert(nvarchar(34),CONVERT(char(34),@SRef,1));
set @sTRef = Convert(nvarchar(34),CONVERT(char(34),@TRef,1));
set @sql = N'update updateTarget set ' + @columnname + N'= tablesource.S_IDRRef 
From 
RL_Retail.dbo.'+@tablename+N' AS updateTarget
Join 
dbo.#TTable as tablesource
on updateTarget.' + @columnname + N' = tablesource.T_IDRRef';
--set @sql = 'select @TRef'
-- EXEC (@sql )
EXEC sp_executesql @stmt = @sql;
 
FETCH NEXT FROM cur_name INTO @tablename, @columnname
END
CLOSE cur_name
DEALLOCATE cur_name
drop table dbo.#TTable;
в принципе мне повезло с тем, что таблицы _Reference56 были одинаковые, поэтому делаем выборку с соединением по наименованию, а дальше уже скулом обходим все таблицы базы и обновляем GUID

Wednesday, December 21, 2011

Доработка по работе с ФР ИКС протоколом ЕП02 в Управление торговлей, редакция 11.0 (11.0.7.13)

1. Добавляем новое перечисление в ОбработчикиДрайверовПодключаемогоОборудования ОбработчикИКСФискальныеРегистраторы 2. Далее добавляем новый модуль в "Общие модули" с названием "ПодключаемоеОборудованиеИКСМФискальныеРегистраторы". В принцыпе, я взял модуль Штрих-м и переписал его под ИКС
////////// ОБЩИЕ КОМАНДЫ ВСЕХ ОБРАБОТЧИКОВ //////////////

// Master  16.12.2011 9:09:00 
// Функция осуществляет подключение устройства.
//
// Параметры:
//  ОбъектДрайвера   - <*>
//           - ОбъектДрайвера драйвера торгового оборудования.
//
// Возвращаемое значение:
//  <Булево> - Результат работы функции.
//
Функция ПодключитьУстройство(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры) Экспорт

	Результат = Истина;
	ПараметрыПодключения.Вставить("СерийныйНомерККМ", "0");
	ПараметрыПодключения.Вставить("ИДУстройства", "");

	ВыходныеПараметры = Новый Массив();

	// Проверка параметров устройства
	Порт                       = Неопределено;
	Скорость                   = Неопределено;
	Таймаут                    = Неопределено;
	ПарольПользователя         = Неопределено;
	ПарольАдминистратора       = Неопределено;
	ОтменятьЧекПриПодключении  = Неопределено;
	НаименованиеОплаты1        = Неопределено;
	НаименованиеОплаты2        = Неопределено;
	НомерСекции                = Неопределено;
	 // Master  15.12.2011 14:27:32 КодСимволаЧастичногоОтреза = Неопределено;
	ЖурналОперацийДрайвера     = Неопределено;
	СовместимыеВерсии          = Неопределено;

	Параметры.Свойство("Порт"                      , Порт);
	Параметры.Свойство("Скорость"                  , Скорость);
	Параметры.Свойство("Таймаут"                   , Таймаут);
	Параметры.Свойство("ПарольПользователя"        , ПарольПользователя);
	Параметры.Свойство("ПарольАдминистратора"      , ПарольАдминистратора);
	Параметры.Свойство("ОтменятьЧекПриПодключении" , ОтменятьЧекПриПодключении);
	Параметры.Свойство("НаименованиеОплаты1"       , НаименованиеОплаты1);
	Параметры.Свойство("НаименованиеОплаты2"       , НаименованиеОплаты2);
	Параметры.Свойство("НомерСекции"               , НомерСекции);
	 // Master  15.12.2011 14:27:22 Параметры.Свойство("КодСимволаЧастичногоОтреза", КодСимволаЧастичногоОтреза); 
	Параметры.Свойство("ЖурналОперацийДрайвера"    , ЖурналОперацийДрайвера);

	Если Порт                       = Неопределено
	 Или Скорость                   = Неопределено
	 Или Таймаут                    = Неопределено
	 Или ПарольПользователя         = Неопределено
	 Или ПарольАдминистратора       = Неопределено
	 Или ОтменятьЧекПриПодключении  = Неопределено
	 Или НаименованиеОплаты1        = Неопределено
	 Или НаименованиеОплаты2        = Неопределено
	 Или НомерСекции                = Неопределено
	  // Master  15.12.2011 14:27:38 Или КодСимволаЧастичногоОтреза = Неопределено
	 Или ЖурналОперацийДрайвера    = Неопределено Тогда
		ВыходныеПараметры.Добавить(999);
		ВыходныеПараметры.Добавить(НСтр("ru='Не настроены параметры устройства.
		|Для корректной работы устройства необходимо задать параметры его работы.
		|Сделать это можно при помощи формы ""Настройка параметров"" модели
		|подключаемого оборудования в форме ""Подключение и настройка оборудования"".'"));

		Результат = Ложь;
	КонецЕсли;

	Если Результат Тогда
		Если НЕ ОбъектДрайвера.FPInit(Параметры.Порт,Параметры.Скорость,Параметры.Таймаут,Параметры.Таймаут) тогда 
			ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
			ВыходныеПараметры.Добавить("");
			ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;

			Результат = Ложь;

		Иначе
			ПараметрыПодключения.СерийныйНомерККМ = ОбъектДрайвера.GetSerialNumber;
			Если Результат И Параметры.ОтменятьЧекПриПодключении И ОбъектДрайвера.GetCheckOpened Тогда
				Результат = ОбъектДрайвера.FPResetOrder();
			КонецЕсли;
			Если Результат И Не ОбъектДрайвера.GetSmenaOpened тогда // Если смена не открыта, проведем регламентные процедуры
				//Проверка времени
				ВремяСервера = МастерПроцедурыСервера.ТекущаяДатаНаСервере();
				Если Результат И НЕ ОбъектДрайвера.CurrentDate=Формат(ВремяСервера,"ДФ=dd.MM.yyyy") тогда
					ОбъектДрайвера.CurrentDate=Формат(ВремяСервера,"ДФ=dd.MM.yyyy");
				КонецЕсли;
				Если Результат И НЕ Лев(ОбъектДрайвера.CurrentTime,7)=Лев(Формат(ВремяСервера,"ДФ=hh:mm:ss"),7) тогда 
					ОбъектДрайвера.CurrentTime=Формат(МастерПроцедурыСервера.ТекущаяДатаНаСервере(),"ДФ=hh:mm:ss");
				КонецЕсли;
				Если Результат И ((НЕ ОбъектДрайвера.GetTaxQuantity=1) Или (НЕ ОбъектДрайвера.GetBaseTax_A=2000) Или (НЕ ОбъектДрайвера.GetTaxTypeExt=0) или (НЕ ОбъектДрайвера.GetUseMixedTax)) тогда
					Результат = ОбъектДрайвера.FPSetTaxRate(0,    			// Пароль программирования
							  1,    			// Количество программируемых групп, начиная с группы "А"	
						   0,   				// Вложенный тип НДС ETaxType.ettWithNDS
						   2000, 				// Ставка НДС группы "А" в 0.01% 
						      0, 				// Ставка НДС группы "Б" в 0.01% 
						  	  0,	 			// Ставка НДС группы "В" в 0.01% 
						  	  0,	 			// Ставка НДС группы "Г" в 0.01% 
						   	  0, 	 			// Ставка НДС группы "Д" в 0.01% 
						      0,  				// Сбор в пенсионный фонд группы "А" в 0.01%
						   	  0,	 			// Сбор в пенсионный фонд группы "Б" в 0.01%
						      0,	 			// Сбор в пенсионный фонд группы "В" в 0.01%
						      0,	 			// Сбор в пенсионный фонд группы "Г" в 0.01%
						      0,	 			// Сбор в пенсионный фонд группы "Д" в 0.01%
						   ложь)   		// Использовать схему составного налога 
				КонецЕсли;

				
				
				
			КонецЕсли;
			//Результат = Истина;
			Если Не Результат тогда
				ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
				ВыходныеПараметры.Добавить("");
				ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;
			КонецЕсли;
		КонецЕсли;
		//мНДС = Новый Массив();
		//мНДС.Добавить(20.00);
		//мНДС.Добавить(0.00);
		//мНДС.Добавить(0.00);
		//мНДС.Добавить(0.00);

		//МассивЗначений = Новый Массив;
		//МассивЗначений.Добавить(Параметры.Порт);
		//МассивЗначений.Добавить(Параметры.Скорость);
		//МассивЗначений.Добавить(Параметры.ПарольПользователя);
		//МассивЗначений.Добавить(Параметры.ПарольАдминистратора);
		//МассивЗначений.Добавить(Параметры.Таймаут);
		//МассивЗначений.Добавить(ПараметрыПодключения.СерийныйНомерККМ);
		//МассивЗначений.Добавить(мНДС[0]);
		//МассивЗначений.Добавить(мНДС[1]);
		//МассивЗначений.Добавить(мНДС[2]);
		//МассивЗначений.Добавить(мНДС[3]);
		//МассивЗначений.Добавить(Ложь);
		//МассивЗначений.Добавить(Параметры.ЖурналОперацийДрайвера);
		//МассивЗначений.Добавить(Параметры.НаименованиеОплаты1);
		//МассивЗначений.Добавить(Параметры.НаименованиеОплаты2);

		//Если НЕ ОбъектДрайвера.Подключить(МассивЗначений, ПараметрыПодключения.ИДУстройства) Тогда
		//	ВыходныеПараметры.Добавить(999);
		//	ВыходныеПараметры.Добавить("");
		//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

		//	Результат = Ложь;
		//Иначе
		//	ПараметрыПодключения.СерийныйНомерККМ = МассивЗначений[5];
		//	Если Параметры.ОтменятьЧекПриПодключении Тогда
		//		ОбъектДрайвера.ОтменитьЧек(ПараметрыПодключения.ИДУстройства);
		//	КонецЕсли;

		//	Результат = Истина;
		//КонецЕсли;
	КонецЕсли;

	Возврат Результат;

КонецФункции

// Master  16.12.2011 9:08:45 
// Функция осуществляет отключение устройства.
//
// Параметры:
//  ОбъектДрайвера - <*>
//         - ОбъектДрайвера драйвера торгового оборудования.
//
// Возвращаемое значение:
//  <Булево> - Результат работы функции.
//
Функция ОтключитьУстройство(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры) Экспорт

	Результат = Ложь;

	ВыходныеПараметры = Новый Массив();
	Результат = ОбъектДрайвера.FPClose();
	Если НЕ Результат  тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;
	КонецЕсли;
	//Если НЕ ОбъектДрайвера.Отключить(ПараметрыПодключения.ИДУстройства) Тогда
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить("");
	//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);
	//Иначе
	//	Результат = Истина;
	//КонецЕсли;

	Возврат Результат;

КонецФункции

// Функция получает, обрабатывает и перенаправляет на исполнение команду к драйверу
//
Функция ВыполнитьКоманду(Команда, ВходныеПараметры = Неопределено, ВыходныеПараметры = Неопределено,
                         ОбъектДрайвера, Параметры, ПараметрыПодключения) Экспорт

	Результат = Истина;

	ВыходныеПараметры = Новый Массив();

	// Открыть смену
	Если Команда = "OpenDay" Тогда
		Результат = ОткрытьСмену(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);

	// Печать чека
	ИначеЕсли Команда = "PrintReceipt" Тогда
		ТаблицаНоменклатуры = ВходныеПараметры[0];
		ТаблицаОплат        = ВходныеПараметры[1];
		ОбщиеПараметры      = ВходныеПараметры[2];

		Результат = ПечатьЧека(ОбъектДрайвера, Параметры, ПараметрыПодключения, ТаблицаНоменклатуры,
		                       ТаблицаОплат, ОбщиеПараметры, ВыходныеПараметры);

	// Печать слип чека
	ИначеЕсли Команда = "PrintText" Тогда
		СтрокаТекста   = ВходныеПараметры[0];

		Результат = ПечатьТекста(ОбъектДрайвера, Параметры, ПараметрыПодключения,
		                         СтрокаТекста, ВыходныеПараметры);

	// Печать чека внесения/выемки
	ИначеЕсли Команда = "Encash" Тогда
		ТипИнкассации = ВходныеПараметры[0];
		Сумма         = ВходныеПараметры[1];

		Результат = Инкассация(ОбъектДрайвера, Параметры, ПараметрыПодключения, ТипИнкассации, Сумма, ВыходныеПараметры);

	// Печать отчета без гашения
	ИначеЕсли Команда = "PrintXReport" Тогда
		Результат = НапечататьОтчетБезГашения(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);

	// Печать отчета с гашением
	ИначеЕсли Команда = "PrintZReport" Тогда
		Результат = НапечататьОтчетСГашением(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);

	// Тестирование устройства
	ИначеЕсли Команда = "CheckHealth" Тогда
		Результат = ТестУстройства(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
		
	// Открытие денежного ящика
	ИначеЕсли Команда = "OpenCashDrawer" Тогда
		Результат = ОткрытьДенежныйЯщик(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);

	// Получение версии драйвера
	ИначеЕсли Команда = "ПолучитьВерсиюДрайвера" Тогда
		Результат = ПолучитьВерсиюДрайвера(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);

	// Указанная команда не поддерживается данным драйвером
	Иначе
		ВыходныеПараметры.Добавить(999);
		ВыходныеПараметры.Добавить(НСтр("ru='Команда ""%Команда%"" не поддерживается данным драйвером.'"));
		ВыходныеПараметры[1] = СтрЗаменить(ВыходныеПараметры[1], "%Команда%", Команда);
		Результат = Ложь;

	КонецЕсли;

	Возврат Результат;

КонецФункции


/////////////////////////////////////
// Функции-исполнители команд

///////// СПЕЦИФИЧНЫЕ ПО ТИПУ ОБОРУДОВАНИЯ КОМАНДЫ ////////////////

// Функция осуществляет открытие смены
Функция ОткрытьСмену(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)

	Результат = Истина;

	Результат = ОбъектДрайвера.FPNullCheck();
	Если НЕ Результат  тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;
	КонецЕсли;
	
	// Заполнение выходных параметров
	ВыходныеПараметры.Добавить(0);
	ВыходныеПараметры.Добавить(0);
	ВыходныеПараметры.Добавить(0);
	ВыходныеПараметры.Добавить(ТекущаяДата());

	Возврат Результат;

КонецФункции


// Осуществляет печать фискального чека
Функция ПечатьЧека(ОбъектДрайвера, Параметры, ПараметрыПодключения, ТаблицаНоменклатуры,
                       ТаблицаОплат, ОбщиеПараметры, ВыходныеПараметры)

	Результат  = Истина;
    ЧекНаВозврат = ОбщиеПараметры[0] = 1;
	// Открываем чек
	Результат = ОткрытьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения,
	                       ОбщиеПараметры[0] = 1, ОбщиеПараметры[1], ВыходныеПараметры);

	// Печатаем строки чека
	СуммаЧека = 0;
	Если Результат Тогда
		Для ИндексМассива = 0 По ТаблицаНоменклатуры.Количество() - 1 Цикл
			Наименование  = ТаблицаНоменклатуры[ИндексМассива][0].Значение;
			Количество    = ТаблицаНоменклатуры[ИндексМассива][5].Значение;
			Цена          = ТаблицаНоменклатуры[ИндексМассива][4].Значение;
			ПроцентСкидки = ТаблицаНоменклатуры[ИндексМассива][8].Значение;
			Сумма         = ТаблицаНоменклатуры[ИндексМассива][9].Значение;
			СуммаЧека = СуммаЧека + Сумма;
			НомерСекции   = ТаблицаНоменклатуры[ИндексМассива][3].Значение;
			СтавкаНДС     = ТаблицаНоменклатуры[ИндексМассива][12].Значение;
	
			Если (НЕ ЧекНаВозврат) И НЕ НапечататьФискальнуюСтроку(ОбъектДрайвера, Параметры, ПараметрыПодключения,
			                                   Наименование, Количество, Цена, ПроцентСкидки, Сумма,
			                                   НомерСекции, СтавкаНДС, ВыходныеПараметры) Тогда
				Прервать;
			
			ИначеЕсли (ЧекНаВозврат) И НЕ НапечататьФискальнуюСтрокуВозврат(ОбъектДрайвера, Параметры, ПараметрыПодключения,
			                                   Наименование, Количество, Цена, ПроцентСкидки, Сумма,
			                                   НомерСекции, СтавкаНДС, ВыходныеПараметры) Тогда
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
     // Master  19.12.2011 7:49:24 необходимо проверить сумму ФР и базы
	// Закрываем чек
	Если Результат Тогда
			Результат = ЗакрытьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ТаблицаОплат, ВыходныеПараметры);
	КонецЕсли;

	Возврат Результат;

КонецФункции

// Осуществляет печать слип-чека
Функция ПечатьТекста(ОбъектДрайвера, Параметры, ПараметрыПодключения,
                       СтрокаТекста, ВыходныеПараметры)

	Результат  = Истина;

	// Открываем чек
	Результат = ОткрытьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, Ложь, Ложь, ВыходныеПараметры);

	// Печатаем строки чека
	Если Результат Тогда
		Для НомерСтроки = 1 По СтрЧислоСтрок(СтрокаТекста) Цикл
			ВыделеннаяСтрока = СтрПолучитьСтроку(СтрокаТекста, НомерСтроки);
			Если Найти(ВыделеннаяСтрока, Символ(Параметры.КодСимволаЧастичногоОтреза)) > 0 Тогда
				ТаблицаОплат = Новый Массив();
				Результат = ЗакрытьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ТаблицаОплат, ВыходныеПараметры);
				Результат = ОткрытьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, Ложь, Ложь, ВыходныеПараметры);
			Иначе
				Если НЕ НапечататьНефискальнуюСтроку(ОбъектДрайвера, Параметры, ПараметрыПодключения,
				                                     ВыделеннаяСтрока, ВыходныеПараметры) Тогда
					Прервать;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

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

	Возврат Результат;

КонецФункции

// Master  16.12.2011 9:36:08 
// Функция осуществляет открытие нового чека.
//
Функция ОткрытьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ЧекВозврата, ФискальныйЧек, ВыходныеПараметры)

	Результат  = Истина;
	НомерСмены = 0;
	НомерЧека  = 0;
	Результат = ОбъектДрайвера.GetSmenaOpened;
	Если не Результат тогда
		ВыходныеПараметры.Добавить(999);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = "Смена закрыта, печать чека не возможна";	
		Возврат Результат;
	КонецЕсли;
	Результат = НЕ ОбъектДрайвера.GetCheckOpened;
	Если НЕ Результат тогда
		ВыходныеПараметры.Добавить(999);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = "Последний чек не закрыт, закройте чек или перезапустите 1с";	
		Возврат Результат;
	КонецЕсли;
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetNumZReport+1);
		Если НЕ ЧекВозврата тогда
			ВыходныеПараметры.Добавить(ОбъектДрайвера.GetSaleCheckNumber+1);
		Иначе
			ВыходныеПараметры.Добавить(ОбъектДрайвера.GetPayCheckNumber+1);
		КонецЕсли;
		ВыходныеПараметры.Добавить(0);
		ВыходныеПараметры.Добавить(ТекущаяДата());
	// Открываем чек
	//Результат = ОбъектДрайвера.ОткрытьЧек(ПараметрыПодключения.ИДУстройства, ФискальныйЧек, ЧекВозврата,
	//									  Истина, НомерЧека, НомерСмены);
	//Если НЕ Результат Тогда
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить("");
	//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);
	//Иначе
	//	// Заполнение выходных параметров
	//	ВыходныеПараметры.Добавить(НомерСмены);
	//	ВыходныеПараметры.Добавить(НомерЧека);
	//	ВыходныеПараметры.Добавить(0);
	//	ВыходныеПараметры.Добавить(ТекущаяДата());
	//КонецЕсли;

	Возврат Результат;

КонецФункции


 // Master  16.12.2011 14:03:27 
// Функция осуществляет печать фискальной строки.
//
Функция НапечататьФискальнуюСтроку(ОбъектДрайвера, Параметры, ПараметрыПодключения,
                                   Наименование, Количество, Цена, ПроцентСкидки, Сумма,
                                   НомерСекции, СтавкаНДС, ВыходныеПараметры)

	Результат = Истина;
	ТКоличество1 = Формат(Количество*1000,"ЧЦ=12; ЧДЦ=0; ЧГ=0");
	ТКоличество2 = Формат(Окр(Количество,0)*1000,"ЧЦ=12; ЧДЦ=0; ЧГ=0");
	IsOneQuant = Истина;
	Если ТКоличество1=ТКоличество2 тогда
		ТКоличество1 = Количество;
		//IsOneQuant = Истина;
	Иначе
		IsOneQuant = Ложь;
		ТКоличество1 = Число(ТКоличество1);
	КонецЕсли;
	Результат = ОбъектДрайвера.FPSaleEx (ТКоличество1,      // количество  
     3,     // количество  знаков  дробной части  кол- ва  
     IsOneQuant,      
     Формат(Цена*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"),      // цена  в  копейках  
     0,     // налоговая группа  « А» 
     ложь,     // не  брать  описание  товара из  ЭККР 
    Лев(Наименование,50),   // название  товара 
    МастерПроцедурыСервера.Хэш(Лев(Наименование,50),,,214783648));      // Код  товара 
	
	
	Если ПроцентСкидки > 0 тогда
    	ОбъектДрайвера.FPDiscount(2,Формат(ПроцентСкидки*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"),"");
	ИначеЕсли ПроцентСкидки < 0 тогда
		ОбъектДрайвера.FPDiscount(3,Формат(ПроцентСкидки*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"),"");
	КонецЕсли;

 
	Если НЕ Результат тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;	
	КонецЕсли;

	
	
	
	//Результат = ОбъектДрайвера.НапечататьФискСтроку(ПараметрыПодключения.ИДУстройства, Наименование, Количество, Цена,
	//												Сумма, НомерСекции, СтавкаНДС);
	//Если НЕ Результат Тогда
	//	ВыходныеПараметры.Очистить();
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить("");
	//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

	//	ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
	//КонецЕсли;

	Возврат Результат;

КонецФункции

 // Master  16.12.2011 14:03:27 
// Функция осуществляет печать фискальной строки.
//
Функция НапечататьФискальнуюСтрокуВозврат(ОбъектДрайвера, Параметры, ПараметрыПодключения,
                                   Наименование, Количество, Цена, ПроцентСкидки, Сумма,
                                   НомерСекции, СтавкаНДС, ВыходныеПараметры)

	Результат = Истина;
	ТКоличество1 = Формат(Количество*1000,"ЧЦ=12; ЧДЦ=0; ЧГ=0");
	ТКоличество2 = Формат(Окр(Количество,0)*1000,"ЧЦ=12; ЧДЦ=0; ЧГ=0");
	IsOneQuant = Истина;
	Если ТКоличество1=ТКоличество2 тогда
		ТКоличество1 = Количество;
		//IsOneQuant = Истина;
	Иначе
		IsOneQuant = Ложь;
		ТКоличество1 = Число(ТКоличество1);
	КонецЕсли;
	Результат = ОбъектДрайвера.FPPayMoneyEx(ТКоличество1,      // количество  
     3,     // количество  знаков  дробной части  кол- ва  
     IsOneQuant,      
     Формат(Цена*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"),      // цена  в  копейках  
     0,     // налоговая группа  « А» 
     ложь,     // не  брать  описание  товара из  ЭККР 
    Лев(Наименование,50),   // название  товара 
    МастерПроцедурыСервера.Хэш(Лев(Наименование,50),,,214783648));      // Код  товара 
	Если ПроцентСкидки > 0 тогда
    	ОбъектДрайвера.FPDiscount(2,Формат(ПроцентСкидки*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"),"");
	ИначеЕсли ПроцентСкидки < 0 тогда
		ОбъектДрайвера.FPDiscount(3,Формат(ПроцентСкидки*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"),"");
	КонецЕсли;
 
	Если НЕ Результат тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;	
	КонецЕсли;

	
	
	
	//Результат = ОбъектДрайвера.НапечататьФискСтроку(ПараметрыПодключения.ИДУстройства, Наименование, Количество, Цена,
	//												Сумма, НомерСекции, СтавкаНДС);
	//Если НЕ Результат Тогда
	//	ВыходныеПараметры.Очистить();
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить("");
	//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

	//	ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
	//КонецЕсли;

	Возврат Результат;

КонецФункции



// Master  16.12.2011 14:03:16 
// Функция осуществляет печать нефискальной строки.
//
Функция НапечататьНефискальнуюСтроку(ОбъектДрайвера, Параметры, ПараметрыПодключения, СтрокаТекста, ВыходныеПараметры)

	Результат = Истина;

	Результат = ОбъектДрайвера.НапечататьНефискСтроку(ПараметрыПодключения.ИДУстройства, СтрокаТекста);
	Если НЕ Результат Тогда
		ВыходныеПараметры.Очистить();
		ВыходныеПараметры.Добавить(999);
		ВыходныеПараметры.Добавить("");
		ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

		ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
	КонецЕсли;

	Возврат Результат;

КонецФункции

// Master  16.12.2011 13:57:52 
// Функция осуществляет закрытие ранее открытого чека.
//
Функция ЗакрытьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ТаблицаОплат, ВыходныеПараметры)

	Результат = Истина;

	СуммаНаличнойОплаты     = 0;
	СуммаБезналичнойОплаты1 = 0;
	СуммаБезналичнойОплаты2 = 0;

	Результат = ОбъектДрайвера.GetCheckOpened;
	Если НЕ Результат тогда
		ВыходныеПараметры.Добавить(999);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = "Чек не открыт, закрытие не возможно";	
		Возврат Результат;
	КонецЕсли;

	
	Для ИндексОплаты = 0 По ТаблицаОплат.Количество() - 1 Цикл
		Если ТаблицаОплат[ИндексОплаты][0].Значение = 0 Тогда
			СуммаНаличнойОплаты = СуммаНаличнойОплаты + ТаблицаОплат[ИндексОплаты][1].Значение;
		ИначеЕсли ТаблицаОплат[ИндексОплаты][0].Значение = 1 Тогда
			СуммаБезналичнойОплаты1 = СуммаБезналичнойОплаты1 + ТаблицаОплат[ИндексОплаты][1].Значение;
		Иначе
			СуммаБезналичнойОплаты2 = СуммаБезналичнойОплаты2 + ТаблицаОплат[ИндексОплаты][1].Значение;
		КонецЕсли;
	КонецЦикла;
	ЗакрытьАвто = Ложь;
	Если НЕ СуммаНаличнойОплаты=0 тогда
		Если СуммаБезналичнойОплаты1=0 и СуммаБезналичнойОплаты2=0 тогда
			ЗакрытьАвто = Истина;
		КонецЕсли;
		Результат = ОбъектДрайвера.FPPayment (3,     // форма  оплат  – наличными  
       					Формат((СуммаНаличнойОплаты*100),"ЧЦ=12; ЧДЦ=0; ЧГ=0"),      // сумма  оплаты в  копейках  
        				ЗакрытьАвто,     // чек не  будет  закрыт  автоматически  
        				Истина ,     // чек закроется  как фискальный 
       					"");      // комментарий  к  этой оплате 
	КонецЕсли;
	Если Результат И (НЕ СуммаБезналичнойОплаты1=0) тогда
		Если СуммаБезналичнойОплаты2=0 тогда
			ЗакрытьАвто = Истина;
		КонецЕсли;

		Результат = ОбъектДрайвера.FPPayment (0,     // форма  оплат  – наличными  
       					Формат(СуммаБезналичнойОплаты1*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"),      // сумма  оплаты в  копейках  
        				ЗакрытьАвто,     // чек не  будет  закрыт  автоматически  
        				Истина ,     // чек закроется  как фискальный 
       					"Карта №1");      // комментарий  к  этой оплате 
	КонецЕсли;
	Если Результат И (НЕ СуммаБезналичнойОплаты2=0) тогда
		Результат = ОбъектДрайвера.FPPayment (0,     // форма  оплат  – наличными  
       					Формат(СуммаБезналичнойОплаты2*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"),      // сумма  оплаты в  копейках  
        				Истина,     // чек не  будет  закрыт  автоматически  
        				Истина ,     // чек закроется  как фискальный 
       					"Карта №2");      // комментарий  к  этой оплате 
	КонецЕсли;

	Если НЕ Результат тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;	
		
		ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
	КонецЕсли;

	
		
	
	//Для ИндексОплаты = 0 По ТаблицаОплат.Количество() - 1 Цикл
	//	Если ТаблицаОплат[ИндексОплаты][0].Значение = 0 Тогда
	//		СуммаНаличнойОплаты = СуммаНаличнойОплаты + ТаблицаОплат[ИндексОплаты][1].Значение;
	//	ИначеЕсли ТаблицаОплат[ИндексОплаты][0].Значение = 1 Тогда
	//		СуммаБезналичнойОплаты1 = СуммаБезналичнойОплаты1 + ТаблицаОплат[ИндексОплаты][1].Значение;
	//	Иначе
	//		СуммаБезналичнойОплаты2 = СуммаБезналичнойОплаты2 + ТаблицаОплат[ИндексОплаты][1].Значение;
	//	КонецЕсли;
	//КонецЦикла;

	//Результат = ОбъектДрайвера.ЗакрытьЧек(ПараметрыПодключения.ИДУстройства,
	//									  СуммаНаличнойОплаты,
	//									  СуммаБезналичнойОплаты1,
	//									  СуммаБезналичнойОплаты2);
	//Если НЕ Результат Тогда
	//	ВыходныеПараметры.Очистить();
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить("");
	//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

	//	ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
	//КонецЕсли;

 	Возврат Результат;

КонецФункции

// Master  16.12.2011 13:57:41 
// Функция осуществляет отмену ранее открытого чека.
//
Функция ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)

	Результат = Истина;

	
	Результат = ОбъектДрайвера.GetCheckOpened;
	Если Результат тогда // Если Чек открыт только тогда аннулируем
		Результат = ОбъектДрайвера.FPResetOrder();		
	КонецЕсли;

	Если НЕ Результат тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;	
	КонецЕсли;
	//ОбъектДрайвера.ОтменитьЧек(ПараметрыПодключения.ИДУстройства);

	Возврат Результат;

КонецФункции

// Master  16.12.2011 9:51:52 
// Функция осуществляет внесение или выемку суммы на ФР.
//
Функция Инкассация(ОбъектДрайвера, Параметры, ПараметрыПодключения, ТипИнкассации, Сумма, ВыходныеПараметры)

	Результат = Истина;

	Если ТипИнкассации=1 тогда
		Результат = ОбъектДрайвера.FPInToCash(Формат(Сумма*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0"));  
	Иначе
		Результат = ОбъектДрайвера.FPOutOfCash(Формат(Сумма*100,"ЧЦ=12; ЧДЦ=0; ЧГ=0")); 
	КонецЕсли;
	
	Если НЕ Результат Тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = ОбъектДрайвера.GetTextErrorMessage;
		
	Иначе
		// Заполнение выходных параметров
		ВыходныеПараметры.Добавить(0);
		ВыходныеПараметры.Добавить(0);
		ВыходныеПараметры.Добавить(0);
		ВыходныеПараметры.Добавить(ТекущаяДата());
	КонецЕсли;
	
	
	
	
//	Результат = ОбъектДрайвера.НапечататьЧекВнесенияВыемки(ПараметрыПодключения.ИДУстройства,
//							   ?(ТипИнкассации = 1, Сумма, -Сумма));
//	Если НЕ Результат Тогда
//		ВыходныеПараметры.Добавить(999);
//		ВыходныеПараметры.Добавить("");
//		КодОшибки = ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

//		ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
//	Иначе
//		// Заполнение выходных параметров
//		ВыходныеПараметры.Добавить(0);
//		ВыходныеПараметры.Добавить(0);
//		ВыходныеПараметры.Добавить(0);
//		ВыходныеПараметры.Добавить(ТекущаяДата());
//	КонецЕсли;

	Возврат Результат;

КонецФункции


// Master  16.12.2011 9:08:28 
// Функция осуществляет снятие отчёта без гашения.
//
Функция НапечататьОтчетБезГашения(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)

	Результат = Истина;

	Результат = ОбъектДрайвера.FPDayReport(Параметры.ПарольАдминистратора);
	Если НЕ Результат Тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1]=ОбъектДрайвера.GetTextErrorMessage;
	КонецЕсли;
	
	//Результат = ОбъектДрайвера.НапечататьОтчетБезГашения(ПараметрыПодключения.ИДУстройства);
	//Если НЕ Результат Тогда
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить("");
	//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

	//	ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
	//Иначе
	//	
	//КонецЕсли;

	Возврат Результат;

КонецФункции


 // Master  16.12.2011 9:07:11 
// Функция осуществляет снятие отчёта с гашением.
//
Функция НапечататьОтчетСГашением(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)

	Результат = Истина;
	ТОстатокДенегВФР = ОбъектДрайвера.GetMoneyInBox;
	ОстатокДенегВФР = ?(ПустаяСтрока(ТОстатокДенегВФР),0,Число(ТОстатокДенегВФР));
	Если НЕ ОстатокДенегВФР=0 тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1] = "Остаток суммы  наличных в денежном ящике: "+Формат(ОстатокДенегВФР/100,"ЧЦ=12; ЧДЦ=2; ЧРГ=; ЧГ=3,0");
		Возврат Ложь;	
	КонецЕсли;
	Результат = ОбъектДрайвера.FPDayClrReport(Параметры.ПарольАдминистратора);
	Если НЕ Результат Тогда
		ВыходныеПараметры.Добавить(999);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1]=ОбъектДрайвера.GetTextErrorMessage;
	КонецЕсли;
	
	//Результат = ОбъектДрайвера.НапечататьОтчетСГашением(ПараметрыПодключения.ИДУстройства);
	//Если НЕ Результат Тогда
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить("");
	//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);

	//	ОтменитьЧек(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры);
	//Иначе
	//	
	//КонецЕсли;

	Возврат Результат;

КонецФункции

 // Master  16.12.2011 9:06:12 
// Функция осуществляет открытие денежного ящика
//
Функция ОткрытьДенежныйЯщик(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)

	Результат = Истина;
	Результат = ОбъектДрайвера.FPOpenBox();
	Если НЕ Результат Тогда
		ВыходныеПараметры.Добавить(ОбъектДрайвера.GetByteResult);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1]=ОбъектДрайвера.GetTextErrorMessage;
	КонецЕсли;
	//Попытка
	//	Результат = ОбъектДрайвера.ОткрытьДенежныйЯщик(ПараметрыПодключения.ИДУстройства, 0); // номер ящика по умолчанию 0
	//Исключение
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить(НСтр("ru='Команда ""Открыть денежный ящик"" не поддерживается данным драйвером.'"));
	//	Возврат Результат;
	//КонецПопытки;
	//
	//Если НЕ Результат Тогда
	//	ВыходныеПараметры.Добавить(999);
	//	ВыходныеПараметры.Добавить("");
	//	ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);
	//КонецЕсли;

	Возврат Результат;

КонецФункции

//////////// ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ ////////////////////

// Master  16.12.2011 9:06:22 
// Функция осуществляет тестирование устройства
//
Функция ТестУстройства(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)

	Результат      = Истина;
	РезультатТеста = "";

	СерийныйНомерККМ = "0";

	//мНДС = Новый Массив();
	//мНДС.Добавить(20.00);
	//мНДС.Добавить(0.00);
	//мНДС.Добавить(0.00);
	//мНДС.Добавить(0.00);

	//МассивЗначений = Новый Массив;
	//МассивЗначений.Добавить(Параметры.Порт);
	//МассивЗначений.Добавить(Параметры.Скорость);
	//МассивЗначений.Добавить(Параметры.ПарольПользователя);
	//МассивЗначений.Добавить(Параметры.ПарольАдминистратора);
	//МассивЗначений.Добавить(Параметры.Таймаут);
	//МассивЗначений.Добавить(СерийныйНомерККМ);
	//МассивЗначений.Добавить(мНДС[0]);
	//МассивЗначений.Добавить(мНДС[1]);
	//МассивЗначений.Добавить(мНДС[2]);
	//МассивЗначений.Добавить(мНДС[3]);
	//МассивЗначений.Добавить(Ложь);
	//МассивЗначений.Добавить(Параметры.ЖурналОперацийДрайвера);
	//МассивЗначений.Добавить(Параметры.НаименованиеОплаты1);
	//МассивЗначений.Добавить(Параметры.НаименованиеОплаты2);

	//Результат = ОбъектДрайвера.ТестУстройства(МассивЗначений, РезультатТеста);  // Master  15.12.2011 14:03:11 
	// { Master  15.12.2011 14:03:16 
	Если НЕ ОбъектДрайвера.FPInit(Параметры.Порт,Параметры.Скорость,Параметры.Таймаут,Параметры.Таймаут) тогда
		ВыходныеПараметры.Добавить(999);
		ВыходныеПараметры.Добавить("");
		ВыходныеПараметры[1]=ОбъектДрайвера.GetTextErrorMessage;
		попытка
			ОбъектДрайвера.FPClose(); // попробуем закрыть сессию	
		Исключение
		КонецПопытки;
	Иначе
		Результат = ОбъектДрайвера.FPLineFeed();
		ОбъектДрайвера.FPSendCustomer(True,"Work with 1C");
		ОбъектДрайвера.FPPrintVersion();
		ОбъектДрайвера.FPClose();
	КонецЕсли;
	// }

	ВыходныеПараметры.Добавить(?(Результат, 0, 999));
	ВыходныеПараметры.Добавить(РезультатТеста);

	Возврат Результат;

КонецФункции

// Master  16.12.2011 9:06:51 
// Функция возвращает версию установленного драйвера
//
Функция ПолучитьВерсиюДрайвера(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)

	Результат = Истина;

	ВыходныеПараметры.Добавить(НСтр("ru='Установлен'"));
	ВыходныеПараметры.Добавить(НСтр("ru='Не определена'"));
   // { Master  15.12.2011 13:42:25 
   //Так как в драйвере ИКС нет значение драйвера, возвращем неопределена
   // }
   	Попытка
		Если ОбъектДрайвера.FPInit(Параметры.Порт,Параметры.Скорость,Параметры.Таймаут,Параметры.Таймаут) тогда
			ВыходныеПараметры[1] = ОбъектДрайвера.GetHardwareVersion;
			ОбъектДрайвера.FPClose();
		КонецЕсли;
	//	ВыходныеПараметры[1] = ОбъектДрайвера.ПолучитьНомерВерсии();
	Исключение
	КонецПопытки;

	Возврат Результат;

КонецФункции