Имя: Пароль:
   
1C
1С v8
В данной транзакции уже происходили ошибки
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) Чем отличается "обращение к БД" от "работа с БД"?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.