1С и 20 онлайн-касс: блокировки

1. MyNameNoName 05.04.18 14:47 Сейчас в теме
Добрый день! 1С 8.2.
1С расположена на терминальном сервере. Все работают через подключения к удаленному рабочему столу. Фактически получается ситуация что кассовые чеки могут создаваться каждые 30 секунд. В случае, если один из кассиров проводит ПКО и в это время начинает другой кассир проводить ПКО - 1-ый кассовый чек пробивается на ККМ, но возникает блокировка и в ПКО не проводится, в нем не устанавливается признак что чек пробит.
У кого были подобные ошибки как Вы их решали? Онлайн кассы АТОЛ 22/25Ф. В результате его вообще возникают эти ошибки?
Спасибо.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
10. Noob001 06.04.18 10:52 Сейчас в теме
(9)
Можно, и после записи. (единственно не скажу, надо проверить, послезаписи() выполняется уже со снятыми блокировками?, а то вдруг ещё нет.)

Можно опять же программно, сначала
1. провести ПКО
2. пробить чек.
3. не знаю записываются у вас реквизиты чека в ПКО если, то установить их
4. Записать ПКО без проведения.
5. закрыть форму программно
6. профит )

Если 2 неудачно, 3 отменить проведение например.
MyNameNoName; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user673778_karavaykov 1 05.04.18 15:25 Сейчас в теме
как вариант, таймаут в драйвере и в настройках 1с увеличить
MyNameNoName; +1 Ответить
3. Noob001 05.04.18 16:09 Сейчас в теме
ККТ не может проводить две операции одновременно.
1С ничего не написала для проверки блокировки ККТ, в момент печати чека.
Правильно необходимо править код, что бы перед печатью чека, 1С проверяла доступность (незаблокированность) оборудования , в драйверах, такая команда есть, и если ККТ сейчас занята, обрабатывать данную ситуацию.
MyNameNoName; +1 Ответить
4. JohnGalt 58 05.04.18 16:11 Сейчас в теме
Еще вариант: добавить регистр для очереди проведения ПКО и проверять по нему, если есть в очереди, ожидать пока очередь не освободится.
MyNameNoName; Noob001; +2 Ответить
5. MyNameNoName 05.04.18 16:52 Сейчас в теме
Насколько я разобрался проблема оказалась в другом:
весь код для проведения чека ККМ запуска из модуля объекта обработки проведения документа (у нас дописанная конфа), так как при проведении документа автоматически заполняется признак пробития, номер чека и смены. В результате этого блокируется таблицы SQL (так как так документ проводился 2 секунды, а теперь 15). Если перенести этот механизм в подписку на событие (обработку проведения) то это поможет или нет? Или что лучше сделать? Отдельную кнопку для пробития чека не хотелось бы выносить.
6. asved.ru 36 05.04.18 17:27 Сейчас в теме
(5) Не поможет.
Нужно искать причины затягивания транзакций и избыточные блокировки.
Если база файловая - покупайте сервер. В файловой базе минимальная гранулярность блокировки - на таблицу.
MyNameNoName; +1 Ответить
7. MyNameNoName 05.04.18 23:22 Сейчас в теме
(6) База клиент-серверная. Большое количество документов может проводиться практически единовременно, в этом проблема. А онлайн-касса только затягивает этот процесс.
А если перенести в после записи, при этом необходимые реквизиты документа заполнил, а документы уже не проводить - а записывать? Или это все равно считается одной транзакцией?
8. Noob001 06.04.18 00:01 Сейчас в теме +0.5 $m
(7) Я так понял у вас пробитие чека идет в обработке проведения. Естественно это не есть хорошо.

Команду "Провести и закрыть" заменяете командой "пробитие чека"

1. Если надо в обработчике предварительно записываете документ
2. пробиваете чек
3. при удачном пробитии проводите и закрываете форму.

ПараметрыЗаписи = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение);
	
		Записать(ПараметрыЗаписи);
		
		Если ДополнительныеПараметры.ПечататьТоварныйЧек Тогда
			ОбъектыПечати = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Объект.Ссылка);
			
			УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер("Документ.РозничнаяПродажа", "ТоварныйЧек", ОбъектыПечати, ОбщегоНазначенияБПКлиент.ПолучитьЗаголовокПечатнойФормы(ОбъектыПечати));
		КонецЕсли;
		
		ТекстСообщения = НСтр("ru = 'Операция выполнена успешно.'");
		ПоказатьОповещениеПользователя(ТекстСообщения);
		
		Закрыть();
Показать


Вот так выглядит код при удачном пробитии чека в Стандартной БП в документе "Розничная продажа".
Посмотрите как там сделано, это самый простой пример.

Теперь пробитие и проведение у вас разделены и "длинных" блокировок не будет.
MyNameNoName; +1 Ответить
9. MyNameNoName 06.04.18 08:11 Сейчас в теме
(8) Благодарю!
Единственное, у меня не управляемые формы. И выполнять пробитие чека лучше после его проведения, вдруг какая из проверок даст ложь и документ нельзя было проводить?
Поэтому я и думаю может на после записи переделать всю процедуру?
10. Noob001 06.04.18 10:52 Сейчас в теме
(9)
Можно, и после записи. (единственно не скажу, надо проверить, послезаписи() выполняется уже со снятыми блокировками?, а то вдруг ещё нет.)

Можно опять же программно, сначала
1. провести ПКО
2. пробить чек.
3. не знаю записываются у вас реквизиты чека в ПКО если, то установить их
4. Записать ПКО без проведения.
5. закрыть форму программно
6. профит )

Если 2 неудачно, 3 отменить проведение например.
MyNameNoName; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот