Имя: Пароль:
1C
 
A, B, C,,, Z, AA, AB, ,,, AX, AY, AZ, BA, BB, ,,,, BX, BY, BZ, CA, CB, ,,,, Что это?
,
0 Гений 1С
 
гуру
30.05.20
12:03
Что это за последоваетельность.
Мне при переносе пришлось нумеровать одинаковые инвойсы, добавляя им в конец суффиксы, чтобы они были уникальными. 26 не хватило, некоторые каждый месяц в течении нескольких лет имеют один номер. Пришлось писать функцию.

Перевод из системы счисления не катит, пришлось свою ваять, причем я делал это довольно интерактивно, подгоняя под результат, без всякого мат-аппарата:

Функция НомерДляМаркировки(Знач Значение=0, Нотация=26, СтрокаСистемы="ABCDEFGHIJKLMNOPQRSTUVWXYZ") Экспорт
    //1 - A
    //26 - Z
    //27 - AA
    Результат = "";
    
    Пока Значение > 0 Цикл
        Результат = Сред(СтрокаСистемы, (Значение - 1) % Нотация + 1, 1)+Результат;
        Если Значение <= Нотация Тогда
            Прервать;
        КонецЕсли;
        Значение = Цел((Значение - 1)/Нотация);
        
        Если Значение = 0 Тогда Прервать; КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции


_math.ПереводЧислаВСистемуСчисления(0, 10)    "0"
_math.НомерДляМаркировки(1, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "A"
_math.НомерДляМаркировки(25, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "Y"
_math.НомерДляМаркировки(26, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "Z"
_math.НомерДляМаркировки(27, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "AA"
_math.НомерДляМаркировки(51, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "AY"
_math.НомерДляМаркировки(52, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "AZ"
_math.НомерДляМаркировки(53, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "BA"
_math.НомерДляМаркировки(76, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "BX"
_math.НомерДляМаркировки(77, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "BY"
_math.НомерДляМаркировки(78, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "BZ"
_math.НомерДляМаркировки(79, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "CA"
_math.НомерДляМаркировки(80, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "CB"




А с системой счисления вот что:

_math.ПереводЧислаВСистемуСчисления(1, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "B"
_math.ПереводЧислаВСистемуСчисления(25, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "Z"
_math.ПереводЧислаВСистемуСчисления(26, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "BA"
_math.ПереводЧислаВСистемуСчисления(27, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "BB"
_math.ПереводЧислаВСистемуСчисления(51, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "BZ"
_math.ПереводЧислаВСистемуСчисления(52, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "CA"
_math.ПереводЧислаВСистемуСчисления(53, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "CB"
_math.ПереводЧислаВСистемуСчисления(76, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "CY"
_math.ПереводЧислаВСистемуСчисления(77, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "CZ"
_math.ПереводЧислаВСистемуСчисления(78, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "DA"
_math.ПереводЧислаВСистемуСчисления(79, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "DB"
_math.ПереводЧислаВСистемуСчисления(80, 26, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")    "DC"

Функция ПереводЧислаВСистемуСчисления(Знач Значение=0, Нотация=36, СтрокаСистемы="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") Экспорт
    //Назначение: Переводит число Значение в строку в заданной системе счисления (Нотация) используя строку знаков этой системы  СтрокаСистемы
    //ДатаСоздания: 20071127
    //Автор: AVB
    //Редактор: Fixin
    //Тестирована: Да
    //Описание:
    //    За основу взят алгоритм avb
    Если Нотация<=0 Тогда Возврат "" КонецЕсли;
    Если Значение < 0 Тогда
        Возврат "-" +
        ПереводЧислаВСистемуСчисления(Значение, Нотация, СтрокаСистемы);
    КонецЕсли;
    
    Значение=Цел(Значение);
    
    Результат="";
    Пока Значение>=0 Цикл
        Результат=Сред(СтрокаСистемы,Значение%Нотация+1,1)+Результат;
        Значение=Цел(Значение/Нотация) ;
        Если Значение = 0 Тогда Прервать; КонецЕсли;
    КонецЦикла;
    Возврат Результат;
КонецФункции


Что это за последовательность, каким мат. аппаратом она правильно строится?
1 RomanYS
 
30.05.20
12:24
(0) У тебя с прибавлением каждой новой цифры - начинается нумерация с 0 ("A"). А дальше всё просто:
26 чисел - однозначных,
26^2 двухзначных,
...

Внутри каждой группы - обычный перевод в систему счисления, с ведущими нулями. "AAA" - трёхзначный нуль.

Ну и алгоритм предельно прост - первым шагом определяем количество цифр N, дальше цикл до N
2 Гений 1С
 
гуру
30.05.20
12:25
(1) хз, я где-то полчаса отлаживал функцию, чтобы начала выдавать правильную последовательность, вот и подумал, что у меня что-то не то с мат.аппарамтом, не прокачан он.
3 Гений 1С
 
гуру
30.05.20
12:26
(1) не согласен, 27 - это не двухзначный нуль, это АА?
4 RomanYS
 
30.05.20
12:27
(0) Ну и
Если Значение = 0 Тогда Прервать; КонецЕсли;

в данных циклах рассмешило от человека, который код десятилетиями пишет
5 RomanYS
 
30.05.20
12:29
(3) тебе сдвиг на 1 надо сделать
0 - "A"
25 - "Z"
26 - "AA"
6 trad
 
30.05.20
12:32
Имена колонок екселя
7 МихаилМ
 
30.05.20
12:35
(4) перевод из систем счисления в 9 классе по информатике проходят.
8 BeerHelpsMeWin
 
30.05.20
12:37
9 RomanYS
 
30.05.20
12:42
(7) Это не совсем СС, тут он правильно написал. Хотя основы комбинаторики где-то там же проходят. В общем сам вопрос норм.

А (4) в конце цикла "Пока Значение > 0 Цикл" это прикол
10 Salimbek
 
30.05.20
12:53
(9) Почему нет? 26-ричная система счисления на алфавите ABCD..
11 NorthWind
 
30.05.20
12:54
(0) Это 26-ричная система счисления с буквенным алфавитом, где цифра от 1 до 26 представляется как буква от А до Z.
12 NorthWind
 
30.05.20
12:54
Сорри, от 0 до 25, конечно
13 МихаилМ
 
30.05.20
12:54
сайт avb  досих пор жив. http://avb1c.narod.ru/
14 RomanYS
 
30.05.20
12:58
(10) Потому что в обычной СС ноль , 00, 000 - это всё одно число. А в (0) "A" < "AA" < "AAA" ...
15 RomanYS
 
30.05.20
12:59
+(1) без сдвига на единицу ("A" = 0):

Функция Перестановка(Знач Ч, Модуль = 26, Нач = "A")
    
    НачКод = КодСимвола(Нач);
    
    Цифр = 1;
    Пока Ч >= Pow(Модуль, Цифр) Цикл
        Ч = Ч - Pow(Модуль, Цифр);
        Цифр = Цифр + 1;
    КонецЦикла;
    
    Рез = "";
    Для инд = 1  По Цифр Цикл
        Рез = Символ(НачКод + Ч % Модуль) + Рез;
        Ч = Цел(Ч/Модуль);
    КонецЦикла;
    
    Возврат Рез;
    
КонецФункции // ()
16 МихаилМ
 
30.05.20
13:02
(15) для этого в 1с есть функция логарифма
17 NorthWind
 
30.05.20
13:03
(14) можно делать правильно с точки зрения СС, т.е. "отказаться" от значения АА, а использовать BA после Z. Т.е. X,Y,Z,BA,BB,BC...ZZ,BAA,BAB... Префиксам-то какая разница? Главное уникальность.
18 RomanYS
 
30.05.20
13:03
(16) Да первый цикл можно убрать, но Гений может не понять :)
19 NorthWind
 
30.05.20
13:03
чтобы был аналог 10, 100 и т.д.
20 Гений 1С
 
гуру
30.05.20
13:04
(17) не, не стоит прогибаться под 1С, мнение заказчика важнее. Не элегантно.
21 RomanYS
 
30.05.20
13:04
(17) Вопрос в (0) именно про математику, а не про префиксы :)
22 RomanYS
 
30.05.20
13:07
(16) а нет, (18) отменяется. Логарифм не прокатим по крайней мере напрямую. Там же сумма(N^i), а не просто (N^i)
23 Гений 1С
 
гуру
30.05.20
13:07
(21) но если возник вопрос про префиксы, то я такое решение сразу отверг. В принципе, можно было бы и в СС переводить готовой функцией, но некрасиво.
24 Shandor777
 
30.05.20
13:14
Что-то мне подсказывает, что в (0) приведена последовательность натуральных чисел. Нуля, как числа в ней нет.
25 RomanYS
 
30.05.20
13:16
(24) Если там нет нуля, то там нет и всех чисел с нулём в записи: 10, 100, 101, 110, 1000, 1001...
26 Сияющий в темноте
 
30.05.20
13:18
это система счисления со смещением.
первая цифра идет в другой системе,где нет нуля-остальные в обычной.
27 BeerHelpsMeWin
 
30.05.20
13:33
О, логарифмы пошли.
Вам код из (8) в 1с перевести?
28 Dmitry77
 
30.05.20
13:34
нумкрация столюцов в excel
29 Сияющий в темноте
 
30.05.20
13:40
(27) там обычный перевод в систему счисления с основанием 26,просто,старшая цифра может быть в 27 вариантах и входное число смещено на единицу.
30 RomanYS
 
30.05.20
13:52
(29) Это тоже самое, что и (24). И не работает. Или в итоге после всех костылей сведётся к (8) или (15)
31 NorthWind
 
30.05.20
13:55
скорее всего, считать нужно по основанию 26, но перед получением буквы из массива делать какие-то простые преобразования для части цифр. Например, уменьшать на единицу.
32 NorthWind
 
30.05.20
13:57
можно просто взять бумажку и расписать. Преобразование в СС делается довольно просто: делим на основание, остаток является очередной цифр, а частное - если оно больше основания, то нужно все повторить еще раз, если меньше, то это и будет последняя цифра и алгоритм завершен. Если расписать пару-тройку чиселок, то будет понятно, как правильно корежить получающиеся остатки чтобы вышло то что надо
33 Гений 1С
 
гуру
30.05.20
14:20
(32) ну вот я так и делал, ковырял, пока не получилось в контрольных точках нужное значение. Но это было не сразу. Без математики пришлось итерационно отлаживать алгоритм.
Программист всегда исправляет последнюю ошибку.