В конфигурации 1С:Управление производственным предприятием (УПП) 1.3 часто возникает ситуация, когда в справочнике Номенклатура хранятся позиции, предназначенные исключительно для обмена с сайтом или для технических нужд. Эти позиции не должны выбираться пользователями в первичных документах (Заказ покупателя, Реализация товаров и услуг и др.). Однако даже если вы настроили фильтр в форме выбора, при вводе названия товара текстом прямо в ячейку табличной части срабатывает стандартный механизм автоподбора, который все равно предлагает "запрещенные" элементы. Проанализируем, как полностью исключить такую номенклатуру из интерфейса ввода.
Когда мы устанавливаем отбор в форме выбора (которая открывается по кнопке с тремя точками), это влияет только на саму форму списка. Но механизм "Ввода по строке" работает иначе. Он инициируется платформой в момент паузы при наборе текста или при нажатии клавиши "Сниз" в поле ввода. Стандартная обработка этого события обращается напрямую к базе данных, игнорируя настройки, сделанные вами в форме выбора. Для решения задачи нам необходимо вмешаться в сам процесс формирования списка подсказок.
Рассмотрим основной программный метод — использование события АвтоПодбор у элемента управления (поля ввода) в колонке табличной части. Это событие позволяет нам перехватить введенный текст, самостоятельно выполнить запрос к базе данных с нужными фильтрами и подсунуть системе свой список значений.
Алгоритм реализации:
Номенклатура.АвтоПодбор.СтандартнаяОбработка = Ложь, чтобы система не запускала свой поиск.Пример кода для реализации фильтрации (в контексте обычных форм УПП):
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
// Отключаем системный поиск
СтандартнаяОбработка = Ложь;
// Если текст слишком короткий, не нагружаем базу
Если СтрДлина(Текст) < 3 Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 50
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Представление КАК Представление
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &ТекстПоиска
| И Номенклатура.ВидНоменклатуры <> &ВидИсключение
| И НЕ Номенклатура.ПометкаУдаления";
Запрос.УстановитьПараметр("ТекстПоиска", "%" + Текст + "%");
Запрос.УстановитьПараметр("ВидИсключение", Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Для сайта"));
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Список = Новый СписокЗначений;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Список.Добавить(Выборка.Ссылка, Выборка.Представление);
КонецЦикла;
// Передаем сформированный список платформе для отображения
ДанныеВыбора = Список;
КонецЕсли;
КонецПроцедуры
Важный нюанс: В параметре ДанныеВыбора можно передавать не просто ссылки, а структуры. Это позволит добавить дополнительные подсказки пользователю (например, выводить артикул рядом с названием).
Если программная переписка автоподбора кажется слишком сложной или в документе много табличных частей, можно применить стратегию "пост-фильтрации". Мы позволяем пользователю выбрать товар, но если он не соответствует критериям, сразу очищаем поле и выводим предупреждение.
Разберем, как это реализовать в событии ПриИзменении:
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТЧ = ЭлементыФормы.Товары.ТекущаяСтрока;
Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
// Проверяем вид номенклатуры
Если СтрокаТЧ.Номенклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Для сайта") Тогда
// Сообщаем пользователю об ошибке
ОбщегоНазначения.СообщитьОбОшибке("Выбранная номенклатура предназначена только для сайта и недоступна для продажи!");
// Очищаем значение
СтрокаТЧ.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот метод менее элегантен с точки зрения интерфейса (пользователь уже совершил действие), но он является гарантированным барьером, который не позволит провести документ с некорректными данными.
В некоторых случаях (если используется платформа 8.3 и формы, поддерживающие расширение параметров выбора), можно обойтись без кода. Проанализируем свойства поля в конфигураторе:
Номенклатура в табличной части.Отбор.ВидНоменклатуры(Не в списке/Не равно).Внимание: В обычных формах УПП 1.3 это свойство часто ограничено. Если оно не дает нужного эффекта при вводе текстом, используйте Связи параметров выбора. Это заставит систему всегда учитывать контекст при поиске по строке.
Рассмотрим "быстрый" административный метод. Если программирование по каким-то причинам недоступно, можно изменить наименования "сайтовых" позиций, добавив в начало спецсимвол (например, _ или ~). Например: ~Подогреватель электрический.
Поскольку стандартный поиск обычно работает по вхождению первых букв, пользователь, набирая слово "Подогреватель", не увидит в топе списка позиции, начинающиеся с символа ~. Это не технический запрет, но эффективный способ снизить количество случайных ошибок в 90% случаев.
Для качественной настройки системы в УПП 1.3 мы рекомендуем комбинировать методы:
АвтоПодбор для удобства пользователя (чтобы лишнее не мешало поиску).ПередЗаписью документа или в ПриИзменении номенклатуры, чтобы исключить ввод запрещенных позиций копированием или через подбор.ВидНоменклатуры.Выполнив эти шаги, вы добьетесь того, что номенклатура для обмена с сайтом перестанет "мусорить" в рабочих документах менеджеров, сохраняя при этом целостность базы данных и корректность выгрузок.