Имя: Пароль:
1C
1С v8
Аналог методу СтрЗаменить()
0 dart909
 
05.08.15
14:36
Подскажите возможно ли в строке вместо подстроки вставить какое то значение без использования метода СтрЗаменить()?
1 Рэйв
 
05.08.15
14:38
Можно. Перебрать по символьно.
2 xaozai
 
05.08.15
14:38
RegExp, как альтернативу можно использовать.
3 dart909
 
05.08.15
14:40
(1) а как это выглядит хотя бы примерно?
4 Timon1405
 
05.08.15
14:40
(0)хватит уже ходить вокруг да около. Будь мужиком, озвучь задачу полностью
5 orefkov
 
05.08.15
14:41
(0)
А в чём сакральный смысл сего мистического действа?
Может, у вас религиозный запрет на использование СтрЗаменить? Или у начальника редкая болезнь - впадание в ступор при прочтении последовательности "стрзаме"?
6 Лодырь
 
05.08.15
14:43
(0) Например в цикле крутить поиск позиции вхождения подстроки и использовать чтонибудь в стиле
ИсходнаяСтрока = Лев(ИсходнаяСтрока,ПозицияЧтоМеняем)+НаЧтоМеняем+Сред(ИсходнаяСтрока,ПозицияЧтоМеняем+ДлинаЧтоМеняем+1)
7 dart909
 
05.08.15
14:43
(4) Окей

Процедура ЗаполнитьВариантМой(МойСчетчик)
    ПроверяемыйТип = Тип("Строка");
    Запрос = Новый Запрос;
        Для каждого Справочник Из Метаданные.Справочники Цикл
             Для каждого Реквизит Из Справочник.Реквизиты Цикл
                  Если Реквизит.Тип.СодержитТип(ПроверяемыйТип) Тогда
                       Запрос.Текст =
                       " Выбрать
                       |ИмяСправочника.Ссылка
                       |ИЗ Справочник.ИмяСправочника КАК ИмяСправочника
                       |ГДЕ РеквизитИмя ПОДОБНО &Параметр";
                       МояПеременная = Найти(Запрос.Текст,"");
                       Запрос.Текст = СокрЛ(Запрос.Текст);
                       ПеременнаяВыбрать = Лев(Запрос.Текст,7);
    
                   КонецЕсли
               КонецЦикла
         КонецЦикла      
    

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

Нужно в запросе вместо строки ИмяСправочника подставить значение не использую метод СтрЗаменить()
8 Рэйв
 
05.08.15
14:43
(5)Я уже боюсь ответа на твой вопрос:-)
9 dart909
 
05.08.15
14:44
я сделал 2 варианта: конкатенация, СтрЗаменить() нужен третий
10 magicSan
 
05.08.15
14:45
StrReplace - не благодари ахахах )))
11 Лодырь
 
05.08.15
14:45
(9) Используй регулярки, начальник протащится
12 butterbean
 
05.08.15
14:45
(9) зачем???
13 Euguln
 
05.08.15
14:46
СтрШаблон
14 dart909
 
05.08.15
14:46
(12) Задание дали такое придумать 3 способ
15 Лодырь
 
05.08.15
14:46
(12) Просто месье знает толк в извращениях
16 disla
 
05.08.15
14:47
(12) наверное, очередной тест при приёме на работу
17 Рэйв
 
05.08.15
14:47
(7)Расстрелять....Ну что заа.....Запрос в цикле- это банально
18 magicSan
 
05.08.15
14:48
(17) "мои глазаааааааааа"
19 Рэйв
 
05.08.15
14:48
Причем студент даже .Выполнить()Забыл
20 dart909
 
05.08.15
14:49
(19) Я скинул часть кода.
21 Рэйв
 
05.08.15
14:50
(20)За такую часть могут в морду дать.
22 sergeev-ag-1977
 
05.08.15
14:50
Ну а что тут не понятного - суммируй текст запроса!
Ничего не нужно будет менять.
23 sergeev-ag-1977
 
05.08.15
14:51
хотя это и есть "конкатенация"
24 Timon1405
 
05.08.15
14:51
Зачем плодить ветки? Как получить справочник из запроса не указывая его имя?
Очевидно же что это тестовое задание, обойти какую-то хрень по метаданным, собрать текст запроса динамически итд.
Вопрос в чем практический смысл этого бреда?
25 sergeev-ag-1977
 
05.08.15
14:53
Ну есть ещё оператор Попытка - вот он 3 вариант.
26 dart909
 
05.08.15
14:53
(21) окей

Процедура ЗаполнитьВариантЗаменаТекста(МойСчетчик)
    ПроверяемыйТип = Тип("Строка");
    Запрос = Новый Запрос;
        Для каждого Справочник Из Метаданные.Справочники Цикл
             Для каждого Реквизит Из Справочник.Реквизиты Цикл
                  Если Реквизит.Тип.СодержитТип(ПроверяемыйТип) Тогда
                       Запрос.Текст =
                       " Выбрать
                       |ИмяСправочника.Ссылка
                       |ИЗ Справочник.ИмяСправочника КАК ИмяСправочника
                       |ГДЕ РеквизитИмя ПОДОБНО Параметр";
                       Запрос.Текст = СтрЗаменить(Запрос.Текст,"ИмяСправочника",Справочник.имя);
                       Запрос.Текст = СтрЗаменить(Запрос.Текст,"РеквизитИмя",Реквизит.Имя);
                       Запрос.Текст = СтрЗаменить(Запрос.Текст,"Параметр","&СтароеЗначениеРеквизитов");
                       Запрос.УстановитьПараметр("СтароеЗначениеРеквизитов","%" + Объект.СтароеЗначениеРеквизитов + "%");
                      
                       РезультатЗапроса = Запрос.Выполнить();
                       ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
                       Пока ВыборкаДетальныеЗаписи.Следующий()Цикл
                             ОбъектВыборки = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
                                  для каждого МойРеквизит Из Справочник.Реквизиты Цикл
                                       Если МойРеквизит.Тип.СодержитТип(ПроверяемыйТип) Тогда          
                                               ОбъектВыборки[МойРеквизит.Имя] = СтрЗаменить(ОбъектВыборки[МойРеквизит.Имя],Объект.СтароеЗначениеРеквизитов,Объект.НовоеЗначениеРеквизитов);    
                                               МойСчетчик =  МойСчетчик +1;
                                       КонецЕсли;         
                                  КонецЦикла;
                       Попытка  
                           ОбъектВыборки.Записать();
                       Исключение
                           Сообщить(ОписаниеОшибки());
                       КонецПопытки    
                       КонецЦикла  
                   КонецЕсли
               КонецЦикла
         КонецЦикла      
КонецПроцедуры
27 sergeev-ag-1977
 
05.08.15
14:54
думаю тема исчерпана.
28 Рэйв
 
05.08.15
14:54
(26)Запрос от этого менее в цикле не стал:-)
29 dart909
 
05.08.15
14:55
(26) Ну да просто как избежать метода СтрЗаменить()
30 magicSan
 
05.08.15
14:56
(28) Кто то не прошел тест на работе и его не возьмут )))
31 magicSan
 
05.08.15
14:56
(28) хотя нах работу с такими идиотскими тз.
32 Рэйв
 
05.08.15
14:56
(29)Сижу ржу:-)
33 Timon1405
 
05.08.15
14:57
(30) наоборот, возьмут на сотку
34 sergeev-ag-1977
 
05.08.15
14:58
Ага а начальник читает мисту пойди тоже ....
35 Рэйв
 
05.08.15
14:58
(33)Кстати я заметил. Именно таких и берут.
36 disla
 
05.08.15
15:00
(0) попробуй через построитель запроса, заодно изучишь
37 magicSan
 
05.08.15
15:01
(29) в (6) через найти и посимвольный перебор видимо. + писали про внешние регулярки.
38 xaozai
 
05.08.15
15:02
В этой задаче, кстати, можно попробовать полнотекстовый поиск использовать...
39 dart909
 
05.08.15
15:02
(37) да попробую как в (6) спасибо)
40 Рэйв
 
05.08.15
15:03
(36)Ты ему еще УФ посоветуй:-))
Точно пропадет надолго.
41 dart909
 
05.08.15
15:05
(40) Ничего так что что у меня УФ..
42 Serg_1960
 
05.08.15
15:06
(26) Запрос.Текст = "Выбрать " + Справочник.Имя + ".Ссылка...
43 Рэйв
 
05.08.15
15:07
(41)Ну так тем более.Советами закидаем так,что мало не покажется:-))
44 Гёдза
 
05.08.15
15:07
Это же задачка из универа по программированию
45 magicSan
 
05.08.15
15:09
(38) а заменять полнтекстовой з аменой7 )))
46 Timon1405
 
05.08.15
15:09
(44) Курсовая или дипломная?
47 xaozai
 
05.08.15
15:10
(45) Просто присваиванием.
48 xaozai
 
05.08.15
15:12
Хотя, если там только часть значения реквизита надо менять, то без замены (как бы она не была реализована) не обойтись, конечно...
49 Злобный монстр
 
05.08.15
15:21
в консолидации много таких конструкций:

Запрос.Текст = Запрос.Текст + "
    |
    |    И Справочник.ПорядковыйНомер " + ?(НаправлениеВверх,"<",">") + " &ПорядковыйНомер
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПорядковыйНомер" + ?(НаправлениеВверх," УБЫВ","");
50 Злобный монстр
 
05.08.15
15:29
Кстати оттуда же из общего модуля:

    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Справочник.ПорядковыйНомер КАК ПорядковыйНомер,
    |    Справочник.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник."+ ИмяСправочника + " КАК Справочник
    |ГДЕ
    |    Не Справочник.ПометкаУдаления";
    Если Не ТекущийЭлемент.Владелец = Неопределено Тогда
        Запрос.Текст = Запрос.Текст + "
        |    И Справочник.Владелец = &Владелец";
    КонецЕсли;
    
    Для каждого КлючИЗначение Из Новый Структура(ИмяРеквизитовРодителя) Цикл
        Запрос.Текст = Запрос.Текст + "
        |И Справочник." + КлючИЗначение.Ключ + " = &" + КлючИЗначение.Ключ;
        Запрос.УстановитьПараметр(КлючИЗначение.Ключ, ТекущийЭлемент[КлючИЗначение.Ключ]);
    КонецЦикла;
51 disla
 
05.08.15
15:57
(50) дык это и есть конкатенация, о чём было написано в (9), нужен третий способ.
52 Злобный монстр
 
05.08.15
16:02
(51) Извиняй, только начало прочитал.
53 sash-ml
 
05.08.15
16:28
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "Петя";
RegExp.IgnoreCase = Истина;
ИсходнаяСтрока = "ПетЯ 123";
Результат = RegExp.Replace(ИсходнаяСтрока, "Вася");
54 Asmody
 
05.08.15
16:34
В коде Мисты можно обнаружить вот такой перл:

function str_replace(txt,cut_str,paste_str){
    return txt.split(cut_str).join(paste_str);
}
55 SUA
 
05.08.15
16:38
результат = "";
пока найти(исходная, заменяемая)>0 цикл
результат = результат + лев(исходная,найти(исходная, заменяемая)-1)+замена;исходная=сред(исходная,найти(исходная,заменяемая)+стрдлина(заменяемая));
конеццикла;
результат=результат+заменяемая;
56 SUA
 
05.08.15
16:39
скучно...
57 disla
 
05.08.15
22:40
(55) ещё один, не знает, что такое конкатенация, см. (9)
58 disla
 
05.08.15
22:42
(0) ну что, взяли на работу?
59 sash-ml
 
06.08.15
09:47
Из извращенных методов можно еще как-то так

ТД = Новый ФорматированныйДокумент ;
ТД.Добавить("Выбрать первые 100 *
|из справочник.");
ТД.Добавить("Номенклатура ");
ТД.Добавить(" где
|Истина");

Запрос = Новый Запрос;
Запрос.Текст = Тд.ПолучитьТекст();
ТЗ = Запрос.Выполнить().Выгрузить();