Доработка автоматического ввода нового номера дисконтной карты в РМК. Розница 3.0
Клиент обратился с задачей — чтобы номер новой карты генерировался автоматически по нажатию кнопки.
Разработку вел в копии базы на сервере. Кассы там не было, поэтому подключил эмулятор ККМ по своей памятке:
Запрос по поиску максимального кода протестировал в консоли кода:
ВЫБРАТЬ
МАКСИМУМ(ДисконтныеКарты.КодКартыШтрихкод) КАК Штрихкод
ИЗ
Справочник.ДисконтныеКарты КАК ДисконтныеКарты
ГДЕ
НЕ ДисконтныеКарты.ПометкаУдаления
На новой платформе в конструкторе можно использовать не включенные в расширение реквизиты — очень удобно:
Интересно, а если конструируешь запрос в конфигурации, он видит поля активных расширений? Думаю вряд ли.
Добавил программно кодом кнопку для генерации номера:
Но клиент попросил, чтобы кнопка помещалась в форму, поэтому уменьшили ширину поля номера карты с типовых 22 до 18:
Код расширения формы РМК получился таким:
&НаСервере Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) //Осипов 2023-10-27 кнопка генерации нового номера //Укорачиваем чтобы кнопка влезла Элементы.НоваяКартаНомер.Ширина = 18; Привязка = Элементы.ГруппаНоваяКартаНомер; ИмяКоманды = "дор_СгенерироватьНомерНовойКарты"; КомандаФормы = ЭтаФорма.Команды.Добавить(ИмяКоманды); КомандаФормы.Действие = ИмяКоманды; КомандаФормы.Заголовок = "Сгенерировать номер новой карты"; КомандаФормы.ИзменяетСохраняемыеДанные = Ложь; //КомандаФормы.Картинка = БиблиотекаКартинок.дор_Молния; КомандаФормы.Картинка = БиблиотекаКартинок.ВнешнийИсточникДанныхКуб; КомандаФормы.Отображение = ОтображениеКнопки.Картинка; НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Привязка); НовыйЭлемент.Вид = ВидКнопкиФормы.Гиперссылка; НовыйЭлемент.ИмяКоманды = ИмяКоманды; КонецПроцедуры &НаКлиенте Процедура дор_СгенерироватьНомерНовойКарты(Команда) НоваяКартаНомер = дор_НовыйКодКарты(); КонецПроцедуры Функция дор_НовыйКодКарты() УстановитьПривелигерованныйДоступ(Истина); З = Новый Запрос(); З.Текст = "ВЫБРАТЬ | ЕСТЬNULL(МАКСИМУМ(ДисконтныеКарты.КодКартыШтрихкод), 0) КАК Штрихкод |ИЗ | Справочник.ДисконтныеКарты КАК ДисконтныеКарты |ГДЕ | НЕ ДисконтныеКарты.ПометкаУдаления"; Выборка = З.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Попытка Возврат Формат(Число(Выборка.Штрихкод) + 1, "ЧЦ=6; ЧДЦ=0; ЧВН=; ЧГ="); Исключение КонецПопытки КонецЕсли; Возврат "000001"; КонецФункции
Среда: Розница 3.0.5.145 Платформа: 8.3.23.1912 Объем: 1 час
Как обеспечивается уникальность номера?
Максимум берется и добавляется единичка. По коду же видно.
Ну взяли две транзакции максимум. Добавили 1. Записали одно и тоже значение
при записи номера контроль. Не взлетит. Да там и нет двух рабочих мест, возможно.