7.7 Поиск значения в Диапозоне номеров

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем n_h, 21 янв 2011.

  1. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Всем доброго времени суток, столкнулся со следующей задачей: Есть документ, в котором есть Наименование, дата, количество, ИдНомерОт, ИдНомерДо. ИдНомер может быть вида например ИдНомерОт=q1234 ИдномерДо=q5678. Нужно сделать поиск такого вида чтобы в строке ввод можно было ввести, например ИдНомер = q2345 и нажав кнопку искать получить в результате документ в котором введенный номер находится в промежутке ИдНомерОт и ИдНомерДо, вроде бы не очень сложно, но как то не соображу, всем заранее огромное спасибо.
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Самое главное - избавиться от чисволов чтобы 1с могла преобразовать число в строку.

    Тут разные подходы. Исходим из стого что первый символ - всегда буква.
    Код:
    Функция ВернутьЧисло(Стр)
    Возврат Число(Сред(Стр,2));
    КонецФункции
    
    Функция НайтиСтрокуДокумента(Поиск)
    Номер=0;
    ВыбратьСтроки();
    Пока ПолучитьСтроку()=1 Цикл
    Если (Поиск>=ВернутьЧисло(ИдНомерОт))И(Поиск<=ВернутьЧисло(ИдНомерДо)) Тогда
    Номер=НомерСтроки;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Возврат Номер;
    КонецФункции
    
    
  3. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Совсем запутался, что то не подскажите, что нужно добавить еще, что бы все работало? Или к чему это прикрутить?
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Что еще подсказать-то???? Единственный нюанс - преобразование вашего Ид к числу. Но если 1й символ всегда буква - больше обсуждать нечего.

    Вызывайте НайтиСтрокуДокумента. Если <>0 вернет номер строки удовлетворяющую условию
  5. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Делаю так, создаю новый отчет ПоискИН, добавляю реквизит с идентификатором "Поиск", долее в модуле:
    Код:
    //*******************************************
    Процедура Сформировать()
    
    
    
    Функция ВернутьЧисло(Стр)
    Возврат Число(Сред(Стр,2));
    КонецФункции
    Функция НайтиСтрокуДокумента(Поиск) 
    Поиск=СоздатьОбъект("Поиск");
    ИдНомерОт = "Документ.РасходнаяНакладная.ИдНомерОт";
    ИдНомерДо = "Документ.РасходнаяНакладная.ИдНомерОт";
    Док = "Документ.РасходнаяНакладная";
    Номер=0;
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку()=1 Цикл
    Если (Поиск>=ВернутьЧисло(ИдНомерОт))И(Поиск<=ВернутьЧисло(ИдНомерДо)) Тогда
    Номер = 
    "" 
    ;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Возврат Номер;
    КонецФункции  
    КонецПроцедуры
    
    На что получаю:

    <<?>>Функция ВернутьЧисло(Стр)
    {Отчет.новый5.Форма.Модуль(6)}: Ожидается ключевое слово 'КонецПроцедуры' ('EndProcedure')
    <<?>>Функция ВернутьЧисло(Стр)
    {Отчет.новый5.Форма.Модуль(6)}: Ожидается ключевое слово 'КонецПроцедуры' ('EndProcedure')
    КонецФункции<<?>>


    В чем мои ошибки? :angry:
  6. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Ой ошибся вместо ИдНомерДо = "Документ.РасходнаяНакладная.ИдНомерОт" ИдНомерДо = "Документ.РасходнаяНакладная.ИдНомерДо" и Поиск=СоздатьОбъект("Поиск"); наверно лишнее, но суть не в этом
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1) Нельзя создавать функцию ВНУТРИ процедуры
    2) Что такое за объект "Поиск"?
    3) Присвоение ИдНомерОт ИдНомерДо Док вообще не нужно
    4) Зачеприсваиваете переменной Номер пустое значение?

    Я же привел вам рабочий пример... Достаточно просто вызвать НайтиСтрокуДокумента и все..
  8. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Вы уж меня извините я в этом новичок, но если просто вызвать, так как вы написали, ругается на, то что переменная ИдНомерОт и ИдНомерДо не определена.
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Вышеприведенный код работает ТОЛЬКО внути модуля формы документа. Вы где пытаетесь его применить?
  10. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Пытаюсь в отчете...
  11. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда так:
    Код:
    Функция ВернутьЧисло(Стр)  
    Возврат Число(Сред(Стр,2));
    КонецФункции
    
    Функция НайтиСтрокуДокумента(Поиск,Док)  
    Номер=0;  
    Док.ВыбратьСтроки();  
    Пока Док.ПолучитьСтроку()=1 Цикл    
    Если (Поиск>=ВернутьЧисло(Док.ИдНомерОт))И(Поиск<=ВернутьЧисло(Док.ИдНомерДо)) Тогда       
    Номер=Док.НомерСтроки;       
    Прервать;   
    КонецЕсли;  
    КонецЦикла; 
    Возврат Номер;
    
    КонецФункции
    
    Процедура Сформировать()
    Поиск=712; //наше число
    Док=СоздатьОбъект("Документ.РасходнаяНакладная"); //для примера - не знаю как у вас
    Док.ВыбратьДокументы();
    Пока Док.ПолучитьДокумент()=1 Цикл
    Поз=НайтиСтрокуДокумента(Поиск,Док);
    Если Поз<>0 Тогда
    Сообщить("Нашли! "+Док+" номер строки "+Поз);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    
    
    
    Обращаю ваше внимание что поиск осуществляется до первого совпадения! Если в табличной части несколько таких строк - выводит только первую
  12. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Огромнейшее человеческое спасибо, осталось не совсем понятно с буквами делаю новый реквизит Номер в коде меняю Поиск=712; на Поиск=Номер и того получаю при запросе если реквизит типа "Строка" тогда отказывается получаю "Операция сравнения на больше-меньше допустимы только над значением совподающих базовых типов" (Число, строка, дата)", если ставить типа число тогда находит с любой буквой. Пробовал сделать так в расходной наклодной добавить графу "букваИн" так чтобы при поиске вводить два реквизита "Букву" и "Номер" тогда
    Код:
     Функция НайтиСтрокуДокумента(Поиск,Док,Буква)  
    Номер=0;  
    Док.ВыбратьСтроки();  
    Пока Док.ПолучитьСтроку()=1 Цикл    
    Если (Поиск>=ВернутьЧисло(Док.ИдНомерОт))И(Поиск<=ВернутьЧисло(Док.ИдНомерДо))И(Буква=ВернутьЧисло(Док.БукваИн))  Тогда       
    Номер=Док.НомерСтроки;       
    Прервать;   
    
    КонецЕсли;  
    КонецЦикла; 
    Возврат Номер;
    
    КонецФункции
    
    Процедура Сформировать()
    Поиск=Текст; //наше число
    Буква=БукваИдНомера;
    Док=СоздатьОбъект("Документ.РасходнаяНакладная"); //для примера - не знаю как у вас
    Док.ВыбратьДокументы();
    Пока Док.ПолучитьДокумент()=1 Цикл
    Поз=НайтиСтрокуДокумента(Поиск,Док,Буква);
    Если Поз<>0 Тогда
    Сообщить("Нашли! "+Док+" номер строки "+Поз);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    
    
    В итоге не находит ничего
  13. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    так и было задумано. А вам что - букву тоже нужно учитывать?
  14. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Конечно буква может менятся
  15. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда так:
    Код:
    Функция ВернутьЧисло(Стр)  
    Возврат Число(Сред(Стр,2));
    КонецФункции
    
    Функция НайтиСтрокуДокумента(Поиск,Док)  
    Номер=0;  
    Док.ВыбратьСтроки();  
    Пока Док.ПолучитьСтроку()=1 Цикл      
    Если (Лев(Поиск,1)<>Лев(Док.ИдНомерОт,1))ИЛИ(Лев(Поиск,1)<>Лев(Док.ИдНомерДо,1) Тогда
    Продолжить;
    КонецЕсли;
    Если (ВернутьЧисло(Поиск)>=ВернутьЧисло(Док.ИдНомерОт))И(ВернутьЧисло(Поиск)<=ВернутьЧисло(Док.ИдНомерДо)) Тогда
    Номер=Док.НомерСтроки;           
    Прервать;     
    КонецЕсли;  
    КонецЦикла; 
    Возврат Номер;
    КонецФункции
    
    
    
  16. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    А для полного счастья не скажите еще как вывести найденный документ?))
  17. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    Все разобрался огромное спасибо, даже и не знаю, как и отблагодарить.
  18. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Сегодня беру борзыми щенками.. Обращайтесь
  19. TopicStarter Overlay
    n_h
    Offline

    n_h Опытный в 1С

    Регистрация:
    21 янв 2011
    Сообщения:
    59
    Симпатии:
    0
    Баллы:
    26
    А можно ли сделать поиск не чувствительный к регистру, т.е. например а123=А123?
  20. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Врег(<Строка>)

    Назначение:
    Возвращает строку, полученную из исходной преобразованием всех символов в верхний регистр.

    Код:
    Врег("а123")="А123";
    
    
    

Поделиться этой страницей