При разработке пользовательских интерфейсов в 1С:Предприятие 8.3 часто возникает задача оптимизации процесса подбора товаров в документы. Стандартное поведение, когда товар переносится в документ простым двойным кликом, не всегда удобно для бухгалтера или менеджера. Чаще всего требуется, чтобы система сначала запросила количество, а в идеале — показала текущую цену и остатки. В этой статье мы подробно разберем, как изменить логику обработки подбора, чтобы по «двойному тыку» открывалось окно ввода данных.
Первым делом нам необходимо определить, где именно перехватывать действие пользователя. В управляемых формах 1С для таблиц (в нашем случае — список номенклатуры в обработке подбора) существует событие Выбор. Оно срабатывает как при двойном щелчке мыши, так и при нажатии клавиши Enter.
Рассмотрим важный нюанс: если мы просто напишем свой код в этом событии, система может параллельно попытаться выполнить стандартное действие. Чтобы этого избежать, в процедуре-обработчике первым делом нужно установить параметр СтандартнаяОбработка в значение Ложь. Проанализируем пример кода для этого события:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартный перенос номенклатуры
СтандартнаяОбработка = Ложь;
// Получаем данные текущей строки
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Здесь мы будем вызывать наше окно ввода
ВызватьОкноВводаКоличества(ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
Если вам нужно максимально быстрое решение без создания новых форм, мы рекомендуем использовать встроенный метод платформы ПоказатьВводЧисла. Поскольку современные конфигурации работают в немодальном режиме, мы не можем просто остановить выполнение кода и ждать ответа пользователя. Нам потребуется использовать ОписаниеОповещения.
Разберем по шагам, как это работает. Мы создаем объект, который «запоминает», какую процедуру нужно вызвать после того, как пользователь нажмет «ОК» в появившемся окне. В дополнительные параметры этого объекта мы передадим ссылку на выбранную номенклатуру, чтобы не «потерять» её.
&НаКлиенте
Процедура ВызватьОкноВводаКоличества(НоменклатураСсылка)
// Подготавливаем структуру с данными для последующей обработки
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Номенклатура", НоменклатураСсылка);
// Описываем, куда программа должна вернуться после ввода числа
Оповещение = Новый ОписаниеОповещения("ПослеВводаКоличества", ЭтотОбъект, ДополнительныеПараметры);
// Вызываем системное диалоговое окно
ПоказатьВводЧисла(Оповещение, 1, "Введите количество для: " + НоменклатураСсылка, 10, 3);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаКоличества(Результат, ДополнительныеПараметры) Экспорт
// Проверяем, ввел ли пользователь число или нажал Отмена
Если Результат <> Неопределено И Результат > 0 Тогда
// Формируем структуру данных для передачи в документ
ДанныеВыбора = Новый Структура;
ДанныеВыбора.Вставить("Номенклатура", ДополнительныеПараметры.Номенклатура);
ДанныеВыбора.Вставить("Количество", Результат);
// Оповещаем форму документа о сделанном выборе
ОповеститьОВыборе(ДанныеВыбора);
КонецЕсли;
КонецПроцедуры
Часто бухгалтеры просят, чтобы в окне ввода была видна не только номенклатура, но и её артикул, остаток на складе и цена. В этом случае возможностей ПоказатьВводЧисла недостаточно. Рассмотрим создание вспомогательной формы ФормаВводаКоличества внутри вашей обработки.
Выясним преимущества этого подхода. Вы можете настроить фокус на поле ввода, чтобы пользователю не приходилось лишний раз использовать мышь. Как только форма открывается, курсор уже стоит в поле «Количество», пользователь набирает цифры, жмет Enter, и окно закрывается.
Алгоритм действий будет следующим:
ФормаВводаКоличества.Номенклатура (декорация или поле надписи), Количество (число), Цена.Выбор вызываем открытие этой формы:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Номенклатура", ТекущиеДанные.Ссылка);
ПараметрыФормы.Вставить("Цена", ТекущиеДанные.Цена); // Если цена есть в списке
// Открываем форму в режиме диалога
ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.ФормаВводаКоличества",
ПараметрыФормы,
ЭтотОбъект); // ЭтотОбъект станет владельцем, который поймает ОповеститьОВыборе
КонецПроцедуры
В самой форме ввода на кнопке «ОК» (или в обработчике нажатия Enter) пропишем возврат данных:
&НаКлиенте
Процедура КомандаОК(Команда)
Результат = Новый Структура;
Результат.Вставить("Номенклатура", Объект.Номенклатура);
Результат.Вставить("Количество", Объект.Количество);
// Передаем данные обратно в форму подбора
ОповеститьОВыборе(Результат);
// Закрываем текущее маленькое окно
Закрыть();
КонецПроцедуры
После того как мы получили количество (через системное окно или свою форму), данные находятся в обработке подбора. Теперь их нужно «пробросить» в сам документ (например, РеализацияТоваровУслуг или ПоступлениеТоваровУслуг). Для этого используется механизм ОповеститьОВыборе.
Проанализируем ситуацию: когда вы вызываете ОповеститьОВыборе(ДанныеВыбора) из формы подбора, в форме документа срабатывает событие ОбработкаВыбора. Именно там происходит добавление новой строки в табличную часть Товары.
Важный совет: всегда передавайте данные в виде структуры. Это позволит вам в будущем легко добавить передачу единицы измерения, ставки НДС или характеристик товара без переписывания всей логики взаимодействия форм.
Чтобы ваш подбор действительно понравился пользователям, обратим внимание на следующие детали:
Автологин или в событии ПриОткрытии явно укажите ЭтаФорма.ТекущийЭлемент = Элементы.Количество;.ПоказатьПредупреждение, но не закрывайте окно ввода, давая шанс исправиться.Используя предложенные методики, вы сможете трансформировать стандартный подбор в удобный инструмент, который минимизирует количество лишних движений пользователя и снижает риск ошибок при вводе данных.