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

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 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    8930    bayselonarrend    20    

157

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

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

13.03.2024    6667    dsdred    18    

80

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

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

24.01.2024    20842    YA_418728146    26    

73

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24649    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15821    YA_418728146    8    

170
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 97 07.02.22 11:53 Сейчас в теме
Много раз натыкался на такую реализацию.
Вот и сейчас плююсь, когда пытаюсь найти номенклатуру/автоработу по артикулу/коду в ожидании получить элемент за десятые секунды, а получается в районе 10 секунд.
Мне не нравится такое решение (я не лично про твоё, а в целом, когда при выборе происходит куча отборов и не достаточно простой запрос, плюс поиск по подобно не с начала строки сильно замедляет), особенно, когда номенклатуры у тебя порядка 1 млн.
В тестовой базе я вообще ОбработкаПолученияДанныхВыбора() удаляю.
native-api; +1 Ответить
6. JoeQPublic 15 07.02.22 14:00 Сейчас в теме
(5)Да, я тебя прекрасно понимаю, скорость поиска оставляет желать лучшего. у нас в базе 300к+ позиций, на поиск уходит несколько секунд. Я согласен что это решение далеко от идеала, но в силу своих знаний я для себя нашел такое решение. По данной теме я вообще никакой толковой информации в интернете не нашел, поэтому буду жить пока что с этим=)
Возможно однажды я наберусь опыта и найду решение более оптимальное и производительное.
Но за критику спасибо=)
7. Pim 186 30.04.23 08:40 Сейчас в теме
(3) Добрый день. Вы уверены, что в расширяемом справочнике можно изменять "Ввод по строке"? Я не нашёл такой возможности. Расширяемый объект не открывается в виде диалоге, а в свойствах "справа" нет нужного пункта.
Оставьте свое сообщение