Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> В якій процедурі проходить стандарне заповнення випадаючого списку номенклатури?          
kostya77 Подменю пользователя
сообщение 29.05.25, 13:24
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

Добрий ден. Підкажіть, в якій процедурі проходить стандарне заповнення випадаючого списку номенклатури, при введенні декількох букв

як підмінити стандартну процедуру і заповнити спиок своїми данними?

Сообщение отредактировал kostya77 - 29.05.25, 13:26

andytg Подменю пользователя
сообщение 29.05.25, 14:19
Сообщение #2

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

kostya77 @ Сегодня, 14:24 * ,
в свойствах элемента формы включаете галку РежимВыбораИзСписка = Истина
обработчик событий НачалоВыбора

дальше так:
(на примере выбора только услуг в качестве номенклатуры)

&НаСервереБезКонтекста
Функция РасходыНоменклатураНачалоВыбораНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Ссылка КАК Ссылка
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    Номенклатура.Наименование УБЫВ";
    
    тбУслуг = Новый ТаблицаЗначений;
    тбУслуг = Запрос.Выполнить().Выгрузить();
    
    спУслуг = Новый СписокЗначений;
    
    спУслуг.ЗагрузитьЗначения(тбУслуг.ВыгрузитьКолонку("Ссылка"));
    
    Возврат спУслуг;
    
КонецФункции

&НаКлиенте
Процедура РасходыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    спУслуг = РасходыНоменклатураНачалоВыбораНаСервере();
    
    Если Не спУслуг.Количество() = 0 Тогда
        ЭтаФорма.Элементы.РасходыНоменклатура.РежимВыбораИзСписка = Истина;
        ЭтаФорма.Элементы.РасходыНоменклатура.СписокВыбора.ЗагрузитьЗначения(спУслуг.ВыгрузитьЗначения());
    Иначе
        ЭтаФорма.Элементы.РасходыНоменклатура.РежимВыбораИзСписка = Ложь;
    КонецЕсли;
    
КонецПроцедуры

kostya77 Подменю пользователя
сообщение 29.05.25, 14:25
Сообщение #3

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

andytg @ Сегодня, 15:19 * ,
РежимВыбораИзСписка = Истина якщо включу цей режим, то пропаде стандартна можливість відкриття списка довідника номенклатури

andytg Подменю пользователя
сообщение 29.05.25, 14:28
Сообщение #4

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

kostya77 @ Сегодня, 15:25 * ,
так вы хотите свой список туда формировать или подменять то, что пользователь выбирал ранее (историю выбора)?

kostya77 Подменю пользователя
сообщение 29.05.25, 14:37
Сообщение #5

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

andytg @ Сегодня, 15:28 * ,
Свой список, но чтобы остались стандартные функции

andytg @ Сегодня, 15:28 * ,
а как можно почистить историю?

мне нужно стобы когда пользователь вводит начальные буквы наименования ноенклатуры список выбора заполнялся по условия. Вот меня интересует в какой процедуре сделать заполнение этого списка?

[необходимо зарегистрироваться для просмотра ссылки] вот пример

andytg Подменю пользователя
сообщение 29.05.25, 14:53
Сообщение #6

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(kostya77 @ 29.05.25, 15:37) *
мне нужно стобы когда пользователь вводит начальные буквы наименования ноенклатуры список выбора заполнялся по условия. Вот меня интересует в какой процедуре сделать заполнение этого списка?

это так работает быстрый поиск (полнотекстовый поиск данных), когда индексы ППД поломаны -- там ничего не ищется или ищется, но не все

как почистить/отключить -- вот [необходимо зарегистрироваться для просмотра ссылки]

TohaMonster Подменю пользователя
сообщение 29.05.25, 15:14
Сообщение #7

Говорящий
***
Группа: Пользователи
Сообщений: 91
Спасибо сказали: 38 раз
Рейтинг: 38

kostya77 @ Сегодня, 14:24 * ,

Посмотрите на событие "Автоподбор" элемента.
Вот как можно выполнять поиск по любой части строки (не только по первым символам). Придумано не мной, где-то нашел

Процедура НашЭлементПоискаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
    
    ТекстПоиска = ВРег(Текст);
    
    Пока СтрНайти(ТекстПоиска, "  ") > 0 Цикл
        ТекстПоиска = СтрЗаменить(ТекстПоиска, "  ", " ");
    КонецЦикла;
    
    ТекстПоиска = СокрЛП(ТекстПоиска);
    
    ДлинаТекста = СтрДлина(ТекстПоиска);
    Если ДлинаТекста = 0 Тогда
        Возврат
    КонецЕсли;
    
    СтандартнаяОбработка = Ложь;
    
    Шрифт = Новый Шрифт(,,Истина);
    Цвет = WebЦвета.Зеленый;
    
    ДанныеВыбора = Новый СписокЗначений;
    
    МассивПодстрок = СтрРазделить(ТекстПоиска, " ");
    
    Для Каждого Стр Из Элемент.СписокВыбора Цикл
        
        Строка = Стр.Значение;
        СтрокаВРег = ВРег(Строка);
        
        ВхожденияНайдены = Истина;
        
        Для Каждого Подстрока Из МассивПодстрок Цикл
            Если Найти(СтрокаВРег, Подстрока) = 0 Тогда
                ВхожденияНайдены = Ложь;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        Если Не ВхожденияНайдены Тогда
            Продолжить
        КонецЕсли;
        
        ДлинаСтроки = СтрДлина(Строка);
        Массив = Новый Массив(ДлинаСтроки);
        
        Для Каждого Подстрока Из МассивПодстрок Цикл
            ДлинаПодстроки = СтрДлина(Подстрока);
            НачалоПоиска = 1;            
            Пока Истина Цикл
                ПозицияПодстроки = СтрНайти(СтрокаВРег, Подстрока, , НачалоПоиска);
                Если ПозицияПодстроки = 0 Тогда
                    Прервать;
                КонецЕсли;
                
                НачалоПоиска = ПозицияПодстроки + ДлинаПодстроки;
                
                Для Сч = ПозицияПодстроки По НачалоПоиска - 1 Цикл
                    Массив[Сч - 1] = Истина;
                КонецЦикла;                
                
                Если НачалоПоиска > ДлинаСтроки Тогда
                    Прервать;
                КонецЕсли;
                
            КонецЦикла;            
        КонецЦикла;
        
        МассивСтрок = Новый Массив;        
        Для Сч = 0 По Массив.ВГраница() Цикл
            Символ = Сред(Строка, Сч + 1, 1);
            Если Массив[Сч] = Неопределено Тогда
                МассивСтрок.Добавить(Символ);
            Иначе
                МассивСтрок.Добавить(Новый ФорматированнаяСтрока(Символ, Шрифт, Цвет));
            КонецЕсли;
        КонецЦикла;
        
        ДанныеВыбора.Добавить(Строка, Новый ФорматированнаяСтрока(МассивСтрок));
        
        Если ДанныеВыбора.Количество() = 50 Тогда
            Прервать
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

AnryMc Подменю пользователя
сообщение 29.05.25, 15:33
Сообщение #8

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 522
Спасибо сказали: 136 раз
Рейтинг: 137.4

Цитата(kostya77 @ 29.05.25, 14:37) *
Свой список, но чтобы остались стандартные функции


?????????????????????????????

Либо стандартные - либо свои

З.Ы, Для стандартных
Справочник Номенклатура
Закладка - Поле ввода
Параметы:
- Ввод по строке - Наименование, Код.... (индексируемые)
- Способ поиска - По началу или Любая часть (нюанс - любая часть но с начала после пробела)
- История выбора при вводе

Сообщение отредактировал AnryMc - 29.05.25, 15:40


Signature
Я можу зробити цю роботу:
- Швидко
- Якісно
- Дешево

Виберіть 2 будь-які пункти

andytg Подменю пользователя
сообщение 29.05.25, 15:58
Сообщение #9

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(TohaMonster @ 29.05.25, 16:14) *
Вот как можно выполнять поиск по любой части строки (не только по первым символам). Придумано не мной, где-то нашел

в свое время (20 лет назад) делал такое на 1С++ в комплексной для Украины 7.7, точнее, переделывал, т.к. мой предшественник сделал такое на рэйнбоу, но оно тормозило от больших объемов данных, в номенклатурном справочнике где-то более 150 тыс. наименований (это всего, не все они живые, но что есть то есть)
отдельная форма подбора, в ней запросами с использованием шаблонов "%" и "_" (и автозамен типа "*" -> "%") формируется строка поиска и далее запускается прямой запрос, который выгружает все в таблицу значений (со всевозможными там пересчетами и т.д.), откуда манагер уже выбирает нужные позиции, при переносе в документ автоматически заполняются все другие параметры (цены, количества, партии и т.д.)
потом было перенесено в УНФ и переписано на 8.3, не меняя самого принципа работы (и уже без 1с++, естественно wink.gif)
работает практически с абсолютно любыми количествами элементов в выборке, скорость поиска -- пару секунд

концепция выглядит так:


Сообщение отредактировал Vofka - 30.05.25, 9:03

AnryMc Подменю пользователя
сообщение 30.05.25, 7:30
Сообщение #10

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 522
Спасибо сказали: 136 раз
Рейтинг: 137.4

andytg @ Вчера, 15:58 * ,

Делал:

1) VBScript.RegExp - довольно быстро

    МойОтбор1 = Новый СписокЗначений;
    
    Если ОдноЧисло Тогда
        
        СтрокаШаблона = "ЧЧЧ1\s{0,2}[mм][mм].?";
        
    Иначе
        
        СтрокаШаблона = "ЧЧЧ1\s{0,2}[xх\*\/]\s{0,2}ЧЧЧ2\s{0,2}[mм][mм].?";
        
    КонецЕсли;
    
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.MultiLine = ЛОЖЬ; //Многострочный
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Истина; //Регистр верхний/нижний или не учитывать

/////////////////////////////

    RegExp.Pattern = СокрЛП(СтрокаШаблона);
    
    ВыборкаПродуктов = Справочники.Продукт.Выбрать();
    
    Пока ВыборкаПродуктов.Следующий() Цикл
        
        Matches=RegExp.Execute(СокрЛП(ВыборкаПродуктов.Наименование));
        
        Если Matches.Count > 0 Тогда
            
            МойОтбор1.Добавить(ВыборкаПродуктов.Ссылка);
            
        КонецЕсли;
        
    КонецЦикла;
    
    НовыйЗапрос = РеквизитТекстЗапроса + "
    |ГДЕ
    |СправочникПродукт.Ссылка В(&МойОтбор1)";
    
    Список.ПроизвольныйЗапрос = Истина;
    Список.ТекстЗапроса = НовыйЗапрос;
    Список.ОсновнаяТаблица = Список.ОсновнаяТаблица;
    Список.ДинамическоеСчитываниеДанных = Истина;
    
    Список.Параметры.УстановитьЗначениеПараметра("МойОтбор1", МойОтбор1);


2) Запрос - ПОДОБНО - довольно тормознуто
    Запрос.УстановитьПараметр("ИскомоеСодержимое", "%"+СокрЛП(ПоискПоИзвлеченномуТексту)+"%");


3) Нечеткий поиск - средненько, но терпимо
    Для каждого тек Из тз_Отбора Цикл
        
        НаимСЖ=СтрокаСжать(тек.Наименование);          
        Нашли="";
        
        РезТек=НечеткоеСравнение(НаимСЖ,ИскСЖ,Нашли,Ранг);
        
        РезТек=2*РезТек-СтрДлина(Нашли);
        РезТек=Цел(100*РезТек/СтрДлина(ИскСЖ));
        
        Если РезТек >= Достоверность Тогда
            
            ДобавитьВРезультаты(Нашли,РезТек, Результаты2, тек.Ссылка, тЭлем, Искомое);
            
        КонецЕсли;
        
        Если ТекущаяДата()>=Лимит Тогда
            
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "ПРЕРВАНО! Перевищено тайм-аут!";
            Сообщение.Сообщить();
            
            Прервать;
            
        КонецЕсли;    
        
    КонецЦикла;

//***************************
&НаСервере
Функция НечеткоеСравнение(Строка1,Строка2,Строка3,Ранг=0)
    
    Дл=СтрДлина(Строка2);
    
    Если Строка1=Строка2 Тогда
        
        Если Строка3="" Тогда Строка3=Строка1 Иначе Строка3=Строка3+","+Строка1 КонецЕсли;
        
        Возврат(Дл);
        
    КонецЕсли;
    
    Огр=Цел(Дл/10); Если Огр>2 Тогда Огр=2 КонецЕсли;
    От=0;
    
    Если Ранг>0 Тогда
        
        От=Дл-Ранг;
        
    КонецЕсли;
    
    Для Сч1=От По Дл-2 Цикл
        
        Для Сч2=1 По Сч1+1 Цикл
            
            Иск=Сред(Строка2,Сч2,Дл-Сч1);
            
            Если(Найти(Строка1,Иск)<>0) Тогда
                
                Рез=СтрДлина(Иск);
                
                Если Строка3="" Тогда
                    
                    Строка3=Иск;
                    
                Иначе
                    
                    Строка3=Строка3+","+Иск;
                    
                КонецЕсли;    
                
                Если (Рез>Огр) или ((Строка3<>Иск) и (Рез>2)) Тогда
                    
                    Стр1=СтрЗаменить(Строка1,Иск,"");
                    Стр2=СтрЗаменить(Строка2,Иск,"");               
                    Рез1=НечеткоеСравнение(Стр1,Стр2,Строка3,Рез);      
                    Рез=Рез+Рез1;
                    
                КонецЕсли;
                
                Возврат(Рез);
                
            КонецЕсли;
            
        КонецЦикла;
        
    КонецЦикла;
    
    Возврат(0);
    
КонецФункции


Другой вариант - тоже терпимо
    ТекстПоиск = "0";
    
    Для Индекс = 1 По ДлинаСтроки - 3 Цикл
        
        ТекстПоиск = ТекстПоиск + " + ВЫБОР КОГДА ИсточникДанных." + ИмяРеквизит + " ПОДОБНО ""%" + Сред(СтрокаПоиска, Индекс, 3) + "%"" ТОГДА 1 ИНАЧЕ 0 КОНЕЦ";
        
    КонецЦикла;
    
    ТекстДерево = Дерево("ИсточникДанных." + ИмяРеквизит, -1, 300);
    
    ТекстРанг = "ВЫБОР КОГДА ПОДСТРОКА(ИсточникДанных." + ИмяРеквизит + ", " + (ДлинаСтроки + 1) + ", 3) = """" ТОГДА " + ДлинаСтроки + " ИНАЧЕ " + ТекстДерево + " КОНЕЦ";
    
    Запрос = Новый Запрос;
    
    Запрос.Текст = "
    |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 500
    |    ИсточникДанных.Ссылка КАК Ссылка,
    |    ИсточникДанных." + ИмяРеквизит + " КАК Реквизит,
    |    100*(" + ТекстПоиск + ")/(" + ТекстРанг + " - 2) КАК Ранг
    //|ИЗ " + ЭтаФорма.ИмяИсточникДанных + " КАК ИсточникДанных
    |ИЗ Справочник.Продукт КАК ИсточникДанных
    |ГДЕ " + ТекстПоиск + " > 0
    |УПОРЯДОЧИТЬ ПО
    |    Ранг УБЫВ";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Выборка = РезультатЗапроса.Выбрать();
    
    Результат = "<html><body><table><tr><td><b>Ранг</b></td><td><b>Найденная строка<b></td></tr>";
    
    Пока Выборка.Следующий() Цикл
        
        Индекс = 1;
        НайденнаяСтрока = Выборка.Реквизит;
        
        Пока Индекс < ДлинаСтроки Цикл
            
            Длина = 2;
            
            Пока Индекс + Длина <= ДлинаСтроки Цикл
                
                Если Найти(НайденнаяСтрока, Сред(СтрокаПоиска, Индекс, Длина + 1)) > 0 Тогда
                    
                    Длина = Длина + 1;
                    
                Иначе
                    
                    Прервать;
                    
                КонецЕсли;
                
            КонецЦикла;
            
            Если Длина > 2 Тогда
                
                Подстрока = Сред(СтрокаПоиска, Индекс, Длина);
                НайденнаяСтрока = СтрЗаменить(НайденнаяСтрока, Подстрока, "<b>" + Подстрока + "</b>");
                
            Иначе
                
                Длина = 0;
                
            КонецЕсли;
            
            Индекс = Индекс + Длина + 1;
            
        КонецЦикла;
        
        Результат = Результат + "<tr><td><button id=" + ЗначениеВСтрокуВнутр(Выборка.Ссылка) + ">...</button>&nbsp;";
        Результат = Результат + Цел(Выборка.Ранг);
        Результат = Результат + "</td><td>";
        Результат = Результат + НайденнаяСтрока;
        Результат = Результат + "</td></tr>";
        
    КонецЦикла;
    
    Результат = Результат + "</table></body></html>";





Signature
Я можу зробити цю роботу:
- Швидко
- Якісно
- Дешево

Виберіть 2 будь-які пункти

Спасибо сказали: andytg,

kostya77 Подменю пользователя
сообщение 30.05.25, 8:00
Сообщение #11

Завсегдатай
****
Группа: Пользователи
Сообщений: 205
Спасибо сказали: 7 раз
Рейтинг: 6

Всем спасибо. Буду разбираться

andytg Подменю пользователя
сообщение 30.05.25, 9:32
Сообщение #12

Общительный
**
Группа: Пользователи
Сообщений: 31
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 7

Цитата(AnryMc @ 30.05.25, 8:30) *
Запрос - ПОДОБНО - довольно тормознуто

у меня сделано через ПОДОБНО, но основной выбор идет исключительно из справочника номенклатуры, без обработки остатков (просто показываем, что есть в справочнике
по заданному шаблону, минимальная длина шаблона ограничена тремя символами, чтоб они случайно в результирующую таблицу не вывалили весь справочник smile.gif)
а потом при перемещении курсора по отбору в активной строке обрабатывается событие ПриАктивизацииСтроки -- и тогда манагеру (через обработчик ожидания) показыватюся фактические остатки по данной позиции в разрезе складов\партий и т.д., откуда он уже может либо выбрать товар клиенту из фактического наличия или оформить заказ поставщику из того, что было когда-то, но сейчас нет в наличии

на прямых запросах и t-sql в клюшках вообще летало, на восьмерке скорость где-то такая же, пару секунд (зависит от размера выборки, конечно, но манагеры обычно не ищут абы что, а по конкретным шаблонам, как на скрине, получается практически моментально

изначально концепция родилась из того, что в оригинальном варианте на клюшках подбор шел не только из номенклатурного справочника, а еще одновременно и из справочника прайсов внешних поставщиков, которых еще не было в справочнике номенклатуры, тогда в случае выбора элемента, отсутствующего в номенклатурном справочнике (но имеющемся в справочнике прайсов сторонних поставщиков), при выборе элемент сперва добавлялся в справочник товаров, а потом уже выбирался, а в восьмерке я просто разрешил им создавать новые элементы самостоятельно, опять же по шаблону и с проверками на возможные дубли

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 13.06.25, 20:43
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!