Как в 1С уведомить пользователя о чём-то таком, на что ему надо обратить внимание? Из штатных простых возможностей есть 2 способа:
Ещё с версии 7.7 есть метод Сообщить(), который выводит текст в специальное окошко. Недостатки:
это просто текст без какого-либо оформления;
его не видно, если у пользователя свёрнута 1С;
сообщение не интерактивно (на него нельзя пощелкать).
В версии 8.2 добавили метод ПоказатьОповещениеПользователя(). Это уже на много лучше: можно и клацнуть, можно показать даже когда 1С свёрнута. Но и тут есть куда стремится:
нельзя управлять временем показа окна;
нельзя на 2 и более слов или выражений повесить разные обработчики событий;
это по прежнему просто текст без возможности его разукрасить, увеличить и т.п.
В 8.3 появился новый объект ФорматированнаяСтрока. Я сам лично с 8.3 пока не работаю, но насколько я понял с его помощью можно разукрашивать текст в интерактивных уведомлениях типо того же ПоказатьОповещениеПользователя(), Предупреждение() и возможно ещё что-то. Если я не прав - поправьте, пожалуйста. Благодаря этому уходит последний недостаток, который был описан в пункте выше. Но остальные два по прежнему актуальны.
Что я предлагаю. Внешняя компонента, которая позволяет показывать окошко. Не просто окошко с текстом, а окошко с содержимым в формате html. Таким образом можно делать практически любое оформление сообщения (в т.ч. вставлять gif картинки). Но это ещё не все. В html-е можно вешать обработчики нажатия на элементы (ссылки, кнопки), которые можно отловить в 1С в обработке внешнего события. Об этом расскажу ниже.
Суть происходящего, надеюсь ясна. Теперь расскажу как пользоваться.
У окна есть 4 свойства:
Title Использование: Чтение и запись Тип: Строка Описание: получает и устанавливает заголовок окошка.
Body Использование: Только чтение Тип: Строка Описание: получает содержимое окна, которое было установлено методом Show().
AllowDrag Использование: Чтение и запись Тип: Булево Описание: Истина - пользователь может перетягивать окошко в другое место, Ложь - окно не перетаскивается.
AllowHide Использование: Чтение и запись Тип: Булево Описание: Истина - окно можно закрыть интерактивно, Ложь - интерактивно окно закрыть нельзя. Если свойство установлено в Истина, то справа вверху есть кнопка закрытия, если в Ложь - то кнопки закрытия нету.
Поддерживаемые методы:
Show(<Тело>, <Время>) Параметры: <Тело> Тип: Строка Это html, который отобразится в окошке. Так же это то, что будет получено в свойстве Body. Пример:
Обработчик ExternalEvent('Параметр1', 'Параметр2') говорит окошку о том, что при щелчке нужно запустить внешнее событие в 1С. Внешнее событие будет приходить от NotificationWindow, имя события задается в первом параметре, данные можно передать во втором.
<Время> (необязательный) Тип: Число Количество секунд после которых окошко само закроется. Если не надо, чтобы само закрывалось - параметр можно не указывать либо указать 0. Если время больше 0, то окно само закроется и сгенерирует в 1С внешнее событие от NotificationWindow с именем события WindowHide и в данных передаст Body. Body можно сохранить где-то для подальшей обработки (в примере приложенной конфигурации можно посмотреть что имелось ввиду).
ShowFromUrl(<Урл>) Параметры: <Урл> Тип: Строка Адрес веб страницы, которую надо отобразить в окне
Hide() Спрятать окошко
SetBackground(<R>, <G>, <B>) Параметры: <R>, <G>, <B> Тип: Число Значения параметров R, G, B в представлении цвета в виде RGB
SetHeight(<Высота>) Параметры: <Высота> Тип: Число Высота окошка
SetWidth(<Ширина>) Параметры: <Ширина> Тип: Число Ширина окошка
BottomRight() Устанавливает окошко в правом нижнем углу экрана
Для работы нужен .Net Framework 4. Работоспособность проверялась на ОС Windows 7 (x32) и платформе 1С:Предприятие 8.2 (8.2.19.90) в режиме управляемого приложения. Должно работать и в обычном приложении и на платформе 8.1 и 7.7 (но я это не проверял).
Прилагаю к посту саму компоненту, пример использования в виде конфигурации 1С и файл, которым компоненту надо регистрировать. Регистрацию нужно запускать от имени администратора.
Вопросы, предложения, пожелания, благодарности можно оставлять тут .
ПС. кто не видел, советую так же ознакомиться со старшим братом NotificationWindow-а - компонентой Notifier-ом .
Регистратор компоненты (не забудьте поменять путь к компоненте; в моем случае это C:\Component\NotificationWindow.dll): RegAddIn.zip ( 376 байт )
Кол-во скачиваний: 52
Живет на форуме
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0
Лично для меня было бы очень полезно ели бы сервер мог сгенерировать оповещение пользователю, а клиент его отловить и отобразить, а если как опция вместо оповещения пользователю просто генерировать внешнее событие, то вообще цены бы не было. Но это мечты ...
Сообщение отредактировал Batchir - 20.08.14, 19:08
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8
Цитата(Batchir @ 20.08.14, 19:59)
Лично для меня было бы очень полезно ели бы сервер мог сгенерировать оповещение пользователю, а клиент его отловить и отобразить, а если как опция вместо оповещения пользователю просто генерировать внешнее событие, то вообще цены бы не было. Но это мечты ...
Это не мечты. Есть у дяди Вовы "кое что" для решения и этого вопроса: с внешним событием и все такое
Живет на форуме
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0
Ну внешнее событие это как дополнение к хотелке. Решение задачи передачи оповещения клиента с сервера - вот о чем я давно мечтаю. т.е. что бы не клиент опрашивал, например, регистр сведений о том появились ли там записи, а сервер делал записи в регистре и оповещал необходимого клиента о том что эти записи появились. и вот тут если бы это оповещение было в виде внешнего события, то была бы сказка.
Сообщение отредактировал Batchir - 21.08.14, 14:12
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8
Batchir, в моём решении так и есть: сервер может отправлять произвольные сообщения клиентам в виде внешних событий. Так же клиенты могут обмениваться произвольными сообщениями между собой, без записи и опроса в базе данных. Но это отдельное решение и отдельный программный комплекс, не касающийся этой темы .
Живет на форуме
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0
А вот это действительно классная штука.
С удовольствием бы поюзал, недавно как раз очень нужно было. УФ. Использовал новый механизм http-сервис 8.3.5, внешний источник слал пост запросы и в базе происходили изменения. Причем необходимо было что б об этих изменениях сразу узнавал конкретный клиент. Ничего подходящего не нашел и пришлось гкодить. А с твоей разработкой красота бы получилась.
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8
bavkyz, это делалось 7 лет назад, поэтому я не уверен, что исходники где-то сохранились. По крайней мере что бы прямо сейчас их откуда-то достать - я не знаю откуда.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!