Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 23:52

Обработка поиска с заданным значением по справочнику

Автор Tgr11, 27 июн 2013, 11:07

0 Пользователей и 1 гость просматривают эту тему.

Tgr11

Добрый день, уважаемые пользователи данного форума. Обращаюсь к Вам вот с таким вопросом: есть обработка поиска по справочнику, в этой обработке есть 5 полей поиска, одно из них НомерДополнения-которое задается пользователем, например-19. Данное поле должно искать по справочнику не просто равно или подобно 19, а отбирать строки справочника, где оно задано последним. Чтобы было яснее: Есть две строки справочника
1.НомерДополнения-19/25/
2.НомерДополнения-11/6/19 , то есть из данных строк мне нужно выбрать именно вторую строку, а первая не нужна.. сейчас у меня обработка ищет только строки, где содержится заданное число. Подскажите где лучше в моем коде и может быть как если кто то знает лучше реализовать данное решение. Прилагаю код, то что у меня на данный момент:
[/Процедура ОсновныеДействияФормыОК(Кнопка)
Если НЕ ЗначениеЗаполнено(СНБ) Тогда
Возврат;
  КонецЕсли;

  текстЗапроса = "ВЫБРАТЬ
| Справочник.Ссылка
|ИЗ
| Справочник.Расценки КАК Справочник
|ГДЕ
| Справочник.СНБ = &СНБ";



  ФильтрПоНаименованию = ПолучитьСтрокуФильтра("Наименование",ПолеВидСравненияНаименование, Наименование);
  ФильтрПоШифру   = ПолучитьСтрокуФильтра("Ид",ПолеВидСравненияШифр, Шифр);
  ФильтрПоСоставуРабот = ПолучитьСтрокуФильтра("СоставРабот", ПолеВидСравненияРаботы, Работы);
  ФильтрПоНомеруДополнения = ПолучитьСтрокуФильтра("НомерДополнения", ПолеВидСравненияНомерДополнения, НомерДополнения);
  текстЗапроса = текстЗапроса + ?(НЕ ФлагСборник,""," И ( Справочник.Владелец  В ИЕРАРХИИ (&Сборник)) ");
  текстЗапроса = текстЗапроса + ?(ФлагШифр    И ЗначениеЗаполнено(ФильтрПоШифру)," И ("+ФильтрПоШифру+")" , "");
  текстЗапроса = текстЗапроса + ?(ФлагНаименование И ЗначениеЗаполнено(ФильтрПоНаименованию)," И ("+ФильтрПоНаименованию+")", "");
    текстЗапроса = текстЗапроса + ?(ФлагРаботы   И ЗначениеЗаполнено(ФильтрПоСоставуРабот)," И Справочник.Ссылка В ("+ФильтрПоСоставуРабот+")", "");
  текстЗапроса = текстЗапроса + ?(ФлагНомерДополнения    И ЗначениеЗаполнено(ФильтрПоНомеруДополнения)," И ("+ФильтрПоНомеруДополнения+")" , "");
  Запрос = Новый Запрос;
  Запрос.Текст = ТекстЗапроса;
  Запрос.УстановитьПараметр("СНБ", СНБ);
  Запрос.УстановитьПараметр("Сборник", Сборник);
  мРасценок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

  глСтруктураОтбораРасценок.Вставить("Шифр", Шифр);
  глСтруктураОтбораРасценок.Вставить("Наименование", Наименование);
  глСтруктураОтбораРасценок.Вставить("Работы", Работы);
  глСтруктураОтбораРасценок.Вставить("ФлагШифр", ФлагШифр);
  глСтруктураОтбораРасценок.Вставить("ФлагНаименование", ФлагНаименование);
  глСтруктураОтбораРасценок.Вставить("ФлагРаботы", ФлагРаботы);
  глСтруктураОтбораРасценок.Вставить("НомерДополнения", НомерДополнения);
    глСтруктураОтбораРасценок.Вставить("ФлагНомерДополнения", ФлагНомерДополнения);
  Закрыть(мРасценок);
КонецПроцедуры

Функция ПолучитьСтрокуФильтра(Ид,ВидСравнения = Неопределено,Строка = "") Экспорт

Фильтр ="";
Если Ид = "СоставРабот" Тогда

  Если ВидСравнения = "Подобно" Тогда
   Фильтр = СтрЗаменить(Строка," ","");
   Фильтр = "СНСоставРабот.Работа.Наименование ПОДОБНО ""%"+Фильтр;
   Фильтр = СтрЗаменить(Фильтр,"//","%"" ИЛИ СНСоставРабот.Работа.Наименование ПОДОБНО ""%");
   Фильтр = СтрЗаменить(Фильтр,"/","%"" И СНСоставРабот.Работа.Наименование ПОДОБНО ""%");
   Фильтр = Фильтр + "%""";
  Иначе
   Фильтр = "СНСоставРабот.Работа.Наименование = """+Строка+"""";
  КонецЕсли;

  ТекстЗапроса ="ВЫБРАТЬ РАЗЛИЧНЫЕ
  | СНСоставРабот.Расценка КАК Ссылка
  |ИЗ
  | РегистрСведений.СНСоставРабот КАК СНСоставРабот
  |ГДЕ
  |  " + Фильтр;
  возврат ТекстЗапроса;
КонецЕсли;

Если ЗначениеНеЗаполнено(Строка) Тогда
  возврат "";
КонецЕсли;


Если ВидСравнения = "Подобно" Тогда
  Фильтр = СтрЗаменить(Строка," ","");
  Фильтр = "Справочник."+Ид+" ПОДОБНО ""%"+Фильтр;
    Фильтр = СтрЗаменить(Фильтр,"//","%"" ИЛИ Справочник."+Ид+" ПОДОБНО ""%");
  Фильтр = СтрЗаменить(Фильтр,"/","%"" И Справочник."+Ид+" ПОДОБНО ""%");
  Фильтр = Фильтр + "%""";
Иначе
Фильтр = "Справочник."+Ид+" = """+Строка+"""";
КонецЕсли;
возврат Фильтр;
КонецФункции

дальше я так понимаю должно что то похожее на функцию поиска именно того что я хочу
Функция ПолучитьНомерПоследнегоДополненияВСтроке(НомерДополнения)
стрДоп = НомерДополнения;
Пока Найти(стрДоп,"/") Цикл
  стрДоп = Прав(стрДоп, СтрДлина(стрДоп) - Найти(стрДоп,"/"));
КонецЦикла;
возврат стрДоп;
КонецФункции // ()

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

Dethmontt

"ВЫбрать * ИЗ Справочник ГДЕ Наименование Подобно %[/"+СтрокаПоиска+" СПЕЦСИМВОЛ ["
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Tgr11

хорошо, но как программа поймет что искать именно последнее значение? ведь мне не просто НомерДополнения +/ найти, а именно в строке НомерДополнения найти Номердополнения+/ где значение последнее, пример я приводила выше. Приведу еще раз:
Стол-НомерДополнения=19/25/19/
Стул-НомерДополнения=19/
Картина-НомерДополнения=20/19/10/
Итог: Попасть после отбора в массив должны Стол и Стул

Dethmontt

Тогда тебе нужно условие что после такого значений "19/" ничего нет, а спереди может быть произвольное количество знаков
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Tgr11

переделала добавила+"/",но осталось все тоже самое, потому что он ищет все НомерДополнения+/
Если Ид = "НомерДополнения" Тогда

  Если ВидСравнения = "Подобно" Тогда
  СпецСимвол=прав("/",1);
  Фильтр = СтрЗаменить(Строка," ","");
  Фильтр = "Справочник."+Ид+" ПОДОБНО ""%"+Фильтр+Спецсимвол;
  Фильтр = Фильтр + "%""";
Иначе
    Фильтр = "Справочник."+Ид+" = """+Строка+"""";
КонецЕсли;
возврат Фильтр;

Добавлено: 27 июн 2013, 14:09


Цитата: Dethmontt от 27 июн 2013, 14:07
Тогда тебе нужно условие что после такого значений "19/" ничего нет, а спереди может быть произвольное количество знаков
спасибо, а как задается в 1с данное условие не подскажите или где почитать про это? не встречалась с таким просто никогда

Dethmontt

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Tgr11

спасибо сейчас попробую, напишу результат
Добавлено: 27 июн 2013, 14:32


ругается сделала так
{Обработка.Поиск.Форма.ФормаПоискаРасценок.Форма(38)}: Ошибка при вызове метода контекста (Выполнить)
      мРасценок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
по причине:
{(7, 62)}: Строка, не закрывающаяся кавычкой
Справочник.СНБ = &СНБ И (Справочник.НомерДополнения ПОДОБНО <<?>>"%19/)

Если Ид = "НомерДополнения" Тогда
      
      Если ВидСравнения = "Подобно" Тогда
      СпецСимвол="/";
      Фильтр = СтрЗаменить(Строка," ","");
      Фильтр = "Справочник."+Ид+" ПОДОБНО ""%"+Фильтр+Спецсимвол;
      Фильтр = Фильтр+"";
   Иначе
       Фильтр = "Справочник."+Ид+" = """+Строка+"""";
   КонецЕсли;

   возврат Фильтр;
    КонецЕсли;

Добавлено: 27 июн 2013, 14:35


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

Dethmontt

Ковычек маловато
Добавлено: 27 июн 2013, 14:38


|   Новый.Наименование ПОДОБНО ""%"+МоеЗначение+"\""";
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск