|
В данной транзакции уже происходили ошибки | ☑ | ||
---|---|---|---|---|
0
fdv_83
28.04.20
✎
07:34
|
Здравствуйте, уважаемые форумчане. Столкнулся с одной проблемой. Имеется обработка по переносу данных из 1С7.7 в 1С8. В один "прекрасный" момент при записи документа выходит ошибка "В данной транзакции уже происходили ошибки". Хотя этого же вида документы уже более сотни были успешно записаны. Прошу подсказать в чём может быть проблема. Часть кода прилагаю:
ИначеЕсли OLEДокумент.Вид() = "ШтрихкодыДляОтгрузкиДилеру" Тогда НомерИзПредыдущейВерсии = ""+OLEДокумент.Вид()+" № "+СокрЛП(OLEДокумент.НомерДок)+" ("+Формат(OLEДокумент.ДатаДок,"ДЛФ=Д")+"), "+OLEДокумент.ПолучитьПозицию(); ИдентификаторОбъектаИзПредыдущейВерсии = OLEДокумент.Вид()+", "+СокрЛП(Прав(OLEДокумент.ПолучитьПозицию(),СтрДлина(СокрЛП(OLEДокумент.ПолучитьПозицию()))-10)); ВыбДокумент = Документы.ШтрихкодыДляОтгрузкиДилеру.НайтиПоРеквизиту("ИдентификаторОбъектаИзПредыдущейВерсии",ИдентификаторОбъектаИзПредыдущейВерсии); Если ВыбДокумент.Пустая() = Ложь Тогда Если ОбновитьДанные = Ложь Тогда Возврат ВыбДокумент.Ссылка; Иначе НовыйДокумент = ВыбДокумент.ПолучитьОбъект(); НовыйДокумент.Штрихкоды.Очистить(); КонецЕсли; Иначе НовыйДокумент = Документы.ШтрихкодыДляОтгрузкиДилеру.СоздатьДокумент(); НовыйДокумент.ИдентификаторОбъектаИзПредыдущейВерсии = ИдентификаторОбъектаИзПредыдущейВерсии; КонецЕсли; НовыйДокумент.Дата = Дата(Год,Месяц,День,Часы,Минуты,Секунды); Если OLEДокумент.Автор.Выбран() = 1 Тогда НовыйДокумент.Автор = СозданиеЭлементаСправочника(OLEДокумент.Автор,,OLEБаза); КонецЕсли; НовыйДокумент.НомерИзПредыдущейВерсии = НомерИзПредыдущейВерсии; Если OLEДокумент.Склад.Выбран() = 1 Тогда НовыйДокумент.Склад = СозданиеЭлементаСправочника(OLEДокумент.Склад,,OLEБаза); КонецЕсли; НовыйДокумент.Примечание = ПреобразованиеНаименования(OLEДокумент.Основание); OLEДокумент.ВыбратьСтроки(); Пока OLEДокумент.ПолучитьСтроку() = 1 Цикл НоваяСтрока = НовыйДокумент.Штрихкоды.Добавить(); Если OLEДокумент.Товар.Выбран() = 1 Тогда НоваяСтрока.Товар = СозданиеЭлементаСправочника(OLEДокумент.Товар,,OLEБаза); КонецЕсли; НоваяСтрока.Штрихкод = OLEДокумент.Штрихкод; НоваяСтрока.СерийныйНомер = ПреобразованиеНаименования(OLEДокумент.СерийныйНомер); Если OLEДокумент.СерийныйНомерСпр.Выбран() = 1 Тогда НоваяСтрока.СерийныйНомерСпр = СозданиеЭлементаСправочника(OLEДокумент.СерийныйНомерСпр,НоваяСтрока.Товар,OLEБаза); КонецЕсли; НоваяСтрока.Количество = OLEДокумент.Количество; НоваяСтрока.СтатусСерийногоНомера = ПреобразованиеНаименования(OLEДокумент.СтатусСерийногоНомера); КонецЦикла; Если OLEДокумент.ДокументОснование.Выбран() = 1 Тогда НовыйДокумент.Записать(РежимЗаписиДокумента.Запись); ДокументОснование = СозданиеДокументов(OLEДокумент.ДокументОснование,,OLEБаза); НовыйДокумент.ДокументОснование = ДокументОснование.Ссылка; КонецЕсли; НовыйДокумент.Записать(РежимЗаписиДокумента.Запись); Если OLEДокумент.ПометкаУдаления() = 1 Тогда НовыйДокумент.УстановитьПометкуУдаления(Истина); ИначеЕсли OLEДокумент.Проведен() = 1 Тогда Если ОбновитьДанные Тогда Если НовыйДокумент.ПометкаУдаления Тогда НовыйДокумент.УстановитьПометкуУдаления(Ложь); ИначеЕсли НовыйДокумент.Проведен Тогда НовыйДокумент.Записать(РежимЗаписиДокумента.ОтменаПроведения); КонецЕсли; КонецЕсли; Попытка НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение); Исключение Сообщить("Непроведенный документ "+НовыйДокумент.Метаданные().Синоним+" № "+НовыйДокумент.Номер+" Дата "+НовыйДокумент.Дата,СтатусСообщения.ОченьВажное); ДокНепроведенныеДокументыНоваяСтрока = ДокНепроведенныеДокументы.Документы.Добавить(); ДокНепроведенныеДокументыНоваяСтрока.Документ = НовыйДокумент.Ссылка; ДокНепроведенныеДокументыНоваяСтрока.Статус = "Не проведен"; ДокНепроведенныеДокументы.Записать(РежимЗаписиДокумента.Запись); КонецПопытки КонецЕсли; Сообщить("Документ "+НовыйДокумент.Метаданные().Синоним+" № "+НовыйДокумент.Номер+" Дата "+НовыйДокумент.Дата); Возврат НовыйДокумент.Ссылка; КонецЕсли; Ошибка выходит на строке, следующей после строки Если OLEДокумент.ДокументОснование.Выбран() = 1 Тогда. Сама база клиент-серверная, но также проверял на файловой базе. Ошибка та же выходит. |
|||
1
vde69
28.04.20
✎
08:29
|
не обработанная ошибка во вложенной транзакции (возможно не явной)
|
|||
2
vde69
28.04.20
✎
08:30
|
классический пример если в коде "при записи" одного документа меняется другой, получается матрешка транзакций, а 1с вложенные транзакции не умеет обрабатывать.
|
|||
3
fdv_83
28.04.20
✎
08:42
|
(2) Спасибо за помощь. В модуле документа в процедуре ПередЗаписью() был код, который записывал справочник. Он и привёл к ошибке.
|
|||
4
Ram_zes
28.04.20
✎
09:13
|
Это вложенные транзакции, инфа 100ка, а так проверь коды справочников, которые записываешь.
|
|||
5
Cyberhawk
28.04.20
✎
13:34
|
(4) "Это вложенные транзакции, инфа 100ка" // Брехня
|
|||
6
ejikbeznojek
28.04.20
✎
13:35
|
(4) (5) Правильно говорить - это обращение к БД после того как появилась сломанная транзакция?)
|
|||
7
Cyberhawk
28.04.20
✎
13:38
|
(6) А это не брехня, одобряю
|
|||
8
Ненавижу 1С
гуру
28.04.20
✎
13:40
|
(6) правильно говорить - это продолжение работы с БД в рамках сломанной транзакции
|
|||
9
Cyberhawk
28.04.20
✎
13:41
|
(8) Чем отличается "обращение к БД" от "работа с БД"?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |