Имя: Пароль:
1C
 
Получить ссылку на документ при его первой записи
0 ac13
 
29.04.17
18:49
Можно ли как-то получить ссылку нового документа при его первой записи. Перед записью никак, а при записи ссылка же уже формируется, правильно? Мне надо получить ссылку при записи и записать ее в реквизит. При первой записи ссылку не записывает, а вот при повторной - все ок. А мне надо при первой
Вот мой код:

Процедура ПриЗаписи(Отказ)
Если Не ЗначениеЗаполнено(Реквизит) Тогда
     Реквизит = СокрЛП(ЧисловойКодПоСсылке(Ссылка));
КонецЕсли;
КонецПроцедуры

Функция ЧисловойКодПоСсылке(Ссылка)
     ШестнадчатиричноеЧисло = СтрЗаменить(Строка(Ссылка.УникальныйИдентификатор()),"-","");
     Возврат
  
  
ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(ШестнадчатиричноеЧисло);
КонецФункции

Функция ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(Знач Значение)
     Значение = НРег(Значение);
     ДлинаСтроки = СтрДлина(Значение);
     Результат = 0;
     Для НомерСимвола = 1 По ДлинаСтроки Цикл
          Результат = Результат * 16 + СтрНайти("0123456789abcdef", Сред(Значение, НомерСимвола, 1)) - 1;
     КонецЦикла;
     Возврат Формат(Результат, "ЧГ=0");
КонецФункции
1 ac13
 
29.04.17
18:59
Главное саму ссылку формирует и заполняет реквизит, пока форма открыта. А когда закроешь откроешь документ - в реквизите пусто. То есть ссылку получает, но не записывает в реквизит
2 ac13
 
29.04.17
19:01
Оно ссылку получает наверное уже после того как документ записан. А как тогда быть? Мне надо получить и записать ее в реквизит при первой записи.
3 Flip
 
29.04.17
19:04
Ну есть же функция;
УстановитьСсылкуНового(Документы.МойДок.ПолучитьСсылку(Новый УникальныйИдентификатор));
4 Flip
 
29.04.17
19:09
Выполняешь эту функцию в процедуре на сервере, контекст твоей формы синхронизируется с серверным объектом формы, форма на клиенте перестраивается, и в твоем реквизите нужное значение.
5 ac13
 
29.04.17
19:11
Процедура ПриЗаписи(Отказ)

    НовыйУин = Документы.ЗаявкаНаРемонт.ПолучитьСсылку(Новый УникальныйИдентификатор);
    ШестнадчатиричноеЧисло = СтрЗаменить(Строка(НовыйУин),"-","");
    НовыйШтрихкод = ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(ШестнадчатиричноеЧисло);
    Если Не ЗначениеЗаполнено(Штрихкод) Тогда
        Штрихкод = НовыйШтрихкод);
    КонецЕсли;

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

Функция ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(Знач Значение)
    
    Значение = НРег(Значение);
    ДлинаСтроки = СтрДлина(Значение);
    Результат = 0;
    Для НомерСимвола = 1 По ДлинаСтроки Цикл
        Результат = Результат * 16 + СтрНайти("0123456789abcdef", Сред(Значение, НомерСимвола, 1)) - 1;
    КонецЦикла;    
    Возврат Формат(Результат, "ЧГ=0");
    
КонецФункции
6 ac13
 
29.04.17
19:12
Код пишу в модуле объекта.
Но че-то то же самое
7 Flip
 
29.04.17
19:18
Так, в процедуре ПриЗаписи() ссылка на записываемый объект, уже должна быть в базе.
Если хочешь получить ссылку, то это надо делать ПередЗаписью()
8 Flip
 
29.04.17
19:21
Типа
Процедура ПередЗаписью(Отказ)

    НовыйУин = Документы.ЗаявкаНаРемонт.ПолучитьСсылку(Новый УникальныйИдентификатор);
    ШестнадчатиричноеЧисло = СтрЗаменить(Строка(НовыйУин),"-","");
    НовыйШтрихкод = ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(ШестнадчатиричноеЧисло);
    Если Не ЗначениеЗаполнено(Штрихкод) Тогда
        Штрихкод = НовыйШтрихкод);
    КонецЕсли;
// если что-то пошло не так, то
    Отказ = Истина;
КонецПроцедуры
9 Flip
 
29.04.17
19:25
Перед записью - ссылки на новый объект еще пока нет, но платформа позволяет "выделить место" в базе под новым идентификатором объекта, с помощью метода ПолучитьСсылку(Новый УникальныйИдентификатор);
а при записи -  объект уже записан в БД, как ссылка.
10 ac13
 
29.04.17
19:28
(8) спасибо! так работает, единственное ссылка не такая как конечная. слишком длинный в итоге номер
11 ac13
 
29.04.17
19:40
Новая ссылка:
<Объект не найден> (24263:b8658564a8357dfd4defc7d01dc1a61f)

Ссылка после записи:
1ab0a8f2-2cfa-11e7-aa50-78e3b51a8a1f

Мне кажется конечный вариант ссылки никак не получить сразу.
12 ac13
 
29.04.17
19:42
Либо попробовать конвертировать ссылку в уин
13 Flip
 
29.04.17
19:43
Попробуй использовать эти функции преобразования (долгих лет человеку, который их написал!! :) );
Функция Из_10_В_Любую(Знач Значение=0,Нотация=128) Экспорт
     Если Нотация<=0 Тогда Возврат("") КонецЕсли;
     Значение=Число(Значение);
     Если Значение<=0 Тогда Возврат("0") КонецЕсли;
     Значение=Цел(Значение);
     Результат="";
    
     Пока Значение>0 Цикл
         Результат=Сред("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!" + "#$%&'()*+,-./:;<=>?@[\]^_`{|}~" +  """",Значение%Нотация+1,1)+Результат;
         Значение=Цел(Значение/Нотация) ;
     КонецЦикла;
    
     Возврат Результат;
КонецФункции
//_________________________________________________________

Функция Из_Любой_В_10(Знач Значение="0",Нотация=128) Экспорт
    Если Нотация<=0 Тогда Возврат(0) КонецЕсли;
    Значение=СокрЛП(Значение);
    Если Значение="0" Тогда Возврат(0) КонецЕсли;
    Результат=0;
    Длина=СтрДлина(Значение);
    
    Для Х=1 По Длина Цикл
        М=1;
        Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
        
        Результат=Результат+(Найти("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!" + "#$%&'()*+,-./:;<=>?@[\]^_`{|}~" +  """",Сред(Значение,Х,1))-1)*М;
    КонецЦикла;
    
    Возврат Окр(Результат);
КонецФункции
14 Flip
 
29.04.17
19:45
Я вот так преобразовываю гуид ссылки в штрихкод (сам поправишь то что нужно);


Функция УпаковатьГУИДСсылки(Ссылка) Экспорт
    
    ГУИДСсылки  = Ссылка.УникальныйИдентификатор();
    
    Если ГУИДСсылки = Неопределено Тогда
        ОбщегоНазначения.СообщитьОбОшибке("Не удалось определить GUID передаваемого объекта!");
        Возврат "";
    КонецЕсли;
    
    ГУИДСсылкиБезДефисов = СтрЗаменить(СокрЛП(ГУИДСсылки), "-","");
    
    ГУИДСсылкиБезДефисов = "a" + ГУИДСсылкиБезДефисов;
    
    ДесятичноеПредставление = Из_Любой_В_10(ГУИДСсылкиБезДефисов, 16);
    
    СтоДвадцатиВосьмиричноеПредставление = Из_10_В_Любую(ДесятичноеПредставление, 94);
    
    Возврат СтоДвадцатиВосьмиричноеПредставление;
    
КонецФункции

Функция ПреобразоватьШтрихКодВГУИД(ПрочитанныйШтрихкод, Нотация10 = 94 , Нотация16 = 16) Экспорт
    
    ДесятичноеПредставление = Из_Любой_В_10(ПрочитанныйШтрихкод, Нотация10);
    
    ШестнадцатиричноеПредставление = Из_10_В_Любую(ДесятичноеПредставление, Нотация16);
    
    ШестнадцатиричноеПредставление = Сред(ШестнадцатиричноеПредставление, 2);
    
    ГУИД = Лев(ШестнадцатиричноеПредставление, 8)+"-"+Сред(ШестнадцатиричноеПредставление,9,4)+"-"+Сред(ШестнадцатиричноеПредставление,13,4)+"-"+Сред(ШестнадцатиричноеПредставление,17,4)+"-"+ Сред(ШестнадцатиричноеПредставление,21,12);
    
    Если ЗначениеЗаполнено(ГУИД) Тогда
        Возврат ГУИД;
    Иначе     
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции

Функция Из_10_В_Любую(Знач Значение=0,Нотация=128) Экспорт
     Если Нотация<=0 Тогда Возврат("") КонецЕсли;
     Значение=Число(Значение);
     Если Значение<=0 Тогда Возврат("0") КонецЕсли;
     Значение=Цел(Значение);
     Результат="";
    
     Пока Значение>0 Цикл
         Результат=Сред("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!" + "#$%&'()*+,-./:;<=>?@[\]^_`{|}~" +  """",Значение%Нотация+1,1)+Результат;
         Значение=Цел(Значение/Нотация) ;
     КонецЦикла;
    
     Возврат Результат;
КонецФункции
//_________________________________________________________

Функция Из_Любой_В_10(Знач Значение="0",Нотация=128) Экспорт
    Если Нотация<=0 Тогда Возврат(0) КонецЕсли;
    Значение=СокрЛП(Значение);
    Если Значение="0" Тогда Возврат(0) КонецЕсли;
    Результат=0;
    Длина=СтрДлина(Значение);
    
    Для Х=1 По Длина Цикл
        М=1;
        Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
        
        Результат=Результат+(Найти("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!" + "#$%&'()*+,-./:;<=>?@[\]^_`{|}~" +  """",Сред(Значение,Х,1))-1)*М;
    КонецЦикла;
    
    Возврат Окр(Результат);
КонецФункции
15 ac13
 
29.04.17
19:46
Не суть получить Шестнадцатиричный код
Главное, что новая ссылка перед записью и после записи разные.
Вот:

Процедура ПередЗаписью(Отказ)

НовыйУин = Документы.ЗаявкаНаРемонт.ПолучитьСсылку(Новый УникальныйИдентификатор);
Штрихкод = НовыйУин.УникальныйИдентификатор();
КонецПроцедуры

Результат такой: 726fa7e1-c3a9-4bc4-bce3-9c64383e2b41

Процедура ПриЗаписи(Отказ)

Штрихкод = Ссылка.УникальныйИдентификатор();

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

Результат такой: 03bfa291-2cfb-11e7-aa50-78e3b51a8a1f
16 ac13
 
29.04.17
19:47
Либо как вариант печатать на документе штрихкод не из ссылки документа, а из реквизита Штрихкод
17 KAO111
 
29.04.17
19:54
(15) Не хватает УстановитьСсылкуНового(НовыйУИН)
18 ac13
 
29.04.17
20:00
(17) теперь получилось.
(8), (17) спасибо вам!!!
19 Flip
 
29.04.17
20:14
Пожалуйста :)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.