Ввод по строке (доработанный)

03.02.22

Разработка - Механизмы платформы 1С

Ввод по строке по дополнительным реквизитам. УТ 11.

При переходе с УТ 10.3 на УТ 11.4 столкнулись с проблемой ввода по строке при заполнении документов.

В УТ 11 есть дополнительные реквизиты, в то время как в УТ 10 мы добавляли реквизиты через конфигуратор в справочник "Номенклатура". в УТ 11 решили так не делать. А расширения дают нам возможность дорабатывать конфигурацию, не меняя её.

Нам нужно было как у нас в УТ 10 было, чтобы при вводе по строке в документы можно было добавлять номенклатуру не только по стандартным реквизитам, но и по дополнительным реквизитам тоже (ну и чтобы номенклатура искалась по любой части наименования).

Стал разбираться, как это реализовать, и разобрался. За ввод по строке отвечает 

Процедура НоменклатураОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

В общем модуле "НоменклатураВызовСервера"

Вывел эту процедуру в расширение с параметром "&Вместо" и дописал текст запроса, получилось вот это:
 

&Вместо("НоменклатураОбработкаПолученияДанныхВыбора")

Процедура Мод_НоменклатураОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Получим структуру возможных полей отбора справочника номенклатуры
    СтруктураРеквизитов = ЗначениеНастроекПовтИсп.РеквизитыСправочника("Номенклатура");
    
    Запрос        = Новый Запрос;
    СтрокаПоиска  = Параметры.СтрокаПоиска;
    УсловиеОтбора = "ИСТИНА";
    
    Для Каждого КлючИЗначениеОтбора Из Параметры.Отбор Цикл
        Если СтруктураРеквизитов.Свойство(КлючИЗначениеОтбора.Ключ) Тогда
            УсловиеОтбора = УсловиеОтбора + "
                |    И СпрНоменклатура." + КлючИЗначениеОтбора.Ключ + " В (&" + КлючИЗначениеОтбора.Ключ + ")";
            Запрос.УстановитьПараметр(КлючИЗначениеОтбора.Ключ,КлючИЗначениеОтбора.Значение);
        КонецЕсли;
    КонецЦикла;
    
    Если НЕ Параметры.Отбор.Свойство("ЭтоГруппа") И Параметры.Свойство("ВыборГруппИЭлементов") Тогда
        Если Параметры.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы Тогда
            УсловиеОтбора = УсловиеОтбора + "
                |    И СпрНоменклатура.ЭтоГруппа";
        ИначеЕсли Параметры.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы Тогда
            УсловиеОтбора = УсловиеОтбора + "
                |    И НЕ СпрНоменклатура.ЭтоГруппа";
        КонецЕсли;
    КонецЕсли;
    
    ТекстЗапроса =
    "ВЫБРАТЬ ПЕРВЫЕ 50
    |    СпрНоменклатура.Ссылка,
    |    СпрНоменклатура.Наименование КАК ПредставлениеСовпадения,
    |    0 КАК Порядок,
    |    СпрНоменклатура.Код КАК ПредставлениеНоменклатуры,
    |    СпрНоменклатура.ЭтоГруппа
    |ПОМЕСТИТЬ НоменклатураПоиск
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |ГДЕ
    |    СпрНоменклатура.Наименование ПОДОБНО &СтрокаПоиска
    |    И &УсловиеОтбора
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ ПЕРВЫЕ 50
    |    СпрНоменклатура.Ссылка,
    |    СпрНоменклатура.Код,
    |    1,
    |    СпрНоменклатура.Наименование,
    |    NULL
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |ГДЕ
    |    СпрНоменклатура.Код ПОДОБНО &СтрокаПоиска
    |    И &УсловиеОтбора
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ ПЕРВЫЕ 50
    |    СпрНоменклатура.Ссылка,
    |    СпрНоменклатура.Артикул,
    |    2,
    |    СпрНоменклатура.Наименование,
    |    NULL
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |ГДЕ
    |    СпрНоменклатура.Артикул ПОДОБНО &СтрокаПоиска
    |    И &УсловиеОтбора
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ ПЕРВЫЕ 50
    |    СпрНоменклатура.Ссылка,
    |    СпрНоменклатура.Значение,
    |    3,
    |    СпрНоменклатура.Свойство.Наименование,
    |    NULL
    |ИЗ
    |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК СпрНоменклатура
    |ГДЕ
    |    СпрНоменклатура.Значение ПОДОБНО &СтрокаПоиска
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    НоменклатураПоиск.Ссылка,
    |    МИНИМУМ(НоменклатураПоиск.Порядок) КАК Порядок
    |ПОМЕСТИТЬ НоменклатураПоПорядку
    |ИЗ
    |    НоменклатураПоиск КАК НоменклатураПоиск
    |
    |СГРУППИРОВАТЬ ПО
    |    НоменклатураПоиск.Ссылка
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 50
    |    НоменклатураПоиск.Ссылка КАК Ссылка,
    |    НоменклатураПоиск.Порядок КАК Порядок,
    |    НоменклатураПоиск.ПредставлениеСовпадения КАК ПредставлениеСовпадения,
    |    НоменклатураПоиск.ПредставлениеНоменклатуры КАК ПредставлениеНоменклатуры
    |ИЗ
    |    НоменклатураПоПорядку КАК НоменклатураПоПорядку
    |        ЛЕВОЕ СОЕДИНЕНИЕ НоменклатураПоиск КАК НоменклатураПоиск
    |        ПО НоменклатураПоПорядку.Ссылка = НоменклатураПоиск.Ссылка
    |            И НоменклатураПоПорядку.Порядок = НоменклатураПоиск.Порядок
    |
    |УПОРЯДОЧИТЬ ПО
    |    Порядок,
    |    ПредставлениеСовпадения,
    |    ПредставлениеНоменклатуры";
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбора" ,УсловиеОтбора);
    
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СтрокаПоиска + "%");
    
    ДанныеВыбора = Новый СписокЗначений;

    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        
        ТекстЗначения = СокрП(Выборка.ПредставлениеСовпадения) + " (" + Выборка.ПредставлениеНоменклатуры + ")";
        
        ЗначениеСписка = Новый Структура;
        ЗначениеСписка.Вставить("Значение", Выборка.Ссылка);
        //ЗначениеСписка.Вставить("ПометкаУдаления", Выборка.ПометкаУдаления);
    
        ДанныеВыбора.Добавить(ЗначениеСписка, ТекстЗначения);
        
    КонецЦикла;
КонецПроцедуры

 

И Вуаля, теперь в документах ввод по строке можно осуществлять по дополнительным реквизитам:


 

Где (SKU) является дополнительным реквизитом справочника "Номенклатура"

 

 

Разработано и протестировано на платформе:

:Предприятие 8.3 (8.3.19.1351)

Управление торговлей, редакция 11 (11.4.6.188)

P.S. Не судите строго, я не так давно начал всем этим заниматься и очень много чего не знаю. но если кому-то это пригодится как пример - замечательно, ну а если нет, то нет.

Если у вас, более опытных, есть какие-либо замечания или советы, буду рад почитать ваши комментарии!

Всем добра!

Ввод по строке Дополнительные реквизиты Поиск номенклатуры

См. также

Механизмы платформы 1С Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    5968    bayselonarrend    126    

59

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    7727    dsdred    57    

99

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    11442    bayselonarrend    21    

162

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    7827    dsdred    18    

82

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    26862    YA_418728146    33    

73
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. AnryMc 849 03.02.22 16:55 Сейчас в теме
Не проще ли добавить нужный реквизит к элементу в том же расширении? Тогда не нужно "переделывать" документ(ы). Т.е. "одна точка врезки", а не несколько



Хотя решение +
2. JoeQPublic 15 03.02.22 21:30 Сейчас в теме
(1)Если я правильно понимаю, Вы имеете ввиду добавить реквизит в номенклатуру расширением?
но поиск всё равно придётся допиливать, потому что стандартно есть только "код" "артикул" и "код для поиска"

P.S. Pа плюсик спасибо! это моя первая публикация(надеюсь что не последняя) и мне приятно)
3. AnryMc 849 04.02.22 09:28 Сейчас в теме
(2)
потому что стандартно есть только "код" "артикул" и "код для поиска"


Если реквизиту установить свойство "индексировать с дополнительным упорядочиванием", то он станет доступен для включения в поиск. Справочник вкладка "Поле ввода" - "Ввод по строке" - перенести его из "доступно для поиска" в "Выбранные поля"
и ниже "способ поиска строки": Начало/Любая часть (тоже иногда полезно поменять - т.к. обычно Начало)
4. JoeQPublic 15 04.02.22 11:35 Сейчас в теме
(3)
Понял, принял, буду знать) Благодарю!
P.S. Кстати по поводу "Начало/Любая часть", у меня вкючено "любая часть" а ищет всё равно с начала строки, собственно поэтому в этом расширении сдела вот это: "Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СтрокаПоиска + "%");" И стало отлично искать по любой части наименования)
5. triviumfan 99 07.02.22 11:53 Сейчас в теме
Много раз натыкался на такую реализацию.
Вот и сейчас плююсь, когда пытаюсь найти номенклатуру/автоработу по артикулу/коду в ожидании получить элемент за десятые секунды, а получается в районе 10 секунд.
Мне не нравится такое решение (я не лично про твоё, а в целом, когда при выборе происходит куча отборов и не достаточно простой запрос, плюс поиск по подобно не с начала строки сильно замедляет), особенно, когда номенклатуры у тебя порядка 1 млн.
В тестовой базе я вообще ОбработкаПолученияДанныхВыбора() удаляю.
native-api; +1 Ответить
6. JoeQPublic 15 07.02.22 14:00 Сейчас в теме
(5)Да, я тебя прекрасно понимаю, скорость поиска оставляет желать лучшего. у нас в базе 300к+ позиций, на поиск уходит несколько секунд. Я согласен что это решение далеко от идеала, но в силу своих знаний я для себя нашел такое решение. По данной теме я вообще никакой толковой информации в интернете не нашел, поэтому буду жить пока что с этим=)
Возможно однажды я наберусь опыта и найду решение более оптимальное и производительное.
Но за критику спасибо=)
7. Pim 189 30.04.23 08:40 Сейчас в теме
(3) Добрый день. Вы уверены, что в расширяемом справочнике можно изменять "Ввод по строке"? Я не нашёл такой возможности. Расширяемый объект не открывается в виде диалоге, а в свойствах "справа" нет нужного пункта.
Оставьте свое сообщение