1С:Предприятие
:: 1С:Предприятие 8 общая
|
|
| ||
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 Тогда. Сама база клиент-серверная, но также проверял на файловой базе. Ошибка та же выходит. | ||
vde69 1 - 28.04.20 - 08:29 | не обработанная ошибка во вложенной транзакции (возможно не явной) | ||
vde69 2 - 28.04.20 - 08:30 | классический пример если в коде "при записи" одного документа меняется другой, получается матрешка транзакций, а 1с вложенные транзакции не умеет обрабатывать. | ||
fdv_83 3 - 28.04.20 - 08:42 | (2) Спасибо за помощь. В модуле документа в процедуре ПередЗаписью() был код, который записывал справочник. Он и привёл к ошибке. | ||
Ram_zes 4 - 28.04.20 - 09:13 | Это вложенные транзакции, инфа 100ка, а так проверь коды справочников, которые записываешь. | ||
Cyberhawk 5 - 28.04.20 - 13:34 | (4) "Это вложенные транзакции, инфа 100ка" // Брехня | ||
ejikbeznojek 6 - 28.04.20 - 13:35 | |||
Cyberhawk 7 - 28.04.20 - 13:38 | (6) А это не брехня, одобряю | ||
Ненавижу 1С 8 - 28.04.20 - 13:40 | (6) правильно говорить - это продолжение работы с БД в рамках сломанной транзакции | ||
Cyberhawk 9 - 28.04.20 - 13:41 | (8) Чем отличается "обращение к БД" от "работа с БД"? |
|
Список тем форума
|