Вход | Регистрация
 
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
(4) (5) Правильно говорить - это обращение к БД после того как появилась сломанная транзакция?)
   Cyberhawk
 
7 - 28.04.20 - 13:38
(6) А это не брехня, одобряю
   Ненавижу 1С
 
8 - 28.04.20 - 13:40
(6) правильно говорить - это продолжение работы с БД в рамках сломанной транзакции
   Cyberhawk
 
9 - 28.04.20 - 13:41
(8) Чем отличается "обращение к БД" от "работа с БД"?

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.