|
Реализация работы двух кассиров на одном ФР | ☑ | ||
---|---|---|---|---|
0
PQT
21.11.17
✎
10:47
|
Сейчас работает один кассир на двух ФР (т.к. магазин разделен на два ИП), подключенных к одной базе на самописной конфе. Теперь требуется посадить рядом второго кассира без покупки еще двух ФР.
Второй кассир будет работать на том же компьютере через удаленный рабочий стол (RDP). Из многочисленных вариантов реализации, которые пришли в голову, кажутся привлекательными два следующих: Компьютер с подключенным ФР будем называть "Тычинка" Компьютер с удаленным RDP, и не подключенной кассой будем называть "Пестик" 1. При проведении "Пестиком" документа Чек, он регистрирует его в регистре сведений "Очередь печати" (и тут первый вопрос - где лучше подобное хранить? в регистре сведений?). "Тычинка" каждые 3 секунды проверяет "Очередь печати", и печатает на ФР все что там появляется. 2. При проведении "Пестиком" документа Чек, константа (булево) "Проверить чеки", устанавливается в "Истина". "Тычинка" каждые 3 секунды проверяет эту константу, и когда "Истина", проверяет чеки за этот день и печатает те, которые не пробиты (или помечены Пестиком). 3. Самый простой, но не буду его использовать, т.к. думаю на базу б'ольшая нагрузка. - Просто "Тычинка" проверяет каждые 3 секунды журнал чеков, и пробивает все, что не было пробито. Надежность между вариантами вроде бы одинаковая, вопрос в том, какой из вариантов менее нагружает базу? Реализация у обоих вариантов не сложная, но может я что-то не предусмотрел. И может у кого есть более рациональные решения? |
|||
1
bodri
21.11.17
✎
10:58
|
На мой взгляд, третий более оптимальней.
Вопрос: Чеки покупателям не отдаете? |
|||
2
Лодырь
21.11.17
✎
10:59
|
||||
3
Лодырь
21.11.17
✎
11:00
|
||||
4
Галахад
гуру
21.11.17
✎
11:15
|
Гм. А какая разница, проверять очередь или константу?
|
|||
5
PQT
21.11.17
✎
11:17
|
(1) ФР будут стоять между кассами, доступ к ним будет у обоих кассиров.
|
|||
6
lodger
21.11.17
✎
11:22
|
дело в файловой базе или клиент-сервер?
|
|||
7
Звездец
21.11.17
✎
11:23
|
вариант 4. Использовать кассовый сервер
|
|||
8
PQT
21.11.17
✎
11:24
|
(6) да, файловая база, и все это на не очень шустром компьютере, но реализовать это нужно срочно, т.к. грядет декабрь
|
|||
9
lodger
21.11.17
✎
11:26
|
(8) в (7) хорошая мысля для такого колхоза. вынести ккм из 1с-ки. сделать независимый от 1с сервис и печатать в него.
рабочие места становятся независимыми и могут вообще жить своими жизнями. |
|||
10
nordbox
21.11.17
✎
11:33
|
(8) Когда то давным давно, когда еще драйвера 8.х только появились, мы как то пробовали всяко разные варианты...
и пришли к выводу что: Любое кроилово приводит в попадалово. Дешевле, проще,быстрее и не имея проблем купить второй ФР. Зачем эти извращения? посчитай, сколько будет стоить кассовый сервер, головняк с настройкой, постоянно надо что бы прогер под рукой был и т.д. |
|||
11
PQT
21.11.17
✎
11:33
|
(9) (7) подразумеваете отдельную 1С базу с данными для печати чеков и вывод этих чеков в ФР? не совсем понял как это работает, постоянный обмен данными?
|
|||
12
PQT
21.11.17
✎
11:38
|
(10) еще + 2 ФР (для двух ИП), и потом обслуживание 4х ФР потребуется., а нужны они нам только по декабрям, т.к. это магазин игрушек) поэтому предпочту кроилово с попыткой избежать попадалово))
|
|||
13
Звездец
21.11.17
✎
11:43
|
(11) http://rnditsoft.ru/
|
|||
14
PQT
21.11.17
✎
11:52
|
(13) Хорошее решение, спасибо что познакомили)
|
|||
15
piter3
21.11.17
✎
11:53
|
(14) На самом деле если поискать то их достаточно много
|
|||
16
perester
21.11.17
✎
12:01
|
лучше прикупить сервер ккм на известном сайте или сервер фр у поставщиков драйверов на кассы
|
|||
17
opus70
21.11.17
✎
12:23
|
купите два кассовых с LAN интерфейсом типа атол 55 или аналогичный штрих и все ваши проблемы
|
|||
18
LienXo
21.11.17
✎
16:54
|
Если Фры не онлайн - пробросить порты по РДП, онлайн - зацепить через ТСР сокет. Только не забывать отключать после пробития чека.
|
|||
19
PQT
22.11.17
✎
07:35
|
(17) о! точно, я и забыл про лан интерфейсы, они у нас как раз имеются в ФР (Атол 22-ПТК), но еще не пробовал)
|
|||
20
PQT
22.11.17
✎
07:38
|
но сегодня пришла другая идея, поочередно подключаться к ФР при пробитии чека, и отключаться. Ну а если подключение будет одновременным, то делать пару секундную задержку. Задам глупый вопрос, но он меня тревожит:
Не влияет ли подключение/отключение при каждом пробитии чека на износ ФР? |
|||
21
lodger
22.11.17
✎
08:10
|
(20) идея имеет право жить.
сделать циклическое повторение попыток при недоступности порта с прерыванием пользователем (мало ли что). нет не влияет. какая ему разница? |
|||
22
PQT
23.11.17
✎
06:41
|
(21) в процессе реализации идеи с повторением попыток, пришла альтернативная (используя таймаут метода):
Если глФР.DeviceEnabled = 0 Тогда ~ещеРаз: глФР.DeviceEnabled = 1; Если глФР.DeviceEnabled = 0 Тогда Если Вопрос("ФР занят, ждем...", РежимДиалогаВопрос.ОКОтмена, 1) = КодВозвратаДиалога.Отмена Тогда Возврат; КонецЕсли; Перейти ~ещеРаз; КонецЕсли; КонецЕсли; |
|||
23
PQT
23.11.17
✎
06:43
|
2 одновременно работающих фискальника заморачивают изза открытия ящика:
ПараметрыКассовогоРегистратора = КэшПараметров.КассовыеРегистраторы.Получить(К.Организация); Если КэшПараметров.РазделятьЧеки Тогда Если глФР.CurrentDeviceNumber = КэшПараметров.ДенежныйЯщикПодключенКУстройству и Не КэшПараметров.НеОткрыватьЯщик Тогда Если глФР.DeviceEnabled = 0 Тогда ~ещеРаз: глФР.DeviceEnabled = 1; Если глФР.DeviceEnabled = 0 Тогда Если Вопрос("ФР занят, ждем...", РежимДиалогаВопрос.ОКОтмена,1) = КодВозвратаДиалога.Отмена Тогда Возврат; КонецЕсли; Перейти ~ещеРаз; КонецЕсли; КонецЕсли; ОткрытьЯщик(глФР, НужноОткрытьЯщик); КонецЕсли; НужноОткрытьЯщик = Ложь; Если глФР.CurrentDeviceNumber <> ПараметрыКассовогоРегистратора.НомерУстройства Тогда глФР.CurrentDeviceNumber = ПараметрыКассовогоРегистратора.НомерУстройства; глФР.DeviceEnabled = 1; // занимаем порт ОткрытьЯщик(глФР, НужноОткрытьЯщик); КонецЕсли; Иначе Если КэшПараметров.ПодключатьФРТолькоПриПечатиЧека Тогда глФР.DeviceEnabled = 1; КонецЕсли; ОткрытьЯщик(глФР, НужноОткрытьЯщик); КонецЕсли; а можно ли создать два объекта Новый("AddIn.FprnM45"); и к ним обращаться напрямую?, переключаться с одного на другой |
|||
24
PQT
23.11.17
✎
06:45
|
...чтобы переключаться с одного на другой.
а то весь этот кусок посвящен открытию денежного ящика |
|||
25
Галахад
гуру
23.11.17
✎
06:51
|
Гм. А типовыми средствами не проще было реализовать? Зачем напрямую к драйверу?
|
|||
26
PQT
23.11.17
✎
07:00
|
(25) Ситуацию затрудняет еще одно усложнение - подключено два ФР, один для одного ИП, другой для второго.
С обоими ФР будут работать два пользовательских сеанса. Я ящиком приходится заморачиваться изза того, что он подключен к одному из ФР, поэтому приходится проверять - к текущему ли устройству подключен денежный ящик, и если нет, то переключаться на второй > открывать ящик > переключаться назад |
|||
27
PQT
23.11.17
✎
07:06
|
Выглядит это так перед выводом чека:
ПараметрыКассовогоРегистратора = КэшПараметров.КассовыеРегистраторы.Получить(К.Организация); Если КэшПараметров.РазделятьЧеки Тогда Если глФР.CurrentDeviceNumber = КэшПараметров.ДенежныйЯщикПодключенКУстройству и Не КэшПараметров.НеОткрыватьЯщик Тогда ЗанятьФР(глФР); ОткрытьЯщик(глФР, НужноОткрытьЯщик); КонецЕсли; НужноОткрытьЯщик = Ложь; Если глФР.CurrentDeviceNumber <> ПараметрыКассовогоРегистратора.НомерУстройства Тогда глФР.DeviceEnabled = 0; глФР.CurrentDeviceNumber = ПараметрыКассовогоРегистратора.НомерУстройства; ЗанятьФР(глФР); ОткрытьЯщик(глФР, НужноОткрытьЯщик); КонецЕсли; Иначе Если КэшПараметров.ПодключатьФРТолькоПриПечатиЧека Тогда ЗанятьФР(глФР); КонецЕсли; ОткрытьЯщик(глФР, НужноОткрытьЯщик); КонецЕсли; и после печати чека: Если НужноОткрытьЯщик и Не КэшПараметров.НеОткрыватьЯщик Тогда Если глФР.CurrentDeviceNumber <> КэшПараметров.ДенежныйЯщикПодключенКУстройству Тогда Если КэшПараметров.ПодключатьФРТолькоПриПечатиЧека Тогда глФР.DeviceEnabled = 0; // Освобождаем КонецЕсли; глФР.CurrentDeviceNumber = КэшПараметров.ДенежныйЯщикПодключенКУстройству; КонецЕсли; ЗанятьФР(глФР); ОткрытьЯщик(глФР, НужноОткрытьЯщик); КонецЕсли; Если КэшПараметров.ПодключатьФРТолькоПриПечатиЧека Тогда глФР.DeviceEnabled = 0; КонецЕсли; |
|||
28
PQT
23.11.17
✎
07:07
|
но думаю нужно переписать все созданием двух объектов AddIn.FprnM45, если такое возможно
|
|||
29
mingw
23.11.17
✎
09:18
|
Бюджет какой? Для готового.
|
|||
31
mingw
23.11.17
✎
09:49
|
(30) Почему никто не задается вопросом: "Как печатать с двух компов на один принтер?"
|
|||
32
Сияющий в темноте
23.11.17
✎
10:48
|
фр-ы какие?
настроить через тсп ип чтобы кпждый пробивал сам а все идеи с проверкой-в лес |
|||
33
Галахад
гуру
23.11.17
✎
11:22
|
(22) Вообще-то, в типовых так и сделано. Торговое подключается при открытии формы и отключается при закрытии.
|
|||
34
Torquader
23.11.17
✎
12:09
|
(33) Это легко переписывается - создаём объект драйвера при подключении к форме, а подключаем само оборудование, когда уже нужно с ним работать.
|
|||
35
Галахад
гуру
23.11.17
✎
12:14
|
(34) Я знаю. В (33) я хотел сказать, что частое подключение и отключение это нормально.
|
|||
36
Torquader
23.11.17
✎
12:23
|
(35) У Атол-а для этого метод DeviceEnabled и был придуман, а идея использования логических устройств - тоже для того, чтобы все настройки записать заранее, а далее, просто переключать.
|
|||
37
PQT
23.11.17
✎
13:02
|
фух, весь день нетерпелось проверить тот код) дождался таки завершения работы магазина).. проверил - все работает, всем спасибо.
Если кому-то начинающим понадобится раздваивание чеков по ИПшникам (по отделам магазина): Функция РазделитьЧекПоОрганизациям() Экспорт Если Не КэшПараметров.РазделятьЧеки Тогда Возврат Истина; КонецЕсли; Записать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЧекТовары.НомерСтроки, | ЧекТовары.Товар.Вид.РеализацияС КАК РеализацияС |ИЗ | Документ.Чек.Товары КАК ЧекТовары |ГДЕ | ЧекТовары.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка); СтрокиПоОрганизациям = Запрос.Выполнить().Выгрузить(); Для каждого Стр Из СтрокиПоОрганизациям Цикл Если Стр.РеализацияС = Null или Стр.РеализацияС = Неопределено или Стр.РеализацияС.Пустая() Тогда Стр.РеализацияС = УмолчанияПользователя.РозничнаяОрганизация; КонецЕсли; Если Стр.РеализацияС <> Организация Тогда ОрганизацияВторогоЧека = Стр.РеализацияС; КонецЕсли; КонецЦикла; ИспОрганизации = Новый Массив; ЧастоИспользуемые.ЗаполнитьМассивУникальнымиЗначениями(ИспОрганизации, СтрокиПоОрганизациям.ВыгрузитьКолонку("РеализацияС")); Если ИспОрганизации.Количество() = 1 Тогда Если Организация = ИспОрганизации[0] Тогда Возврат Истина; Иначе Организация = ИспОрганизации[0]; глПриСменеОрганизации(ЭтотОбъект,,, Ложь); КонецЕсли; ИначеЕсли ИспОрганизации.Количество() = 2 Тогда //************* в чеке товар с двух организаций, значит будем раздваивать ************ Чек2 = Документы.Чек.СоздатьДокумент(); СтрокиПереносим = Новый Массив; Для Каждого СТр из СтрокиПоОрганизациям Цикл Если СТр.РеализацияС <> Организация Тогда СтрокаДока = Товары[СТр.НомерСтроки-1]; СтрокиПереносим.Добавить(СтрокаДока); ЗаполнитьЗначенияСвойств(Чек2.Товары.Добавить(),СтрокаДока); КонецЕсли; КонецЦикла; ЗаполнитьЗначенияСвойств(Чек2,ЭтотОбъект); Чек2.Организация = ОрганизацияВторогоЧека; глПриСменеОрганизации(Чек2,,, Ложь); Чек2.КассовыйРегистратор = КэшПараметров.КассовыеРегистраторы[ОрганизацияВторогоЧека].КассовыйРегистратор; НачатьТранзакцию(); РасчетЧека2 = Чек2.Товары.Итог("Всего"); РасчетЧека1 = ЭтотОбъект.Товары.Итог("Всего") - РасчетЧека2; Для каждого СтрОплаты Из ЭтотОбъект.Оплата Цикл Было = СтрОплаты.Получено; СтрОплаты.Получено = Мин(РасчетЧека1,Было); Было = Было - СтрОплаты.Получено; Если РасчетЧека1 > 0 Тогда РасчетЧека1 = РасчетЧека1 - СтрОплаты.Получено; КонецЕсли; Если РасчетЧека2 > 0 и Было > 0 Тогда НовОплата = Чек2.Оплата.Добавить(); ЗаполнитьЗначенияСвойств(НовОплата,СтрОплаты); НовОплата.Получено = Мин(РасчетЧека2,Было); РасчетЧека2 = РасчетЧека2 - НовОплата.Получено; КонецЕсли; КонецЦикла; Чек2.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный); Отказ = Ложь; СерверТО.ПечатьЧекаФР(Чек2, "ПробитьЧек", "Чек", Отказ); Если Отказ Тогда // ОтменитьТранзакцию(); Иначе Чек2.ЧекПробитККМ = 1; Чек2.Записать(РежимЗаписиДокумента.Запись); КонецЕсли; Для каждого Стр Из СтрокиПереносим Цикл Товары.Удалить(Стр); КонецЦикла; Записать(); ЗафиксироватьТранзакцию(); КонецЕсли; Возврат Истина; КонецФункции |
|||
38
mingw
23.11.17
✎
13:04
|
Очередь печати нужна.
(37) Попробуй одновременно с двух мест на один фр. Что будет? |
|||
39
PQT
24.11.17
✎
07:17
|
(38) тут (22) после того как не получилось занять порт, выводится на одну секунду вопрос-сообщение "ФР занят, ждем...". Получается красиво - он будто мигает).. и пользователь может остановить печать чека нажатием "отмена".
|
|||
40
PQT
24.11.17
✎
07:18
|
(39) мигает, потомучто "Вопрос" выводится через каждую секунду, пока не освободится ФР, либо пользователь не отменит
|
|||
41
Otark
24.11.17
✎
07:53
|
Если конфа самописная нет заморочек с кассовыми сменами и еще у вас и атол то, что вам мешает просто подключить по сети атол? то есть как-то вот так: http://catalog.mista.ru/public/537905/
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |