Имя: Пароль:
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) ну вот я так и делал, ковырял, пока не получилось в контрольных точках нужное значение. Но это было не сразу. Без математики пришлось итерационно отлаживать алгоритм.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший