|
На новых УНФ с индексом 93, 96 перестали печататься чеки в автоматическом режиме. Поддержка сказала, что косяк 1С. На деле же оказалось, что 1с внесли какие-то изменения и чек не бился с сайта, выдавал ошибку. Исправили самостоятельно, корректировкой общего модуля "Б_ПечатьЧековСервер". Отправили данные в поддержку, может быть что-то сделают. Может кому пригодится. Под спойлером весь листинг этого модуля. Сделано под УНФ 1.6.14.96 Скрытый текст |
---|
#Область ПроцедурыИФункцииПечати
Функция ПолучитьСпкДокументов(Статус) Экспорт
мДокументы = новый Массив;
Запрос = Новый Запрос; Запрос.УстановитьПараметр("Статус", Статус); Запрос.Текст = "ВЫБРАТЬ | Б_ОчередьПечати.Документ, | Б_ОчередьПечати.Статус, | Б_ОчередьПечати.Документ.Дата КАК ДатаДокумента, | Б_ОчередьПечати.ИдЧекаНаСайте |ИЗ | РегистрСведений.Б_ОчередьПечати КАК Б_ОчередьПечати |ГДЕ | Б_ОчередьПечати.Статус = &Статус | |УПОРЯДОЧИТЬ ПО | ДатаДокумента";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл мДокументы.Добавить(Новый Структура("Документ, ИдЧекаНаСайте",Выборка.Документ , Выборка.ИдЧекаНаСайте)); КонецЦикла;
Возврат мДокументы;
КонецФункции
Процедура ИзменитьЗаписьВРегистре_Б_ОчередьПечати(Элемент, Статус) Экспорт
Выборка = РегистрыСведений.Б_ОчередьПечати.Выбрать(Новый Структура("Документ", Элемент.Документ));
Пока Выборка.Следующий() Цикл
лЗапись = Выборка.ПолучитьМенеджерЗаписи();
лЗапись.Статус = Статус; лЗапись.ИдЧекаНаСайте = Элемент.ИдЧекаНаСайте; лЗапись.Записать(Истина);
КонецЦикла;
КонецПроцедуры
Функция КоличествоДокументовДляЧеков() Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Б_ОчередьПечати.Документ, | Б_ОчередьПечати.Статус |ИЗ | РегистрСведений.Б_ОчередьПечати КАК Б_ОчередьПечати |ГДЕ | Б_ОчередьПечати.Статус <> 3"; ТзнЗапроса = Запрос.Выполнить().Выгрузить();
Результат = ТзнЗапроса.Количество();
УстановитьПривилегированныйРежим(Ложь);
Возврат Результат;
КонецФункции
#КонецОбласти
#Область ОбщиеПроцедурыИФункции
Функция ПолучитьКассуККМ() Экспорт
лОбщиеНастройки = Константы.Б_ОбщиеНастройки.Получить().Получить(); Если лОбщиеНастройки = Неопределено тогда Возврат Справочники.КассыККМ.ПустаяСсылка(); КонецЕсли;
Если лОбщиеНастройки.Свойство("КассаККМ") тогда КассаККМ = лОбщиеНастройки.КассаККМ; Иначе КассаККМ = Справочники.КассыККМ.ПустаяСсылка(); КонецЕсли;
Возврат КассаККМ;
КонецФункции
Функция ПолучитьКассираККМ() Экспорт
лОбщиеНастройки = Константы.Б_ОбщиеНастройки.Получить().Получить(); Если лОбщиеНастройки = Неопределено тогда Возврат Справочники.Пользователи.ПустаяСсылка(); КонецЕсли;
Если лОбщиеНастройки.Свойство("Кассир") тогда Кассир = лОбщиеНастройки.Кассир; Иначе Кассир = Справочники.Пользователи.ПустаяСсылка(); КонецЕсли;
Возврат Кассир;
КонецФункции
Функция ПолучитьПризнакИспользованияКассираИКассуККМИзДокумента() Экспорт
ИспользоватьКассираИКассуККМИзДокумента = Ложь;
лОбщиеНастройки = Константы.Б_ОбщиеНастройки.Получить().Получить(); Если лОбщиеНастройки = Неопределено тогда Возврат ИспользоватьКассираИКассуККМИзДокумента; КонецЕсли;
Если лОбщиеНастройки.Свойство("ИспользоватьКассираИКассуККМИзДокумента") тогда ИспользоватьКассираИКассуККМИзДокумента = лОбщиеНастройки.ИспользоватьКассираИКассуККМИзДокумента; КонецЕсли;
Возврат ИспользоватьКассираИКассуККМИзДокумента;
КонецФункции
Функция ПолучитьПодключаемоеОборудование(пКассаККМ) Экспорт Возврат пКассаККМ.ПодключаемоеОборудование; КонецФункции
Функция ПолучитьКонтактыДокумента(Документ) Экспорт
Результат = новый Структура; Результат.Вставить("Email",""); Результат.Вставить("Телефон","");
Если Документ.Метаданные().Реквизиты.Найти("Контрагент") <> Неопределено тогда
лКонтрагент = Документ.Контрагент;
Для Каждого ТекКИ из лКонтрагент.КонтактнаяИнформация Цикл
Если ТекКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон И ТекКИ.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента тогда Результат.Телефон = ТекКИ.Представление; КонецЕсли;
Если ТекКИ.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты И ТекКИ.Вид = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента тогда Результат.Email = ТекКИ.Представление; КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура СообщитьПодробно(пСобытие, ЗаписьВЖурналРегистрации = Ложь) Экспорт
//#Если Клиент Тогда Сообщить(пСобытие); //#КонецЕсли
Б_ОбщиеПроцедурыИФункцииСервер.ОтображениеСостояния(пСобытие);
Если ЗаписьВЖурналРегистрации тогда ЗаписьЖурналаРегистрации("СобытияПечатиЧековМодуляБитрикс", УровеньЖурналаРегистрации.Ошибка,,, пСобытие); КонецЕсли;
лОбщиеНастройки = Константы.Б_ОбщиеНастройки.Получить().Получить(); Если лОбщиеНастройки = Неопределено тогда Возврат; КонецЕсли;
КаталогЛога = лОбщиеНастройки.КаталогЛога; КассаККМ = лОбщиеНастройки.КассаККМ;
Если НЕ ЗначениеЗаполнено(КаталогЛога) тогда Возврат; КонецЕсли;
СистемнаяИнформация = Новый СистемнаяИнформация; ПлатформаWindows = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64;
ИмяЛогФайла = "Receipt_" + Строка(КассаККМ) + " " + СокрЛП(Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"))+ ".txt"; ПолноеИмяЛогФайла = Б_ОбщиеПроцедурыИФункцииСервер.ПолучитьПутьДляПлатформы(ПлатформаWindows, КаталогЛога + "\"+ИмяЛогФайла);
Если НЕ Б_ОбщиеПроцедурыИФункцииСервер.СуществуетФайл(КаталогЛога) тогда СоздатьКаталог(КаталогЛога); КонецЕсли;
Текст = Новый ЗаписьТекста(ПолноеИмяЛогФайла, КодировкаТекста.ANSI,,истина); Текст.ЗаписатьСтроку(Строка(ТекущаяДата()) + "--" + пСобытие); Текст.Закрыть();
КонецПроцедуры
Функция ЭтоНужноеРабочееМесто() Экспорт
Результат = Ложь;
лОбщиеНастройки = Константы.Б_ОбщиеНастройки.Получить().Получить(); Если лОбщиеНастройки = Неопределено тогда Возврат Результат; КонецЕсли;
Если лОбщиеНастройки.Свойство("РабочееМесто") тогда РабочееМесто = лОбщиеНастройки.РабочееМесто; КонецЕсли;
Результат = МенеджерОборудованияВызовСервера.ПолучитьРабочееМестоКлиента() = РабочееМесто;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область РаботаСЧеком
Функция ЕстьЧекУДокумента(Документ) Экспорт
Выборка = РегистрыСведений.Б_ИнформацияОЧеках.Выбрать(Новый Структура("Документ", Документ)); ЕстьСвойствоОЧеках = Выборка.Следующий();
НайденныйРеквизит = Документ.Метаданные().Реквизиты.Найти("НомерЧекаККМ"); Если НайденныйРеквизит <> Неопределено тогда ЕстьНомерЧека = ?(ЗначениеЗаполнено(Документ.НомерЧекаККМ),Истина, Ложь) Иначе ЕстьНомерЧека = Ложь; КонецЕсли;
Возврат (ЕстьСвойствоОЧеках ИЛИ ЕстьНомерЧека);
КонецФункции
Функция ПодготовитьДанныеДляПробитияЧека(Документ, КассаККМ, Автор, ЭтоВозврат = Ложь) Экспорт
Объект = Документ;
// Подготовка таблицы товаров ОбщиеПараметры = МенеджерОборудованияКлиентСервер.ПараметрыОперацииФискализацииЧека();
РозничныеПродажиСервер.ДополнитьТоварамиПараметрыПриПробитииЧека(Объект, ОбщиеПараметры); СуммаСтрокЧека = РозничныеПродажиСервер.СуммаСтрокЧека(ОбщиеПараметры);
// Общие параметры чека РеквизитыОрганизация = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Организация, "НаименованиеПолное,ИНН,КПП");
СтруктураРеквизитов = Новый Структура("ЭлектронныйЧекSMSПередаютсяПрограммой1С,ЭлектронныйЧекEmailПередаютсяПрограммой1С,СерийныйНомер,Код,ПодключаемоеОборудование"); СтруктураРеквизитов.Вставить("СпособФорматноЛогическогоКонтроля", "ПодключаемоеОборудование.СпособФорматноЛогическогоКонтроля"); СтруктураРеквизитов.Вставить("ДопустимоеРасхождениеФорматноЛогическогоКонтроля", "ПодключаемоеОборудование.ДопустимоеРасхождениеФорматноЛогическогоКонтроля"); СтруктураРеквизитов.Вставить("ТипОборудования", "ПодключаемоеОборудование.ТипОборудования"); РеквизитыКассыККМ = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(КассаККМ, СтруктураРеквизитов);
РеквизитыКассира = РозничныеПродажиСервер.ПолучитьРеквизитыКассира(Объект.Автор);
ОбщиеПараметры.ТипРасчета = ?(ЭтоВозврат, Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратРасходаДенежныхСредств, Перечисления.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств);
ОбщиеПараметры.Электронно = Ложь;
Если ЗначениеЗаполнено(Объект.Телефон) Тогда Если РеквизитыКассыККМ.ЭлектронныйЧекSMSПередаютсяПрограммой1С Тогда ОбщиеПараметры.Отправляет1СSMS = Истина; КонецЕсли; ОбщиеПараметры.ПокупательНомер = РозничныеПродажиСервер.УбратьРазделителиВНомереТелефона(Объект.Телефон); КонецЕсли;
Если ЗначениеЗаполнено(Объект.АдресЭП) Тогда Если РеквизитыКассыККМ.ЭлектронныйЧекEmailПередаютсяПрограммой1С Тогда ОбщиеПараметры.Отправляет1СEmail = Истина; КонецЕсли; ОбщиеПараметры.ПокупательEmail = Объект.АдресЭП; КонецЕсли;
ОбщиеПараметры.ДокументОснование = Объект.Ссылка;
// Параметры необходимые для чека ЕНВД на принтере чеков ОбщиеПараметры.КассаККМ = КассаККМ; ОбщиеПараметры.Кассир = РеквизитыКассира.ИмяКассираИДолжность; ОбщиеПараметры.Вставить("ИмяКассира", РеквизитыКассира.ИмяКассира); ОбщиеПараметры.КассирИНН = РеквизитыКассира.КассирИНН;
ОбщиеПараметры.ОрганизацияНазвание = РеквизитыОрганизация.НаименованиеПолное; ОбщиеПараметры.ОрганизацияИНН = РеквизитыОрганизация.ИНН; ОбщиеПараметры.ОрганизацияКПП = РеквизитыОрганизация.КПП; ОбщиеПараметры.НомерКассы = "00001"; ОбщиеПараметры.НомерЧека = "1"; ОбщиеПараметры.НомерСмены = "1";
АдресМагазина = УправлениеНебольшойФирмойСервер.ПолучитьКонтактнуюИнформацию(Объект.Организация, ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.ФактАдресОрганизации"));
СерийныйНомер = РеквизитыКассыККМ.СерийныйНомер; Если НЕ ЗначениеЗаполнено(СерийныйНомер) Тогда СерийныйНомер = "1"; КонецЕсли;
ОбщиеПараметры.АдресМагазина = АдресМагазина; ОбщиеПараметры.НаименованиеМагазина = Строка(Объект.Организация); ОбщиеПараметры.СерийныйНомер = СерийныйНомер; ОбщиеПараметры.СистемаНалогообложения = РозничныеПродажиСервер.ПолучитьТипСистемыНалогообложенияККТ( Объект.Организация, , Объект.Дата, Объект.СпециальныйНалоговыйРежим);
Если РеквизитыКассыККМ.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ККТ Тогда ОбщиеПараметры.СпособФорматноЛогическогоКонтроля = РеквизитыКассыККМ.СпособФорматноЛогическогоКонтроля; ОбщиеПараметры.ДопустимоеРасхождениеФорматноЛогическогоКонтроля = РеквизитыКассыККМ.ДопустимоеРасхождениеФорматноЛогическогоКонтроля; Если ФорматноЛогическийКонтрольКлиентСервер.НуженФорматноЛогическийКонтроль(ОбщиеПараметры) Тогда ФорматноЛогическийКонтрольКлиентСервер.ПровестиФорматноЛогическийКонтроль(ОбщиеПараметры); КонецЕсли; КонецЕсли;
СтрокаОплаты = Новый Структура("ТипОплаты,Наименование,Сумма", Перечисления.ТипыОплатыККТ.Электронно, НСтр("ru = 'Электронно'"), Объект.СуммаДокумента); ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
РазницаСумм = СуммаСтрокЧека - Объект.СуммаДокумента; Если РазницаСумм > 0 Тогда СтрокаОплаты = Новый Структура("ТипОплаты,Наименование,Сумма", Перечисления.ТипыОплатыККТ.Постоплата, НСтр("ru = 'Постоплата'"), РазницаСумм); ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты); КонецЕсли;
Возврат ОбщиеПараметры;
КонецФункции // ПодготовитьДанныеДляПробитияЧека()
Процедура ДобавитьЗначенияСвойствЧека(АктивныйДокумент, ФискальныйПризнак, АдресСайта, РегНомерККТ)
НовоеСвойство = РегистрыСведений.Б_ИнформацияОЧеках.СоздатьМенеджерЗаписи(); НовоеСвойство.Документ = АктивныйДокумент; НовоеСвойство.ИдСвойства= Б_ОбщиеПроцедурыИФункцииСервер.ПолучитьПредопределенныйИдОбъекта("ИдСвойстваФискальныйПризнак"); НовоеСвойство.Значение = ФискальныйПризнак; НовоеСвойство.Записать(Истина);
НовоеСвойство = РегистрыСведений.Б_ИнформацияОЧеках.СоздатьМенеджерЗаписи(); НовоеСвойство.Документ = АктивныйДокумент; НовоеСвойство.ИдСвойства= Б_ОбщиеПроцедурыИФункцииСервер.ПолучитьПредопределенныйИдОбъекта("ИдСвойствАдресСайта"); НовоеСвойство.Значение = АдресСайта; НовоеСвойство.Записать(Истина);
НовоеСвойство = РегистрыСведений.Б_ИнформацияОЧеках.СоздатьМенеджерЗаписи(); НовоеСвойство.Документ = АктивныйДокумент; НовоеСвойство.ИдСвойства= Б_ОбщиеПроцедурыИФункцииСервер.ПолучитьПредопределенныйИдОбъекта("ИдСвойствРегНомерККТ"); НовоеСвойство.Значение = РегНомерККТ; НовоеСвойство.Записать(Истина);
НовоеСвойство = РегистрыСведений.Б_ИнформацияОЧеках.СоздатьМенеджерЗаписи(); НовоеСвойство.Документ = АктивныйДокумент; НовоеСвойство.ИдСвойства= Б_ОбщиеПроцедурыИФункцииСервер.ПолучитьПредопределенныйИдОбъекта("ИдСвойствПечатьЧека"); НовоеСвойство.Значение = "false"; НовоеСвойство.Записать(Истина);
КонецПроцедуры
Процедура ПробитьЧекЗавершениеСервер(РезультатВыполнения, АктивныйДокумент) Экспорт
ДокументОбъект = АктивныйДокумент.ПолучитьОбъект();
// Установить полученное значение номера чека реквизиту документа. Если РезультатВыполнения.ВыходныеПараметры <> Неопределено Тогда ДокументОбъект.НомерСменыККМ = РезультатВыполнения.ВыходныеПараметры[0]; ДокументОбъект.НомерЧекаККМ = РезультатВыполнения.ВыходныеПараметры[1]; КонецЕсли;
ДокументОбъект.Дата = УправлениеНебольшойФирмойВызовСервера.ДатаСеанса();
Если НЕ ЗначениеЗаполнено(ДокументОбъект.НомерЧекаККМ) Тогда ДокументОбъект.НомерЧекаККМ = 1; КонецЕсли;
ДобавитьЗначенияСвойствЧека(АктивныйДокумент, РезультатВыполнения.ВыходныеПараметры[4], РезультатВыполнения.ВыходныеПараметры[5], РезультатВыполнения.ВыходныеПараметры[6]);
Попытка ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение) Исключение СообщитьПодробно("не удалось записать номер чека у документа: " + Строка(АктивныйДокумент), Истина); СообщитьПодробно(ОписаниеОшибки(), Истина); КонецПопытки;
КонецПроцедуры
#КонецОбласти |
|