Исправление кассовой смены
1С в связке с кассой не поддерживают, к сожалению, целостность транзакции. Это касается и пробития чека и закрытия смены.
Иногда при закрытии смены чеки в 1С свернуты, Z-отчет пробит, но на финальной стадии происходит сбой и смена не помечается, как закрытая.
Выглядит этот так.
При попытке регистрации продаж ошибка:
При попытке закрытия смены ошибка:
При попытке открытия смены ошибка:
Раньше я специальными инструментами делал документ кассовой смены закрытым, но потом мне это надоело, потому что проблема регулярно возникала, и я написал обработку для администратора магазина.
Обработка открывает или закрывает последнюю кассовую смену, определяя текущее рабочее место, кассу ККМ к нему и последнюю кассовую смену.
Код обработки несложный:
#Область СобытияФормы &НаКлиенте Процедура РабочееМестоПриИзменении(Элемент) КассаККМ = ПолучитьККМ(РабочееМесто); КассаККМПриИзменении(Неопределено); КонецПроцедуры &НаКлиенте Процедура КассаККМПриИзменении(Элемент) КассоваяСмена = НайтиПоследнийДокументКассовойСмены(КассаККМ); КассоваяСменаПриИзменении(Неопределено); КонецПроцедуры &НаКлиенте Процедура КассоваяСменаПриИзменении(Элемент) ОбновитьСостояниеКассовойСмены(); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) РабочееМесто = МенеджерОборудованияКлиентПовтИсп.РабочееМестоКлиента(); РабочееМестоПриИзменении(Неопределено); ПравоЕстьНаИзменениеКассы = ПравоЕстьНаИзменениеКассы(); Элементы.КассаККМ.ТолькоПросмотр = НЕ ПравоЕстьНаИзменениеКассы; Элементы.КассоваяСмена.ТолькоПросмотр = НЕ ПравоЕстьНаИзменениеКассы; Элементы.РабочееМесто.ТолькоПросмотр = НЕ ПравоЕстьНаИзменениеКассы; КонецПроцедуры &НаКлиенте Процедура СделатьСменуОткрытой(Команда) СделатьСменуОткрытойНаСервере(); ОбновитьСостояниеКассовойСмены(); КонецПроцедуры &НаКлиенте Процедура СделатьСменуЗакрытой(Команда) СделатьСменуЗакрытойНаСервере(); ОбновитьСостояниеКассовойСмены(); КонецПроцедуры #КонецОбласти &НаКлиенте Процедура ОбновитьСостояниеКассовойСмены() Если ЗначениеЗаполнено(КассоваяСмена) Тогда СтатусКассовойСмены = ПолучитьСостояниеКассовойСмены(КассоваяСмена); Если СтатусКассовойСмены = ПредопределенноеЗначение("Перечисление.СтатусыКассовойСмены.Открыта") Тогда СостояниеКассыККМ = "Открыта"; Элементы.ФормаСделатьСменуОткрытой.Видимость = ложь; Элементы.ФормаСделатьСменуЗакрытой.Видимость = истина; Иначе СостояниеКассыККМ = "Закрыта"; Элементы.ФормаСделатьСменуЗакрытой.Видимость = ложь; Элементы.ФормаСделатьСменуОткрытой.Видимость = истина; КонецЕсли; Иначе СостояниеКассыККМ = ""; КонецЕсли; КонецПроцедуры &НаСервере Функция ПравоЕстьНаИзменениеКассы() Возврат РольДоступна("ПолныеПрава"); КонецФункции &НаСервере Функция ПолучитьСостояниеКассовойСмены(КассоваяСмена) Возврат КассоваяСмена.Статус; КонецФункции &НаСервере Функция ПолучитьККМ(РабочееМесто) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | КассыККМ.Ссылка КАК КассаККМ, | КассыККМ.Магазин КАК Магазин, | КассыККМ.Владелец КАК Организация, | ВЫБОР | КОГДА КассыККМ.ПодключаемоеОборудование.ТипОборудования = &ККТОнлайн | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК НеобходимостьПроверятьФизЛицо |ИЗ | Справочник.КассыККМ КАК КассыККМ |ГДЕ | НЕ КассыККМ.ПометкаУдаления | И НЕ КассыККМ.Магазин = ЗНАЧЕНИЕ(Справочник.Магазины.ПустаяСсылка) | И НЕ КассыККМ.ТипКассы = ЗНАЧЕНИЕ(Перечисление.ТипыКассККМ.ККМOffline) | И КассыККМ.РабочееМесто = &РабочееМестоККМ | И КассыККМ.Магазин = &Магазин | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | КассыККМ.Ссылка, | КассыККМ.Магазин, | КассыККМ.Владелец, | ВЫБОР | КОГДА КассыККМ.ПодключаемоеОборудование.ТипОборудования = &ККТОнлайн | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ |ИЗ | Справочник.КассыККМ КАК КассыККМ |ГДЕ | НЕ КассыККМ.ПометкаУдаления | И НЕ КассыККМ.ТипКассы = ЗНАЧЕНИЕ(Перечисление.ТипыКассККМ.ККМOffline) | И КассыККМ.ТипКассы = ЗНАЧЕНИЕ(Перечисление.ТипыКассККМ.СетевоеОборудование)"; Запрос.УстановитьПараметр("Магазин" , ПараметрыСеанса.ТекущийМагазин); Запрос.УстановитьПараметр("РабочееМестоККМ", РабочееМесто); Запрос.УстановитьПараметр("ККТОнлайн" , Перечисления.ТипыПодключаемогоОборудования.ККТ); Результат = Запрос.Выполнить(); ТаблицаРезультатаЗапроса = Результат.Выгрузить(); Если ТаблицаРезультатаЗапроса.Количество() > 0 Тогда Возврат ТаблицаРезультатаЗапроса[0].КассаККМ; Иначе Возврат Неопределено; КонецЕсли; КонецФункции Функция НайтиПоследнийДокументКассовойСмены(КассаККМ) Экспорт УстановитьПривилегированныйРежим(Истина); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Т.Ссылка КАК КассоваяСмена |ИЗ | Документ.КассоваяСмена КАК Т |ГДЕ | Т.Проведен | И Т.КассаККМ = &КассаККМ | |УПОРЯДОЧИТЬ ПО | Т.Дата УБЫВ"; Запрос.УстановитьПараметр("КассаККМ", КассаККМ); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.КассоваяСмена; Иначе Возврат Неопределено; КонецЕсли; КонецФункции &НаСервере Процедура СделатьСменуОткрытойНаСервере() ДО = КассоваяСмена.ПолучитьОбъект(); ДО.Статус = Перечисления.СтатусыКассовойСмены.Открыта; ДО.ОбменДанными.Загрузка = истина; ДО.Записать(); КонецПроцедуры &НаСервере Процедура СделатьСменуЗакрытойНаСервере() ДО = КассоваяСмена.ПолучитьОбъект(); ДО.Статус = Перечисления.СтатусыКассовойСмены.Закрыта; ДО.ОбменДанными.Загрузка = истина; ДО.Записать(); КонецПроцедуры
Среда: Розница 2.3.11.33. Объем: 1 час.
Свежие комментарии