Две кассы на одном компьютере. Розница 2.3

Возникла задача поставить на один компьютер два РМК. Чтобы продавец мог переключаться при необходимости между ними.

Подобное решение в типовом функционале не поддерживается. Есть недорогое решение на infostart.

Но мне оно показалось чрезмерно усложненным, а я люблю простые решения. Зачем исправлять во всей конфигурации возможность привязки нескольких касс к одному рабочему месту, если можно просто поменять рабочие места?

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

Я просто создаю два рабочих места, к каждому из которых привязываю оборудование и кассы.

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

Соответственно, при старте формы РМК у пользователя дополнительно запрашивается выбор рабочего места. Это место прописывается в рабочее место текущего сеанса.

И после этого пользователь работает уже в выбранном рабочем месте.

Настройка нескольких тестовых РМК

Я веду разработку на компьютере без РМК в копии базы, поэтому буду использовать принтер чеков в качестве РМК.

Параметр сеанса называется РабочееМестоКлиента, процедура по его установке МенеджерОборудованияВызовСервера.УстановитьРабочееМестоКлиента:

Буду использовать расширение, которое назову «Несколько РМК» с префиксом нрмк.

Создание двух рабочих мест на одном компьютере

В справочник рабочих мест добавляют поле «Номер», где храню номер РМК для рабочего места — 1 или 2. Если номер 0, значит несколько РМК не используется.

Пришлось в справочнике РМК отключить некоторые проверки, чтобы можно было создавать два РМК на одно имя компьютера.

В форме списка (+ вывожу поля, которых нет в штатном списке — код, имя компьютера, номер РМК):

&НаКлиенте
&Вместо("СписокПередНачаломДобавления")
Процедура нрмк_СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Возврат; //Не контролируем добавление
	ПродолжитьВызов(Элемент, Отказ, Копирование, Родитель, Группа, Параметр);
КонецПроцедуры


&НаСервере
Процедура нрмк_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
   Элемент = Элементы.Добавить("нрмк_Код", Тип("ПолеФормы"), Элементы.Список);
   Элемент.Вид = ВидПоляФормы.ПолеВвода;
   Элемент.ПутьКДанным = "Список.Код";

   Элемент = Элементы.Добавить("нрмк_ИмяКомпьютера", Тип("ПолеФормы"), Элементы.Список);
   Элемент.Вид = ВидПоляФормы.ПолеВвода;
   Элемент.ПутьКДанным = "Список.ИмяКомпьютера";
   
   Элемент = Элементы.Добавить("нрмк_Номер", Тип("ПолеФормы"), Элементы.Список);
   Элемент.Вид = ВидПоляФормы.ПолеВвода;
   Элемент.ПутьКДанным = "Список.Ссылка.нрмк_Номер"; //Через ссылку, там в запросе нет этого поля
   
КонецПроцедуры

В форме элемента (+ вывожу дополнительное поле):


&НаСервере
Процедура нрмк_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	
	НовыйЭлемент = ЭтаФорма.Элементы.Добавить("нрмк_Номер", Тип("ПолеФормы"));
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.ПутьКДанным = "Объект.нрмк_Номер";

КонецПроцедуры

&НаСервереБезКонтекста
&Вместо("ПроверкаУникальностиПоИдентификаторуКлиента")
Функция нрмк_ПроверкаУникальностиПоИдентификаторуКлиента(Ссылка, ИдентификаторКлиента)
	Возврат Истина; //Отключаем проверку уникальности
	Результат = ПродолжитьВызов(Ссылка, ИдентификаторКлиента);
	Возврат Результат;
КонецФункции

Выбор рабочего места при запуске РМК

В окне запуска РМК (ФормаМеню) я добавляю две кнопки для выбора первого или второго РМК. Кнопки показываются только, если текущее РМК имеет номер РМК не ноль, чтобы можно было переключиться между ним и другим РМК.

При щелчке по кнопке зеленым выделяется текущий РМК, другой выделяется серым.

Выбрано РМК 1:

Выбрано РМК 2:

При этом обновляется и заголовок формы старта РМК — в нем выводится название РМК.

1С поддерживает указание другого РМК из параметра сеанса, так что код работает. Причем выбор рабочего места запоминается на время сеанса, т.е. при повторном входе не нужно выбирать РМК заново.

Расширение для формы ФормаМеню обработки РМКУправляемыйРежим:


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

	ШрифтКнопок = Новый Шрифт(Элементы.ДекорацияРегистрацияПродаж.Шрифт,,14, истина); 
	
	ИмяКоманды = "нрмк_РМК1";
	КомандаФормы = ЭтаФорма.Команды.Добавить(ИмяКоманды);
	КомандаФормы.Действие = ИмяКоманды;
	КомандаФормы.Заголовок = "РМК 1";
	КомандаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст;
	
	НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ЭлементГруппа);
	НовыйЭлемент.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
	НовыйЭлемент.ИмяКоманды = ИмяКоманды;
	НовыйЭлемент.Шрифт = ШрифтКнопок;
	НовыйЭлемент.Ширина = 11;
	
	ИмяКоманды = "нрмк_РМК2";
	КомандаФормы = ЭтаФорма.Команды.Добавить(ИмяКоманды);
	КомандаФормы.Действие = ИмяКоманды;
	КомандаФормы.Заголовок = "РМК 2";
	КомандаФормы.Отображение = ОтображениеКнопки.КартинкаИТекст;
	
	НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ЭлементГруппа);
	НовыйЭлемент.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
	НовыйЭлемент.ИмяКоманды = ИмяКоманды;
	НовыйЭлемент.Шрифт = ШрифтКнопок;
	НовыйЭлемент.Ширина = 11;
	
	УстановитьПривилегированныйРежим(истина);
	Попытка
		ТекущееРМК = ПараметрыСеанса.РабочееМестоКлиента.нрмк_Номер; //ПараметрыСеанса.нрмк_ТекущееРМК;
	Исключение
		ТекущееРМК = 1;
	КонецПопытки;
	
	Если ТекущееРМК = 2 Тогда
		нрмк_УстановитьРМК(2); 
	Иначе
		//По умолчанию
		нрмк_УстановитьРМК(1); 
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура нрмк_РМК1(Команда) Экспорт
	//ПоказатьПредупреждение("РМК 1");
	нрмк_УстановитьРМК(1);
	ПолучитьРабочееМесто(); //Обновляем заголовок о рабочем месте
КонецПроцедуры

&НаКлиенте
Процедура нрмк_РМК2(Команда) Экспорт
	//ПоказатьПредупреждение("РМК 2");
	нрмк_УстановитьРМК(2);
	ПолучитьРабочееМесто(); //Обновляем заголовок о рабочем месте
КонецПроцедуры

&НаСервере
Процедура нрмк_УстановитьРМК(ТекущееРМК) Экспорт
	Если ТекущееРМК = 1 Тогда
		Элементы.нрмк_РМК1.Пометка = Истина;
		Элементы.нрмк_РМК2.Пометка = ложь;
		Элементы.нрмк_РМК1.ЦветТекста = WebЦвета.Зеленый;
		Элементы.нрмк_РМК2.ЦветТекста = WebЦвета.Серый;
	Иначе
		Элементы.нрмк_РМК1.Пометка = ложь;
		Элементы.нрмк_РМК2.Пометка = истина;
		Элементы.нрмк_РМК1.ЦветТекста = WebЦвета.Серый;
		Элементы.нрмк_РМК2.ЦветТекста = WebЦвета.Зеленый;
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(истина);
	
	ИдентификаторКлиента = МенеджерОборудованияКлиентСервер.ИдентификаторКлиентаДляРабочегоМеста();
	ТекРабочееМесто = ПолучитьРабочееМестоПоИдентификаторуКлиентаИНомеруРМК(ИдентификаторКлиента, ТекущееРМК);
	
	Если ЗначениеЗаполнено(ТекРабочееМесто) Тогда
		МенеджерОборудованияВызовСервера.УстановитьРабочееМестоКлиента(ТекРабочееМесто);
	Иначе
		Сообщить("Не найдено рабочее место №: " + ТекущееРМК);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ЕстьДваРМК()
	Возврат ПараметрыСеанса.РабочееМестоКлиента.нрмк_Номер <> 0;
КонецФункции 

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

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

fixin

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

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

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

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