|
Подписка "ПередЗаписьюДокумента()" | ☑ | ||
---|---|---|---|---|
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
|
||||
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
|
Со стороны другой базы никто ничего делать не будит НИКОГДА!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |