Имя: Пароль:
1C
1С v8
Обратное отражение символов в строке
,
0 makMich
 
22.03.23
16:58
Добрый день!
Обычное приложение.
Во внешней обработке есть табличная часть. В ней колонка под названием "значение". Это строка из рандомных символов.
Необходима процедура, которая бы отражала символы в ячейках в обратном порядке.
т.е. было:

| 1 | qwer |
| 2 | asdf |
| 3 | zxcv |


стало:
| 1 | rewq |
| 2 | fdsa |
| 3 | vcxz |


Пробовал найти какие-то встроенные методы, но ничего не нашел. 1С только начал изучать, поэтому может не вижу какого то очевидного решения?!
Спасибо за помощь!
1 Aleksey
 
20.03.23
20:14
нет очевидных решений нет. 1С как бы не про перестановку местами символов в строке
https://www.cyberforum.ru/1c-custom/thread1545918.html
2 Волшебник
 
20.03.23
20:16
3 magicSan
 
20.03.23
20:22
(0) откуда такие задачи в 1С?
4 Волшебник
 
20.03.23
20:23
(3) Очевидно, с собеседования
5 magicSan
 
20.03.23
20:25
(4) Откуда такие задачи на собеседование?
6 Волшебник
 
20.03.23
20:30
(5) Когда я проводил собеседования, я задавал вопросы про флаг "основной отбор" для измерения регистра сведений. По сравнению с моим вопросом, решить сабж очень легко. Простая алгоритмическая задача, которую легко загуглить и решить на всех языках программирования.
7 magicSan
 
20.03.23
20:37
(6) Он же не быдло кодером устраиваться. То что легко согласен. Но вот вспоминается мне вопросы типа "пронумеровать результат запроса" - пока до дома ехал придумал, но за час не смог учитывая что были другие задачи. Или цена валюты на каждый день учитывая что в какой-то день цены могло не быть. - это не типовые высосанные непонятно из каких мест задачи.

У основного отбора, если не изменят память при удалении, при удаление элемента удалится запись регистра. - нормальный вопрос на знание платформы. (если я конечно правильно вспомнил)
8 magicSan
 
20.03.23
20:39
"
    Ведущее —  свойство измерения, подразумевающее под собой информацию о том, что без значения этого измерения запись регистра не имеет смысл. На деле это означает что система при удалении значения из измерения удаляет еще и запись регистра с «Ведущим» измерением. Может быть установлено только одно измерение.
    Основной отбор — если регистр независимый, по этим измерениям будет устанавливаться регистрация изменений для плана обмена. Аналогично использование Основной отбор по периоду включает основной отбор для период для периодических регистров.
"

Я был рядом ))))
9 Chameleon1980
 
20.03.23
20:52
(8) еще кое-что есть для ведущего измерения
10 Волшебник
 
20.03.23
22:05
(8) я не спрашивал про "Ведущее"
11 lexushka
 
21.03.23
06:24
(6-8) Собеседование это конечно святое, но в своей работе с типовыми конфигурациями вы часто "дергали" эти настройки, вон в (7) реальный уровень — что-то там такое есть, но надо будет — уточним Помнить все по платформе где типа значения в коде ТипЗнч() а в запросе ТипЗначения() по моему мнению нереально — оно нелогична-с
12 2S
 
21.03.23
06:26
(0) напиши рекурсивную функцию, тест пройдешь
13 lexushka
 
21.03.23
06:27
а в расширении #Удаление/#КонецУдаления и держищь себя в руках чтобы не написать #Удалить и не забыть что не КонецЕсли, те КонецУдалить а КонецУдаления...
14 DJ Anthon
 
21.03.23
06:28
(8) а можете сказать, почему только может быть ведущим? какая в этом логика и технические трудности сделать их несколько?
15 DJ Anthon
 
21.03.23
06:29
* только одно
16 lexushka
 
21.03.23
06:32
(15) какой бардак случится если записи будут удалять сразу несколько измерений Как решать коллизию?
17 DJ Anthon
 
21.03.23
06:34
(16) не понял, в чем бардак. записи удалятся. допустим, есть измерение организация и номенклатура. что я удаляю организацию, что я удаляю номенклатуру - запись все равно удалится. это мне и нужно. она и нужна только если существует и то, и другое. а так удаление номенклатуры или организации остановится, потому что сначала надо вычистить мои регистры ручками.
18 lexushka
 
21.03.23
06:36
(17) полагаю слишком сложно
нет человека - нет проблемы…
19 lexushka
 
21.03.23
06:43
Что до задачи — надо обратить внимание что спереди цифры в черточках и их переворачивать не надо
20 Serg_1960
 
22.03.23
16:58
Не оптимально, но лаконично :)

Сообщить(Зеркало("А роза упала на лапу Азора"));   // "арозА упал ан алапу азор А"

Функция Зеркало(ИсхСтрока, Знач х = 1)
	Возврат ?(х > СтрДлина(ИсхСтрока), "", Зеркало(ИсхСтрока, х+1) + Сред(ИсхСтрока, х, 1));
КонецФункции
21 Волшебник
 
21.03.23
10:41
(14) Ведущих измерений может быть много. В (8) ошибка.
22 Garykom
 
гуру
21.03.23
10:44
(21) там не в (8) ошибка а в днк
23 Garykom
 
гуру
21.03.23
10:47
(6) >флаг "основной отбор" для измерения регистра сведений
фактически это составной ключ для таблицы
24 Волшебник
 
21.03.23
10:50
(23) Только для другой таблицы
25 Garykom
 
гуру
21.03.23
10:54
(20) Это не просто не оптимально а грубейшая ошибка или как минимум неоптимальное решение
Если длина строки ограничена то неоптимальное, если про максимальные длины строк ничего не известно - ошибка

"Однако нужно избегать использования рекурсивного вызова и для алгоритмов, в которых реальная вложенность рекурсии будет достигать сотен уровней. Во встроенном языке не установлено конкретного ограничения количества уровней рекурсивного вызова. Ограничение носит технологический характер. Аварийное завершение работы системы будет происходить, после того, как будут исчерпаны свободные ресурсы, используемые при рекурсии.  Рекомендуется  создавать алгоритмы, количество уровней рекурсии в которых будет на практике ограничиваться   несколькими десятками."
26 НафНаф
 
21.03.23
11:01
во как можно в ms sql:

select REVERSE(t.f)
from (select N'фыва' as f) as t
27 Serg_1960
 
21.03.23
11:02
По поводу (6)
А сегодня в ИТС не все могут смотреть. Вернее смотреть могут не только лишь все, мало кто может это делать :)))

...Особое внимание следует уделить регистрам сведений, имеющим независимый режим записи (свойство "Режим записи" установлено в значение "Независимый"). Для данных регистров гранулой обмена является набор записей с отбором по измерениям, c установленным свойством "Основной отбор"...

Источник: ИТС, "Подготовка конфигурации к работе в распределенной информационной базе" - https://its.1c.ru/db/metod8dev/content/2266/hdoc
28 makMich
 
21.03.23
11:39
Спасибо всем. Основная проблема была не в отзеркаливании строки, а в записи в таблицу. Не сразу разобрался, что из табличной части нужно выгрузить данные в таблицу значений и уже в ней производить изменения, а потом загрузить измененное обратно.
29 Serg_1960
 
21.03.23
11:42
По поводу (25)
С теоретической частью рассуждений разумеется согласен. Но, однако, хочу обратить Ваше внимание на следующие обстоятельство: автор темы указал пример исходных данных. Учитывая это, моё решение всего лишь неоптимально (но допустимо). О чём я сразу же и предупредил в (20)

PS: ну, да, времена я тот ещё зануда :)
30 Garykom
 
гуру
21.03.23
11:56
(29) цикл проще
31 Garykom
 
гуру
21.03.23
11:56
(30)+ явный цикл, проще и понятней
в отличие от неявного через рекурсию
32 Garykom
 
гуру
21.03.23
11:59

ИсхСтрока = "абв";
РезСтрока = "";
Для НомерСимвола = 1 По СтрДлина(ИсхСтрока) Цикл
  РезСтрока = "" + Сред(ИсхСтрока, НомерСимвола, 1) + РезСтрока;
КонецЦикла;
33 Garykom
 
гуру
21.03.23
12:09
Кстати кто знает почему вот такой код (32) в Java и C# скажут НЕОПТИМАЛЬНО?
34 Garykom
 
гуру
21.03.23
12:10
(33)+ речь не про встроенные функции переворачивания типа reverse()
35 Волшебник
 
21.03.23
12:11
(33) Потому что наращивание строки по символам приводит к копированию всей строки. Нужно использовать StringBuilder
36 magicSan
 
21.03.23
12:21
(35) нет, на каждой итерации ты добавляешь в заранее выделенную область памяти 1 байт.
37 Garykom
 
гуру
21.03.23
12:22
(35) ага
38 Garykom
 
гуру
21.03.23
12:22
(37)+ причем не просто наращивание а слева
39 Волшебник
 
21.03.23
12:27
(36) Ну во-первых не 1, а 2, потому что строки в юникоде. А во-вторых тип String относится к immutable-типам, он не модифицируется. Присвоение строке символа приводит к созданию новой строки.
40 magicSan
 
21.03.23
12:37
(39) да, читанул, мыслю в рамках си++.
41 lodger
 
22.03.23
16:57
тогда так?

ИсхСтрока = "абв";
Промежуток = Новый Массив;   ДлинаСтроки = СтрДлина(ИсхСтрока);
Для НомерСимвола = 1 По ДлинаСтроки Цикл	
	Промежуток.Добавить(Сред(ИсхСтрока, 1+ДлинаСтроки-НомерСимвола, 1));
КонецЦикла;		   
РезСтрока = СтрСоединить(Промежуток,"");
42 Волшебник
 
21.03.23
12:53
(41) Сделайте замер производительности на строке в миллион символов. Вряд ли там будет какое-то ускорение
43 lodger
 
21.03.23
13:27
(42) почему сразу "вряд ли"? кратный перевес.
http://paste1c.ru/2ske0nihhq7o
https://postimg.cc/NKSGnMZb
44 Волшебник
 
21.03.23
13:37
(43) Хм... Понятно, спасибо.
45 lodger
 
21.03.23
14:06
+(43) если инициализировать массив сразу известным размером новый массив(ДлинаСтроки);
а значения вбрасывать методом .Установить(),
то рядом с "РезСтрока = "" + Сред(ИсхСтрока, НомерСимвола, 1) + РезСтрока;" разницы вообще не видно. возможно она есть, но там какие то проценты по пальцам рук пересчитать.
46 magicSan
 
21.03.23
14:08
(45) чот у тебя на вызове кувырков - показывает что через голову отнял ...7% на замере видно другое, интересно через потоки на скока быстрее будет - там встроенная фича по инверсии есть.
47 lodger
 
21.03.23
14:11
(46) не 7%, а 0.07%.
потому что переменную для результата не создавал внутри (чтобы обратно отдать поинтер), а передал непосредственно данные.
48 Garykom
 
гуру
21.03.23
14:14
(43) как с этой пасты скопипастить код?
49 Garykom
 
гуру
21.03.23
14:14
(48)+ и вопрос нахрен она нужна если код нельзя скопировать?
50 Garykom
 
гуру
21.03.23
14:15
(49)+ регаться точно не собираюсь
51 Волшебник
 
21.03.23
14:15
(48) Ctrl-A, Ctrl-C
52 Garykom
 
гуру
21.03.23
14:15
(51) не работает
53 lodger
 
21.03.23
14:15
(52) работает
54 Garykom
 
гуру
21.03.23
14:16
(52) (53) да получилось со второй попытки
55 Волшебник
 
21.03.23
14:19
И эти люди автоматизируют страну...
56 Garykom
 
гуру
22.03.23
16:57
эээ сколько надо символов лопатить чтобы хотя бы секунду заняло любым методом?
у меня уже

Гигастрока = "начало"+СтроковыеФункцииКлиентСервер.СформироватьСтрокуСимволов("у", 10000000000000000000000000);


и один фиг оба в пределах секунды
57 Волшебник
 
21.03.23
14:23
(56) Внутри цикла добавь запрос к регистру бухгалтерии
58 Garykom
 
гуру
21.03.23
14:25
(57) ыыы
59 magicSan
 
21.03.23
14:31
(57) ахахахахаха
60 НафНаф
 
22.03.23
13:03
(56) извините, но я вам не верю, что в пределах секунды
61 Garykom
 
гуру
22.03.23
14:09
(60) i9-13900kf
62 Garykom
 
гуру
22.03.23
14:11
(60) я тоже подумал что странно
проверил даже что в функции заполнения нет ограничения на длину числа
числа в 1С 32 знака целой части
63 magicSan
 
22.03.23
14:23
(61) 3 герца, не сильно быстрый у меня изначально тупить начало на генерации строки пришлось число уменьшать. Тоже не верю.
64 magicSan
 
22.03.23
14:25
(63) а турбо буст до 6.3? 0о кхм кхм нефига себе, но всё равно не верю.
65 Garykom
 
гуру
22.03.23
14:54
(60) (63) правильно не верите

речь про кривой код из (43)

там бага с реквизитом формы получается
66 Garykom
 
гуру
22.03.23
15:00
https://i.paste.pics/b06708112083b4ba64e325bf55c682bd.png

правильный результат 2 и 4 секунды
67 lodger
 
22.03.23
15:12
(65) так, а в чем баг? интересна ж.
68 Garykom
 
гуру
22.03.23
15:22
(67) сам то попробуй
не в реквизит формы а в переменную делать СформироватьСтрокуСимволов()


// Формирует строку повторяющихся символов заданной длины.
//
// Параметры:
//  Символ      - Строка - символ, из которого будет формироваться строка.
//  ДлинаСтроки - Число  - требуемая длина результирующей строки.
//
// Возвращаемое значение:
//  Строка - строка, состоящая из повторяющихся символов.
//
&НаСервереБезКонтекста
Функция СформироватьСтрокуСимволов(Знач Символ, Знач ДлинаСтроки) Экспорт
    
    Результат = "";
    Для Счетчик = 1 По ДлинаСтроки Цикл
        Результат = Результат + Символ;
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

&НаСервере
Процедура кувырокНаСервере()
    
    ИсходнаяСтрока = "начало"+СформироватьСтрокуСимволов("у", 1000000);
    
    а = кувырокЧерезГолову(ИсходнаяСтрока);

    Сообщить("------------------------------");

    б = кувырокЧерезЗад(ИсходнаяСтрока);

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

&НаСервере
Функция кувырокЧерезГолову(Гигастрока)
    
    Сообщить("Начало: "+ТекущаяДата());
    
    Промежуток = Новый Массив;
    ДлинаСтроки = СтрДлина(Гигастрока);
    Для НомерСимвола = 1 По ДлинаСтроки Цикл    
        Промежуток.Добавить(Сред(Гигастрока, 1+ДлинаСтроки-НомерСимвола, 1));
    КонецЦикла;
    
    Результат = СтрСоединить(Промежуток,"");
    
    Сообщить("Конец: "+ТекущаяДата());
    
    Возврат Результат;    
    
КонецФункции

&НаСервере
Функция кувырокЧерезЗад(Гигастрока)
    
    Сообщить("Начало: "+ТекущаяДата());
    
    РезСтрока = "";
    Для НомерСимвола = 1 По СтрДлина(Гигастрока) Цикл
        РезСтрока = "" + Сред(Гигастрока, НомерСимвола, 1) + РезСтрока;
    КонецЦикла;
    
    Сообщить("Конец: "+ТекущаяДата());
    
    Возврат РезСтрока;
    
КонецФункции    

&НаКлиенте
Процедура Команда1(Команда)
    кувырокНаСервере();
КонецПроцедуры
69 Asmody
 
22.03.23
15:40
70 Волшебник
 
22.03.23
15:48
(69) Алгоритм этого функционала, пожалуйста, впиши в статью Книга знаний: Перевернуть строку на разных языках программирования
71 НафНаф
 
22.03.23
15:52
(66) 2 и 24 секунды
72 Garykom
 
гуру
22.03.23
16:07
(71) там очень странно
да почему то второй способ выдает иногда разное время
73 Garykom
 
гуру
22.03.23
16:09
(71) угу 2 и 24 секунды это я опечатался
но суть что при нескольких запусках там разное время от 16 до 30 секунд выходило
74 Garykom
 
гуру
22.03.23
16:21
Переделал

// Формирует строку повторяющихся символов заданной длины.
//
// Параметры:
//  Символ      - Строка - символ, из которого будет формироваться строка.
//  ДлинаСтроки - Число  - требуемая длина результирующей строки.
//
// Возвращаемое значение:
//  Строка - строка, состоящая из повторяющихся символов.
//
&НаСервереБезКонтекста
Функция СформироватьСтрокуСимволов(Знач Символ, Знач ДлинаСтроки) Экспорт
    
    Результат = "";
    Для Счетчик = 1 По ДлинаСтроки Цикл
        Результат = Результат + Символ;
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

&НаСервереБезКонтекста
Функция СформироватьСтрокуСимволовБыстро(Знач Символ, Знач ДлинаСтроки) Экспорт
    
    МассивСимволов = Новый Массив(ДлинаСтроки);
    Для Счетчик = 1 По ДлинаСтроки Цикл
        МассивСимволов[Счетчик-1] = Символ;
    КонецЦикла;
    Результат = СтрСоединить(МассивСимволов, "");
    
    Возврат Результат;
    
КонецФункции

&НаСервере
Процедура кувырокНаСервере()
    
    //ИсходнаяСтрока = "начало"+СформироватьСтрокуСимволов("у", 1000000);
    ИсходнаяСтрока = "начало"+СформироватьСтрокуСимволовБыстро("у", 1000000);
    
    а = кувырокЧерезГолову(ИсходнаяСтрока);

    Сообщить("------------------------------");

    б = кувырокЧерезЗад(ИсходнаяСтрока);

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

&НаСервере
Функция кувырокЧерезГолову(Гигастрока)
    
    Сообщить("Начало: "+ТекущаяДата());
    
    Промежуток = Новый Массив;
    ДлинаСтроки = СтрДлина(Гигастрока);
    Для НомерСимвола = 1 По ДлинаСтроки Цикл    
        Промежуток.Добавить(Сред(Гигастрока, 1+ДлинаСтроки-НомерСимвола, 1));
    КонецЦикла;
    
    Результат = СтрСоединить(Промежуток,"");
    
    Сообщить("Конец: "+ТекущаяДата());
    
    Возврат Результат;    
    
КонецФункции

&НаСервере
Функция кувырокЧерезЗад(Гигастрока)
    
    Сообщить("Начало: "+ТекущаяДата());
    
    ДлинаСтроки = СтрДлина(Гигастрока);
    МассивСимволов = Новый Массив(ДлинаСтроки);
    Для НомерСимвола = 1 По ДлинаСтроки Цикл
        МассивСимволов[ДлинаСтроки-НомерСимвола] = Сред(Гигастрока, НомерСимвола, 1);
    КонецЦикла;
    Результат = СтрСоединить(МассивСимволов, "");
    
    Сообщить("Конец: "+ТекущаяДата());
    
    Возврат Результат;
    
КонецФункции    

&НаКлиенте
Процедура Команда1(Команда)
    кувырокНаСервере();
КонецПроцедуры
75 Garykom
 
гуру
22.03.23
16:21
76 Garykom
 
гуру
22.03.23
16:24
СтрСоединить() реально шустро пашет
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн