Имя: Пароль:
1C
1С v8
Проверка на палиндром в 1С 8.3
0 Xilen
 
15.01.15
19:49
Приветствую!
Сделал проверку на палиндром наименования в номенклатуре, но выдает ошибку

{Справочник.Номенклатура.Форма.ФормаЭлемента.Форма(1019)}: Получение элемента по индексу для значения не определено
    Если (ТекНаим[Начало] <> ТекНаим[Конец]) Тогда


Вот код:

&НаКлиенте
Процедура ПроверитьПалиндром(Команда)
    ТекНаим=СокрЛП(НРег(СтрЗаменить(Объект.Наименование," ", "")));
    Начало=1;
    Конец=СтрДлина(ТекНаим);
    Палиндром=Истина;
    Пока (Начало < Конец) И (Начало <= СтрДлина(ТекНаим)) И (Конец >= 1) Цикл
        Если (ТекНаим[Начало] <> ТекНаим[Конец]) Тогда
            Палиндром=Ложь;
            Прервать;
        КонецЕсли;
            Начало=Начало+1;
            Конец=Конец-1;
    КонецЦикла;
    Если Палиндром=Истина Тогда            
        Сообщить("Является палиндромом");
    Иначе
        Сообщить("Не является палиндромом");
    КонецЕсли;
КонецПроцедуры


В чем косяк, подскажите, пожалуйста)
1 Лохматые Уши
 
15.01.15
19:53
ТекНаим - это строка. Какой же там может быть индекс?
2 Xilen
 
15.01.15
19:56
Тогда как исправить? Посимвольно можно же работать со строками в 1С. Думал сработает) в с++ точно сработает такой алгоритм)
3 zulu_mix
 
15.01.15
20:02
кури Сред
4 Cyberhawk
 
15.01.15
20:07
(2) тебе уже проще засунуть строку в массив на входе
5 Xilen
 
15.01.15
20:10
В "Сред" заработало) правда строка "арозаупаланалапуазора" не является палиндромом Оо )) Косякнул в условии что ли..
6 Salimbek
 
15.01.15
20:53
(5) СокрЛП в начале используй, а то слева первый символ будет "а", а справа - пробел, вот и не сойдется.
7 Xilen
 
15.01.15
21:11
Отладчик показывает именно "арозаупаланалапуазора", т.е. без пробелов, но при этом результат все равно "не является".
8 Крошка Ру
 
15.01.15
21:34
(7) Ну ты даешь! Что в слове содержится в отладчике ты посмотрел, молодец. А посмотреть, в какой момент он на строку "Палиндром = Ложь;" попадает - это уже неспортивно?
9 zulu_mix
 
15.01.15
21:37
Функция РеверсСтроки(Стр)
    Длина = СтрДлина(Стр);
    СтрокаРезультат = "";
    Для н = 1 По Длина Цикл
        Счетчик = Длина - н;
        СтрокаРезультат = СтрокаРезультат + Сред(Стр, Счетчик, 1);
    КонецЦикла;
    Возврат СтрокаРезультат;
КонецФункции

Функция ЭтоПалиндром(Стр)
    Возврат Стр = РеверсСтроки(Стр)
КонецФункции

Сообщить(ЭтоПалиндром("арозаупаланалапуазора"));
10 Xilen
 
15.01.15
21:52
Посмотрел где) но после того как написал сюда)

Спасибо за помощь! Буду разбираться))
11 Armando
 
15.01.15
21:58
Просто интересно, какую задачу решаете таким образом?
12 Xilen
 
15.01.15
21:58
Проверить на полиндром значение поля "Наименование"
13 zulu_mix
 
15.01.15
22:01
вообще правильнее так:

Функция ЭтоПалиндром(Стр)
    Возврат ВРЕГ(СтрЗаменить(Стр," ","")) = ВРЕГ(СтрЗаменить(РеверсСтроки(Стр)," ",""))
КонецФункции
14 Адимр
 
15.01.15
22:02
(9) Проверь последовательность нуклеотидов в дезоксирибонуклеиновой кислоте на палиндромы,скачать можно сдесь http://www.gutenberg.org/ebooks/author/856
15 Записьдампа
 
15.01.15
22:07
(13) Повышаем градус! =)

Функция ЭтоПалиндром(Фраза)
    Возврат Фраза = "" Или (Лев(Фраза, 1) = Прав(Фраза, 1) И ЭтоПалиндром( Сред(Фраза, 2, СтрДлина(Фраза) - 2)));
КонецФункции
16 Крошка Ру
 
15.01.15
22:09
(15) Повышать, так повышать:

Возврат ОбщийМодульЛингвистическихФункций.ЭтоПалиндром(Фраза);
17 Armando
 
15.01.15
22:11
(12) Это понятно. Практический смысл какой?
18 Xilen
 
15.01.15
22:12
(17) Тема курсовой.. А смысла практического нет) Баловство)
19 zulu_mix
 
15.01.15
22:12
(15) как думаешь, при какой длине строки выпадет твой ник?
20 Записьдампа
 
15.01.15
22:15
(19) Ну тогда вот так =)
Функция ЭтоПалиндром(Фраза)
    Возврат КодВозвратаДиалога.Да = Вопрос("Фраза """ + Фраза + """ является палиндромом?", РежимДиалогаВопрос.ДаНет);
КонецФункции
21 Xilen
 
15.01.15
22:20
Тогда вопрос поставлю по-другому: как грамотно написать условие:
Если (Сред(ТекНаим,Начало,Конец) <> Последний символ из ТекНаим) Тогда

ну и соответственно последний уменьшается на 1 в цикле
22 Xilen
 
15.01.15
22:21
В общем, сравнение первого символа и последнего в цикле,
причем будет первый+1, последний-1
23 zulu_mix
 
15.01.15
22:22
зачем эти сложности? реверс строки и сравнение с оригиналом гораздо гораздее
24 Записьдампа
 
15.01.15
22:26
(21)
    ЭтоПалиндром = Истина;
    
    Начало = 1;
    Конец  = СтрДлина(ТекНаим);
    
    Пока Начало < Конец Цикл
        Если Сред(ТекНаим, Начало, 1) <>  Сред(ТекНаим, Начало, 1) Тогда
            ЭтоПалиндром = Ложь;
            Прервать;
        КонецЕсли;
        Начало = Начало + 1;
        Конец  = Конец  - 1;
    КонецЦикла;
25 Записьдампа
 
15.01.15
22:27
Тьфу.

Если Сред(ТекНаим, Начало, 1) <>  Сред(ТекНаим, Конец 1) Тогда

Кончено же
26 Xilen
 
15.01.15
22:29
(23) ну, если говорить о загрузке, то посимвольное сравнение с начала и конца быстрее произойдет, нежели взять строку, реверснуть и сравнить обе) правда это доли секунды)

просто когда искал материал по работе со строками в 1с наткнулся на этот пример, решил попробовать) но там написано простыми словами, а не кодом)

Спасибо, Записьдампа) я пытался сделать также, только не единицы ставил, а длину строки)
27 Xilen
 
15.01.15
22:31
Хотя отбой, даже слово "трепет" при твоем условии сочло палиндромом)
28 Записьдампа
 
15.01.15
22:36
(27) Я ведь ща 1С запущу =)


Функция ЭтоПалиндром(ТекНаим)
    
    ЭтоПалиндром = Истина;
    
    Начало = 1;
    Конец  = СтрДлина(ТекНаим);

    Пока Начало < Конец Цикл
        Если Сред(ТекНаим, Начало, 1) <> Сред(ТекНаим, Конец, 1) Тогда
            ЭтоПалиндром = Ложь;
            Прервать;
        КонецЕсли;
        Начало = Начало + 1;
        Конец  = Конец  - 1;
    КонецЦикла;
    
    Возврат ЭтоПалиндром;
КонецФункции


Сообщить(ЭтоПалиндром("трепет"));
Сообщить(ЭтоПалиндром("арозаупаланалапуазора"));
29 Записьдампа
 
15.01.15
22:38
В качестве списка литературы к курсовой синтаксис-помощник 1С будешь указывать? =)
30 Xilen
 
15.01.15
22:39
&НаКлиенте
Процедура ПроверитьПалиндром(Команда)
    ТекНаим=СокрЛП(НРег(СтрЗаменить(ТекНаим," ", "")));
    Начало=1;
    Конец=СтрДлина(ТекНаим);
    Палиндром=Истина;
    Пока Начало < Конец Цикл
        Если Сред(ТекНаим,Начало,1) <> Сред(ТекНаим,Конец,1) Тогда
            Палиндром=Ложь;
            Прервать;
        КонецЕсли;
    Начало=Начало+1;
    Конец=Конец-1;
    КонецЦикла;
    Если Палиндром=Истина Тогда            
        Сообщить("Является палиндромом");
    Иначе
        Сообщить("Не является палиндромом");
    КонецЕсли;  
КонецПроцедуры


результат: "трепет" - палиндром)
просто я в карточке номенклатуры сделал кнопку на командной панели и привязал к процедуре
31 Xilen
 
15.01.15
22:39
(29) обойдемся без списка литературы :D
32 Записьдампа
 
15.01.15
22:40
ТекНаим откуда берется?
33 Xilen
 
15.01.15
22:44
(32) тьфу блин))) видать удалил случайно вместе с комментом и оставил не ту строку XD

ТекНаим=СокрЛП(НРег(СтрЗаменить(Объект.Наименование," ", "")));

все, работает))) спасибо))