Возникла такая проблемма:
пишу загрузку данных из одной базы в другую (обе ТиС)
так как документов много - использую транзакцию.
при загрузке нужно сохранить нумерацию документов (если это возможно).
естественно я использую префикс, чтобы небыло конфликтов с имеющимися документами.
в безе которая грузится используются документы "ОтчетККМ" и "ПКО" - у них сквозная нумерацию, нумератор "ПКО".
Операторы в это базе безобразно забивали эти докумены и поэтому получились к примеру такие "ОтчетККМ 00005" и "ПКО В00005", но и это ещё не все, префиксы в этих документах использовались как попало.
поэтому когда я им присваиваю оди префикс, возникают конфликты
обрабатываю это следующим способом:
1) присваиваю им номер к примеру так: если было "0007" то стало "А007".
2) делаю попытку записи документа в операторах "Попытка - Исключение", если не удается, то получаю номер через "УстановитьНовыйНомер("А")"
можно конечно перед записью проверять на существование такого номера, но в этом проблемма: нумерация сквозная и называется нумератор "ПКО", поэтому если я ищу соответствующий номер то в любом случае ищу по документу "ПКО" а не нумератору "ПКО", хотя этот номер может принадлежать документу "ОтчетККМ" и соответственно не найдется. это уже проверялось
так вот, это было все предисловие, проблемма в том что когда обрабатываются операторы "Исключение - КонецПопытки", т.е. документ не удалось записать с текущим номером. то потом транзакция "ЗафиксироватьТранзакцию()" не завершается успешно, хотя я присвоил документу новый номер и удачно его записал.
вопрос: как можно вернуть транзакцию на место.
"можно конечно перед записью проверять на существование такого номера, но в этом проблемма: нумерация сквозная и называется нумератор "ПКО", поэтому если я ищу соответствующий номер то в любом случае ищу по документу "ПКО" а не нумератору "ПКО", хотя этот номер может принадлежать документу "ОтчетККМ" и соответственно не найдется. это уже проверялось"
1. Попробуй не использовать УстановитьНовыйНомер, а просто НомерДок=НомерДок+"А";
2. Для контроля попробуй в исключении сразу написать
ЗавершитьТранзакцию();
НачатьТранзакцию();
2Wladimir_spb
Что значит неправильно? Это ты сказал? Всю жизнь так делаю.
Для того и придуман блок Попытка Исключение
P/S И можешь быть уверен, что внутри 1С перед Записать() как раз и идет проверка НайтиПоНомеру.
Так что никакой половой разницы нет
Спасибо всем!
У меня тоже есть мысли как это можно реализовать, но они получаются как-то через ...опу.
просто постоянно пишу алгоритмы так, чтоб это подошло для многих случаев, тоесть универсально.
а номер с префиксом "А#" - тоже может попастся.
2Abadonna
Кусок из одноэсовской статьи "Обработка исключений":
...Чем меньше в вашей программе будет таких конструкций, тем лучше. Все потенциальные ошибки необходимо «отлавливать» по возможности еще до их возникновения...
Сhe Burashka Написал:
-------------------------------------------------------
> Тогда пиши префикс в цикле со всеми допустимыми
> символами, префикс должен заканчиваться символом
> чей код меньше кода нуля - фишка как раз в этом..
Это не поможет, описано выше.
просто если есть документ ОтчетККМ с номером "А0002".
то когда я создаю документ "ПКО А0002" и проверяю этот номер с помощью функции "НайтиПоНомеру(...)" то она мне скажет что такого номера нет, а при записи документа вылетит ошибка "Номер не уникальный".
какой-то бред ты написал...
я какую мысль хочу до тебя донести:
1. юзеры насоздовали всяких префиксов.
2. тебе надо обеспечить чтобы автоматно-программно создаваемый префикс НЕ ИСПОЛЬЗОВАЛСЯ ЮЗЕРАМИ.
3. как система нумерует документы:
- находится ПОСЛЕДНИЙ ИСПОЛЬЗОВАННЫЙ ПРЕФИКС !!!ПО АЛФАВИТУ!!!
- его номерная часть +1
4. чтобы юзеры НЕ БРАЛИ !!!"ТВОЙ" ПРЕФИКС"!!! для своего тупого ручного использования - надо всего лишь обеспечить чтобы ТВОЙ ПРЕФИКС !!!НЕ БЫЛ ПОСЛЕДНИМ ПО АЛФАВИТУ СРЕДИ ВСЕХ ИСПОЛЬЗУЕМЫХ ПРЕФИКСОВ ДЛЯ ЭТОГО ВИДА ДОКУМЕНТОВ!!!
5. это обеспечивается наличием перед номерной частью НЕКОЕГО СИМВОЛА С КОДОМ МЕНЬШЕ КОДА ЗНАКА 0 (ноль).
..
на примере:
- счета-фактуры нумеруются МГ0001
- бух для авансовых счф захренячил МГа00001
- теперь любое ручное введение ОБЫЧНОЙ СЧФ приведет к ее нумерации МГа0002 - т.е. в системе "внутренней" нумерации отнесет к авансовым - см.почему выше написано...
- вместо МГа надо было ввести МГ/ (слеш меньше 0) - ручные отгрузочные СЧФ ПРОДОЛЖАЛИ БЫ НУМЕРОВАТЬСЯ !!!!!АВТОМАТОМ!!! в правильном префиксе, а авансовые бухи пусть нумеруют ручками - любят они это дело.. имитация бурной деятельности блин....
..
такой подход можно преломить к твоей ситуевине..
..
ффу блин...
это получается ты не понял моей проблеммы.
в данный момент я делаю загрузку из одной конфы в другую (обе ТиС).
тоесть объединяю базы двух фирм в одну.
в конечной базе префиксы должны стоять те, которые указаны для этой фирмы. тоесть для одной фирмы "А" для другой "Б".
и данная проблемма у меня возникает именно во время этой загрузки
Складывается впечатление, что никто незнает (или забыл) что такое транзакция.
Транзакция предназначена для одновременной записи (или незаписи) изменений в базу данных. То, что транзакция работает быстрее - это всего лишь свойство ее реализации в движке 1С.
Попытка записать документ с неуникальным номером - это тоже элемент транзакции. Если один документ не записан, то остальные тоже записывать нельзя (иначе это уже не транзакция).
Использование конструкии Попытка позволяет заранее узнать об ошибках, но не позволяет этой ошибки избежать.
ИМХО возможные решения:
1. На первом проходе выявлять проблемные документы. Если таких документов нет, то фиксировать транзакцию, если есть - то отменять ее и переходить на второй проход.
На втором проходе присваивать номера документам с учетом результатов первого прохода.
2. Используем Попытку, но не используем Транзакцию
3. Используем Транзакцию, но не используем Попытку. Возможные коллизии определыем с помощью метода НайтиПоНомеру().