Имя: Пароль:
1C
1С v8
Команда AddDevice(), ДобавитьУстройство();
0 Sigh
 
04.03.14
13:27
В самописанной конфе, через драйвер АТОЛ подключен фискальный регистратор. Проблема в том что в драйвере, в логических устройствах плодятся устройства ФР, просто копирвоанием по всем параметрам предыдущего. Пол логам драйвера ФР, определили что по времени это происходит, когда открывается смена на фисккальном регистраторе. Так как чудес не бывает, и иницировать такое может только команда  AddDevice() или ДобавитьУстройство(), НО такой команды нет если идти через отладчик по нажатию клавиши... Вот код даже:

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

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



Кто поможет, буду очень сильно благодарен. Вышлю пиво :) Просто сил уже нет, не понимаю в чем может быть проблема?