Многопользовательская печать чеков в 1С: КА 1.1, УТ 10.3

Обновлено: Сентябрь 04, 2019
< Назад

Проблема:

Типовая конфигурация заводит на каждое рабочее место список оборудования привязанное к этому рабочему месту.

Описание проблемы на примере:

Есть два пользователя 1С, которые хотят работать с одной кассой.

В процессе работы с кассой в 1С открывается документ «Кассовая смена», привязанная к рабочему месту пользователя по идентификатору рабочего места

Далее, второй пользовать пытается печатать. 
1С ищет кассовую смену, привязанную к идентификатору рабочему места этого пользователя и не находит у данного пользователя открытой смены. Затем 1С пытается открыть смену, но так как смены уже открыта аппаратно на кассе первым пользователем, возвращается ошибка «невозможно открыть смену, смена уже открыта». Без открытой смены дальнейшая работа второго пользователя невозможна. Такое поведение определено логикой типовой конфигурации.

Требование к работе:Чтобы оба ПК работали с одной ККМ в одной кассовой смене, и не мешали друг другу

Решение:​
Для конфигурации «1С:Комплексная автоматизация 1.1».

Для обеспечения многопользовательской печати с использованием ПО Сервер ККМ
необходимо заменить процедуру ОписаниеПоследнейКассовойСмены в модуле: ОбщийМодуль.КассовыеСменыВызовСервера

Новый текст функции ОписаниеПоследнейКассовойСмены :

 Функция ОписаниеПоследнейКассовойСмены(ФискальноеУстройство) Экспорт
  //РБ-Софт. 03/05/18 15:00
  // Комментируем типовой код
 //Запрос = Новый Запрос();
  //Запрос.Текст =
  //"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
  // КассоваяСмена.Ссылка КАК КассоваяСмена,
  // КассоваяСмена.ФискальноеУстройство,
  // КассоваяСмена.НачалоКассовойСмены,
  // КассоваяСмена.ОкончаниеКассовойСмены,
  // ДОБАВИТЬКДАТЕ(КассоваяСмена.НачалоКассовойСмены, ДЕНЬ, 1) КАК ДатаИстеченияСрокаДействия,
  // КассоваяСмена.Организация,
  // КассоваяСмена.Статус,
  // КассоваяСмена.ДатаСменыККТ,
  // КассоваяСмена.НомерСменыККТ,
  // КассоваяСмена.КассаККМ
  //|ИЗ
  // Документ.КассоваяСмена КАК КассоваяСмена
  //|ГДЕ
  // КассоваяСмена.ФискальноеУстройство = &ФискальноеУстройство
  // И КассоваяСмена.Проведен
  //|
  //|УПОРЯДОЧИТЬ ПО
  // КассоваяСмена.НачалоКассовойСмены УБЫВ";
  //Запрос.УстановитьПараметр("ФискальноеУстройство", ФискальноеУстройство);
  //Результат = Запрос.Выполнить().Выгрузить();
  //
  //Если Результат.Количество() = 0 Тогда
  // Возврат Неопределено;
  //Иначе
  // СтруктураРезультат = Новый Структура();
  // Для Каждого КолонкаРезультата Из Результат.Колонки Цикл
  //  СтруктураРезультат.Вставить(КолонкаРезультата.Имя, Результат[0][КолонкаРезультата.Имя]);
  // КонецЦикла;
  // Возврат СтруктураРезультат;
  //КонецЕсли;
 //РБ-Софт. Конец типового кода
 //РБ-Софт. Начало. Баинов.
  //
  //1. Сначала определяем кассу ККМ по фискальному устройству.
  //2. Затем по кассе ККМ - определим кассовую смену.
  //Таким образом, если мы в настройках торгового оборудования к одной КассеККМ (справочник.КассыККМ)
  //привяжем несколько рабочих мест, то они смогут печатать чеки, используя одну и ту же кассовую смену

 //Шаг 1. Определение кассы ККМ по фискальному устройству.

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

 //Шаг 2. Определяем кассовую смену по кассе ККМ

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

Автор публикации

не в сети 2 дня

Евгений Баинов

Аватар 0
Комментарии: 0Публикации: 229Регистрация: 26-04-2019

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

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

20 + четыре =

Авторизация
*
*

14 − семь =

Регистрация
*
*
*

1 × три =

Генерация пароля

три × 2 =