Имя: Пароль:
1C
1C 7.7
v7: Уникальный ID документа
0 spectre1978
 
15.05.15
12:10
Нужно для семерки сделать уникальный ID документа из цифр и латиницы, как можно более короткий (в идеале 10-12 знаков), чтобы впоследствии по нему можно было документ в той же базе найти. Нет ли готовых наработок? Изобретать велосипед неохота. Про ЗначениеВСТрокуВнутр и ЗначениеВСтроку знаю - не подходит потому что мусора в строке много, знаки препинания, скобки.
1 spectre1978
 
15.05.15
12:11
пока приходит в голову соорудить строку из номера и года, но еще нужно с префиксами на кириллице что-то сделать
2 Ёпрст
 
15.05.15
12:14
(0) iddoc документа, если че, 9 символов.
А про ЗначениеВСТрокуВнутр .. ты не знаешь, как бэ.
3 spectre1978
 
15.05.15
12:15
(2) каким образом получить?
4 spectre1978
 
15.05.15
12:16
и каким образом по нему найти док?
5 ДенисЧ
 
15.05.15
12:16
2с+= очень поможет
6 ДенисЧ
 
15.05.15
12:16
1с++
7 spectre1978
 
15.05.15
12:17
Понял. А если без сторонних разработок?
8 Ёпрст
 
15.05.15
12:18
(7) ознакомься, что есть ЗначениеВСтрокуВнутр и.. всё найдется и без ВК
9 spectre1978
 
15.05.15
12:18
(8) где почитать?
10 Spyke
 
15.05.15
12:19
(0)     Использовать v7plus.dll

ЗагруженаВ7Плюс = 1;
    Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
        Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "ExtForms\" + "v7plus.dll") <> 1 Тогда        
            Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда
                //Предупреждение("Компонента v7plus.dll не найдена! Продолжение работы невозможно!", 10);
                //СтатусВозврата(0);
                //Возврат;
                ЗагруженаВ7Плюс = 0;
            КонецЕсли;    
        КонецЕсли;
    КонецЕсли;
    
    Если ЗагруженаВ7Плюс = 1 Тогда
        Попытка    
            глНТТРСистИнформ = СоздатьОбъект("AddIn.V7SysInfo")
        Исключение
        КонецПопытки;


Далее в глобальнике
Функция глСоздатьИдентификатор()    Экспорт
    Если ПустоеЗначение(глНТТРСистИнформ) = 1 Тогда
        Возврат("");
    Иначе
        Возврат(СокрЛП(глНТТРСистИнформ.СоздатьGUID()));
    КонецЕсли;
    
    
КонецФункции    // глСоздатьИдентификатор()
Далее привводе нового документа
запихивать в реквизит динной 36 символов
11 drcrasher
 
15.05.15
12:19
(10) извращение
(9) в СП
12 spectre1978
 
15.05.15
12:20
(10) не подойдет, документов уже много, править базу не вариант. Хотелось бы обойтись уже имеющейся инфой без добавления лишних сущностей
13 spectre1978
 
15.05.15
12:21
+ (12) то же касается ВК. Хотелось бы стандартными средствами, без изменения базы, без навешивания ВК кроме стандартной v7plus
14 spectre1978
 
15.05.15
12:22
(11) В СП ничего нет
ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> - значение объекта агрегатного типа данных которое нужно преобразовать.
Подробнее см. в документации, глава ''Системные процедуры и функции''
15 spectre1978
 
15.05.15
12:23
(8), (14) я так понимаю, речь идет о том чтобы разодрать эту строку и чего-то из нее достать, а потом собрать. Правильно ли я понял? Где можно почитать про формат строки?
16 Cap_1977
 
15.05.15
12:24
Сообщить(ЗначениеВСтрокуВнутр(ТекДок));

Блеать
17 spectre1978
 
15.05.15
12:25
(16) спокойнее :)
вот строка
{"O","0","0","1611","0","0","         0   "}
что мне с ней сделать?
18 Ёпрст
 
15.05.15
12:26
И вообще, если нет уриба, то и 6 символов от iddoc использовать можно. И ..если перевести в систему счисления с большим основанием, то и еще меньше длина строки получится.
19 spectre1978
 
15.05.15
12:27
Ребят, это зашибись что вы такие загадочные, но может вы все-таки либо объясните по-нормальному, либо скажете где прочитать?
20 Ёпрст
 
15.05.15
12:28
21 spectre1978
 
15.05.15
12:29
(20) О! Так бы сразу. Спасибо!
22 Cap_1977
 
15.05.15
12:30
(21) Лентяйка ;(
23 1Сергей
 
15.05.15
12:32
+ для перевода в/из тридцатишестиричную, воспользуйтесь:
_idtostr() и _strtoid()
24 1Сергей
 
15.05.15
12:35
хотя, если идет выгрузка из/в обособленных баз со схожей структурой (родственные... да, и не только), то я бы на этот id не возлагал больших надежд. Будут повторяться с очень высокой вероятностью.
25 spectre1978
 
15.05.15
12:37
(24) но в этом случае можно тем или иным способом обозначить префикс базы?
26 1Сергей
 
15.05.15
12:37
(25) не можно, а нужно :)
27 Ёпрст
 
15.05.15
12:38
(25) он уже и так есть в iddoc -  последние 3 символа
28 spectre1978
 
15.05.15
12:38
правильно ли я понял, что вот это вот "         0   " и есть строка в 36-ричной кодировке?
29 Ёпрст
 
15.05.15
12:38
(28) так обозначается пустой шввщс
30 Ёпрст
 
15.05.15
12:39
iddoc
31 Ёпрст
 
15.05.15
12:41
Если нужен обмен между разными базами, ставь мод.
Правила рисуются за час лююбые. Между любыми базами.
32 1Сергей
 
15.05.15
12:42
(27) это если риб
33 spectre1978
 
15.05.15
13:31
(18) я опять по поводу IDDOC.
По описанию все-таки не совсем понял, как он заполняется.
Изначально полагаем, что он забит символами пробела, т.е. 0x20. Они незначащие. А вот дальше начинается интересное. У меня в базе встречаются иддоки, в которых заполнен один десятый по счету от начала строки символ. Есть - где заполнены 9 и 10 символы. У более свежих доков забито все с 6 по 13. Получается, что выравнивания по правому краю строки нет? И где тогда хранится префикс, в каких символах?
В описании написано вот так:
Седьмой параметр списка - строка 13 символов:
01-10 ИД вида объекта
11-20 ИД объекта
21-23 ИД информационной базы (УРИБ).
Какие 21-23, если строка 13 символов? Я запутался.
34 spectre1978
 
15.05.15
15:07
Кажется, понял. Выравнивание кода идет от 10 символа справа налево, с 11 по 13 - номер ИБ, дополенный нулями. Используются десятичные цифры.
35 Garykom
 
гуру
15.05.15
15:26
Когда то давно делали самопальный УРИБ на 1С 7.7 для обмена через xml и ftp.

Для синхронизации сделали коды строковые подлиннее.
И просто ГУИДы через ВК получали и в код писали.

С небольшим извращением (base64) для хранения 16 байт guid в 24 макс длина кода в 1С 7.7
36 Serginio1
 
15.05.15
15:30
(31) Я и сейчас делаю обмен между 7 кой и восьмеркой.
Длыя получения GUIDа вк не нужна

Функция ПолучитьНовыйГуид()
    TypeLib = CreateObject("Scriptlet.TypeLib");
    NewGUID = TypeLib.Guid();
    TypeLib="";
    Возврат Нрег(Сред(NewGUID,2,36));
КонецФункции
37 Spyke
 
15.05.15
15:36
(36) Аналог в (10) но ТС отверг
38 spectre1978
 
15.05.15
16:03
(37) коды уже есть, менять их не хочется, равно как не хочется модифицировать документы. А главное - это и не нужно. IDDOC спасает, вполне, но я хочу поподробнее узнать структуру. (18) пишет про 6 идентифицирующих символов... начиная с какого они отсчитываются? Если в 11-13 префикс, то получается что они идут с 5 по 10. Может ли быть что-то значимое в первых четырех?
39 Torquader
 
15.05.15
19:50
(38) В (17) вас обманули, ID будет написан вместо последнего нуля, если сделать ЗначениеВСтрокуВнутр(Док.ТекущийДокумент())
Причём, у всех документов ИД общие.
Ид состоит из 10 цифр (число 4 байта) и трёх символов РИБ.
Чтобы обратно получить ссылку документа, можно собрать строку с ИД вида (в (17) число 1611) подставить Ид-вида любого документа и выполнить поиск Док.НайтиДокумент(ЗначениеИзСтрокиВнутр(НашаСтрока));
всё получится.
40 spectre1978
 
15.05.15
20:55
(39) Уже сделал нужный мне механизм, основываясь на предположении что ид из 10 цифр. Вы подтвердили, спасибо.