Имя: Пароль:
1C
1С v8
Подписка "ПередЗаписьюДокумента()"
,
0 Sasha_H
 
31.07.12
12:07
Есть подписка на данное событие, в процедуре подписки прописан код:


НаборЗаписей = РегистрыСведений.Объекты_ID.СоздатьНаборЗаписей();
   
   НоваяЗапись = НаборЗаписей.Добавить();
   НоваяЗапись.DocID        = ?(ЗначениеЗаполнено(ДокументОбъект.DocID), мDocID,мDocID+1);
   НоваяЗапись.DocRecID    = ?(СтрокиДокумента.Количество()=0,мDocRecID, мDocRecID+СтрокиДокумента.Количество());
   
   НаборЗаписей.Записать(Истина);

Мне необходимо неважно запишится документ или нет,  мне надо чтобы РС в любом случае перезаписался, а он редиска, когда документа получает Отказ на запись не сохраняет изменений....

что не так то сделано?
1 asady
 
31.07.12
12:10
(0) потому что в транзакции
2 Sasha_H
 
31.07.12
12:11
черт, хотел код сэкономить, по-ходу придется эту всю бадю в модуле каждого объекта вызывать :(
3 zak555
 
31.07.12
12:12
что это за поля ?
4 Sasha_H
 
31.07.12
12:12
есть варианты как схитрить?
5 zak555
 
31.07.12
12:13
DocID - ID в каком виде ?
6 Sasha_H
 
31.07.12
12:13
(3) по коду видно, что это ЧИСЛО!
7 Kreont
 
31.07.12
12:14
(4) А если перенести в подписку ПриУстановкеНовогоНомера?
8 Sasha_H
 
31.07.12
12:15
дело в (1) , там транза идет, а по скольку 1С туповата и не имеет разделенных транз, то попытка написать НачатьТранзу не приводит к успеху.
9 zak555
 
31.07.12
12:15
(6) для какиз целей ?
10 Sasha_H
 
31.07.12
12:16
(9) мне, что выложить ТЗ сюда в полном объеме?!
11 Sasha_H
 
31.07.12
12:17
(7) не подходит, необходимо проаналиировать перед записью именно, может чего добавили в документ!
12 zak555
 
31.07.12
12:19
(10) я к тому, что где ты потом будешь это использовать ?
13 Spieluhr
 
31.07.12
12:20
(11) А какой смысл сохранять инфу в регистре, если в документе ввели абра-кадабру и он даже не записывается? Если док новый - у него и ссылки еще нет
14 Sasha_H
 
31.07.12
12:21
(13) есть смысл!
15 pumbaEO
 
31.07.12
12:22
Ну если есть вселенский смысл, то запускай фоновое асинхронное задание и туда передавай свои параметры.
16 Sasha_H
 
31.07.12
12:22
(12) В РС. поля счетчики:

v8: Блокировка записи РС

тут это обговаривалось...
17 Sasha_H
 
31.07.12
12:23
просто в случае реализации не учол транзакцию, а счас тестирую и вижу проблему...
18 zak555
 
31.07.12
12:26
(16) жесть
19 Classic
 
31.07.12
12:26
(0)
Запускай обработку, которая запишет.
20 hhhh
 
31.07.12
12:26
(15) товарищ из (15) прав. В общем фигачь данные в таблицу значений или в файл на диске, а потом уже после окончания транзакции перекидывай их в регистр сведений.
21 hhhh
 
31.07.12
12:27
(20) к (17)
22 Sasha_H
 
31.07.12
12:27
жесть в том. что данные надо отдавать не в базу 1С. По ИД числовом шапки документа и строки ТЧ.

Для этого мне необходимо хранить последнии счетчики, чтобы когда будет записыватся новая строка или новый документ взялся счетчик+1.
23 zak555
 
31.07.12
12:29
(22) гуид храниться в каком формате ?
24 Sasha_H
 
31.07.12
12:30
(23) ты что убить меня этим вопросом решил?

(6)
25 Sasha_H
 
31.07.12
12:31
(20) боюсь ребят наткнемся тогда на неуникальность :(
26 Sasha_H
 
31.07.12
12:33
вся жесть состоит в том, что для строк документов и их шапок надо присвоить числовые ИД, чтобы при обмене в другую БД это выгружать.
27 zak555
 
31.07.12
12:33
28 Sasha_H
 
31.07.12
12:34
(27) что со строками ТЧ собрался сделать?
29 zak555
 
31.07.12
12:35
(28) строки будет определять так
1ая -- числоАйдиДока
2ая -- числоАйдиДока+1
3ая -- числоАйдиДока+2
...
30 Sasha_H
 
31.07.12
12:38
(29) ну в этом что-то есть. я правда не увидил момента:

Ч = бфМат.ПереводИзСистемыСчисленияВЧисло(СтрGUID, 16);
31 Sasha_H
 
31.07.12
12:46
смое интересное, функция перевода системы изчесления где?
32 Sammo
 
31.07.12
12:50
(22) Ну и отдавай. Только через планы обмена
33 hhhh
 
31.07.12
13:04
(31) стоп. Ну у тебя же документ не записался, значит и твой регистр менять не надо. У тебя же в регистре номер последнего документа. Непонятно, чего ты паришься? То есть ответ был уже в (1).
34 Sasha_H
 
31.07.12
13:07
(33) дело в том, что я изменил в документе его реквизиты :(
35 Sasha_H
 
31.07.12
13:08
Процедура ПередЗаписьюДокументаДляОбменаЛЦ(ДокументОбъект,Отказ) Экспорт
   
   МетаданныеДокумента = ДокументОбъект.Метаданные();
   
  Если НЕ ОбщегоНазначения.ЕстьРеквизитДокумента("DocID", МетаданныеДокумента)
+ Code
       или Не ОбщегоНазначения.ЕстьТабЧастьДокумента("Товары",МетаданныеДокумента) Тогда
       Возврат;
   КонецЕсли;    
   
   Отбор = Новый Структура("DocRecID",0);
   Товары = ДокументОбъект.Товары;
   
   СтрокиДокумента = Товары.НайтиСтроки(Отбор);
   
   Если ЗначениеЗаполнено(ДокументОбъект.DocID) и СтрокиДокумента.Количество()=0 Тогда
       Возврат; //Всем строкам и шапке документа ID присвоенно

   КонецЕсли;    
   
   Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ
   |    Объекты_ID.DocID,
   |    Объекты_ID.DocRecID
   |ИЗ
   |    РегистрСведений.Объекты_ID КАК Объекты_ID
   |
   |ДЛЯ ИЗМЕНЕНИЯ
   |    РегистрСведений.Объекты_ID");
   
   РезЗапр = Запрос.Выполнить();
   Выборка = РезЗапр.Выбрать();
   Выборка.Следующий();
   
   Если РезЗапр.Пустой() Тогда
       Возврат;
   КонецЕсли;    
   
   мDocID         = Выборка.DocID;
   мDocRecID     = Выборка.DocRecID;
   
   //Записуем данные в РС

   НаборЗаписей = РегистрыСведений.Объекты_ID.СоздатьНаборЗаписей();
   
   НоваяЗапись = НаборЗаписей.Добавить();
   НоваяЗапись.DocID         = ?(ЗначениеЗаполнено(ДокументОбъект.DocID), мDocID,мDocID+1);
   НоваяЗапись.DocRecID     = ?(СтрокиДокумента.Количество()=0,мDocRecID, мDocRecID+СтрокиДокумента.Количество());
   
   НаборЗаписей.Записать();
   
   //Проставляем реквизиты в документ

   Если Не ЗначениеЗаполнено(ДокументОбъект.DocID) Тогда
       ДокументОбъект.DocID = мDocID+1;
   КонецЕсли;    
   
   Для каждого СтрокаТабличнойЧасти Из СтрокиДокумента Цикл
       
       СтрокаТабличнойЧасти.DocRecID = мDocRecID + 1;
       мDocRecID = мDocRecID+1;
       
   КонецЦикла;    
   
КонецПроцедуры
36 hhhh
 
31.07.12
13:08
(34) но это изменение не сохранилось. Значит получается, что не изменил реквизиты.
37 Sasha_H
 
31.07.12
13:10
ревизиты уже установились и когда пользователь не закрыл документ, а например исправил количество, то все уже.
38 Sasha_H
 
31.07.12
13:11
вот гуид в число, я не увидил самой интересной функции
Ч = бфМат.ПереводИзСистемыСчисленияВЧисло(СтрGUID, 16);

чего там внутри-то?!
39 hhhh
 
31.07.12
13:13
(37) они пишутся в базу в транзакции. И то что пользователь что-то там исправил - это никого не колышет. Транзакция отменена, значит пользователь со всеми его количествами послан в баню.
40 Sasha_H
 
31.07.12
13:13
(32) в этом тоже есть идея, присваивать ИД только во время обмена.
41 Sasha_H
 
31.07.12
13:17
(39) дел в том, что пример по коду выше:

проверяем заполнены ли реквизит Шапки и ТЧ, если что-то не заполнено идем ниже.

Читаем данные счетчиков в РС. Доплюсовуем эти счетчики и проставляем в реквизит документа.

Идет сбой при проведении так как пользователь например указал завышенное к-во.
Пользователь исправляет к-во и делает "Записать". на верхнем уровне в проерке уже реквизиты в документе
DocID и DocRecID заняты, а РС не знает об этом.
42 Sasha_H
 
31.07.12
13:21
то есть при получении из РС
DocID  = 100
DocRecID = 1000

в документ ставим DocID = 101
DocRecID = 1001

сбой в транзе, в РС не зашло изменения (101 и 1001), а вот в документ эти реквизиты установились. И при следующий записи, когда пользователь исправил замечания мы не присвоим никакого ID.

Потом след. документ записуем и берем эти же (101 и 1001) - уникальность нарушена.
43 Sasha_H
 
31.07.12
13:28
вижу рабочий вариант только (32).
минус его это перезапись документов.
44 Sammo
 
31.07.12
13:34
(43) А ты в РС храни не последний, а гуид конкретного документа.
45 hhhh
 
31.07.12
13:40
(42) так у тебя другая ситуация совсем. У тебя транзакция документа прошла успешно, у тебя регистр не записался.
46 hhhh
 
31.07.12
13:42
нужно чтобы у тебя как раз регистр писался в транзакции документа, а у тебя по отдельности документ и регистр. То есть в (8) бред у тебя.
47 Sasha_H
 
31.07.12
13:42
(45) не совем так. Первая транза дала сбой и гуиды встали в документ, после успешной транзы гуиды будут неверны.
48 Sasha_H
 
31.07.12
13:44
относительно Гуида в число и обратно нашол и протестил, мне не подходит, так как ИД  Ч(10)

вот примеры:


Функция УникальныйИдентификаторВЧисло(GUID) Экспорт
   Рез=0;
   Стр = Строка(GUID);
   Индекс=1;
   Пока Индекс<=36 Цикл
       Симв = Сред(Стр,Индекс,1);
       Если Симв="-" Тогда
           Индекс=Индекс+1;
           Продолжить;
       КонецЕсли;
       
       Если Симв>="0" и Симв<="9" Тогда
           Ч = Число(Симв);        
       ИначеЕсли Симв="a" Тогда
           Ч=10;
       ИначеЕсли Симв="b" Тогда
           Ч=11;
       ИначеЕсли Симв="c" Тогда
           Ч=12;
       ИначеЕсли Симв="d" Тогда
           Ч=13;    
       ИначеЕсли Симв="e" Тогда
           Ч=14;        
       ИначеЕсли Симв="f" Тогда
           Ч=15;        
       КонецЕсли;
       
       Рез=Рез*16+Ч;
       
       Индекс=Индекс+1;
   КонецЦикла;
   
   Сообщить(рез);  
   
   Возврат Рез;
КонецФункции

Функция ЧислоВGUID(Парам)
   
   СпецСтрока="0123456789abcdef";
   РезСтрока="";
   
   Парам1=Парам;
   Пока Парам1>0 Цикл
       Ост = Парам1%16;
       Парам1=(Парам1-Ост)/16;
       Длина=СтрДлина(РезСтрока);
       Если (Длина=12) или (Длина=17) или (Длина=22) или (Длина=27) Тогда
           РезСтрока="-"+РезСтрока;            
       КонецЕсли;
       РезСтрока=Сред(СпецСтрока,Ост+1,1)+РезСтрока;
   КонецЦикла;
   
   Возврат Новый УникальныйИдентификатор(РезСтрока);

КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   
   стрГ = Строка(ПолеВвода1.УникальныйИдентификатор());
   Сообщить(стрГ);
   ч = УникальныйИдентификаторВЧисло(стрГ);
   
   ссылко = ЧислоВGUID(ч);
   Сообщить(ссылко);
   
КонецПроцедуры

e5c93656-da45-11e1-94ee-2c768aa92b8d
305 437 964 834 603 041 129 328 196 376 110 640 013
e5c93656-da45-11e1-94ee-2c768aa92b8d
49 Sasha_H
 
31.07.12
13:46
то есть даже если я и переведу мой ГУИД документа в число а он:
305 437 964 834 603 041 129 328 196 376 110 640 013

не соответсвует разрядности :(
50 Sasha_H
 
31.07.12
13:47
(44) рост регистра он будет равен шапки+ тч строки
51 Sasha_H
 
31.07.12
13:52
хоть бери плин под скулем выполни через адо жостко INSERT :(
52 Sammo
 
31.07.12
14:00
(50) При обмене с другой базой сделали составной ключ - гуид регистратора + номер строки. При приходе гуида регистратора сторонняя база полностью перезаписывает все записи с первой частью ключа = гуид.
53 Sasha_H
 
31.07.12
14:41
Со стороны другой базы никто ничего делать не будит НИКОГДА!