Восстановление транзакции

26. пользователь 23.03.12 06:42
Сообщение было скрыто модератором.
...
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
27. Серёга 21.10.07 16:22 Сейчас в теме
Возникла такая проблемма:
пишу загрузку данных из одной базы в другую (обе ТиС)
так как документов много - использую транзакцию.
при загрузке нужно сохранить нумерацию документов (если это возможно).
естественно я использую префикс, чтобы небыло конфликтов с имеющимися документами.

в безе которая грузится используются документы "ОтчетККМ" и "ПКО" - у них сквозная нумерацию, нумератор "ПКО".
Операторы в это базе безобразно забивали эти докумены и поэтому получились к примеру такие "ОтчетККМ 00005" и "ПКО В00005", но и это ещё не все, префиксы в этих документах использовались как попало.

поэтому когда я им присваиваю оди префикс, возникают конфликты
обрабатываю это следующим способом:
1) присваиваю им номер к примеру так: если было "0007" то стало "А007".
2) делаю попытку записи документа в операторах "Попытка - Исключение", если не удается, то получаю номер через "УстановитьНовыйНомер("А")"

можно конечно перед записью проверять на существование такого номера, но в этом проблемма: нумерация сквозная и называется нумератор "ПКО", поэтому если я ищу соответствующий номер то в любом случае ищу по документу "ПКО" а не нумератору "ПКО", хотя этот номер может принадлежать документу "ОтчетККМ" и соответственно не найдется. это уже проверялось

так вот, это было все предисловие, проблемма в том что когда обрабатываются операторы "Исключение - КонецПопытки", т.е. документ не удалось записать с текущим номером. то потом транзакция "ЗафиксироватьТранзакцию()" не завершается успешно, хотя я присвоил документу новый номер и удачно его записал.
вопрос: как можно вернуть транзакцию на место.

привожу код:
<pre>
Попытка
_ЗагрДок.Записать();
Исключение
ВывестиСообщение("Ошибка записи документа: " + _ВидДок + " " + _ЗагрДок.НомерДок + " от " + _ЗагрДок.ДатаДок, "!!!");
_ЗагрДок.УстановитьНовыйНомер(мПрефиксДокументов);
ВывестиСообщение("Номер документа изменен на: " + _ЗагрДок.НомерДок, "!!!");
_ЗагрДок.Записать();
КонецПопытки;
</pre>


28. Wladimir_spb 21.10.07 18:08 Сейчас в теме
Делай не попытку записи, а поиск по номеру...
29. Серёга 21.10.07 18:38 Сейчас в теме
Я про это уже писал:

"можно конечно перед записью проверять на существование такого номера, но в этом проблемма: нумерация сквозная и называется нумератор "ПКО", поэтому если я ищу соответствующий номер то в любом случае ищу по документу "ПКО" а не нумератору "ПКО", хотя этот номер может принадлежать документу "ОтчетККМ" и соответственно не найдется. это уже проверялось"
30. Wladimir_spb 21.10.07 18:46 Сейчас в теме
Что мешает пройтись по всем документам нумератора?
31. Серёга 21.10.07 20:53 Сейчас в теме
Тоесть получается, что нельзя восстановить транзакцию?
32. poppy 21.10.07 21:18 Сейчас в теме
33. Wladimir_spb 21.10.07 21:21 Сейчас в теме
Даже если можно, все равно неправильно проверять номер попыткой записи.
34. Abadonna 3964 22.10.07 02:48 Сейчас в теме
1. Попробуй не использовать УстановитьНовыйНомер, а просто НомерДок=НомерДок+"А";
2. Для контроля попробуй в исключении сразу написать
ЗавершитьТранзакцию();
НачатьТранзакцию();
35. Abadonna 3964 22.10.07 03:03 Сейчас в теме
2Wladimir_spb
Что значит неправильно? Это ты сказал? Всю жизнь так делаю.
Для того и придуман блок Попытка Исключение
P/S И можешь быть уверен, что внутри 1С перед Записать() как раз и идет проверка НайтиПоНомеру.
Так что никакой половой разницы нет
36. CheBurator 2696 22.10.07 03:07 Сейчас в теме
Присвойпрефикс типа А#
и не мучайся
37. Серёга 22.10.07 08:03 Сейчас в теме
Спасибо всем!
У меня тоже есть мысли как это можно реализовать, но они получаются как-то через ...опу.
просто постоянно пишу алгоритмы так, чтоб это подошло для многих случаев, тоесть универсально.
а номер с префиксом "А#" - тоже может попастся.
38. Wladimir_spb 22.10.07 09:35 Сейчас в теме
2Abadonna
Кусок из одноэсовской статьи "Обработка исключений":
...Чем меньше в вашей программе будет таких конструкций, тем лучше. Все потенциальные ошибки необходимо «отлавливать» по возможности еще до их возникновения...
39. CheBurator 2696 22.10.07 09:46 Сейчас в теме
Тогда пиши префикс в цикле со всеми допустимыми символами, префикс должен заканчиваться символом чей код меньше кода нуля - фишка как раз в этом..
40. Abadonna 3964 22.10.07 09:46 Сейчас в теме
Тупая статья, значит.
В путних языках даже принудительная генерация исключений предусмотрена
41. Серёга 22.10.07 10:18 Сейчас в теме
Сhe Burashka Написал:
-------------------------------------------------------
> Тогда пиши префикс в цикле со всеми допустимыми
> символами, префикс должен заканчиваться символом
> чей код меньше кода нуля - фишка как раз в этом..

Это не поможет, описано выше.
просто если есть документ ОтчетККМ с номером "А0002".
то когда я создаю документ "ПКО А0002" и проверяю этот номер с помощью функции "НайтиПоНомеру(...)" то она мне скажет что такого номера нет, а при записи документа вылетит ошибка "Номер не уникальный".
42. CheBurator 2696 22.10.07 12:05 Сейчас в теме
какой-то бред ты написал...
я какую мысль хочу до тебя донести:
1. юзеры насоздовали всяких префиксов.
2. тебе надо обеспечить чтобы автоматно-программно создаваемый префикс НЕ ИСПОЛЬЗОВАЛСЯ ЮЗЕРАМИ.
3. как система нумерует документы:
- находится ПОСЛЕДНИЙ ИСПОЛЬЗОВАННЫЙ ПРЕФИКС !!!ПО АЛФАВИТУ!!!
- его номерная часть +1
4. чтобы юзеры НЕ БРАЛИ !!!"ТВОЙ" ПРЕФИКС"!!! для своего тупого ручного использования - надо всего лишь обеспечить чтобы ТВОЙ ПРЕФИКС !!!НЕ БЫЛ ПОСЛЕДНИМ ПО АЛФАВИТУ СРЕДИ ВСЕХ ИСПОЛЬЗУЕМЫХ ПРЕФИКСОВ ДЛЯ ЭТОГО ВИДА ДОКУМЕНТОВ!!!
5. это обеспечивается наличием перед номерной частью НЕКОЕГО СИМВОЛА С КОДОМ МЕНЬШЕ КОДА ЗНАКА 0 (ноль).
..
на примере:
- счета-фактуры нумеруются МГ0001
- бух для авансовых счф захренячил МГа00001
- теперь любое ручное введение ОБЫЧНОЙ СЧФ приведет к ее нумерации МГа0002 - т.е. в системе "внутренней" нумерации отнесет к авансовым - см.почему выше написано...
- вместо МГа надо было ввести МГ/ (слеш меньше 0) - ручные отгрузочные СЧФ ПРОДОЛЖАЛИ БЫ НУМЕРОВАТЬСЯ !!!!!АВТОМАТОМ!!! в правильном префиксе, а авансовые бухи пусть нумеруют ручками - любят они это дело.. имитация бурной деятельности блин....
..
такой подход можно преломить к твоей ситуевине..
..
ффу блин...
43. Серёга 22.10.07 12:31 Сейчас в теме
это получается ты не понял моей проблеммы.
в данный момент я делаю загрузку из одной конфы в другую (обе ТиС).
тоесть объединяю базы двух фирм в одну.
в конечной базе префиксы должны стоять те, которые указаны для этой фирмы. тоесть для одной фирмы "А" для другой "Б".
и данная проблемма у меня возникает именно во время этой загрузки
44. CheBurator 2696 22.10.07 12:38 Сейчас в теме
вот проблема - и непонятна... в чем ОНА?
45. Abadonna 3964 22.10.07 12:39 Сейчас в теме
Блин, Серега, разговор шел о том, что срывается транзакция, а вовсе не о префиксах.
(Серега - имеется в виду Чебур, а не Серёга ;))
46. CheBurator 2696 22.10.07 13:22 Сейчас в теме
транзакция срывается из-за нумерации!!
47. poppy 22.10.07 14:57 Сейчас в теме
Складывается впечатление, что никто незнает (или забыл) что такое транзакция.

Транзакция предназначена для одновременной записи (или незаписи) изменений в базу данных. То, что транзакция работает быстрее - это всего лишь свойство ее реализации в движке 1С.

Попытка записать документ с неуникальным номером - это тоже элемент транзакции. Если один документ не записан, то остальные тоже записывать нельзя (иначе это уже не транзакция).

Использование конструкии Попытка позволяет заранее узнать об ошибках, но не позволяет этой ошибки избежать.

ИМХО возможные решения:
1. На первом проходе выявлять проблемные документы. Если таких документов нет, то фиксировать транзакцию, если есть - то отменять ее и переходить на второй проход.
На втором проходе присваивать номера документам с учетом результатов первого прохода.

2. Используем Попытку, но не используем Транзакцию

3. Используем Транзакцию, но не используем Попытку. Возможные коллизии определыем с помощью метода НайтиПоНомеру().
48. Abadonna 3964 22.10.07 18:22 Сейчас в теме
Чё получил - сам не понял, но забавно
Тфу... не то....
49. Shaman100M 1151 24.10.07 10:29 Сейчас в теме
По проблеме одноименного нумератора и вида документа "ПКО" тоже столкнулся в своей http://infostart.ru/profile/8196/projects/1143/

Использовал последовательно метод "НайтиПоНомеру()" для всех видов документов, включенных в нумератор.
50. Shaman100M 1151 24.10.07 10:32 Сейчас в теме
+ тогда можно обойтись без попытки
51. danser 3 26.10.07 02:07 Сейчас в теме
Не мучася, используй метод ПрефиксНомера(), или можно УстановитьНовыйНомер, но тогда у тебя нумерация с последним префиксом пойдет с 0 :) и всё.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот