|  | 
				На новых УНФ с индексом 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]);
 
 Попытка
 ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение)
 Исключение
 СообщитьПодробно("не удалось записать номер  чека у документа: " + Строка(АктивныйДокумент), Истина);
 СообщитьПодробно(ОписаниеОшибки(), Истина);
 КонецПопытки;
 
 КонецПроцедуры
 
 #КонецОбласти
 | 
 |