База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как корректно реализовать и использовать процедуру А_ПолучитьСписок(Текст) в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 11 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
3 июля 2026 в 14:14 #38038
вот код процедуры А_ПолучитьСписок(Текст)
«&НаСервере
Процедура А_ПолучитьСписок(Текст)Объект.А_ПолеПоиска = Текст;
СписокНайденного.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ ПЕРВЫЕ 25
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
| ЕСТЬNULL(Штрихкоды.Штрихкод, «»»») КАК Штрихкод
|ПОМЕСТИТЬ втХарактеристики
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Склад = &Склад
| И Номенклатура.Наименование ПОДОБНО &Наименование) КАК ТоварыНаСкладахОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
| ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| И ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
| ПО ТоварыНаСкладахОстатки.Характеристика = Штрихкоды.Характеристика
| И ТоварыНаСкладахОстатки.Номенклатура = Штрихкоды.Владелец
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втХарактеристики.Характеристика КАК Характеристика
|ПОМЕСТИТЬ втХарактеристикиПосле
|ИЗ
| втХарактеристики КАК втХарактеристики
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втХарактеристикиПосле.Характеристика КАК Характеристика,
| втХарактеристикиПосле.Характеристика.ор_МаркируемыйТовар КАК Характеристикаор_МаркируемыйТовар
|ПОМЕСТИТЬ втХарМарка
|ИЗ
| втХарактеристикиПосле КАК втХарактеристикиПосле
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| втХарактеристики.Номенклатура КАК Номенклатура,
| втХарактеристики.Цена КАК Цена,
| втХарактеристики.КоличествоОстаток КАК КоличествоОстаток,
| втХарактеристики.Характеристика КАК Характеристика,
| втХарактеристики.Штрихкод КАК Штрихкод,
| ЕСТЬNULL(втХарМарка.Характеристикаор_МаркируемыйТовар, ЛОЖЬ) КАК МаркируемыйТовар
|ИЗ
| втХарактеристики КАК втХарактеристики
| ЛЕВОЕ СОЕДИНЕНИЕ втХарМарка КАК втХарМарка
| ПО втХарактеристики.Характеристика = втХарМарка.Характеристика
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура
|АВТОУПОРЯДОЧИВАНИЕ»;МассивИзСтроки = СтрРазделить(Текст, » «);
Текст1 = «»;
Текст2 = «»;
Текст3 = «»;
Текст4 = «»;
Попытка
Текст1 = МассивИзСтроки[0];
Исключение
КонецПопытки;
Попытка
Текст2 = МассивИзСтроки[1];
Исключение
КонецПопытки;
Попытка
Текст3 = МассивИзСтроки[2];
Исключение
КонецПопытки;
Попытка
Текст4 = МассивИзСтроки[3];
Исключение
КонецПопытки;Запрос.УстановитьПараметр(«Склад», Объект.Магазин.СкладПродажи);
Запрос.УстановитьПараметр(«ВидЦены», Объект.Магазин.ПравилоЦенообразования.ВидЦен);
Запрос.УстановитьПараметр(«Наименование»,»%» + Текст1 + «%» + Текст2 + «%» + Текст3 + «%» + Текст4 + «%»);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();Для каждого СтрокаТЗ из РезультатЗапроса Цикл
НоваяСтрока = СписокНайденного.Добавить();
НоваяСтрока.Номенклатура = СтрокаТЗ.Номенклатура;
НоваяСтрока.Цена = СтрокаТЗ.Цена;
НоваяСтрока.Остаток = СтрокаТЗ.КоличествоОстаток;
НоваяСтрока.Характеристика = СтрокаТЗ.Характеристика;
НоваяСтрока.Штрихкод = СтрокаТЗ.Штрихкод;
НоваяСтрока.ЕдИзм = Строка(СтрокаТЗ.Номенклатура.ЕдиницаИзмерения);
Если СтрокаТЗ.МаркируемыйТовар Тогда
мМаркировка = «[М]»;
Иначе
мМаркировка = «»;
КонецЕсли;
НоваяСтрока.МаркируемыйТовар = мМаркировка;КонецЦикла;
Если Текст = «» Тогда
СписокНайденного.Очистить();
КонецЕсли;
КонецПроцедуры
« -
3 июля 2026 в 14:14 #38039
Код процедуры А_ПолучитьСписок(Текст) написан грамотно, но есть несколько важных моментов, которые нужно проверить и учесть, чтобы всё работало корректно:
1. Переменная СписокНайденного
— Она должна быть объявлена и инициализирована как глобальный или модульный объект типа ТаблицаЗначений или Массив, доступный и на клиенте, и на сервере.
— Если это ТаблицаЗначений, то перед вызовом процедуры нужно её создать, например:1С (Код)12345678СписокНайденного = Новый ТаблицаЗначений;СписокНайденного.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("Справочник.Номенклатура"));СписокНайденного.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));СписокНайденного.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));СписокНайденного.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("Справочник.ХарактеристикиНоменклатуры"));СписокНайденного.Колонки.Добавить("Штрихкод", Новый ОписаниеТипов("Строка"));СписокНайденного.Колонки.Добавить("ЕдИзм", Новый ОписаниеТипов("Строка"));СписокНайденного.Колонки.Добавить("МаркируемыйТовар", Новый ОписаниеТипов("Строка"));— Если переменная не инициализирована, будет ошибка.
2. Объект и его свойства
— В коде используетсяОбъект.Магазин.СкладПродажииОбъект.Магазин.ПравилоЦенообразования.ВидЦен.
— Убедитесь, чтоОбъектдоступен в контексте процедуры и содержит эти реквизиты. Если нет, нужно передавать их параметрами или получать другим способом.3. Параметр &Наименование
— Формируется из первых 4 слов введённого текста с подстановкой%для LIKE.
— Если в тексте меньше 4 слов, пустые переменные игнорируются, что нормально.
— Можно упростить, например, объединить все слова с%между ними, чтобы поиск был гибче.4. Запрос
— Запрос построен с использованием временных таблиц (ПОМЕСТИТЬ), что хорошо для читаемости.
— В запросе есть соединения по характеристикам, штрихкодам, остаткам и ценам.
— Убедитесь, что индексы по этим полям есть, чтобы запрос работал быстро.5. Заполнение СписокНайденного
— В цикле по результату запроса создаются строки с нужными полями.
— Для маркируемого товара ставится метка «[М]», иначе пустая строка.6. Очистка при пустом тексте
— Если текст пустой, список очищается.—
Рекомендации по улучшению и проверке:
— Проверьте, что
СписокНайденногообъявлен и инициализирован в модуле, где вызывается процедура.
— Если процедура вызывается с клиента, аСписокНайденного— глобальная переменная, то нужно использовать механизм передачи данных между клиентом и сервером (например, через параметры или свойства формы).
— Для отладки добавьте вывод количества найденных записей:1С (Код)1Сообщить("Найдено записей: " + РезультатЗапроса.Количество());— Если поиск по нескольким словам не нужен, можно упростить параметр &Наименование, например:
1С (Код)1Запрос.УстановитьПараметр("Наименование", "%" + Текст + "%");— Если нужно искать по штрихкоду, можно добавить условие в запрос.
—
Если нужна помощь с интеграцией этого кода в форму или с объявлением переменных — могу помочь.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.