Имя: Пароль:
1C
1С v8
Как сделать проверку на строку?
0 cyx7
 
27.03.15
11:17
в ут 11 загружаю файл, в файле много строк. Есть сроки аналогичные этой: "Дата события в архиве: 24.09.20143 04.03.2016 ". как мне сделать проверку на последние символы (конкретно "3 04.03.2016")? эти    символы имеют такой тип всегда, тоесть могут быть "4 15.11.2014". Тоесть как то разбить строку надо или как? проверка такого формата: "если "3 04.03.2016" тогда ..."
1 Fish
 
27.03.15
11:19
Открой в СП раздел "Функции работы со значениями типа Строка". Там всё есть.
2 Я сказал
 
27.03.15
11:20
Если Прав(Строка, 12) = "3 04.03.2016" Тогда

...

КонецЕсли
3 Я сказал
 
27.03.15
11:20
А вообще да, (1) более правильный ответ
4 cyx7
 
27.03.15
11:24
(3) я уже тоже нашла, спасибо ребятки) но "= "3 04.03.2016"" не получится, всегда разные числа
5 Fish
 
27.03.15
11:28
(4) А что с чем надо-то сравнивать?
6 ВРедная
 
27.03.15
11:29
(5) как я поняла ее бы спасли регулярные выражения, если бы они были.
Формат окончания строки всегда одинаковый, а сами цифры разные. Надо найти все строки по этому формату.
7 ВРедная
 
27.03.15
11:31
(6) Читать как "У тех строк которые нужны автору - формат окончания строк всегда одинаковый"
8 cyx7
 
27.03.15
11:31
(5) ч = число, п - пробел, т - точка: если формат такой "ЧпЧЧтЧчтЧЧЧЧ"
9 cyx7
 
27.03.15
11:32
(5) и если формат такой, тогда я разбираю эту строку и первое число присваиваю реквизиту, и дату - другому реквизиту
10 cyx7
 
27.03.15
11:32
(7) да, Вы правы)
11 Fish
 
27.03.15
11:33
(9) Напиши свою функцию проверки формата, и передавай туда правые 12 символов.
12 Cube
 
27.03.15
11:34
(8) Ну так проверь только на точки и пробел. Сильно сомневаюсь, что при таком формате могут встречаться буквы...
13 cyx7
 
27.03.15
11:34
это наверное нужно  сначала СокрЛП(прав(СтрТекстДок,13))  , потом каждый символ перебрать и сравнить его тип
14 cyx7
 
27.03.15
11:38
(11) правые 13, там последний пробел всегда
15 Cube
 
27.03.15
11:39
+(12) Как-то так:

ДлинаСтроки = СтрДлина(СтрТекстДок);
Если Сред(СтрТекстДок, ДлинаСтроки - 11, 1) = " " И Сред(СтрТекстДок, ДлинаСтроки - 8, 1) = "." И Сред(СтрТекстДок, ДлинаСтроки - 5, 1) = "." Тогда
    //Твой код по захвату мира
16 Dilgorp
 
27.03.15
11:42
(13) у символа нет типа, есть код
Н-р:
КодСимвола = КодСимвола("1");
вернет 49

Коды символов "0"-"9" 48-57 соответственно
17 cyx7
 
27.03.15
11:45
а я так думала сделать Если Найти(Строка," ") = 2 и Найти(СтрТекстДок,".")=5 и Найти(СтрТекстДок,".")=8
18 Timon1405
 
27.03.15
11:46
Перем RegExp;
//
Функция МнеЭтоПодходит(СтрокаПроверки)
  Возврат RegExp.Test(СтрокаПроверки);
КонецФункции
//
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern =  "\d \d\d\.\d\d\.\d\d\d\d$";
19 cyx7
 
27.03.15
11:47
Если Найти(Строка," ") = 2 и Найти(СтрТекстДок,".")=5 и Найти(СтрТекстДок,".")=8
20 Dilgorp
 
27.03.15
11:47
(17) не сработает
если Найти(СтрТекстДок,".")=5
то он всегда будет 5 возвращать
21 Cube
 
27.03.15
11:47
(17) А кто тебе сказал, что Найти() ищет дальше? Она ищет первое вхождение и всё...
22 cyx7
 
27.03.15
11:47
ой, Если Найти(Строка," ") = 2 и Найти(Строка,".")=5 и Найти(Строка,".")=8, вот так ведь сработает? (18) а можете рассказать поподробнее, пожалуйста?
23 Fish
 
27.03.15
11:48
(22) Найти() возвращает первый найденный результат.
24 cyx7
 
27.03.15
11:49
(21) тогда Вашим методом воспользоваться лучше? после обеду буду пробовать, спасибо всем откликнувшимся) а (18) расскажи поподробнее пожалуйста
25 Timon1405
 
27.03.15
11:50
26 Cube
 
27.03.15
11:51
(24) "тогда Вашим методом воспользоваться лучше?"
А (15) ты пропустила, видимо...
27 cyx7
 
27.03.15
12:40
(26) я его и имела ввиду)
28 cyx7
 
27.03.15
13:04
пипеееец, бывает и такой формат "13 04.03.2016"
29 cyx7
 
27.03.15
13:04
тоесть первое число двузначное((((((((((( теперь вообще фиг сделаешь((
30 Cube
 
27.03.15
13:06
(29) Да ну нафуй)) Показывай код, что уже сделано.
31 cyx7
 
27.03.15
13:08
(30)
ДатаАкта = "";
    ТабАктов = Новый ТаблицаЗначений;
    ТабАктов.Колонки.Добавить("НомерДела");
    ТабАктов.Колонки.Добавить("ДатаДела");
    ТабАктов.Колонки.Добавить("НомераТомов");
    ТабАктов.Колонки.Добавить("ВсегоТомов");
    ТабАктов.Колонки.Добавить("НомерПоАкту");
    ТабАктов.Колонки.Добавить("СрокХранения");
    ТабАктов.Колонки.Добавить("ОкончаниеХранения");
    
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.УстановитьТекст(ИсхТекст);
    ТекстДок.РазделительСтрок = Символы.ПС;
    НомСтр = 1;
    Пока НомСтр <= ТекстДок.КоличествоСтрок() Цикл
        СтрТекстДок = ТекстДок.ПолучитьСтроку(НомСтр);
        Если Найти(СтрТекстДок,"Дата события в архиве") >0 Тогда
            ДатаАкта = РасчетДаты(СтрЗаменить(Сред(СтрТекстДок,Найти(СтрТекстДок,"Дата события в архиве")+23,10),".",""));
        КонецЕсли;
            
        Если СтрДлина(СтрТекстДок) > 20 И ПроверитьНаЧисло(Лев(СтрТекстДок,Найти(СтрТекстДок," ")-1)) И Найти(СтрТекстДок," от ") > 0 Тогда
            СтрТаб = ТабАктов.Добавить();
            СтрТаб.НомерПоАкту = Лев(СтрТекстДок,Найти(СтрТекстДок," ")-1);
            СтрТаб.НомерДела = Сред(СтрТекстДок,Найти(СтрТекстДок," ")+1,Найти(СтрТекстДок," от ")-(Найти(СтрТекстДок," ")+1));
            СтрТаб.ДатаДела = Сред(СтрТекстДок,Найти(СтрТекстДок," от ")+4,СтрДлина(СтрТекстДок)-(Найти(СтрТекстДок," от ")+3));
            КоличествоТомов = 0;
        КонецЕсли;
        
        Если ПроверитьНаЧисло(СтрТекстДок) Тогда
            Если КоличествоТомов = 0 Тогда
                СтрТаб.НомераТомов = Лев(СтрТекстДок,СтрДлина(СтрТекстДок)-1);
            Иначе
                СтрТаб.НомераТомов = СтрТаб.НомераТомов + ","+ Лев(СтрТекстДок,СтрДлина(СтрТекстДок)-1);
            КонецЕсли;
            КоличествоТомов = КоличествоТомов+1;
            СтрТаб.ВсегоТомов = КоличествоТомов;
        КонецЕсли;
        //наш кусок, который делаем=)
        строка =СокрЛП(прав(СтрТекстДок,13));
        ДлинаСтроки = СтрДлина(строка);
        Если Сред(строка, ДлинаСтроки - 11, 1) = " " И Сред(строка, ДлинаСтроки - 8, 1) = "." И Сред(строка, ДлинаСтроки - 5, 1) = "." Тогда
            СтрТаб.СрокХранения = Лев(строка, 1);
            СтрТаб.ОкончаниеХранения = Прав(строка,10);
        КонецЕсли;
        //Конец
        НомСтр = НомСтр+1;            
    КонецЦикла;
32 alex_shkut
 
27.03.15
13:10
Аптека?
Вам, по сути важна только последняя дата.
33 alex_shkut
 
27.03.15
13:10
или архивариус :)
34 yavasya
 
27.03.15
13:13
(0)
попытка
строкаИлиНет=строкаИлиНет+"";
перем=1;
исключение
перем=2;
конецПопытки;
35 Cube
 
27.03.15
13:18
(31) Вместо

        строка =СокрЛП(прав(СтрТекстДок,13));
        ДлинаСтроки = СтрДлина(строка);
        Если Сред(строка, ДлинаСтроки - 11, 1) = " " И Сред(строка, ДлинаСтроки - 8, 1) = "." И Сред(строка, ДлинаСтроки - 5, 1) = "." Тогда
            СтрТаб.СрокХранения = Лев(строка, 1);
            СтрТаб.ОкончаниеХранения = Прав(строка,10);
        КонецЕсли;

Делай так:

        строка = СокрЛП(СтрТекстДок);
        ДлинаСтроки = СтрДлина(строка);
        Если Сред(строка, ДлинаСтроки - 11, 1) = " " И Сред(строка, ДлинаСтроки - 8, 1) = "." И Сред(строка, ДлинаСтроки - 5, 1) = "." Тогда
            СтрТаб.СрокХранения = ?(Сред(строка, ДлинаСтроки - 18, 1) = ".", Сред(строка, ДлинаСтроки - 13, 1), Сред(строка, ДлинаСтроки - 14, 2));
            СтрТаб.ОкончаниеХранения = Сред(строка, ДлинаСтроки - 10, 10);
        КонецЕсли;
36 D_E_S_131
 
27.03.15
13:18
В (25) самый правильный ответ. Не изобретайте сноуборд.
37 Cube
 
27.03.15
13:19
+(35) То есть, не надо обрезать строку, работай с полной строкой.
38 cyx7
 
27.03.15
13:21
(37) я тоже так подумала, но не подойдет, потому что длина строки будет меняться из-за это числа перед второй датой
39 cyx7
 
27.03.15
13:23
а есть ли какой нибудь метод отбрасывающий левую часть. тоесть я пишу сколько первых символов отбросить. тогда я у начальной строки отбросила бы первые ненужные символы(они то всегда одинаковые"Дата события в архиве: 24.09.2014")
40 cyx7
 
27.03.15
13:23
(36) я там не поняла(
41 Dilgorp
 
27.03.15
13:23
(39) есть, но попробуй все таки (35) все нормально сработает)
42 cyx7
 
27.03.15
13:25
(41) ааа, все увидела), что когда он присваивает значение переменной - там условие спрятано)
43 Fish
 
27.03.15
13:26
(39) Удивишься, но это метод Прав() :))
44 cyx7
 
27.03.15
13:29
(43) нет, вы меня не поняли, при методе прав, я указываю число символов справа и их же получаю, а я хочу указать число символов, которые отбросились бы слева
45 1976vas
 
27.03.15
13:31
(44) Сред()
46 Fish
 
27.03.15
13:32
(44) А посчитать не судьба?
Прав(Строка, СтрДлина(Строка)-НужноеКоличествоСимволовСлева)
47 Cube
 
27.03.15
13:33
строка = СокрЛП(СтрТекстДок);
        ДлинаСтроки = СтрДлина(строка);
        Если Сред(строка, ДлинаСтроки - 11, 1) = " " И Сред(строка, ДлинаСтроки - 8, 1) = "." И Сред(строка, ДлинаСтроки - 5, 1) = "." Тогда
            ВремСтрока = СокрЛП(Лев(Строка, ДлинаСтроки - 10));
            НомерСимвола = СтрДлина(ВремСтрока);
            ТекСимвол = "";
            Пока ТекСимвол <> "." ИЛИ НомерСимвола > 0 Цикл
                НомерСимвола = НомерСимвола - 1;
                ТекСимвол = Сред(ВремСтрока, НомерСимвола, 1);
            КонецЦикла;
            СтрТаб.СрокХранения = Прав(ВремСтрока, СтрДлина(ВремСтрока) - НомерСимвола);
            СтрТаб.ОкончаниеХранения = Сред(строка, ДлинаСтроки - 10, 10);
        КонецЕсли;
48 D_E_S_131
 
27.03.15
13:34
(40) Это конечно же аргумент, да-ооо!
http://habrahabr.ru/post/115825/
49 Cube
 
27.03.15
13:34
(47) Эх, забыл 4 символа отнять, исправляюсь:

        строка = СокрЛП(СтрТекстДок);
        ДлинаСтроки = СтрДлина(строка);
        Если Сред(строка, ДлинаСтроки - 11, 1) = " " И Сред(строка, ДлинаСтроки - 8, 1) = "." И Сред(строка, ДлинаСтроки - 5, 1) = "." Тогда
            ВремСтрока = СокрЛП(Лев(Строка, ДлинаСтроки - 10));
            НомерСимвола = СтрДлина(ВремСтрока);
            ТекСимвол = "";
            Пока ТекСимвол <> "." ИЛИ НомерСимвола > 0 Цикл
                НомерСимвола = НомерСимвола - 1;
                ТекСимвол = Сред(ВремСтрока, НомерСимвола, 1);
            КонецЦикла;
            СтрТаб.СрокХранения = Прав(ВремСтрока, СтрДлина(ВремСтрока) - НомерСимвола + 4);
            СтрТаб.ОкончаниеХранения = Сред(строка, ДлинаСтроки - 10, 10);
        КонецЕсли;
50 _nik-nik_
 
27.03.15
13:41
Простите, пример файла (строк 2-10) можно посмотреть?
51 ЧеловекДуши
 
27.03.15
13:45
(0) Что за файл?
Откуда он такой?
Если пишут в текстовый реквизит любую дату... то
"Попытка Автоматизировать Бардак, получаем Автоматизированный бардак" :)
52 cyx7
 
27.03.15
13:55
(48) спасибо, вечером изучу всё досканально)(51) html файл (49) Вам большущее спасибо) (46) Вам спасибо за нравственные учения) я честно честно сама тоже много делаю и читаю и изучаю, но когда в тупик захожу - обращаюсь)
53 Cube
 
27.03.15
13:56
(52) Не было бы фотки в профиле и меня бы тут не было :)
54 Cube
 
27.03.15
13:57
+(53) Кстати, фотку можно уже и обновить)
55 cyx7
 
27.03.15
13:59
(54) на выходных только, на работе нету)
56 cyx7
 
27.03.15
14:01
(50) а зачем?
57 1976vas
 
27.03.15
14:03
(56) Уже говорили, темная, очки большие...
58 cyx7
 
27.03.15
14:08
(57) да я не про фото)
59 cyx7
 
27.03.15
14:08
(48) кстати, очки - не дурачки у меня
60 kosts
 
27.03.15
14:20
с = "3 04.03.2016";
Если СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(с, "9","0"), "8","0"), "7","0"), "6","0"), "5","0"), "4","0"), "3","0"), "2","0"), "1","0") = "0 00.00.0000" Тогда
61 Fish
 
27.03.15
14:21
(60) Читай (28) :)
62 Zhuravlik
 
27.03.15
14:23
А можно загрузить тз в запрос, и там проверить на "ПОДОБНО".
63 kosts
 
27.03.15
14:23
(61) Ну "или" можно добавить, тертически
64 cyx7
 
27.03.15
14:32
(49) ааа, это бесконечный цикл((
65 Timon1405
 
27.03.15
14:40
(28) тогда нужно просто поменять последнюю строчку  в (18) на
RegExp.Pattern =  "\d?\d \d\d\.\d\d\.\d\d\d\d$";
переходите уже на темную сторону силы)
66 cyx7
 
27.03.15
14:43
(65) я сегодня вечером вашу сторону изучать начну))))
в общем изменила я код чуть добавила еще одну на проверку, тк, попадаются ненужные строки, у которых окончание похожее, но всё работает)))) всем спасибо, вот конечный результат


строка = СокрЛП(СтрТекстДок);
        ДлинаСтроки = СтрДлина(строка);
        
        Попытка
            Проверка = Число(Сред(строка, ДлинаСтроки - 11, 1));
        Исключение
            Проверка = Сред(строка, ДлинаСтроки - 11, 1);
        КонецПопытки;
        
        Если Сред(строка, ДлинаСтроки - 10, 1) = " " И Сред(строка, ДлинаСтроки - 7, 1) = "." И Сред(строка, ДлинаСтроки - 4, 1) = "." и ТипЗНЧ(Проверка) = Тип("Число") Тогда
            ВремСтрока = СокрЛП(Лев(Строка, ДлинаСтроки - 10));
            Если СтрДлина(ВремСтрока)=35 тогда
                СтрТаб.СрокХранения = Прав(ВремСтрока,2);
            ИначеЕсли СтрДлина(ВремСтрока)=34 тогда
                СтрТаб.СрокХранения = Прав(ВремСтрока,1);
            КонецЕсли;
            СтрТаб.ОкончаниеХранения = Сред(строка, ДлинаСтроки - 9, 10);
        КонецЕсли;
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший