Исправление кассовой смены

1С в связке с кассой не поддерживают, к сожалению, целостность транзакции. Это касается и пробития чека и закрытия смены.

Иногда при закрытии смены чеки в 1С свернуты, Z-отчет пробит, но на финальной стадии происходит сбой и смена не помечается, как закрытая.

Выглядит этот так.

При попытке регистрации продаж ошибка:

При попытке закрытия смены ошибка:

При попытке открытия смены ошибка:

Раньше я специальными инструментами делал документ кассовой смены закрытым, но потом мне это надоело, потому что проблема регулярно возникала, и я написал обработку для администратора магазина.

Обработка открывает или закрывает последнюю кассовую смену, определяя текущее рабочее место, кассу ККМ к нему и последнюю кассовую смену.

Состояние до
Состояние после.

Код обработки несложный:




#Область СобытияФормы

&НаКлиенте
Процедура РабочееМестоПриИзменении(Элемент)
	КассаККМ = ПолучитьККМ(РабочееМесто);
	КассаККМПриИзменении(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура КассаККМПриИзменении(Элемент)
	КассоваяСмена = НайтиПоследнийДокументКассовойСмены(КассаККМ);
	КассоваяСменаПриИзменении(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура КассоваяСменаПриИзменении(Элемент)
	ОбновитьСостояниеКассовойСмены();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	РабочееМесто = МенеджерОборудованияКлиентПовтИсп.РабочееМестоКлиента();
	РабочееМестоПриИзменении(Неопределено);

	ПравоЕстьНаИзменениеКассы = ПравоЕстьНаИзменениеКассы();
	Элементы.КассаККМ.ТолькоПросмотр = НЕ ПравоЕстьНаИзменениеКассы;
	Элементы.КассоваяСмена.ТолькоПросмотр = НЕ ПравоЕстьНаИзменениеКассы;
	Элементы.РабочееМесто.ТолькоПросмотр = НЕ ПравоЕстьНаИзменениеКассы;
	
КонецПроцедуры

&НаКлиенте
Процедура СделатьСменуОткрытой(Команда)
	СделатьСменуОткрытойНаСервере();
	ОбновитьСостояниеКассовойСмены();
КонецПроцедуры

&НаКлиенте
Процедура СделатьСменуЗакрытой(Команда)
	СделатьСменуЗакрытойНаСервере();
	ОбновитьСостояниеКассовойСмены();
КонецПроцедуры


#КонецОбласти

&НаКлиенте
Процедура ОбновитьСостояниеКассовойСмены()
	
	Если ЗначениеЗаполнено(КассоваяСмена) Тогда
		
		СтатусКассовойСмены = ПолучитьСостояниеКассовойСмены(КассоваяСмена);
		
		Если СтатусКассовойСмены = ПредопределенноеЗначение("Перечисление.СтатусыКассовойСмены.Открыта") Тогда
			СостояниеКассыККМ = "Открыта";
			Элементы.ФормаСделатьСменуОткрытой.Видимость = ложь;
			Элементы.ФормаСделатьСменуЗакрытой.Видимость = истина;
		Иначе
			СостояниеКассыККМ = "Закрыта";
			Элементы.ФормаСделатьСменуЗакрытой.Видимость = ложь;
			Элементы.ФормаСделатьСменуОткрытой.Видимость = истина;
		КонецЕсли;
		
	Иначе
		
		СостояниеКассыККМ = "";
		
	КонецЕсли;
КонецПроцедуры


&НаСервере
Функция ПравоЕстьНаИзменениеКассы()
	Возврат РольДоступна("ПолныеПрава");
КонецФункции

&НаСервере
Функция ПолучитьСостояниеКассовойСмены(КассоваяСмена)
	Возврат КассоваяСмена.Статус;
КонецФункции

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

КонецФункции


Функция НайтиПоследнийДокументКассовойСмены(КассаККМ) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	Запрос.Текст =   
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Т.Ссылка КАК КассоваяСмена
	|ИЗ
	|	Документ.КассоваяСмена КАК Т
	|ГДЕ
	|	Т.Проведен
	|	И Т.КассаККМ = &КассаККМ
	|
	|УПОРЯДОЧИТЬ ПО
	|	Т.Дата УБЫВ";
	
	Запрос.УстановитьПараметр("КассаККМ", КассаККМ);
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	
	Если Выборка.Следующий() Тогда
		Возврат Выборка.КассоваяСмена;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции


&НаСервере
Процедура СделатьСменуОткрытойНаСервере()
	ДО = КассоваяСмена.ПолучитьОбъект();
	ДО.Статус = Перечисления.СтатусыКассовойСмены.Открыта;
	ДО.ОбменДанными.Загрузка = истина;
	ДО.Записать();
КонецПроцедуры

&НаСервере
Процедура СделатьСменуЗакрытойНаСервере()
	ДО = КассоваяСмена.ПолучитьОбъект();
	ДО.Статус = Перечисления.СтатусыКассовойСмены.Закрыта;
	ДО.ОбменДанными.Загрузка = истина;
	ДО.Записать();
КонецПроцедуры

Среда: Розница 2.3.11.33. Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *