Предыстория: Почему 8.5 и как это тут появилось?
С выходом 8.5 с новым интерфейсом «Элемент». Энтузиазм и любопытство потрогать новинку не утихали, и в один скучный вечер я поднял платформу, установил БСП и перевел всё на новый интерфейс. Не без нюансов, конечно, но это уже отдельная тема. Затем полем для экспериментов стал «УТ», один из последних релизов.
Всегда было желание написать свою статью на Инфостарт, но не хотелось повторять что-то, что уже было в том или ином виде написано на просторах Инфостарта. А тут и новая платформа, и новый функционал вроде как — в общем, звезды сошлись и руки дотянулись, а что получилось, то получилось, не судите строго.
Идея: получаем подсказки без перехода в карточку или отчет
Взгляд упал на метод формы списка ПриНаведении
. Возникла мысль: а что, если пользователь, листая список (выбора или основной), мог бы получать дополнительные подсказки или сообщения? Начать решил с простого — выводить последнее поступление, остатки и цену. Если пользователь задерживается на строке хотя бы на секунду, всплывает подсказка с этой информацией.
За основу берем форму списка справочника «Номенклатура».
Реализация: пишем серверные обработчики
Для начала нам понадобятся две серверные функции.
1. Находим последнее поступление:
&НаСервере
Функция НайтиПоследнееПоступление(Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Товары.Цена КАК Цена,
| Товары.Количество КАК Количество,
| Товары.Ссылка.Дата КАК Дата,
| Товары.Ссылка.Номер КАК НомерДокумента
|ИЗ
| Документ.ПриобретениеТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Номенклатура = &Номенклатура
| И Товары.Ссылка.Проведен = ИСТИНА
| И Товары.Ссылка.ПометкаУдаления = ЛОЖЬ
|
|УПОРЯДОЧИТЬ ПО
| Дата УБЫВ";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Новый Структура();
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка;
КонецФункции
2. Получаем остатки по номенклатуре на текущую дату:
&НаСервере
Функция ПолучитьТекущиеОстатки(Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВТ_Остатки.ВНаличииОстаток КАК Количество
|ПОМЕСТИТЬ ВТ_Остатки
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Номенклатура = &Номенклатура) КАК ВТ_Остатки
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Остатки.Количество КАК Количество
|ИЗ
| ВТ_Остатки КАК ВТ_Остатки";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
Остаток = 0;
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Остаток = Остаток + Выборка.Количество;
КонецЦикла;
КонецЕсли;
Возврат Остаток;
КонецФункции
Реализация простая, «на коленке», можно было в целом и в один запрос, может как-нибудь структурой вывести, но так скажем "Дисклеймер - все написанное является плодом воображения автора и не носит экспертный характер". Поэтому еще раз прошу не судить строго.
Собираем всё вместе на клиенте
1. Объявляем переменные на форме для передачи идентификатора строки.
&НаКлиенте
Перем СсылкаСтроки;
&НаКлиенте
Перем ПолеСтроки;
Для чего нам эти переменные, так как в обработчик ожидания нельзя передать параметры, делаем хитрую уловку, чтобы «протащить» параметры из обработчика наведения в обработчик ожидания эти переменные как временное хранилище, чтобы сохранить данные о текущей строке и поле между вызовами обработчиков.
2. Определяем процедуру ПриНаведении
, где подключим обработчик ожидания.
Он нужен, чтобы не спамить вызовами и отложить запуск процедуры показа подсказки.
&НаКлиенте
Процедура Расш_СписокСтандартныйПоискНоменклатураПриНаведенииПосле(Элемент, Строка, Поле)
// Помещаем строку во временное хранилище
СсылкаСтроки = Строка;
ПолеСтроки = Поле;
// Подключаем обработчик на 1 секунду
ПодключитьОбработчикОжидания("ПоказатьПодсказкуПоТаймеру", 1);
КонецПроцедуры
3. Процедура показа подсказки по таймеру.
Вызываем функцию, получаем текст, очищаем старые сообщения и показываем новое.
&НаКлиенте
Процедура ПоказатьПодсказкуПоТаймеру()
ДанныеПодсказки = ПолучитьДанныеДляПодсказки(СсылкаСтроки);
// Очищаем сообщения и показываем новую подсказку
ОчиститьСообщения();
ОбщегоНазначенияКлиент.СообщитьПользователю(ДанныеПодсказки.Текст, СсылкаСтроки, ПолеСтроки,,);
КонецПроцедуры
4. Функция получения данных для подсказки
&НаСервере
Функция ПолучитьДанныеДляПодсказки(СсылкаСтроки)
Результат = Новый Структура("Текст, Заголовок");
ПоследнееПоступление = НайтиПоследнееПоступление(СсылкаСтроки);
// Формируем текст подсказки
Текст = "";
Если ПоследнееПоступление.Количество() = 0 Тогда
Текст = Текст + "d60; Не поступала" + Символы.ПС;
Иначе
Текст = Текст + " Последнее поступление: " +
Формат(ПоследнееПоступление.Дата, "ДФ=dd.MM.yyyy") + Символы.ПС;
Текст = Текст + " Цена: " +
Формат(ПоследнееПоступление.Цена, "ЧДЦ=2; ЧГ=0; ЧРД=.") + " руб." + Символы.ПС;
Текст = Текст + " Количество: " +
Формат(ПоследнееПоступление.Количество, "ЧДЦ=2; ЧГ=0; ЧРД=.") + Символы.ПС;
Текст = Текст + " Документ: " + ПоследнееПоступление.НомерДокумента;
КонецЕсли;
// Добавляем текущие остатки
Остатки = ПолучитьТекущиеОстатки(СсылкаСтроки);
Если Остатки > 0 Тогда
Текст = Текст + Символы.ПС + " В наличии: " + Формат(Остатки, "ЧДЦ=2; ЧГ=0; ЧРД=.");
КонецЕсли;
Результат.Текст = Текст;
Результат.Заголовок = СсылкаСтроки.Наименование;
Возврат Результат;
КонецФункции
Заключение: Зачем это все надо было?
Этим простым примером я хотел попробовать и продемонстрировать один из сценариев в среде платформы 8.5, конкретно на форме списка. Но главное даже не сам пример, а открываемые им возможности.
Представьте, что это не подсказка с остатками, а целая система контекстной информации, которую вы можете настроить под свои задачи (может она появится в какой-нибудь другой статье):
-
Разная информация — разным пользователям. Почему бы не подключить ролевую модель: бухгалтеру показывать данные по оплате, менеджеру — рейтинг и просрочку, а кладовщику — остатки и точные места хранения.
-
Расширенная аналитика. Для документа приобретения можно выводить не просто факт, а целую мини-инфографику: статус оплаты, расхождения при приемке, прикрепленные документы.
И это мы затронули только справочник номенклатуры. Механизм — своего рода плацдарм для фантазии. Скорее всего, с запуском полноценной релизной 8.5 1С сама добавит что-то подобное, но ничто не мешает нам уже сейчас творить удобные и нестандартные интерфейсы, копаясь в новшествах платформы.
Спасибо за внимание и всего доброго!
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.22.106
Вступайте в нашу телеграмм-группу Инфостарт