Товарищи давайте реализуем в рознице печать одного чека на фр и на pos принтер
Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
это ж форум экстрасенсов, очевидно же что один предприниматель - енвд, другой - не очень, и по первому нужно печатать нефискальные чеки
Да вы правы какая разница сколько кто на чем главное что нужно разделить печать в одном документе чек ккм(рмк) на фискальную и не фискальную
// Функция осуществляет проведение документа и печать чека на ФР.
//
// Параметры:
// Ответ - <Строка>
// - Выходной параметр; описание произошедшей ошибки.
//
// Отказ - <Булево>
// - Выходной параметр; признак отказа от выполнения операции.
//
// Возвращаемое значение:
// <Булево> - Истина в случае успешного завершения операции.
//
Функция ПровестиИРаспечататьЧек(Ответ, Отказ, ФормаДокумента, ПечатьПакетаДокументовВозврат = Ложь, РучнойРежимПечати = Ложь, ВсеПРН = Ложь,ВсеФР = Ложь) Экспорт
Результат = Истина;
Ответ = "";
Попытка
Если НачалоДня(Дата) = НачалоДня(ТекущаяДата())
И Метаданные().ОперативноеПроведение = Метаданные.СвойстваОбъектов.ОперативноеПроведение.Разрешить Тогда
Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный);
Иначе
Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
КонецЕсли;
Если ПечатьПакетаДокументовВозврат Тогда
Печать("КМ3");
КонецЕсли;
Исключение
Ответ = "Ошибка при попытке проведения документа!";
Отказ = Истина;
Результат = Ложь;
Возврат Результат;
КонецПопытки;
Если СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый Тогда
Возврат Результат;
КонецЕсли;
ФР = глЗначениеПеременной("мФР");
//серега
Если ИмяКомпьютера() = "LENOVOG" Тогда
ФР = Неопределено;
КонецЕсли;
//серега
Если ФР = Неопределено Тогда
МассивФР = ПолучитьСерверТО().ПолучитьСписокУстройств(
Перечисления.ВидыТорговогоОборудования.ФискальныйРегистратор,
КассаККМ);
КоличествоФР = МассивФР.Количество();
Если КоличествоФР = 0 Тогда
Ответ = "Чек не пробит, т.к. не подключен фискальный регистратор!";
Отказ = Истина;
Результат = Истина;
Возврат Результат;
ИначеЕсли КоличествоФР = 1 Тогда
ФР = МассивФР[0];
Иначе
//серега
Если ИмяКомпьютера() = "LENOVOG" Тогда
Попытка
Если НЕ ВсеПРН И НЕ ВсеФР Тогда
ЗакрытиеНеФискальногоЧека("1C224805-2FF7-4843-B17D-43212DCFEEF0");
ЗакрытиеФискальногоЧека("7D54CEF5-55B2-44BF-9B5C-DD7C3C56B87B");
Отказ = Ложь;
Результат = Истина;
Возврат Результат;
ИначеЕсли ВсеФР Тогда
ПолноеЗакрытиеЧека("1C224805-2FF7-4843-B17D-43212DCFEEF0");
Отказ = Ложь;
Результат = Истина;
Возврат Результат;
Иначе
ПолноеЗакрытиеЧека("7D54CEF5-55B2-44BF-9B5C-DD7C3C56B87B");
Отказ = Ложь;
Результат = Истина;
Возврат Результат;
КонецЕсли;
Исключение
Отказ = Истина;
Ответ = "Чек не пробит!";
Результат = Ложь;
Возврат Результат;
КонецПопытки;
Иначе
//серега
СписокФР = РаботаСТорговымОборудованием.ПолучитьСписокУстройствТОДляВыбора(МассивФР);
ФР = СписокФР.ВыбратьЭлемент("Необходимо выбрать фискальный регистратор");
Если ФР = Неопределено Тогда
Ответ = "Операция отменена пользователем.";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Операция отменена!" + Символы.ПС +
"Фискальный регистратор для печати чека выбран не был!" + Символы.ПС +
"Возможны расхождения данных в информационной базе и фискальном регистраторе (принтере чеков).";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
Возврат Результат;
Иначе
ФР = ФР.Значение;
КонецЕсли;
//серега
КонецЕсли;
//серега
КонецЕсли;
КонецЕсли;
ОшибкаТО = Перечисления.ТООшибкиОбщие.ПустаяСсылка();
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТчТовары.Номенклатура.Представление КАК Номенклатура,
| ТчТовары.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатуры,
| ТчТовары.Номенклатура.Код КАК Код,
| ТчТовары.Номенклатура.Весовой КАК Весовой,
| ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ТчТовары.Цена КАК Цена,
| ТчТовары.Количество КАК Количество,
| ВЫБОР
| КОГДА ТчТовары.Цена * ТчТовары.Количество = 0
| ТОГДА 0
| ИНАЧЕ (1 - ТчТовары.Сумма / (ТчТовары.Цена * ТчТовары.Количество)) * 100
| КОНЕЦ КАК ПроцентСкидкиНаценки,
| ТчТовары.СтавкаНДС,
| ТчТовары.СуммаНДС
|ИЗ
| Документ.ЧекККМ.Товары КАК ТчТовары
|ГДЕ
| ТчТовары.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Ответ = "Пустой чек не может быть пробит на фискальном регистраторе!";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Пустой чек!" + Символы.ПС +
"Пустой чек не может быть распечатан на фискальном регистраторе!" + Символы.ПС +
"Это не критичная ошибка, т.к. проведенный пустой чек не влияет на данные информационной базы.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
Возврат Результат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("Код");
ТаблицаТоваров.Колонки.Добавить("Весовой");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ");
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.Код = Выборка.Код;
Товар.Весовой = Выборка.Весовой;
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
КонецЦикла;
ОшибкаТО = ПечатьЧекаККМ(ФР, НомерЧекаККМ, НомерСменыККМ,
ТаблицаТоваров, ПолучитьСуммуНаличнойОплаты(),
ПолучитьСуммуБезналичнойОплаты() + ПолучитьСуммуОплатыПодарочнымиСертификатами(),
ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат);
Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка записи чека!" + Символы.ПС +
"Не удалось установить признак пробития чека!" + Символы.ПС +
"Это не критичная ошибка, т.к. при закрытии смены чек в любом случае попадет в отчет о продажах.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецПопытки;
Иначе
Ответ = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка фискального регистратора!" + Символы.ПС +
Ответ + Символы.ПС + "!" +
"Необходимо проверить настройки подключения фискального регистратора.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецЕсли;
Если ПараметрыСеанса.НаличиеОбменаДаннымиПоКассе И Не ПараметрыСеанса.ЭтоГлавныйУзелОбменаПоКассе Тогда
//определим настройку для выполнения
СтруктураНастроекОбмена = ПроцедурыОбменаДаннымиПоКассе.ПолучитьСтруктуруНастроекОбменаВУзлеКассы();
Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.НастройкаОбменаДанными) Тогда
Сообщить("Не смог определить настройку обмена данными для узла кассы!
|Необходимо в форме узла обмена выбрать соответствующую настройку обмена!", СтатусСообщения.ОченьВажное);
Иначе
ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоПроизвольнойНастройке(СтруктураНастроекОбмена.НастройкаОбменаДанными, Ложь, глЗначениеПеременной("глОбработкаАвтоОбменДанными"));
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции // ПровестиИРаспечататьЧек()
//
// Параметры:
// Ответ - <Строка>
// - Выходной параметр; описание произошедшей ошибки.
//
// Отказ - <Булево>
// - Выходной параметр; признак отказа от выполнения операции.
//
// Возвращаемое значение:
// <Булево> - Истина в случае успешного завершения операции.
//
Функция ПровестиИРаспечататьЧек(Ответ, Отказ, ФормаДокумента, ПечатьПакетаДокументовВозврат = Ложь, РучнойРежимПечати = Ложь, ВсеПРН = Ложь,ВсеФР = Ложь) Экспорт
Результат = Истина;
Ответ = "";
Попытка
Если НачалоДня(Дата) = НачалоДня(ТекущаяДата())
И Метаданные().ОперативноеПроведение = Метаданные.СвойстваОбъектов.ОперативноеПроведение.Разрешить Тогда
Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный);
Иначе
Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
КонецЕсли;
Если ПечатьПакетаДокументовВозврат Тогда
Печать("КМ3");
КонецЕсли;
Исключение
Ответ = "Ошибка при попытке проведения документа!";
Отказ = Истина;
Результат = Ложь;
Возврат Результат;
КонецПопытки;
Если СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый Тогда
Возврат Результат;
КонецЕсли;
ФР = глЗначениеПеременной("мФР");
//серега
Если ИмяКомпьютера() = "LENOVOG" Тогда
ФР = Неопределено;
КонецЕсли;
//серега
Если ФР = Неопределено Тогда
МассивФР = ПолучитьСерверТО().ПолучитьСписокУстройств(
Перечисления.ВидыТорговогоОборудования.ФискальныйРегистратор,
КассаККМ);
КоличествоФР = МассивФР.Количество();
Если КоличествоФР = 0 Тогда
Ответ = "Чек не пробит, т.к. не подключен фискальный регистратор!";
Отказ = Истина;
Результат = Истина;
Возврат Результат;
ИначеЕсли КоличествоФР = 1 Тогда
ФР = МассивФР[0];
Иначе
//серега
Если ИмяКомпьютера() = "LENOVOG" Тогда
Попытка
Если НЕ ВсеПРН И НЕ ВсеФР Тогда
ЗакрытиеНеФискальногоЧека("1C224805-2FF7-4843-B17D-43212DCFEEF0");
ЗакрытиеФискальногоЧека("7D54CEF5-55B2-44BF-9B5C-DD7C3C56B87B");
Отказ = Ложь;
Результат = Истина;
Возврат Результат;
ИначеЕсли ВсеФР Тогда
ПолноеЗакрытиеЧека("1C224805-2FF7-4843-B17D-43212DCFEEF0");
Отказ = Ложь;
Результат = Истина;
Возврат Результат;
Иначе
ПолноеЗакрытиеЧека("7D54CEF5-55B2-44BF-9B5C-DD7C3C56B87B");
Отказ = Ложь;
Результат = Истина;
Возврат Результат;
КонецЕсли;
Исключение
Отказ = Истина;
Ответ = "Чек не пробит!";
Результат = Ложь;
Возврат Результат;
КонецПопытки;
Иначе
//серега
СписокФР = РаботаСТорговымОборудованием.ПолучитьСписокУстройствТОДляВыбора(МассивФР);
ФР = СписокФР.ВыбратьЭлемент("Необходимо выбрать фискальный регистратор");
Если ФР = Неопределено Тогда
Ответ = "Операция отменена пользователем.";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Операция отменена!" + Символы.ПС +
"Фискальный регистратор для печати чека выбран не был!" + Символы.ПС +
"Возможны расхождения данных в информационной базе и фискальном регистраторе (принтере чеков).";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
Возврат Результат;
Иначе
ФР = ФР.Значение;
КонецЕсли;
//серега
КонецЕсли;
//серега
КонецЕсли;
КонецЕсли;
ОшибкаТО = Перечисления.ТООшибкиОбщие.ПустаяСсылка();
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТчТовары.Номенклатура.Представление КАК Номенклатура,
| ТчТовары.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатуры,
| ТчТовары.Номенклатура.Код КАК Код,
| ТчТовары.Номенклатура.Весовой КАК Весовой,
| ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ТчТовары.Цена КАК Цена,
| ТчТовары.Количество КАК Количество,
| ВЫБОР
| КОГДА ТчТовары.Цена * ТчТовары.Количество = 0
| ТОГДА 0
| ИНАЧЕ (1 - ТчТовары.Сумма / (ТчТовары.Цена * ТчТовары.Количество)) * 100
| КОНЕЦ КАК ПроцентСкидкиНаценки,
| ТчТовары.СтавкаНДС,
| ТчТовары.СуммаНДС
|ИЗ
| Документ.ЧекККМ.Товары КАК ТчТовары
|ГДЕ
| ТчТовары.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Ответ = "Пустой чек не может быть пробит на фискальном регистраторе!";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Пустой чек!" + Символы.ПС +
"Пустой чек не может быть распечатан на фискальном регистраторе!" + Символы.ПС +
"Это не критичная ошибка, т.к. проведенный пустой чек не влияет на данные информационной базы.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
Возврат Результат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("Код");
ТаблицаТоваров.Колонки.Добавить("Весовой");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ");
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.Код = Выборка.Код;
Товар.Весовой = Выборка.Весовой;
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
КонецЦикла;
ОшибкаТО = ПечатьЧекаККМ(ФР, НомерЧекаККМ, НомерСменыККМ,
ТаблицаТоваров, ПолучитьСуммуНаличнойОплаты(),
ПолучитьСуммуБезналичнойОплаты() + ПолучитьСуммуОплатыПодарочнымиСертификатами(),
ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат);
Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка записи чека!" + Символы.ПС +
"Не удалось установить признак пробития чека!" + Символы.ПС +
"Это не критичная ошибка, т.к. при закрытии смены чек в любом случае попадет в отчет о продажах.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецПопытки;
Иначе
Ответ = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка фискального регистратора!" + Символы.ПС +
Ответ + Символы.ПС + "!" +
"Необходимо проверить настройки подключения фискального регистратора.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецЕсли;
Если ПараметрыСеанса.НаличиеОбменаДаннымиПоКассе И Не ПараметрыСеанса.ЭтоГлавныйУзелОбменаПоКассе Тогда
//определим настройку для выполнения
СтруктураНастроекОбмена = ПроцедурыОбменаДаннымиПоКассе.ПолучитьСтруктуруНастроекОбменаВУзлеКассы();
Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.НастройкаОбменаДанными) Тогда
Сообщить("Не смог определить настройку обмена данными для узла кассы!
|Необходимо в форме узла обмена выбрать соответствующую настройку обмена!", СтатусСообщения.ОченьВажное);
Иначе
ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоПроизвольнойНастройке(СтруктураНастроекОбмена.НастройкаОбменаДанными, Ложь, глЗначениеПеременной("глОбработкаАвтоОбменДанными"));
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции // ПровестиИРаспечататьЧек()
//серега
Процедура ЗакрытиеФискальногоЧека(Идентификатор)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТчТовары.Номенклатура.Представление КАК Номенклатура,
| ТчТовары.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатуры,
| ТчТовары.Номенклатура.Код КАК Код,
| ТчТовары.Номенклатура.Весовой КАК Весовой,
| ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ТчТовары.Цена КАК Цена,
| ТчТовары.Количество КАК Количество,
| ВЫБОР
| КОГДА ТчТовары.Цена * ТчТовары.Количество = 0
| ТОГДА 0
| ИНАЧЕ (1 - ТчТовары.Сумма / (ТчТовары.Цена * ТчТовары.Количество)) * 100
| КОНЕЦ КАК ПроцентСкидкиНаценки,
| ТчТовары.СтавкаНДС,
| ТчТовары.СуммаНДС,
| ТчТовары.Сумма
|ИЗ
| Документ.ЧекККМ.Товары КАК ТчТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО ТчТовары.Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
| И (ЗначенияСвойствОбъектов.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПечатьФР))
|ГДЕ
| ТчТовары.Ссылка = &Ссылка
| И ЗначенияСвойствОбъектов.Значение = ИСТИНА");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("Код");
ТаблицаТоваров.Колонки.Добавить("Весовой");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ТаблицаТоваров.Колонки.Добавить("Сумма");
ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ");
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.Код = Выборка.Код;
Товар.Весовой = Выборка.Весовой;
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
Товар.Сумма = Выборка.Сумма;
КонецЦикла;
ОшибкаТО = ПечатьЧекаККМ(Идентификатор, НомерЧекаККМ, НомерСменыККМ,
ТаблицаТоваров, ?(ПолучитьСуммуНаличнойОплаты() = 0, 0, ТаблицаТоваров.Итог("Сумма")),
?(ПолучитьСуммуБезналичнойОплаты() = 0, 0, ТаблицаТоваров.Итог("Сумма")),
ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат);
Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ = Истина;
Результат = Ложь;
КонецПопытки;
Иначе
Ответ = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ = Истина;
Результат = Ложь;
КонецЕсли;
Если ПараметрыСеанса.НаличиеОбменаДаннымиПоКассе И Не ПараметрыСеанса.ЭтоГлавныйУзелОбменаПоКассе Тогда
//определим настройку для выполнения
СтруктураНастроекОбмена = ПроцедурыОбменаДаннымиПоКассе.ПолучитьСтруктуруНастроекОбменаВУзлеКассы();
Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.НастройкаОбменаДанными) Тогда
Сообщить("Не смог определить настройку обмена данными для узла кассы!
|Необходимо в форме узла обмена выбрать соответствующую настройку обмена!", СтатусСообщения.ОченьВажное);
Иначе
ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоПроизвольнойНастройке(СтруктураНастроекОбмена.НастройкаОбменаДанными, Ложь, глЗначениеПеременной("глОбработкаАвтоОбменДанными"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗакрытиеНеФискальногоЧека(Идентификатор)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТчТовары.Номенклатура.Представление КАК Номенклатура,
| ТчТовары.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатуры,
| ТчТовары.Номенклатура.Код КАК Код,
| ТчТовары.Номенклатура.Весовой КАК Весовой,
| ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ТчТовары.Цена КАК Цена,
| ТчТовары.Количество КАК Количество,
| ВЫБОР
| КОГДА ТчТовары.Цена * ТчТовары.Количество = 0
| ТОГДА 0
| ИНАЧЕ (1 - ТчТовары.Сумма / (ТчТовары.Цена * ТчТовары.Количество)) * 100
| КОНЕЦ КАК ПроцентСкидкиНаценки,
| ТчТовары.СтавкаНДС,
| ТчТовары.СуммаНДС,
| ТчТовары.Сумма
|ИЗ
| Документ.ЧекККМ.Товары КАК ТчТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО ТчТовары.Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
| И (ЗначенияСвойствОбъектов.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПечатьФР))
|ГДЕ
| ТчТовары.Ссылка = &Ссылка
| И ЗначенияСвойствОбъектов.Значение = ЛОЖЬ");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("Код");
ТаблицаТоваров.Колонки.Добавить("Весовой");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ТаблицаТоваров.Колонки.Добавить("Сумма");
ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ");
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.Код = Выборка.Код;
Товар.Весовой = Выборка.Весовой;
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
Товар.Сумма = Выборка.Сумма;
КонецЦикла;
ОшибкаТО = ПечатьЧекаККМ(Идентификатор, НомерЧекаККМ, НомерСменыККМ,
ТаблицаТоваров, ТаблицаТоваров.Итог("Сумма"),
0,
ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат);
Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка записи чека!" + Символы.ПС +
"Не удалось установить признак пробития чека!" + Символы.ПС +
"Это не критичная ошибка, т.к. при закрытии смены чек в любом случае попадет в отчет о продажах.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецПопытки;
Иначе
Ответ = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка фискального регистратора!" + Символы.ПС +
Ответ + Символы.ПС + "!" +
"Необходимо проверить настройки подключения фискального регистратора.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецЕсли;
Если ПараметрыСеанса.НаличиеОбменаДаннымиПоКассе И Не ПараметрыСеанса.ЭтоГлавныйУзелОбменаПоКассе Тогда
//определим настройку для выполнения
СтруктураНастроекОбмена = ПроцедурыОбменаДаннымиПоКассе.ПолучитьСтруктуруНастроекОбменаВУзлеКассы();
Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.НастройкаОбменаДанными) Тогда
Сообщить("Не смог определить настройку обмена данными для узла кассы!
|Необходимо в форме узла обмена выбрать соответствующую настройку обмена!", СтатусСообщения.ОченьВажное);
Иначе
ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоПроизвольнойНастройке(СтруктураНастроекОбмена.НастройкаОбменаДанными, Ложь, глЗначениеПеременной("глОбработкаАвтоОбменДанными"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПолноеЗакрытиеЧека(Идентификатор);
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТчТовары.Номенклатура.Представление КАК Номенклатура,
| ТчТовары.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатуры,
| ТчТовары.Номенклатура.Код КАК Код,
| ТчТовары.Номенклатура.Весовой КАК Весовой,
| ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ТчТовары.Цена КАК Цена,
| ТчТовары.Количество КАК Количество,
| ВЫБОР
| КОГДА ТчТовары.Цена * ТчТовары.Количество = 0
| ТОГДА 0
| ИНАЧЕ (1 - ТчТовары.Сумма / (ТчТовары.Цена * ТчТовары.Количество)) * 100
| КОНЕЦ КАК ПроцентСкидкиНаценки,
| ТчТовары.СтавкаНДС,
| ТчТовары.СуммаНДС,
| ТчТовары.Сумма
|ИЗ
| Документ.ЧекККМ.Товары КАК ТчТовары
|ГДЕ
| ТчТовары.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("Код");
ТаблицаТоваров.Колонки.Добавить("Весовой");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ТаблицаТоваров.Колонки.Добавить("Сумма");
ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ");
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.Код = Выборка.Код;
Товар.Весовой = Выборка.Весовой;
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
Товар.Сумма = Выборка.Сумма;
КонецЦикла;
ОшибкаТО = ПечатьЧекаККМ(Идентификатор, НомерЧекаККМ, НомерСменыККМ,
ТаблицаТоваров, ?(ПолучитьСуммуНаличнойОплаты() = 0, 0, ТаблицаТоваров.Итог("Сумма")),
?(ПолучитьСуммуБезналичнойОплаты() = 0, 0, ТаблицаТоваров.Итог("Сумма")),
ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат);
Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка записи чека!" + Символы.ПС +
"Не удалось установить признак пробития чека!" + Символы.ПС +
"Это не критичная ошибка, т.к. при закрытии смены чек в любом случае попадет в отчет о продажах.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецПопытки;
Иначе
Ответ = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка фискального регистратора!" + Символы.ПС +
Ответ + Символы.ПС + "!" +
"Необходимо проверить настройки подключения фискального регистратора.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецЕсли;
Если ПараметрыСеанса.НаличиеОбменаДаннымиПоКассе И Не ПараметрыСеанса.ЭтоГлавныйУзелОбменаПоКассе Тогда
//определим настройку для выполнения
СтруктураНастроекОбмена = ПроцедурыОбменаДаннымиПоКассе.ПолучитьСтруктуруНастроекОбменаВУзлеКассы();
Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.НастройкаОбменаДанными) Тогда
Сообщить("Не смог определить настройку обмена данными для узла кассы!
|Необходимо в форме узла обмена выбрать соответствующую настройку обмена!", СтатусСообщения.ОченьВажное);
Иначе
ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоПроизвольнойНастройке(СтруктураНастроекОбмена.НастройкаОбменаДанными, Ложь, глЗначениеПеременной("глОбработкаАвтоОбменДанными"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//серега
////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
РежимРМК = Ложь;
КонтролироватьОстаткиТоваровПриЗакрытииЧека = Ложь;
Процедура ЗакрытиеФискальногоЧека(Идентификатор)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТчТовары.Номенклатура.Представление КАК Номенклатура,
| ТчТовары.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатуры,
| ТчТовары.Номенклатура.Код КАК Код,
| ТчТовары.Номенклатура.Весовой КАК Весовой,
| ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ТчТовары.Цена КАК Цена,
| ТчТовары.Количество КАК Количество,
| ВЫБОР
| КОГДА ТчТовары.Цена * ТчТовары.Количество = 0
| ТОГДА 0
| ИНАЧЕ (1 - ТчТовары.Сумма / (ТчТовары.Цена * ТчТовары.Количество)) * 100
| КОНЕЦ КАК ПроцентСкидкиНаценки,
| ТчТовары.СтавкаНДС,
| ТчТовары.СуммаНДС,
| ТчТовары.Сумма
|ИЗ
| Документ.ЧекККМ.Товары КАК ТчТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО ТчТовары.Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
| И (ЗначенияСвойствОбъектов.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПечатьФР))
|ГДЕ
| ТчТовары.Ссылка = &Ссылка
| И ЗначенияСвойствОбъектов.Значение = ИСТИНА");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("Код");
ТаблицаТоваров.Колонки.Добавить("Весовой");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ТаблицаТоваров.Колонки.Добавить("Сумма");
ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ");
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.Код = Выборка.Код;
Товар.Весовой = Выборка.Весовой;
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
Товар.Сумма = Выборка.Сумма;
КонецЦикла;
ОшибкаТО = ПечатьЧекаККМ(Идентификатор, НомерЧекаККМ, НомерСменыККМ,
ТаблицаТоваров, ?(ПолучитьСуммуНаличнойОплаты() = 0, 0, ТаблицаТоваров.Итог("Сумма")),
?(ПолучитьСуммуБезналичнойОплаты() = 0, 0, ТаблицаТоваров.Итог("Сумма")),
ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат);
Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ = Истина;
Результат = Ложь;
КонецПопытки;
Иначе
Ответ = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ = Истина;
Результат = Ложь;
КонецЕсли;
Если ПараметрыСеанса.НаличиеОбменаДаннымиПоКассе И Не ПараметрыСеанса.ЭтоГлавныйУзелОбменаПоКассе Тогда
//определим настройку для выполнения
СтруктураНастроекОбмена = ПроцедурыОбменаДаннымиПоКассе.ПолучитьСтруктуруНастроекОбменаВУзлеКассы();
Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.НастройкаОбменаДанными) Тогда
Сообщить("Не смог определить настройку обмена данными для узла кассы!
|Необходимо в форме узла обмена выбрать соответствующую настройку обмена!", СтатусСообщения.ОченьВажное);
Иначе
ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоПроизвольнойНастройке(СтруктураНастроекОбмена.НастройкаОбменаДанными, Ложь, глЗначениеПеременной("глОбработкаАвтоОбменДанными"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗакрытиеНеФискальногоЧека(Идентификатор)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТчТовары.Номенклатура.Представление КАК Номенклатура,
| ТчТовары.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатуры,
| ТчТовары.Номенклатура.Код КАК Код,
| ТчТовары.Номенклатура.Весовой КАК Весовой,
| ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ТчТовары.Цена КАК Цена,
| ТчТовары.Количество КАК Количество,
| ВЫБОР
| КОГДА ТчТовары.Цена * ТчТовары.Количество = 0
| ТОГДА 0
| ИНАЧЕ (1 - ТчТовары.Сумма / (ТчТовары.Цена * ТчТовары.Количество)) * 100
| КОНЕЦ КАК ПроцентСкидкиНаценки,
| ТчТовары.СтавкаНДС,
| ТчТовары.СуммаНДС,
| ТчТовары.Сумма
|ИЗ
| Документ.ЧекККМ.Товары КАК ТчТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО ТчТовары.Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
| И (ЗначенияСвойствОбъектов.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПечатьФР))
|ГДЕ
| ТчТовары.Ссылка = &Ссылка
| И ЗначенияСвойствОбъектов.Значение = ЛОЖЬ");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("Код");
ТаблицаТоваров.Колонки.Добавить("Весовой");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ТаблицаТоваров.Колонки.Добавить("Сумма");
ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ");
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.Код = Выборка.Код;
Товар.Весовой = Выборка.Весовой;
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
Товар.Сумма = Выборка.Сумма;
КонецЦикла;
ОшибкаТО = ПечатьЧекаККМ(Идентификатор, НомерЧекаККМ, НомерСменыККМ,
ТаблицаТоваров, ТаблицаТоваров.Итог("Сумма"),
0,
ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат);
Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка записи чека!" + Символы.ПС +
"Не удалось установить признак пробития чека!" + Символы.ПС +
"Это не критичная ошибка, т.к. при закрытии смены чек в любом случае попадет в отчет о продажах.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецПопытки;
Иначе
Ответ = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка фискального регистратора!" + Символы.ПС +
Ответ + Символы.ПС + "!" +
"Необходимо проверить настройки подключения фискального регистратора.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецЕсли;
Если ПараметрыСеанса.НаличиеОбменаДаннымиПоКассе И Не ПараметрыСеанса.ЭтоГлавныйУзелОбменаПоКассе Тогда
//определим настройку для выполнения
СтруктураНастроекОбмена = ПроцедурыОбменаДаннымиПоКассе.ПолучитьСтруктуруНастроекОбменаВУзлеКассы();
Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.НастройкаОбменаДанными) Тогда
Сообщить("Не смог определить настройку обмена данными для узла кассы!
|Необходимо в форме узла обмена выбрать соответствующую настройку обмена!", СтатусСообщения.ОченьВажное);
Иначе
ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоПроизвольнойНастройке(СтруктураНастроекОбмена.НастройкаОбменаДанными, Ложь, глЗначениеПеременной("глОбработкаАвтоОбменДанными"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПолноеЗакрытиеЧека(Идентификатор);
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ТчТовары.Номенклатура.Представление КАК Номенклатура,
| ТчТовары.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатуры,
| ТчТовары.Номенклатура.Код КАК Код,
| ТчТовары.Номенклатура.Весовой КАК Весовой,
| ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ТчТовары.Цена КАК Цена,
| ТчТовары.Количество КАК Количество,
| ВЫБОР
| КОГДА ТчТовары.Цена * ТчТовары.Количество = 0
| ТОГДА 0
| ИНАЧЕ (1 - ТчТовары.Сумма / (ТчТовары.Цена * ТчТовары.Количество)) * 100
| КОНЕЦ КАК ПроцентСкидкиНаценки,
| ТчТовары.СтавкаНДС,
| ТчТовары.СуммаНДС,
| ТчТовары.Сумма
|ИЗ
| Документ.ЧекККМ.Товары КАК ТчТовары
|ГДЕ
| ТчТовары.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("Код");
ТаблицаТоваров.Колонки.Добавить("Весовой");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ТаблицаТоваров.Колонки.Добавить("Сумма");
ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ");
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.Код = Выборка.Код;
Товар.Весовой = Выборка.Весовой;
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
Товар.Сумма = Выборка.Сумма;
КонецЦикла;
ОшибкаТО = ПечатьЧекаККМ(Идентификатор, НомерЧекаККМ, НомерСменыККМ,
ТаблицаТоваров, ?(ПолучитьСуммуНаличнойОплаты() = 0, 0, ТаблицаТоваров.Итог("Сумма")),
?(ПолучитьСуммуБезналичнойОплаты() = 0, 0, ТаблицаТоваров.Итог("Сумма")),
ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат);
Если НЕ ЗначениеЗаполнено(ОшибкаТО) Тогда
СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый;
Попытка
Записать(РежимЗаписиДокумента.Запись);
Исключение
Ответ = "Не удалось записать документ с установленными параметрами пробитого чека.";
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка записи чека!" + Символы.ПС +
"Не удалось установить признак пробития чека!" + Символы.ПС +
"Это не критичная ошибка, т.к. при закрытии смены чек в любом случае попадет в отчет о продажах.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецПопытки;
Иначе
Ответ = ПолучитьСерверТО().ПолучитьТекстОшибкиФРТО(ОшибкаТО);
Отказ = Истина;
Результат = Ложь;
Если РежимРМК Тогда
ТекстОшибки = "Ошибка фискального регистратора!" + Символы.ПС +
Ответ + Символы.ПС + "!" +
"Необходимо проверить настройки подключения фискального регистратора.";
ВывестиИнформациюОбОшибке(ТекстОшибки);
КонецЕсли;
КонецЕсли;
Если ПараметрыСеанса.НаличиеОбменаДаннымиПоКассе И Не ПараметрыСеанса.ЭтоГлавныйУзелОбменаПоКассе Тогда
//определим настройку для выполнения
СтруктураНастроекОбмена = ПроцедурыОбменаДаннымиПоКассе.ПолучитьСтруктуруНастроекОбменаВУзлеКассы();
Если Не ЗначениеЗаполнено(СтруктураНастроекОбмена.НастройкаОбменаДанными) Тогда
Сообщить("Не смог определить настройку обмена данными для узла кассы!
|Необходимо в форме узла обмена выбрать соответствующую настройку обмена!", СтатусСообщения.ОченьВажное);
Иначе
ПроцедурыОбменаДанными.ВыполнитьОбменДаннымиПоПроизвольнойНастройке(СтруктураНастроекОбмена.НастройкаОбменаДанными, Ложь, глЗначениеПеременной("глОбработкаАвтоОбменДанными"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//серега
////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
РежимРМК = Ложь;
КонтролироватьОстаткиТоваровПриЗакрытииЧека = Ложь;
В форме регистрации продаж Завершение закрытие и кнопки в форме
//Производит закрытие чека на фискальном регистраторе и печать товарного чека.
//
// Параметры:
// Печать - булево, признак необходимости печати товарного чека.
//
Процедура ЗакрытьЧек(Печать = Ложь, РучнойРежим = Ложь, ВыбратьДокументПечати = Ложь, ВсеПРН = Ложь, ВсеФР = Ложь)
Перем Отказ;
Если ТолькоПросмотр Тогда
Закрыть();
КонецЕсли;
Если (СтатусЧекаККМ <> Перечисления.СтатусыЧековККМ.Пробитый
Или СтатусЧекаККМ <> Перечисления.СтатусыЧековККМ.Архивный
Или СтатусЧекаККМ <> Перечисления.СтатусыЧековККМ.Аннулированный)
И Товары.Количество() > 0 Тогда
Оплата.Очистить();
ФормаОплат = ПолучитьФорму("ФормаОплатЧека", ЭтаФорма);
ФормаОплат.СуммаОплаты = ЭлементыФормы.ИнфНадписьТекущееЗначение.Значение;
Результат = ФормаОплат.ОткрытьМодально();
ЭлементыФормы.ИнфНадписьТекущееЗначение.Значение = "";
ЭлементыФормы.Панель3.ЦветФона = ЦветаСтиля.ЦветФонаФормы;
КонецЕсли;
Если Результат <> "Закрыть чек" Тогда
Возврат;
КонецЕсли;
Отказ = Ложь;
//Погашение сертификатами
ТаблицаПогашения = ПодготовитьТаблицуПогашения();
ПроверитьЗаполнениеТабличнойЧастиПогашения(ТаблицаПогашения, ЭтотОбъект, Отказ, "");
УправлениеЗапасами.ПроверитьДвиженияСерийныхНомеровДляПогашения(ЭтотОбъект, РежимПроведенияДокумента.Оперативный, Отказ, "");
Если Отказ Тогда
Возврат;
КонецЕсли;
ИтогоПодарочныеСертификатыПоНоминалу = ПолучитьСуммуНоминаловПодарочныхСертификатов();
ИтогоПоЧеку = Товары.Итог("Сумма");
ПотериПокупателя = ИтогоПодарочныеСертификатыПоНоминалу - ИтогоПоЧеку;
Если ПотериПокупателя > 0 Тогда
ФормаИнформацииОбОшибке = Документы.ЧекККМ.ПолучитьФорму("ФормаИнформацииОбОшибке");
ТекстСообщения = "Потери покупателя от недобора товара составляют - " + Формат(ПотериПокупателя, "ЧЦ=15; ЧДЦ=2; ЧГ=3,0") + " грн." + Символы.ПС +
"Покупатель согласен?";
ФормаИнформацииОбОшибке.ТекстОшибки = "Информация для покупателя:" + Символы.ПС + ТекстСообщения;
ФормаИнформацииОбОшибке.Ответ = КодВозвратаДиалога.Нет;
ФормаИнформацииОбОшибке.ОткрытьМодально();
Если Не ФормаИнформацииОбОшибке.Ответ = КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ПроверитьПодаркиВНаличии();
Если Подарки.Количество()>0 Тогда
мОтбор = Новый Структура;
мОтбор.Вставить("Номенклатура",Справочники.Номенклатура.ПустаяСсылка());
ТаблицаПодарки = Подарки.Выгрузить();
ТаблицаПодарки.Колонки.Добавить("Получен", Новый ОписаниеТипов("Булево"));
МассивНеНужныхСтрок = Новый Массив;
СтрокиПодарков = Подарки.НайтиСтроки(мОтбор);
КонтролироватьОстаткиТоваровПриЗакрытииЧека = мИспользоватьНастройкуРМК И мНастройкаРМК.КонтролироватьОстаткиТоваровПриЗакрытииЧека;
Для каждого СтрокаПодарки Из СтрокиПодарков Цикл
ФормаВыбораПодарка = ПолучитьФорму("ФормаВыбораПодаркаИзСписка", ЭтаФорма);
ФормаВыбораПодарка.КоличествоНаборов = СтрокаПодарки.Количество;
ФормаВыбораПодарка.СкидкаНаценка = СтрокаПодарки.СкидкаНаценка;
Результат = ФормаВыбораПодарка.ОткрытьМодально();
Если ЗначениеЗаполнено(ФормаВыбораПодарка.Номенклатура) Тогда
СтрокаПодарки.Номенклатура = ФормаВыбораПодарка.Номенклатура;
СтрокаПодарки.ХарактеристикаНоменклатуры = ФормаВыбораПодарка.ХарактеристикаНоменклатуры;
СтрокаПодарки.Коэффициент = ФормаВыбораПодарка.Коэффициент;
СтрокаПодарки.Количество = ФормаВыбораПодарка.Количество;
СтрокаПодарки.ЕдиницаИзмерения = ФормаВыбораПодарка.ЕдиницаИзмерения;
СтрокаПодарки.Склад = ОбработкаТабличныхЧастей.ПолучитьСкладПродажиНоменклатуры(СтрокаПодарки.Номенклатура, КассаККМ);
СтрокаПодарки.Цена = Ценообразование.ПолучитьЦенуНоменклатурыВРознице(Дата, КассаККМ.Магазин, СтрокаПодарки.Номенклатура, СтрокаПодарки.ХарактеристикаНоменклатуры, СтрокаПодарки.ЕдиницаИзмерения);
СтрокаПодарки.Сумма = СтрокаПодарки.Цена * СтрокаПодарки.Количество;
СтрокаТаблицыПодарки = ТаблицаПодарки[Подарки.Индекс(СтрокаПодарки)];
СтрокаТаблицыПодарки.Получен = ФормаВыбораПодарка.Получен;
ЗаполнитьЗначенияСвойств(СтрокаТаблицыПодарки, СтрокаПодарки);
ИначеЕсли ФормаВыбораПодарка.ЗакрытаПриОтсутствииДанных Тогда
МассивНеНужныхСтрок.Добавить(СтрокаПодарки);
СтрокаТаблицыПодарки = ТаблицаПодарки[Подарки.Индекс(СтрокаПодарки)];
СтрокаТаблицыПодарки.Получен = Истина;
Иначе
Возврат;
КонецЕсли;
КонецЦикла;
Для каждого СтрокаПодарки Из МассивНеНужныхСтрок Цикл
Подарки.Удалить(СтрокаПодарки);
КонецЦикла;
мОтбор = Новый Структура;
мОтбор.Вставить("Получен",Ложь);
СтрокиТаблицаПодарки = ТаблицаПодарки.НайтиСтроки(мОтбор);
Если СтрокиТаблицаПодарки.Количество()>0 Тогда
ФормаВыдачиПодарков = ПолучитьФорму("ФормаВыдачиПодарков", ЭтаФорма);
ФормаВыдачиПодарков.ВидОперацийЧекККМ = ВидОперации;
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(СтрокиТаблицаПодарки,ФормаВыдачиПодарков.ТаблицаВыбораПодарка);
ФормаВыдачиПодарков.ТаблицаВыбораПодарка.Свернуть("Номенклатура,ХарактеристикаНоменклатуры,ЕдиницаИзмерения, Помечен","Количество");
Результат = ФормаВыдачиПодарков.ОткрытьМодально();
Если Результат <> "Выдали все подарки" Тогда
Возврат;
КонецЕсли;
КонецЕсли;
УправлениеМаркетинговымиАкциями.ПеренестиПодаркиВТовары(ЭтотОбъект, Товары, Скидки, Подарки, КассаККМ.Магазин);
КонецЕсли;
Эквайринг.ПересчитатьТорговуюУступку(ДоговорЭквайринга, Оплата);
ПересчитатьБанковскийКредит();
ЗавершитьЗакрытиеЧека(Печать, РучнойРежим, ВыбратьДокументПечати, ВсеПРН, ВсеФР);
КонецПроцедуры // ЗакрытьЧек()
// Определяет была ли оплата картой
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Булево
//
Функция ЕстьОплатаПлатежнойКартой()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(Оплата.ВидОплаты КАК Справочник.ВидыОплатЧекаККМ) КАК ВидОплаты,
| ВЫРАЗИТЬ(Оплата.Сумма КАК ЧИСЛО) КАК Сумма
|ПОМЕСТИТЬ ТаблицаОплаты
|ИЗ
| &Оплата КАК Оплата
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаОплаты.ВидОплаты,
| ТаблицаОплаты.Сумма
|ИЗ
| ТаблицаОплаты КАК ТаблицаОплаты
|ГДЕ
| ТаблицаОплаты.ВидОплаты.ТипОплаты = ЗНАЧЕНИЕ(Перечисление.ТипыОплатЧекаККМ.ПлатежнаяКарта)
| И ТаблицаОплаты.Сумма > 0";
Запрос.УстановитьПараметр("Оплата", Оплата.Выгрузить());
Результат = Запрос.Выполнить();
Возврат Не Результат.Пустой()
КонецФункции // ЕстьОплатаПлатежнойКартой()
// Процедура закрывает чек в форме
//
Процедура ЗавершитьЗакрытиеЧека(Печать, РучнойРежим = Ложь, ВыбратьДокументПечати = Ложь, ВсеПРН = Ложь, ВсеФР = Ложь) Экспорт
Перем Паника;
Перем Ответ;
СоздатьНовыйЧек = Истина;
ПечатьПакетаДокументовВозврат = (ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат И мИспользоватьНастройкуРМК И мНастройкаРМК.ПриВозвратеРаспечатыватьПакетДокументов);
Если НЕ НачалоДня(ДокументОбъект.Дата) = НачалоДня(ТекущаяДата()) Тогда
ДокументОбъект.Дата = НачалоДня(ТекущаяДата());
КонецЕсли;
Если НЕ НачалоДня(ДокументОбъект.Дата) = НачалоДня(ТекущаяДата()) Тогда
ДокументОбъект.Дата = Дата(Год(ДокументОбъект.Дата), Месяц(ДокументОбъект.Дата), День(ДокументОбъект.Дата),
Час(ТекущаяДата()), Минута(ТекущаяДата()), Секунда(ТекущаяДата()))
КонецЕсли;
ЭлементыФормы.ИнфНадписьТекущаяСумма.Заголовок = "";
Результат = ПровестиИРаспечататьЧек(Ответ, Паника, ЭтаФорма, ПечатьПакетаДокументовВозврат, РучнойРежим, ВсеПРН, ВсеФР);
Если Не Результат Тогда
ВывестиИнформациюОбОшибке("Чек не пробит.
|При формировании чека возникла ошибка.
|" + Ответ);
Иначе
ОпределитьСообщенияКассируПослеОформленияЧека();
ДисконтнаяКартаДляЗамены = ДисконтнаяКарта;
КонецЕсли;
Если СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый Тогда
Если Печать Тогда
Если ВыбратьДокументПечати Тогда
УниверсальныеМеханизмы.ОткрытьФормуВыбораПечатныхФормОбъекта(ЭтотОбъект, ЭтаФорма);
Иначе
Печать("Чек");
КонецЕсли;
КонецЕсли;
СоздатьНовыйДокумент();
Иначе
Если Не ЭтоНовый() Тогда
Если ЕстьОплатаПлатежнойКартой() Тогда
ТекстСообщения = "Чек не пробит. Была оплата платежной картой" + Символы.ПС +
"Чек нужно пробить позднее или аннулировать перед закрытием смены";
Иначе
ТекстСообщения = "Чек не пробит. " + Символы.ПС +
"Чек нужно пробить позднее или аннулировать перед закрытием смены";
КонецЕсли;
ВывестиИнформациюОбОшибке(ТекстСообщения);
СоздатьНовыйДокумент();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
и
Процедура КнопкаВвестиТоварныйЧекВсеНажатие(Элемент)
Перем Заголовок, Результат;
Отказ = ВыполнитьКонтрольЗакрытияЧека(Заголовок, Результат);
Если Отказ Тогда
ВывестиИнформациюОбОшибке(Заголовок + Результат);
Иначе
ПересчитатьАвтоматическиеСкидки();
ПечатьТоварногоЧека =Ложь;
ЗакрытьЧек(ПечатьТоварногоЧека,,,Истина);
КонецЕсли;
Если ЭлементыФормы.ПанельПодборКлавиши.Страницы.Подбор.Видимость Тогда
мПодбор.НоменклатураПриАктивизацииСтроки(ЭтаФорма, ЭлементыФормы.НоменклатураСписок);
КонецЕсли;
УстановитьАктивныйЭлемент();
КонецПроцедуры
Процедура КнопкаВвестиТоварныйЧекНеВсеНажатие(Элемент)
Перем Заголовок, Результат;
Отказ = ВыполнитьКонтрольЗакрытияЧека(Заголовок, Результат);
Если Отказ Тогда
ВывестиИнформациюОбОшибке(Заголовок + Результат);
Иначе
ПересчитатьАвтоматическиеСкидки();
ПечатьТоварногоЧека =Ложь;
ЗакрытьЧек(ПечатьТоварногоЧека,,,,Истина);
КонецЕсли;
Если ЭлементыФормы.ПанельПодборКлавиши.Страницы.Подбор.Видимость Тогда
мПодбор.НоменклатураПриАктивизацииСтроки(ЭтаФорма, ЭлементыФормы.НоменклатураСписок);
КонецЕсли;
УстановитьАктивныйЭлемент();
КонецПроцедуры
При попытке напечатать чек пишет фр не подключен? ну помогите плиз блин!!!!!!!!!!!!!!!!!!!
//Производит закрытие чека на фискальном регистраторе и печать товарного чека.
//
// Параметры:
// Печать - булево, признак необходимости печати товарного чека.
//
Процедура ЗакрытьЧек(Печать = Ложь, РучнойРежим = Ложь, ВыбратьДокументПечати = Ложь, ВсеПРН = Ложь, ВсеФР = Ложь)
Перем Отказ;
Если ТолькоПросмотр Тогда
Закрыть();
КонецЕсли;
Если (СтатусЧекаККМ <> Перечисления.СтатусыЧековККМ.Пробитый
Или СтатусЧекаККМ <> Перечисления.СтатусыЧековККМ.Архивный
Или СтатусЧекаККМ <> Перечисления.СтатусыЧековККМ.Аннулированный)
И Товары.Количество() > 0 Тогда
Оплата.Очистить();
ФормаОплат = ПолучитьФорму("ФормаОплатЧека", ЭтаФорма);
ФормаОплат.СуммаОплаты = ЭлементыФормы.ИнфНадписьТекущееЗначение.Значение;
Результат = ФормаОплат.ОткрытьМодально();
ЭлементыФормы.ИнфНадписьТекущееЗначение.Значение = "";
ЭлементыФормы.Панель3.ЦветФона = ЦветаСтиля.ЦветФонаФормы;
КонецЕсли;
Если Результат <> "Закрыть чек" Тогда
Возврат;
КонецЕсли;
Отказ = Ложь;
//Погашение сертификатами
ТаблицаПогашения = ПодготовитьТаблицуПогашения();
ПроверитьЗаполнениеТабличнойЧастиПогашения(ТаблицаПогашения, ЭтотОбъект, Отказ, "");
УправлениеЗапасами.ПроверитьДвиженияСерийныхНомеровДляПогашения(ЭтотОбъект, РежимПроведенияДокумента.Оперативный, Отказ, "");
Если Отказ Тогда
Возврат;
КонецЕсли;
ИтогоПодарочныеСертификатыПоНоминалу = ПолучитьСуммуНоминаловПодарочныхСертификатов();
ИтогоПоЧеку = Товары.Итог("Сумма");
ПотериПокупателя = ИтогоПодарочныеСертификатыПоНоминалу - ИтогоПоЧеку;
Если ПотериПокупателя > 0 Тогда
ФормаИнформацииОбОшибке = Документы.ЧекККМ.ПолучитьФорму("ФормаИнформацииОбОшибке");
ТекстСообщения = "Потери покупателя от недобора товара составляют - " + Формат(ПотериПокупателя, "ЧЦ=15; ЧДЦ=2; ЧГ=3,0") + " грн." + Символы.ПС +
"Покупатель согласен?";
ФормаИнформацииОбОшибке.ТекстОшибки = "Информация для покупателя:" + Символы.ПС + ТекстСообщения;
ФормаИнформацииОбОшибке.Ответ = КодВозвратаДиалога.Нет;
ФормаИнформацииОбОшибке.ОткрытьМодально();
Если Не ФормаИнформацииОбОшибке.Ответ = КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ПроверитьПодаркиВНаличии();
Если Подарки.Количество()>0 Тогда
мОтбор = Новый Структура;
мОтбор.Вставить("Номенклатура",Справочники.Номенклатура.ПустаяСсылка());
ТаблицаПодарки = Подарки.Выгрузить();
ТаблицаПодарки.Колонки.Добавить("Получен", Новый ОписаниеТипов("Булево"));
МассивНеНужныхСтрок = Новый Массив;
СтрокиПодарков = Подарки.НайтиСтроки(мОтбор);
КонтролироватьОстаткиТоваровПриЗакрытииЧека = мИспользоватьНастройкуРМК И мНастройкаРМК.КонтролироватьОстаткиТоваровПриЗакрытииЧека;
Для каждого СтрокаПодарки Из СтрокиПодарков Цикл
ФормаВыбораПодарка = ПолучитьФорму("ФормаВыбораПодаркаИзСписка", ЭтаФорма);
ФормаВыбораПодарка.КоличествоНаборов = СтрокаПодарки.Количество;
ФормаВыбораПодарка.СкидкаНаценка = СтрокаПодарки.СкидкаНаценка;
Результат = ФормаВыбораПодарка.ОткрытьМодально();
Если ЗначениеЗаполнено(ФормаВыбораПодарка.Номенклатура) Тогда
СтрокаПодарки.Номенклатура = ФормаВыбораПодарка.Номенклатура;
СтрокаПодарки.ХарактеристикаНоменклатуры = ФормаВыбораПодарка.ХарактеристикаНоменклатуры;
СтрокаПодарки.Коэффициент = ФормаВыбораПодарка.Коэффициент;
СтрокаПодарки.Количество = ФормаВыбораПодарка.Количество;
СтрокаПодарки.ЕдиницаИзмерения = ФормаВыбораПодарка.ЕдиницаИзмерения;
СтрокаПодарки.Склад = ОбработкаТабличныхЧастей.ПолучитьСкладПродажиНоменклатуры(СтрокаПодарки.Номенклатура, КассаККМ);
СтрокаПодарки.Цена = Ценообразование.ПолучитьЦенуНоменклатурыВРознице(Дата, КассаККМ.Магазин, СтрокаПодарки.Номенклатура, СтрокаПодарки.ХарактеристикаНоменклатуры, СтрокаПодарки.ЕдиницаИзмерения);
СтрокаПодарки.Сумма = СтрокаПодарки.Цена * СтрокаПодарки.Количество;
СтрокаТаблицыПодарки = ТаблицаПодарки[Подарки.Индекс(СтрокаПодарки)];
СтрокаТаблицыПодарки.Получен = ФормаВыбораПодарка.Получен;
ЗаполнитьЗначенияСвойств(СтрокаТаблицыПодарки, СтрокаПодарки);
ИначеЕсли ФормаВыбораПодарка.ЗакрытаПриОтсутствииДанных Тогда
МассивНеНужныхСтрок.Добавить(СтрокаПодарки);
СтрокаТаблицыПодарки = ТаблицаПодарки[Подарки.Индекс(СтрокаПодарки)];
СтрокаТаблицыПодарки.Получен = Истина;
Иначе
Возврат;
КонецЕсли;
КонецЦикла;
Для каждого СтрокаПодарки Из МассивНеНужныхСтрок Цикл
Подарки.Удалить(СтрокаПодарки);
КонецЦикла;
мОтбор = Новый Структура;
мОтбор.Вставить("Получен",Ложь);
СтрокиТаблицаПодарки = ТаблицаПодарки.НайтиСтроки(мОтбор);
Если СтрокиТаблицаПодарки.Количество()>0 Тогда
ФормаВыдачиПодарков = ПолучитьФорму("ФормаВыдачиПодарков", ЭтаФорма);
ФормаВыдачиПодарков.ВидОперацийЧекККМ = ВидОперации;
ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(СтрокиТаблицаПодарки,ФормаВыдачиПодарков.ТаблицаВыбораПодарка);
ФормаВыдачиПодарков.ТаблицаВыбораПодарка.Свернуть("Номенклатура,ХарактеристикаНоменклатуры,ЕдиницаИзмерения, Помечен","Количество");
Результат = ФормаВыдачиПодарков.ОткрытьМодально();
Если Результат <> "Выдали все подарки" Тогда
Возврат;
КонецЕсли;
КонецЕсли;
УправлениеМаркетинговымиАкциями.ПеренестиПодаркиВТовары(ЭтотОбъект, Товары, Скидки, Подарки, КассаККМ.Магазин);
КонецЕсли;
Эквайринг.ПересчитатьТорговуюУступку(ДоговорЭквайринга, Оплата);
ПересчитатьБанковскийКредит();
ЗавершитьЗакрытиеЧека(Печать, РучнойРежим, ВыбратьДокументПечати, ВсеПРН, ВсеФР);
КонецПроцедуры // ЗакрытьЧек()
// Определяет была ли оплата картой
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Булево
//
Функция ЕстьОплатаПлатежнойКартой()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(Оплата.ВидОплаты КАК Справочник.ВидыОплатЧекаККМ) КАК ВидОплаты,
| ВЫРАЗИТЬ(Оплата.Сумма КАК ЧИСЛО) КАК Сумма
|ПОМЕСТИТЬ ТаблицаОплаты
|ИЗ
| &Оплата КАК Оплата
|;
|
|////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаОплаты.ВидОплаты,
| ТаблицаОплаты.Сумма
|ИЗ
| ТаблицаОплаты КАК ТаблицаОплаты
|ГДЕ
| ТаблицаОплаты.ВидОплаты.ТипОплаты = ЗНАЧЕНИЕ(Перечисление.ТипыОплатЧекаККМ.ПлатежнаяКарта)
| И ТаблицаОплаты.Сумма > 0";
Запрос.УстановитьПараметр("Оплата", Оплата.Выгрузить());
Результат = Запрос.Выполнить();
Возврат Не Результат.Пустой()
КонецФункции // ЕстьОплатаПлатежнойКартой()
// Процедура закрывает чек в форме
//
Процедура ЗавершитьЗакрытиеЧека(Печать, РучнойРежим = Ложь, ВыбратьДокументПечати = Ложь, ВсеПРН = Ложь, ВсеФР = Ложь) Экспорт
Перем Паника;
Перем Ответ;
СоздатьНовыйЧек = Истина;
ПечатьПакетаДокументовВозврат = (ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат И мИспользоватьНастройкуРМК И мНастройкаРМК.ПриВозвратеРаспечатыватьПакетДокументов);
Если НЕ НачалоДня(ДокументОбъект.Дата) = НачалоДня(ТекущаяДата()) Тогда
ДокументОбъект.Дата = НачалоДня(ТекущаяДата());
КонецЕсли;
Если НЕ НачалоДня(ДокументОбъект.Дата) = НачалоДня(ТекущаяДата()) Тогда
ДокументОбъект.Дата = Дата(Год(ДокументОбъект.Дата), Месяц(ДокументОбъект.Дата), День(ДокументОбъект.Дата),
Час(ТекущаяДата()), Минута(ТекущаяДата()), Секунда(ТекущаяДата()))
КонецЕсли;
ЭлементыФормы.ИнфНадписьТекущаяСумма.Заголовок = "";
Результат = ПровестиИРаспечататьЧек(Ответ, Паника, ЭтаФорма, ПечатьПакетаДокументовВозврат, РучнойРежим, ВсеПРН, ВсеФР);
Если Не Результат Тогда
ВывестиИнформациюОбОшибке("Чек не пробит.
|При формировании чека возникла ошибка.
|" + Ответ);
Иначе
ОпределитьСообщенияКассируПослеОформленияЧека();
ДисконтнаяКартаДляЗамены = ДисконтнаяКарта;
КонецЕсли;
Если СтатусЧекаККМ = Перечисления.СтатусыЧековККМ.Пробитый Тогда
Если Печать Тогда
Если ВыбратьДокументПечати Тогда
УниверсальныеМеханизмы.ОткрытьФормуВыбораПечатныхФормОбъекта(ЭтотОбъект, ЭтаФорма);
Иначе
Печать("Чек");
КонецЕсли;
КонецЕсли;
СоздатьНовыйДокумент();
Иначе
Если Не ЭтоНовый() Тогда
Если ЕстьОплатаПлатежнойКартой() Тогда
ТекстСообщения = "Чек не пробит. Была оплата платежной картой" + Символы.ПС +
"Чек нужно пробить позднее или аннулировать перед закрытием смены";
Иначе
ТекстСообщения = "Чек не пробит. " + Символы.ПС +
"Чек нужно пробить позднее или аннулировать перед закрытием смены";
КонецЕсли;
ВывестиИнформациюОбОшибке(ТекстСообщения);
СоздатьНовыйДокумент();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
и
Процедура КнопкаВвестиТоварныйЧекВсеНажатие(Элемент)
Перем Заголовок, Результат;
Отказ = ВыполнитьКонтрольЗакрытияЧека(Заголовок, Результат);
Если Отказ Тогда
ВывестиИнформациюОбОшибке(Заголовок + Результат);
Иначе
ПересчитатьАвтоматическиеСкидки();
ПечатьТоварногоЧека =Ложь;
ЗакрытьЧек(ПечатьТоварногоЧека,,,Истина);
КонецЕсли;
Если ЭлементыФормы.ПанельПодборКлавиши.Страницы.Подбор.Видимость Тогда
мПодбор.НоменклатураПриАктивизацииСтроки(ЭтаФорма, ЭлементыФормы.НоменклатураСписок);
КонецЕсли;
УстановитьАктивныйЭлемент();
КонецПроцедуры
Процедура КнопкаВвестиТоварныйЧекНеВсеНажатие(Элемент)
Перем Заголовок, Результат;
Отказ = ВыполнитьКонтрольЗакрытияЧека(Заголовок, Результат);
Если Отказ Тогда
ВывестиИнформациюОбОшибке(Заголовок + Результат);
Иначе
ПересчитатьАвтоматическиеСкидки();
ПечатьТоварногоЧека =Ложь;
ЗакрытьЧек(ПечатьТоварногоЧека,,,,Истина);
КонецЕсли;
Если ЭлементыФормы.ПанельПодборКлавиши.Страницы.Подбор.Видимость Тогда
мПодбор.НоменклатураПриАктивизацииСтроки(ЭтаФорма, ЭлементыФормы.НоменклатураСписок);
КонецЕсли;
УстановитьАктивныйЭлемент();
КонецПроцедуры
При попытке напечатать чек пишет фр не подключен? ну помогите плиз блин!!!!!!!!!!!!!!!!!!!
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот