Итак по порядку.
Начнем со стандартной формы РМК Розницы (ею, кстати и закончим).
Давно не давала покоя ее "недоделанность". Очень сложно показать кассиру, работающему исключительно в обработке РМК плюсы их новой программы. "Их нет!" скажет любой кассир, работавший до этого в конкурентных продуктах и будет по-своему прав. Не понимаю, почему удобство РМК в создании Розницы стоит на последнем месте.
Последней каплей моего терпения стала установки и запуск Розницы в небольшом кафе, владелец которого наш хороший, благодарный клиент, с которым мы сотрудничаем на протяжении многих лет.
Почему Розница? Не потянут они общепит. Обороты не те, персонал не обучен, да и ни к чему. А Розница справится со всеми требованиями клиента.
В общем дошли до РМК. Заполнили меню, настроили оборудование, УТМы, поставили тач, и получили вот это:
Просто при вызове "Быстрых товаров", если в Палитре есть группы (2 уровня), то вместо открытия панели на форме РМК открывается блокирующая форма подбора справочника "Палитра быстрых товаров".
Теперь, если наш покупатель гурман и не ограничивается тарелкой борща или комплексным, то по окончании ввода блюд кассир вынужден "возить!" пальцем палитру по тачу, распихивая ее в разные углы и укромные места, роняя при этом реплики и разнообразные салаты в подобранный чек, чтобы посмотреть, все-ли по заказу выбрано верно. Здесь я тихонько удалился, ссылаясь на "надо посмотреть" и "вроде температура опять поднялась".
Стоит также заметить, что кнопки реализованы как "Поле картинки", вероятно с далеко идущими планами, однако планы еще далеки, а нажатие на поле-картинку не визуально. То есть если нажать на обычную кнопку, она проваливается и пользователь видит, что он нажал на кнопку. Нажатие на картинку ничем не сопровождается. Ни визуальным эффектом, ни звуком, ни каким-либо намеком, кроме выполняемого кнопкой действия. А если компьютер не быстрый или нажатие на кнопку требует продолжительных расчетов, то пользователь нажимает на нее многократно. Последствия можно только предполагать.
Ну, хватит лирики. Поговорим о шрифтах. Но сначала добавим форме, словами 1С, юзабилити. ))) Короче, сделаем ее удобнее.
1. Мне не понравилось расположение элементов. Верхние кнопки основных команд с одновременно открытой панелью дополнительных команд внизу съедают не менее 50% высоты таблицы чека при разрешении 1024х768. Про 800х600 мы даже не говорим, хотя многие профессиональные мониторы кассира имеют разрешение именно 800х600.
Отметим, что чаще стали использоваться мониторы с соотношением сторон не 4:3, а 16:9. Т.е. Таблица с товарами сокращается до 4-6 строк.
Вывод. Перенести кнопки основных действий на правую или левую часть экрана и расположить их вертикально. Я расположил справа. Для праворуких. Информационные группы пока уберем. Они съели до 20% места на форме. Вернем потом на место, разобравшись к чему расточительство.
Вот что из этого получилось (разрешение 1680х1050):
2. Места стало в 2 раза больше, но с быстрыми товарами мы еще не разобрались. Окно с кнопками все еще вываливается поверх основной формы.
Надо, чтобы окно открывалось сбоку. Поискал в коде заполнение кнопок быстрых товаров. Действительно. При инициализации РМК заполняется только верхняя группа быстрых товаров. Все что ниже первого уровня не хранится в форме, а добавляется из открываемой формы подбора справочника - "Палитры быстрых товаров".
Зачем переделывать то, что уже работает? Точно, незачем. Пусть форма подбора приклеивается слева от основной формы.
Отдельное спасибо за идею Павлу Одинцову (Darklight) и Дмитрию Васильеву(dandykry).
Дмитрий предложил приклеить окно сбоку: http://v8.1c.ru/o7/201502wnds/index.htm
А Павлом был предложен вариант использовать WScript.Shell для закрепления открытого окна программно.
&НаКлиенте
Процедура ЗакрепитьСправа() экспорт
Если ЭтаФорма.ВводДоступен() Тогда
WSHShell = Новый COMОбъект("WScript.Shell");
WSHShell.SendKeys("%");
WSHShell.SendKeys("{DOWN 5}");
WSHShell.SendKeys("{RIGHT}");
WSHShell.SendKeys("{UP 5}");
WSHShell.SendKeys("{ENTER}");
КонецЕсли;
КонецПроцедуры
и
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ЗакрепитьСправа",0.1,Истина);
КонецПроцедуры
Смысл функции ЗакрепитьСправа() Нажать на последовательность кнопок: Alt, вниз 5 раз, вправо, вверх 5 раз, Enter. Что равносильно: Главное меню - Окна - Закрепить справа. (если слева, то Up 6)
Обработчик ожидания нужен для выполнения "скрипта" над уже открытим окном. Прямой вызов ЗакрепитьСправа() из той же функции, которая открывает форму подбора недопустим.
В результате получилось так:
3. Ну, раз пошла такая пляска, то кнопкам тоже достанется.
Меняем картинки на кнопки. Чуть форматируем информационные надписи и результат воодушевляет на дальнейшие подвиги.
Еще немного форматирования. Панель быстрых товаров отлично прижилась справа. Форма не расползается.
Разочарование ждало на этапе полевых испытаний.
Форма расползлась на разрешении монитора 1024х768.
4. Нормальный человек так бы и сказал: Надо масштабировать. Масштаб - это наше все!
Как? Выход нашелся, как всегда, простой. Будем масштабировать шрифты.
На этапе инициализации РМК собираем наименования всех элементов формы, имеющих свойство "Шрифт". И в отдельный массив элементы таблицы товаров (как показала практика очень удобно масштабировать независимо все элементы формы и отдельно таблицу товаров).
МассивИменТаблицы = Новый Массив;
МассивИмен = Новый Массив;
Для Каждого ЭлемФормы Из Элементы цикл //Перебор всех элементов формы
Попытка
Шрифт = ЭлемФормы.Шрифт;
МассивИмен.Добавить(ЭлемФормы.Имя);
Исключение КонецПопытки; //У групп, к примеру, нет свойства шрифт. Сработает исключение.
КонецЦикла;
Для каждого Элемент Из Элементы.Товары.ПодчиненныеЭлементы Цикл //Здесь сложнее, нам нужны только подчиненные
Если НЕ Элемент.Вид = ВидГруппыФормы.ГруппаКолонок Тогда
МассивИменТаблицы.Добавить(Элемент.Имя);
Иначе //Группа
Для каждого ЭлементГруппы1 Из Элемент.ПодчиненныеЭлементы Цикл
Если НЕ ЭлементГруппы1.Вид = ВидГруппыФормы.ГруппаКолонок Тогда
МассивИменТаблицы.Добавить(ЭлементГруппы1.Имя);
Иначе //Группа
Для каждого ЭлементГруппы2 Из ЭлементГруппы1.ПодчиненныеЭлементы Цикл
Если НЕ ЭлементГруппы2.Вид = ВидГруппыФормы.ГруппаКолонок Тогда
МассивИменТаблицы.Добавить(ЭлементГруппы2.Имя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Да... Не рекурсия... Но, если вызвать на клиенте функцию с передачей ей в параметре тип Элемент формы, то получим "Отсутствует отображение для типа таблицаформы...". Не стал задумываться, пока, как сделать красивее. Клиент ждет результата.
Расположил, временно, чтобы поиграться, кнопки управления масштабом на форме. Кнопку "Изменить форму" тоже вывел. Почему кассира обделили - не понимаю. Потом спрячем их с глаз долой, чтобы не занимали драгоценное пространство, в меню настроек формы.
Команды кнопок вызывают процедуры, в которых происходит изменение шрифта всех элементов формы или элементов таблицы товаров. Получилось так. При изменении масштаба шрифта заголовка кнопки, сама кнопка увеличивается или уменьшается, если не задан жесткий размер. Это нам и нужно.
(следует заметить, что изменение размера шрифта приводит к противоречивым результатам. Сильно зависит от установленных флагов стилей. Если установлено в Авто, то размер не меняется, поэтому используем масштаб шрифта. Он работает идеально.)
Новый Шрифт(<ИмяШрифта>, <Размер>, <Жирный>, <Наклонный>, <Подчеркнутый>, <Зачеркнутый>, <Масштаб>)
<Масштаб> (необязательный)
Тип: Число.
Задает значение свойства Масштаб.
Значение по умолчанию: 100.
Вот пример кода уменьшения масштаба шрифта таблицы товаров на 10% и увеличения масштаба шрифтов всех элементов формы на 10%:
&НаКлиенте
Процедура УменьшитьШрифт(Команда)
Для каждого ЭлементМассива Из МассивИменТаблицы Цикл
Масштаб = 90;
Элементы[ЭлементМассива].Шрифт = Новый Шрифт(Элементы[ЭлементМассива].Шрифт, ,,,,,,Масштаб);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УвеличитьМасштаб(Команда)
Для каждого ЭлементМассива Из МассивИмен Цикл
Масштаб = 110;
Элементы[ЭлементМассива].Шрифт = Новый Шрифт(Элементы[ЭлементМассива].Шрифт, ,,,,,,Масштаб);
КонецЦикла;
КонецПроцедуры
Изначально был такой вариант, но он не работал:
Масштаб = Элементы[ЭлементМассива].Шрифт.Масштаб;
Шаг = 20; //20%
Масштаб = Масштаб + Шаг;
Элементы[ЭлементМассива].Шрифт = Новый Шрифт(Элементы[ЭлементМассива].Шрифт, ,,,,,,Масштаб);
Этот вариант, почему-то постоянно уменьшал, значительно более, чем на 20%, хотя должен был наоборот, увеличивать на 20%.
Сравним оба варианта увеличения шрифта:
Правильный:
Масштаб = 110;
Элементы[ЭлементМассива].Шрифт = Новый Шрифт(Элементы[ЭлементМассива].Шрифт, ,,,,,,Масштаб);
Неправильный:
Масштаб = Масштаб + Шаг;//Масштаб - Шаг;
Элементы[ЭлементМассива].Шрифт = Новый Шрифт(Элементы[ЭлементМассива].Шрифт, ,,,,,,Масштаб);
Просто после присвоения элементу шрифта с новым масштабом, Элемент так и запомнит шрифт с новым масштабом. И это не обязательно 100%.
Новый масштаб будет задан не от эталонного (100%) а от текущего значения масштаба шрифта.
Итак, если последнее значение масштаба шрифта 70%, а мы хотим увеличить на 10%, то получится, что Масштаб = 80.
После присвоения нового шрифта его масштаб составит 80% от предыдущих 70% (а не от эталонного 100%), т.е. шрифт уменьшится, а не увеличится.
Каждый раз, когда мы хотим увеличить шрифт мы должны указать ему не на сколько процентов увеличить, а сколько процентов он будет составлять от текущего масштаба.
т.е. если мы хотим увеличить на 20%, то надо просто указать масштаб = 120, а если уменьшить на 20%, то, соответственно Масштаб = 80.
После того, как я усвоил эту простую истину форма снова ожила уже на любых разрешениях. Надо только менять масштаб на 20-30%:
800х600
1024х768
1680х1050 (шрифт таблицы мелковат):
1680х1050 (вот где пригодилось отдельное масштабирование шрифтов таблицы товаров):
В заключение расскажу, что планирую доделать в интерфейсе кассира, чтобы показать Розницу "Лицом" а не как в штатном РМК.
1. При открытии форма сама выберет какой масштаб шрифтов ей выбрать. И впишется в любое разрешение монитора, не съедая слова в кнопках.
2. Надо добавить сохранение текущей настройки масштаба, чтобы каждый раз не пересчитывать при открытии.
Стандартных способов получить разрешение или размер формы нет. Добавил возможность сохранять масштаб основных элементов формы.
3. Надо бы разрешить пользователю компоновать форму так, как ему будет удобнее в ней работать. И сохранять настройки под каждого пользователя.
4. Переработать палитры быстрых товаров. То что есть - не красиво и не функционально. Быстрые товары должны жить на той же форме РМК. Использование скриптов хоть и помогло, но не является самым красивым решением.
Готово. Пришлось повозиться с алгоритмом построения.
5. Добавить форму ввода количества товаров. Когда продается дробное количество с тача затруднительно вводить число, используя встроенный "калькулятор"
Готово. Количество вводится с доп. формы клавиатуры. Добавил, кстати, кнопку "Сторно", которую тщетно ищут новообращенные в 1С Розницу. По той же причине назвал кнопку количество "Х".
Делюсь результатом.
Разрешение 1024х768. Открыто нижнее меню доп. операций и меню настроек масштаба элементов.
Разрешение 1680 х1050. Добавлена кнопка ввода количества. Кнопка "сторно" доступна только если кассиру разрешено удалять строки.
РМК может работать как дополнительная подключаемая обработка, что позволит ее использование с базовыми версиями продукта:
Для запуска потребуется создать ярлык и прописать в нем команду запуска обработки из внешнего файла (пример командной строки):
"C:\Program Files (x86)\1cv8\common\1cestart.exe" ENTERPRISE /F "E:\Разработки\Розница" /N"Кассир" /P"парольКассира" /Execute"E:\Разработки\РМК\РМК_Внешняя.epf"
Надеюсь, что мой опыт кому-нибудь пригодится.
С удовольствием приму любые идеи направленные на улучшение РМК. Буду рад их с Вами обсудить.