Как корректно реализовать и использовать процедуру А_ПолучитьСписок(Текст) в 1С?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как корректно реализовать и использовать процедуру А_ПолучитьСписок(Текст) в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #38038
      Фото аватараOdineski
      Участник

        вот код процедуры А_ПолучитьСписок(Текст)

        «&НаСервере
        Процедура А_ПолучитьСписок(Текст)

        Объект.А_ПолеПоиска = Текст;

        СписокНайденного.Очистить();
        Запрос = Новый Запрос;
        Запрос.Текст =
        «ВЫБРАТЬ ПЕРВЫЕ 25
        | ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
        | ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
        | ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
        | ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
        | ЕСТЬNULL(Штрихкоды.Штрихкод, «»»») КАК Штрихкод
        |ПОМЕСТИТЬ втХарактеристики
        |ИЗ
        | РегистрНакопления.ТоварыНаСкладах.Остатки(
        | ,
        | Склад = &Склад
        | И Номенклатура.Наименование ПОДОБНО &Наименование) КАК ТоварыНаСкладахОстатки
        | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        | ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
        | И ТоварыНаСкладахОстатки.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
        | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
        | ПО ТоварыНаСкладахОстатки.Характеристика = Штрихкоды.Характеристика
        | И ТоварыНаСкладахОстатки.Номенклатура = Штрихкоды.Владелец
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        | втХарактеристики.Характеристика КАК Характеристика
        |ПОМЕСТИТЬ втХарактеристикиПосле
        |ИЗ
        | втХарактеристики КАК втХарактеристики
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        | втХарактеристикиПосле.Характеристика КАК Характеристика,
        | втХарактеристикиПосле.Характеристика.ор_МаркируемыйТовар КАК Характеристикаор_МаркируемыйТовар
        |ПОМЕСТИТЬ втХарМарка
        |ИЗ
        | втХарактеристикиПосле КАК втХарактеристикиПосле
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗЛИЧНЫЕ
        | втХарактеристики.Номенклатура КАК Номенклатура,
        | втХарактеристики.Цена КАК Цена,
        | втХарактеристики.КоличествоОстаток КАК КоличествоОстаток,
        | втХарактеристики.Характеристика КАК Характеристика,
        | втХарактеристики.Штрихкод КАК Штрихкод,
        | ЕСТЬNULL(втХарМарка.Характеристикаор_МаркируемыйТовар, ЛОЖЬ) КАК МаркируемыйТовар
        |ИЗ
        | втХарактеристики КАК втХарактеристики
        | ЛЕВОЕ СОЕДИНЕНИЕ втХарМарка КАК втХарМарка
        | ПО втХарактеристики.Характеристика = втХарМарка.Характеристика
        |
        |УПОРЯДОЧИТЬ ПО
        | Номенклатура
        |АВТОУПОРЯДОЧИВАНИЕ»;

        МассивИзСтроки = СтрРазделить(Текст, » «);
        Текст1 = «»;
        Текст2 = «»;
        Текст3 = «»;
        Текст4 = «»;
        Попытка
        Текст1 = МассивИзСтроки[0];
        Исключение
        КонецПопытки;
        Попытка
        Текст2 = МассивИзСтроки[1];
        Исключение
        КонецПопытки;
        Попытка
        Текст3 = МассивИзСтроки[2];
        Исключение
        КонецПопытки;
        Попытка
        Текст4 = МассивИзСтроки[3];
        Исключение
        КонецПопытки;

        Запрос.УстановитьПараметр(«Склад», Объект.Магазин.СкладПродажи);
        Запрос.УстановитьПараметр(«ВидЦены», Объект.Магазин.ПравилоЦенообразования.ВидЦен);
        Запрос.УстановитьПараметр(«Наименование»,»%» + Текст1 + «%» + Текст2 + «%» + Текст3 + «%» + Текст4 + «%»);
        РезультатЗапроса = Запрос.Выполнить().Выгрузить();

        Для каждого СтрокаТЗ из РезультатЗапроса Цикл

        НоваяСтрока = СписокНайденного.Добавить();
        НоваяСтрока.Номенклатура = СтрокаТЗ.Номенклатура;
        НоваяСтрока.Цена = СтрокаТЗ.Цена;
        НоваяСтрока.Остаток = СтрокаТЗ.КоличествоОстаток;
        НоваяСтрока.Характеристика = СтрокаТЗ.Характеристика;
        НоваяСтрока.Штрихкод = СтрокаТЗ.Штрихкод;
        НоваяСтрока.ЕдИзм = Строка(СтрокаТЗ.Номенклатура.ЕдиницаИзмерения);
        Если СтрокаТЗ.МаркируемыйТовар Тогда
        мМаркировка = «[М]»;
        Иначе
        мМаркировка = «»;
        КонецЕсли;
        НоваяСтрока.МаркируемыйТовар = мМаркировка;

        КонецЦикла;

        Если Текст = «» Тогда

        СписокНайденного.Очистить();

        КонецЕсли;

        КонецПроцедуры
        «

      • #38039
        bot_avaOdin — Одинэсник
        Участник

          Код процедуры А_ПолучитьСписок(Текст) написан грамотно, но есть несколько важных моментов, которые нужно проверить и учесть, чтобы всё работало корректно:

          1. Переменная СписокНайденного
          — Она должна быть объявлена и инициализирована как глобальный или модульный объект типа ТаблицаЗначений или Массив, доступный и на клиенте, и на сервере.
          — Если это ТаблицаЗначений, то перед вызовом процедуры нужно её создать, например:

          — Если переменная не инициализирована, будет ошибка.

          2. Объект и его свойства
          — В коде используется Объект.Магазин.СкладПродажи и Объект.Магазин.ПравилоЦенообразования.ВидЦен.
          — Убедитесь, что Объект доступен в контексте процедуры и содержит эти реквизиты. Если нет, нужно передавать их параметрами или получать другим способом.

          3. Параметр &Наименование
          — Формируется из первых 4 слов введённого текста с подстановкой % для LIKE.
          — Если в тексте меньше 4 слов, пустые переменные игнорируются, что нормально.
          — Можно упростить, например, объединить все слова с % между ними, чтобы поиск был гибче.

          4. Запрос
          — Запрос построен с использованием временных таблиц (ПОМЕСТИТЬ), что хорошо для читаемости.
          — В запросе есть соединения по характеристикам, штрихкодам, остаткам и ценам.
          — Убедитесь, что индексы по этим полям есть, чтобы запрос работал быстро.

          5. Заполнение СписокНайденного
          — В цикле по результату запроса создаются строки с нужными полями.
          — Для маркируемого товара ставится метка «[М]», иначе пустая строка.

          6. Очистка при пустом тексте
          — Если текст пустой, список очищается.

          Рекомендации по улучшению и проверке:

          — Проверьте, что СписокНайденного объявлен и инициализирован в модуле, где вызывается процедура.
          — Если процедура вызывается с клиента, а СписокНайденного — глобальная переменная, то нужно использовать механизм передачи данных между клиентом и сервером (например, через параметры или свойства формы).
          — Для отладки добавьте вывод количества найденных записей:

          — Если поиск по нескольким словам не нужен, можно упростить параметр &Наименование, например:

          — Если нужно искать по штрихкоду, можно добавить условие в запрос.

          Если нужна помощь с интеграцией этого кода в форму или с объявлением переменных — могу помочь.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С