7.7 Строковая функция Найти() для константы

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

  1. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Всем здравствуйте! Меня мучает такая проблема. Есть две константы непериодические, тип "Строка" - СтрокаБазовая, СтрокаПоиска. Нужно найти позиции константы СтрокаБазовая, в которых она "разбивается" константой СтрокаПоиска. Почему строковая функция Найти() в этом случае не работает? В приведенном ниже коде если исполнить процедуру Выполнить() сразу после открытия формы, то результат будет неверным:
    СтрокаБазовая - " оплата за гроулак , согласно сч. факт № 86 от 04.03.2010"
    СтрокаПоиска - "гроулак"
    Ожидаемые значения: Поз1=12, Поз2=19, Поз3=39
    Результат: Поз1=-1, Поз2=98, Поз3=1
    Если скопировать текст и вставить в сами же реквизиты СтрокаБазовая, СтрокаПоиска, а после этого вызвать процедуру Выполнить(), то результат верный. Почему так получается и как исправить этот код:
    Код:
    Процедура Выполнить()
        Поз1=Найти(СтрокаБазовая,СтрокаПоиска)-1;
        Поз2=Поз1+СтрДлина(СтрокаПоиска);
        Поз3=СтрДлина(СтрокаБазовая)-Поз2;
    КонецПроцедуры
     
    Процедура ПриОткрытии()
        СтрокаБазовая=Константа.НазначениеПлатежаПКО;
        СтрокаПоиска=Константа.МенятьНазначениеПлатежаПКО;
    КонецПроцедуры
  2. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    1) по вашим данным, с учётом всех левых ваших пробелов у меня вышло 1 = 11, 2 = 18, 3 = 39
    Код:
    Процедура Сформировать()
    СтрокаБазовая=" оплата за гроулак , согласно сч. факт № 86 от 04.03.2010";
    СтрокаПоиска="гроулак";
    
        Поз1=Найти(СтрокаБазовая,СтрокаПоиска)-1;
        Поз2=Поз1+СтрДлина(СтрокаПоиска);
        Поз3=СтрДлина(СтрокаБазовая)-Поз2;
        Сообщить("1 = "+Поз1+" 2 = "+Поз2+" 3 = "+Поз3);
    КонецПроцедуры
    
    2) функция отработала правильно, если не найдено - возвращает 0, а 0-1 = -1 :)))) где-то ошибка грамматики? левые пробелы?
  3. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Я и говорил сразу, что если константы заменить текстом, то функция работает. Вы попробуйте сделать СтрокаБазовая, СтрокаПоиска в виде констант (строковых и непериодических, как я и писал раньше), и присвоить им эти значения. Тогда дибо функция не работает, либо константы "искаверкивают" значения строк
  4. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Поз1=Найти(СтрокаБазовая,СокрЛП(СтрокаПоиска))-1;
  5. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    угу, только одно но
    это ваши константы вашей конфигурации
    у прочих их быть не обязано
  6. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Да, именно так и надо было писать! Большое спасибо! Еще и к базовой строке функция СокрЛП() также относится. Вот только ума не приложу, откуда там взялись лишнии пробелы. Я в форме обработки где писал этот код смотрел на реквизитах типа строка неограниченной длины - левых пробелов не было. Вот окончательный код, кому интересно:

    Код:
    Процедура Выполнить()
        Поз1=Найти(СокрЛП(СтрокаБазовая),СокрЛП(СтрокаПоиска))-1;
        Поз2=Поз1+СтрДлина(СокрЛП(СтрокаПоиска));
        Поз3=СтрДлина(СокрЛП(СтрокаБазовая))-Поз2;
    КонецПроцедуры
     
    Процедура ПриОткрытии()
    СтрокаБазовая=Константа.НазначениеПлатежаПКО;
    СтрокаПоиска=Константа.МенятьНазначениеПлатежаПКО;
    КонецПроцедуры
  7. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Это свойство 1с... При обращении к реквизиту/константе 1с возвращает ПОЛНУЮ строку. Т.е. строку дополненную пробелами до длины, заданной в конфигураторе

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