При работе в рознице часто возникает необходимость отложить чек, например, если покупатель забыл товар или ожидает дополнительной информации. В таких ситуациях бывает критически важно добавить комментарий к отложенному чеку, чтобы указать причину отложения, особенности заказа или другие важные детали. Однако типовая функциональность 1С не всегда предоставляет такое поле. Рассмотрим, как мы можем реализовать эту доработку, используя расширения конфигурации.
Основная проблема, с которой мы сталкиваемся, заключается в том, что добавление поля комментария просто на форму РМК (Рабочего Места Кассира) с установкой галки "Сохраняемые данные" не приведет к его сохранению. Это происходит потому, что данные формы не всегда напрямую связаны с данными объекта, который сохраняется в базе данных. Отложенные чеки хранятся в специальном хранилище, и для сохранения нашего комментария, его необходимо добавить как реквизит самого объекта, представляющего отложенный чек, а не только как реквизит формы. В нашем случае, наиболее логичным объектом для добавления комментария будет Документ.ЧекККМ, так как именно он формируется при завершении операции, и данные отложенного чека часто преобразуются в него.
Первым шагом нам необходимо добавить новый реквизит для хранения комментария. Мы будем делать это через расширение конфигурации, что позволит нам не снимать конфигурацию с поддержки и сохранять возможность ее обновления. Добавим реквизит непосредственно в тот объект, который будет хранить этот комментарий постоянно. Исходя из логики работы РМК, это будет Документ.ЧекККМ.
Документ.ЧекККМ.Документ.ЧекККМ, создайте новый реквизит.Таким образом, мы гарантируем, что для каждого чека ККМ (в том числе и для тех, которые формируются из отложенных чеков) будет существовать поле, предназначенное для хранения нашего комментария.
После того как реквизит добавлен, нам необходимо обеспечить его заполнение и отображение в интерфейсе РМК. Для этого мы будем использовать обработчики событий форм РМК в нашем расширении. Все действия будем выполнять в контексте расширения.
Расширения позволяют нам внедрять свой код в различные точки выполнения типовой конфигурации: до выполнения типовой процедуры, после нее или даже полностью заменять ее. В нашем случае мы будем использовать обработчики "до" и "после" для управления комментарием.
При создании нового чека или очистке РМК важно сбросить значение комментария, чтобы старые данные не переносились в новый чек. Мы можем использовать обработчик события СоздатьНовыйНабор, который обычно вызывается при инициализации нового чека.
Добавим следующий код в модуль формы РабочееМестоКассира вашего расширения:
&НаСервере
&Перед("СоздатьНовыйНабор")
Процедура ВашеРасширение_СоздатьНовыйНабор(ОчиститьДокументОбработки, ОчисткаАвтосохраненныхДанных)
Объект["Комментарий"] = "";
КонецПроцедуры
В этом коде:
&НаСервере указывает, что процедура будет выполняться на сервере.&Перед("СоздатьНовыйНабор") означает, что наша процедура ВашеРасширение_СоздатьНовыйНабор будет вызвана перед выполнением типовой процедуры СоздатьНовыйНабор.Объект["Комментарий"] = ""; устанавливает пустую строку в свойство "Комментарий" текущего объекта формы РМК, тем самым очищая его. Мы предполагаем, что на форме РМК также присутствует реквизит "Комментарий", к которому мы обращаемся.Нам нужен механизм, который позволит кассиру ввести комментарий непосредственно в момент откладывания чека. Мы можем привязаться к существующему событию, которое происходит в процессе обработки чека. В приведенном примере из форума использован обработчик ОповещениеОткрытьФормуВыбораПричиныВозврата. Хотя его название может показаться не совсем подходящим для отложенного чека, оно, вероятно, является удобной точкой входа в данной конфигурации для запроса дополнительной информации.
Добавим следующий код:
&НаКлиенте
&После("ОповещениеОткрытьФормуВыбораПричиныВозврата")
Процедура ВашеРасширение_ОповещениеОткрытьФормуВыбораПричиныВозврата(РезультатОткрытияФормы, ДополнительныеПараметры)
ПодсказкаВводаСтроки = "Введите комментарий к чеку:";
ОписаниеОповещения = Новый ОписаниеОповещения("ВашеРасширение_ПослеВводаСтроки", ЭтотОбъект);
ПоказатьВводСтроки(ОписаниеОповещения, Объект["Комментарий"], ПодсказкаВводаСтроки, 0, Ложь);
КонецПроцедуры
Здесь:
&НаКлиенте указывает, что процедура выполняется на клиенте.&После("ОповещениеОткрытьФормуВыбораПричиныВозврата") означает, что наш код будет выполнен после типовой процедуры. Вам может потребоваться найти другую точку входа, если эта не подходит для вашего конкретного сценария откладывания чека (например, обработчик кнопки "Отложить чек").ПоказатьВводСтроки(...) открывает стандартное диалоговое окно для ввода строки.
ОписаниеОповещения – это объект, который указывает, какая процедура будет вызвана после того, как пользователь введет текст и нажмет "ОК" (или отменит ввод).Объект["Комментарий"] – текущее значение комментария, которое будет предложено пользователю для редактирования.ПодсказкаВводаСтроки – текст, отображаемый в заголовке окна ввода.После того как пользователь введет комментарий и нажмет "ОК", система вызовет процедуру, указанную в ОписаниеОповещения (в нашем случае это ВашеРасширение_ПослеВводаСтроки). Эта процедура должна принять введенную строку и присвоить ее свойству "Комментарий" объекта формы.
Добавим следующую процедуру:
&НаКлиенте
Процедура ВашеРасширение_ПослеВводаСтроки(Строка, ДополнительныеПараметры) Экспорт
Если НЕ Строка = Неопределено Тогда
Объект["Комментарий"] = Строка;
КонецЕсли;
КонецПроцедуры
В этой процедуре:
Неопределено (то есть, пользователь не отменил ввод).Объект["Комментарий"] = Строка; присваивает введенный текст свойству "Комментарий" текущего объекта формы РМК. Важно, чтобы это свойство затем было сохранено в постоянном хранилище отложенного чека.Когда кассир выбирает отложенный чек для продолжения работы, нам необходимо, чтобы сохраненный ранее комментарий был загружен и отображен. Для этого мы используем обработчик события ЗаполнитьДаннымиПоЧекуККМ, который вызывается при загрузке данных чека в форму РМК.
Добавим следующий код:
&НаСервере
&После("ЗаполнитьДаннымиПоЧекуККМ")
Процедура ВашеРасширение_ЗаполнитьДаннымиПоЧекуККМ(ЧекЗаполнения, Отказ)
Объект["Комментарий"] = ЧекЗаполнения.Комментарий;
КонецПроцедуры
Здесь:
&НаСервере указывает на выполнение на сервере.&После("ЗаполнитьДаннымиПоЧекуККМ") гарантирует, что наш код выполнится после того, как типовая процедура заполнит основные данные чека.ЧекЗаполнения – это параметр, который передает объект чека (например, Документ.ЧекККМ или временный объект, представляющий отложенный чек), из которого берутся данные. Благодаря тому, что мы добавили реквизит "Комментарий" в Документ.ЧекККМ (или соответствующий объект), мы можем к нему обратиться как к ЧекЗаполнения.Комментарий.Объект["Комментарий"] = ЧекЗаполнения.Комментарий; присваивает значение комментария из загруженного объекта свойству "Комментарий" на форме РМК.Документ.ЧекККМ). Флаг "Сохраняемые данные" на реквизите формы сам по себе не обеспечивает сохранение в базе данных, он лишь указывает, что данные должны быть сохранены при закрытии формы (что не всегда приводит к постоянному хранению, особенно в случае отложенных чеков).НСИ и администрирование -> Продажи -> Розничные продажи -> Хранить отложенные чеки.Объект.Комментарий.Следуя этим шагам и рекомендациям, мы можем успешно добавить и сохранять поле комментария в отложенных чеках РМК, значительно улучшив информативность и удобство работы кассиров. При необходимости можно воспользоваться готовым расширением для ввода комментария к чеку в РМК по горячей клавише.