Ошибка при создании транзакции

Содержание:

1.       Причина ошибки в 1С Предприятие 8.3

2.       Почему ошибку «В данной транзакции уже происходили ошибки» надо устранить

3.       Как устранить ошибку в программе 1С Предприятие 8

Довольно часто пользователи программы 1С Предприятие 8 сталкиваются с ошибкой «В данной транзакции уже происходили ошибки».

В данной транзакции уже происходили ошибки

В данной транзакции уже происходили ошибки

Документ не записывается, а понять, в чем причина невозможно, т.к. текст сообщения об ошибке ни чего конкретного не сообщает.

Давайте разберемся в чем причина.  

1.    Причина ошибки в 1С Предприятие 8.3

С технической точки зрения эта ошибка в 1С:Предприятие 8.3 возникает в транзакции в момент первого обращения к базе данных после обработки исключительной ситуации операторами (Попытка-Исключение).

Ниже на рисунке продемонстрирован пример, когда при записи объекта «Объект_1» вызывается исключительная ситуация, при этом ошибка возникает в строке «Ссылка_2.Наименование», т.к. осуществляется запрос к базе данных в объектной модели данных. И не важно, запись это или чтение.

Возникновение ошибки в 1С Предприятие 8.3 при записи объекта

Возникновение ошибки в 1С Предприятие 8.3 при записи объекта

Причем в попытке-исключении обрабатываться операция, которая также выполняется в транзакции. Чаще всего это сочетание явных и неявных транзакций, т.е. транзакций, вызванных оператором НачатьТранзакцию явно и транзакций, вызванных платформой неявно (например, при записи объекта).

Как известно, система 1С:Предприятие 8.3 не поддерживает вложенных транзакций, но допускает организацию вложенной конструкции нескольких транзакций. В нашем примере явный вызов транзакции оператором НачатьТранзакцию – транзакция 1 уровня, а неявная транзакция записи – транзакция 2 уровня и т.д. Возникновение ошибки на нижних уровнях запрещает успешное завершение транзакции 1 уровня. Другими словами, откатывается все «дерево транзакций».

В чем же здесь проблема?  

2.    Почему ошибку «В данной транзакции уже происходили ошибки» надо устранить

Во-первых, пользователь никогда не поймет в чем причина, т.к. формулировка сообщения об ошибке для него не информативна.

Во-вторых, воспроизведение ошибки и ее отладка администратором тоже будет не простым занятием. Дело в том, что ошибка возникает в момент первого обращения к базе данных, т.е. в журнале регистрации будет зафиксирована именно эта строка. Хотя сама причина этой ошибки находиться в коде на самом нижнем уровне. В нашем примере «Объект_1» может содержать различные проверки перед записью, «завернутые» в конструкцию «Попытка-Исключение», которые, в свою очередь, могут также иметь глубокую иерархию вызовов процедур и функций. Попробуй разберись.

В-третьих, суть этой ошибки – некорректный код. А если быть более точным – несоблюдение требований к написанию кода с использованием транзакций.

Как решить эту проблему в 1С:Предприятие?  

3.    Как устранить ошибку в программе 1С Предприятие 8

Основным требованием к написанию кода с использованием транзакций, непосредственно связанным с ошибкой «В данной транзакции уже происходили ошибки» в 1С:Предприятие, являются правила использования обработки исключения:

1. Метод НачатьТранзакцию должен находиться за пределами блока Попытка-Исключение;

2. Все действия, выполняемые после вызова метода НачатьТранзакцию, должны находиться в одном блоке Попытка, в том числе чтение, блокировка и обработка данных;

3. Метод ЗафиксироватьТранзакцию должен идти последним в блоке Попытка перед оператором Исключение;

4. В блоке Исключение нужно сначала вызвать метод ОтменитьТранзакцию, а затем выполнять другие действия;

5. При использовании вложенных транзакций в конце блока Исключение рекомендуется добавить оператор ВызватьИсключение. Это позволит перенаправить исключение выше по стеку. В этом случае в журнале регистрации мы получим именно ту строку, которая привела к ошибке;

6. В блоке исключения рекомендуется сделать запись об ошибке средствами встроенного языка.

Общая схема во вложенной транзакции:

Схема вложенной транзакции в системе 1С:Предприятие 8.3

Пример:

Пример вложенной транзакции для решения ошибки «В данной транзакции уже происходили ошибки»

Пример вложенной транзакции для решения ошибки «В данной транзакции уже происходили ошибки»

Не следует использовать метод НачатьТранзакцию внутри неявной транзакции, вызванной платформой. В этом нет никакого смысла. Не стоит также «оборачивать» в явную транзакцию операцию записи коллекции объектов, которые не требуют согласованной записи. Если в блоке исключения, вложенной транзакции не используется оператор ВызватьИсключение, а используется, например, сообщение или запись в журнал регистрации, то нужно избегать явного или неявного обращения к базе данных после обработки исключения в конфигурациях 1С Предприятие 8.

Специалист компании «Кодерлайн»

Игорь Торба

Программа 1С является самой популярной и наиболее удобной при автоматизации предприятия. В ней предусмотрены решения, созданные на базе одной платформы, соответственно, функционируют они по одному принципу, что значительно упрощает использование ПО. Нередко пользователи сталкиваются с сообщением «В данной транзакции уже происходили ошибки». Рассмотрим как в 1С 8.3 исправить подобную проблему.

1С 8.3 документация по работе с программой

Содержание

  1. Причина появления сообщения о повторных ошибках в 1С 8.3
  2. Есть ли смысл исправлять ошибки транзакции, которые уже происходили
  3. Устраняем ошибку транзакции в 1С Предприятие версии 8.3
  4. Также можно выполнить удаление другим способом:
  5. Особенности написания кода, которые помогут исключить ошибку в транзакциях

Причина появления сообщения о повторных ошибках в 1С 8.3

Главная проблема заключается в том, что сообщение об ошибке «В данной транзакции уже происходили ошибки» неинформативно, нет никакой конкретики. Поэтому будем опираться на проблемы, с которыми чаще всего сталкиваются пользователи. Например, с технической стороны ошибка такого рода может возникнуть при первой транзакции, то есть и при первичном обращении к базе данных.

Часть функций, которые выполняет платформа 1С

Подобная ошибка может произойти при обработки ситуации «Попытка-Исключение». Например, при создании записи «Объект_1» формируется исключительная ситуация, а сама ошибка появляется в «Ссылка_2.Наименование». То есть происходит запрос базы данных объектной модели.

В «Попытке-Исключение» начинается обработка операции, которая также должна быть выполнена в транзакции, которая, в свою очередь, может быть явной или неявной (создается в момент записи объекта).

1С: Предприятие 8.3 не поддерживает транзакций вложенного типа. Однако допускается создание вложенной конструкции сразу нескольких транзакций. Из-за наличия явной и неявной транзакции может возникнуть ошибка. То есть программа запрещает транзакцию 1-го уровня на более низших уровнях.

Читайте также: Значение не является значением объектного типа 1С.

Есть ли смысл исправлять ошибки транзакции, которые уже происходили

При работе с 1С 8.3 не стоит оставлять подобные вещи без внимания. Прежде всего, другой пользователь также может столкнуться с ней, но не поймет причин её возникновения. Если не выполнить отладку системы, то в дальнейшем могут возникнуть дополнительные проблемы. Так как оповещение «В данной транзакции уже происходили ошибки» появляется при первом обращении, то в журнале регистрации данная строка обязательно зафиксируется, но, опять же, без подробного пояснения. Хоть ошибка и располагается на нижнем уровне кода, она нарушит необходимую иерархию. Это приведет к сбою других функций и только еще больше запутает администратора.

При наличие некорректного кода, транзакции будут выполняться с нарушениями или не будут выполняться вовсе. Поэтому при возникновении таких сообщений стоит решить проблему.

Устраняем ошибку транзакции в 1С Предприятие версии 8.3

В первую очередь стоит очистить кэш базы данных. Сделать это можно вручную. Для этого:

  1. Переходим на диск, на котором расположена база 1С.
  2. Переходим в папку с базой (путь может отличаться, но по умолчанию она установлена в той директории, которая показана на фото ниже).Путь в данным кэша 1С версии 8.3
  3. Удаляем кэш вручную.Удаление кэша вручную
  4. То же самое делаем с кэшем в папке 1с8.2.

Также можно выполнить удаление другим способом:

  1. Создаем на рабочем столе пустой документ. Назовем его «Удаление пользовательского кэша».Создание пустого документа на рабочем столе
  2. Указываем в нем следующую строчу и сохраняем документ в формате .bat.

Указание функции для очистки кэша

После того, как файл преобразуется, его можно запустить и весь пользовательский кэш удалится автоматически. Пробуем снова запустить программу и выполнить операцию. Если не помогло, то лучше всего обратиться к администратору. Также нужно помнить про основные особенности написания кода с использованием транзакций. Это поможет исключить ряд распространенных ошибок.

Также вам будет интересно: Ошибка в 1С 7.7 «Порядок сортировки, установленный для базы данных, отличается от системного».

Особенности написания кода, которые помогут исключить ошибку в транзакциях

Прежде всего нужно опираться на нюансы корректной обработки исключений:

  • Метод «Начать транзакцию» должен быть вынесен за пределы «Попытка-Исключение».
  • Действия, осуществляемые после вызова «Начать транзакцию» должны быть в пределах блока «Попытка». К этом также относится чтение, обработка или блокировка данных.
  • Метод «Зафиксировать транзакцию» необходимо прописывать последним в блоке «Попытка» и до «Исключение».
  • В блоке «Исключение» необходимо сначала обратиться к методу «Отменить транзакцию» и уже потом выполнять прочие действия.
  • Если применяются вложенные транзакции, то в конце «Исключение» не лишним будет добавить оператора «Вызвать исключение».
  • В «Исключения» следует добавить соответствующую запись об ошибке.
  • Если транзакция неявная, то нет никакого смысла переходить к методу «Начать транзакцию». Некоторые также пробуют «обернуть» в явную транзакцию те операции, которые и вовсе не нуждаются в согласовании.

Решить проблему транзакций, в которых происходят ошибки, самостоятельно получается не всегда. Поэтому стоит попробовать выполнить простейшие действия – перезагрузить программу или очистить кэш. К более серьезным манипуляциям в 1С стоит переходить только при уверенности, что вы обладаете достаточным опытом.

В данной транзакции уже происходили ошибки!

Я

  

Privetanya

02.08.19 — 09:06

Ошибка при вызове метода контекста (Выполнить)

Выборка = Запрос.Выполнить().Выбрать();

по причине:

Ошибка выполнения запроса

по причине:  

В данной транзакции уже происходили ошибки!

Не могу понять в чем проблема,помогите пожалуйста…

после выполнения

Номенклатура=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры))

Номенклатура =Ошибка получения представления значения: В данной транзакции уже происходили ошибки!

  

Cyberhawk

1 — 02.08.19 — 09:08

В поломанной транзакции обращаться к БД нельзя

  

Cyberhawk

2 — 02.08.19 — 09:08

Истинная проблема где-то в коде до того места, где тебе показало эту ошибку

  

piter3

3 — 02.08.19 — 09:08

С чего решил,что здесь?

Номенклатура=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры))

  

Privetanya

4 — 02.08.19 — 09:11

(3) после выполнения этой строки номенклатура=Ошибка получения представления значения: В данной транзакции уже происходили ошибки!. Отладчиком проверяла

  

Privetanya

5 — 02.08.19 — 09:11

(2) как найти?

  

Cyberhawk

6 — 02.08.19 — 09:12

Отладчиком тем более нет смысла проверять, т.к. ты все еще внутри поломанной транзакции

  

Cyberhawk

7 — 02.08.19 — 09:13

(5) Написать хитрый метод в общем модуле, в каждой строке кода в режиме трассировки вызывать этот метод, который будет возвращать признак того, что транзакция поломана. Ну это если совсем тямы нет прикинуть по коду, где же факап случился.

  

piter3

8 — 02.08.19 — 09:13

(4)Нет,ищи ранее

  

Privetanya

9 — 02.08.19 — 09:26

(8) я взяла эту обработку из комплексной и перенесла на нашу самописку. Там все хорошо работает.а тут такая ошибка…

  

piter3

10 — 02.08.19 — 09:27

(9) И че?Ищи,попробуй на копии без транзакции

  

Privetanya

11 — 02.08.19 — 09:38

(10) так странно. В этой функции ВИНоменклатуры = Неопределено

Функция НайтиСоздатьНоменклатуру(СтрокаТовара, Знач ВидНоменклатуры, СтавкаНДС, ВИНоменклатуры = Неопределено)

    

    Номенклатура = Справочники.Номенклатура.ПустаяСсылка();

    ВИНоменклатуры = Неопределено;

    
    УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры= Неопределено);

а при вызове ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам приходит уже Истина.

Функция ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры)

    

    Если НЕ ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаИд) Тогда

        Возврат Ложь;

    КонецЕсли;

    
    Попытка                  

        

        ИдНоменклатуры = ПолучитьИдНоменклатуры(СтрокаТовара.ТоварУслугаИд);

        Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры));

  

piter3

12 — 02.08.19 — 09:39

Истина это нашла или нет?Я же не вижу что там

  

Privetanya

13 — 02.08.19 — 10:21

(12) Если посмотреть в комплексной,то там получает так же неопределено. А у меня истина.

  

piter3

14 — 02.08.19 — 10:21

(13) Может стоит подумать над кодом и отличиями?

  

Вафель

15 — 02.08.19 — 10:24

в транзакции нельзя записывать с попыткой. все равно ломается

  

Privetanya

16 — 02.08.19 — 10:27

(14) Вот ищу отличия

  

dka80

17 — 02.08.19 — 10:30

Функция ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры)

Возврат Истина

КонецФункции

Тогда увидишь где ошибка ранее

  

zva

18 — 02.08.19 — 10:34

Вместо УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры= Неопределено);

нужно УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры);

  

catena

19 — 02.08.19 — 10:37

УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры= Неопределено);

— ну еще бы оно не приходило «Истина»

  

Privetanya

20 — 02.08.19 — 10:39

(18) ошибка осталась

  

Privetanya

21 — 02.08.19 — 10:42

(17) не вижу ошибку ранее,значит она в этой функции

  

Privetanya

22 — 02.08.19 — 10:51

(15) убрала попытку и вышла вот такая ошибка. {Обработка.ОбменССайтом.МодульОбъекта(5103)}: Ошибка при вызове метода контекста (ПолучитьОбъект)

        Если Номенклатура.ПолучитьОбъект() = Неопределено Тогда

по причине:

В данной транзакции уже происходили ошибки!

Функция ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ХарактеристикаНоменклатуры)

    

    Если НЕ ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаИд) Тогда

        Возврат Ложь;

    КонецЕсли;

    
    //Попытка

        

        ИдНоменклатуры = ПолучитьИдНоменклатуры(СтрокаТовара.ТоварУслугаИд);

        Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры));

        Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда

            Возврат Ложь;

        КонецЕсли;

        

        Если Номенклатура.ПолучитьОбъект() = Неопределено Тогда

            // Объект не найден

            СообщитьПользователю(«Номенклатура не найдена по уникальному идентификатору: » + ИдНоменклатуры, Ложь);

            Возврат Ложь;

        КонецЕсли;

        

        Если НЕ Номенклатура.ВестиУчетПоХарактеристикам Тогда

            Возврат Истина;

        КонецЕсли;

        

        ИдХарактеристики = ПолучитьИдХарактеристики(СтрокаТовара.ТоварУслугаИд);

        Если ПустаяСтрока(ИдХарактеристики) Тогда

            Возврат Истина;

        КонецЕсли;

        

        ХарактеристикаНоменклатуры = Справочники.ВариантыИсполнения.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдХарактеристики));

        ПустаяХарактеристикаСсылка=Справочники.ВариантыИсполнения.ПустаяСсылка();

        Если ХарактеристикаНоменклатуры = ПустаяХарактеристикаСсылка Тогда

            Возврат Истина;

        КонецЕсли;

            

        Если ХарактеристикаНоменклатуры.ПолучитьОбъект() = Неопределено Тогда

            СообщитьПользователю(«Объект <ХарактеристикаНоменклатуры> не найден: » + Строка(ИдХарактеристики)

                + «. Будет создан новый объект.», Ложь);

                
            Возврат Ложь;

            
        КонецЕсли;

        
    //Исключение

        
    //    Возврат Ложь;

        
    //КонецПопытки;

    
    Возврат Истина;

    
КонецФункции

  

Вафель

23 — 02.08.19 — 10:54

(22) нельзя ЗАПИСЫВАТЬ в попытке. ищи запись выше по коду

  

Cyberhawk

24 — 02.08.19 — 10:55

(15) (23) Что-то ты несешь ерунду

  

catena

25 — 02.08.19 — 10:56

(22)Поставь уже в отладчике остановку по ошибке.

  

GGDots

26 — 02.08.19 — 10:59

(25) +

  

DrZombi

27 — 02.08.19 — 11:09

(22) Номенклатура.ПолучитьОбъект()

Что вы тут пытаетесь проверить… Баже святы…

У вас какой уровень в 1С? :)

  

DrZombi

28 — 02.08.19 — 11:09

(25) Тут и без отладчика видно ошибку :)

  

DrZombi

29 — 02.08.19 — 11:11

+(22) «Если Номенклатура.ПолучитьОбъект() = Неопределено Тогда»

Тут скрыт первый косяк… «Детектит, ГУАНО код»… Рекомендую тут подумать вам, и переписать :)

  

Privetanya

30 — 02.08.19 — 11:17

похоже поняла. Ошибка происходит при записи договора контрагента.

  

DrWatson

31 — 02.08.19 — 11:30

(30) Нужно найти ту первую Попытку с записью данных в БД, которая вываливается в исключение без «В данной транзакции уже происходили ошибки!». После такого исключения продолжать работу в транзакции уже нельзя. Нужно выходить из всех вызывающих процедур. Лучше всего это сделать через ВызватьИсключение с человеческим сообщением об ошибке или вообще не делать попытку.

Возможно, обработка просто не рассчитана на работу в транзакции.

  

catena

32 — 02.08.19 — 11:59

(27)По-моему, проверяется найденность элемента по переданному ИД. А как надо?

  

hhhh

33 — 02.08.19 — 12:08

(32) а точно там «Неопределено» выдаст? может null?

  

catena

34 — 02.08.19 — 12:27

  

Cyberhawk

35 — 02.08.19 — 12:29

(32) Запросом же можно (с условием на ссылку)

  

catena

36 — 02.08.19 — 12:32

(35)Ну, это дело вкуса, при разовом обращении не вижу тут грубой ошибки.

  

Cyberhawk

37 — 02.08.19 — 12:34

(36) Все зависит от того, планируется ли дальнейшая работа с объектом. Если только для проверки существования, то избыточное получение данных налицо.

Добрый день, уважаемые коллеги.

Сегодня поделюсь обзором одной ошибки с неявным генезисом и отсутствующим описанием. Суть в следующем: пользователь внес в базу Бухгалтерия 3.0 документ поступление товаров и услуг (УПД), в котором неверно указан входящий номер. При попытке номер исправить и перепровести документ, 1С ругается «В данной транзакции уже происходили ошибки». Попытки отменить проведение, пометить на удаление или просто перезаписать этот документ вызывают аналогичное сообщение. Соседний аналогичный документ работает корректно.

Проблемная накладная от 01.04.2021, внешних поводов для беспокойства не вызывает. Конфигурация типовая, версии 3.0.89, релиз не самый последний, но довольно свежий и стабильный. База файловая, работает один человек. 

Беда подобной ошибки в том, что она не имеет четкого описания. Нет ссылок на проблемный код в конфигураторе. Нет отсылок к неверным реквизитам или пользовательским данным. С чего начинать поиски причины неясно.

Если спросить у интернета, то он выдаст массу статей и обсуждений. Они верные по сути, но не дают ответа на вопрос что делать. То есть они объясняют суть проблемы: при возникновении ошибки в одном из уровней многоуровневой транзакции, отменяется всё дерево. Связано это с некорректным написанием кода и неверным использованием механизма транзакций. Рекомендуется писать код правильно. Что делать пользователям типовых конфигураций не написано.

Пошёл стандартным путём:

  1. Закрыл все окна, открыл документ заново и попробовал провести. Безрезультатно.
  2. Сохранив предварительно базу, обновил её до 3.0.91 — последнего релиза. Вдруг это действительно ошибка в коде. Не помогло.
  3. Протестировал базу стандартными средствами ТиИ конфигуратора и утилитой chdbfl. Ошибок нет, не помогло.
  4. Очистил кэш в папках AppDataRoaming и AppDataLocal (будьте внимательны, не удалите список баз!). Не помогло.
  5. Отключил ненужные фоновые задания. Остальным установил увеличенный интервал между попытками, расписание проверок сделал ежедневным. Впрочем, это явно лишнее — в списке активных пользователей была только одна строка. Действие не помогло.
  6. Стал размышлять: что ещё перепроводится при проведении поступления? Введённый на основании счет-фактура. При детальном изучении выяснилось, что у с/ф ошибочно была указана дата 01.01.2021. Т.е. документ попал в закрытый для редактирования период — дата запрета установлена на 31.03.2021. 

Снял флаг запрета, поправил дату и указал верный номер. Всё провелось без ошибок.

Однако вопрос к коду типовой конфигурации остался: ошибка очень неявная. Вместо конкретного указания на невозможность перепровести счет-фактуру из-за установленной даты запрета, пользователь видит неинформативную надпись общего характера. Как так получается, что 1С игнорирует собственные стандарты разработки затрудняя поиск источника проблем не только пользователю, но и специалистам — загадка.

Небольшое пояснение. У 1С есть две похожие ошибки: «Объект изменен другим пользователем/ в другой транзакции» и «Ошибка блокировки транзакции». Они имеют пару похожих формулировок, но все они возникают когда записываемый объект занят другим пользователем. Это может быть как физический пользователь, так и регламентное задание. Частный случай — дважды открытый документ или элемент справочника. Именно для исключения этих ситуаций присутствуют действия в п. 1 и п. 5.

Если статья оказалась полезной, вы можете поддержать блог, отправив символическую сумму через форму ниже. Ваша поддержка вдохновляет меня на создание новых статей.  

Здравствуйте! Работаю в 1С:Предприятие 8.3 (8.3.9.2233), конфигурация Бухгалтерия предприятия, редакция 3.0 (3.0.49.21). При создании документа либо создании документа копированием выходит сообщение «В данной транзакции уже происходили ошибки!» Помогите, пожалуйста, работа в программе стала невозможной.

Цитата (MarinaMorskaya):При создании документа либо создании документа копированием выходит сообщение «В данной транзакции уже происходили ошибки!»

Вы копируете еще открытый документ?
Закрывайте все окна.

Заполнить и подать уведомление об исчисленных суммах налогов и взносов

г. Новосибирск3 487 баллов

Здравствуйте!
у Вас типовая конфигурация, т.е. без изменений, или же вносились изменения в конфигурацию?

Цитата (Kamushek):Вы копируете еще открытый документ?
Закрывайте все окна.

Нет, я не копирую открытый документ. И окна закрыла. И из программы выходила. И новый документ создаю. А сохранять начинаю — лезет это сообщение…

Цитата (nsk1C):у Вас типовая конфигурация, т.е. без изменений, или же вносились изменения в конфигурацию?

Да, типовая конфигурация, без изменений.

Цитата (MarinaMorskaya):Нет, я не копирую открытый документ. И окна закрыла. И из программы выходила. И новый документ создаю. А сохранять начинаю — лезет это сообщение…

Администрирование — Поддержка и обслуживание — Активные пользователи — сколько человек?
У вас база находится на этом компьютере или на сервере? В файловом режиме или клиент-серверном работаете?
Используете ли терминальный сервер?

Цитата (Kamushek):Администрирование — Поддержка и обслуживание — Активные пользователи — сколько человек?

Татьяна, может быть в фоновом задании дело? Кажется, один человек всегда числился, а сейчас ещё строка… Посмотрите скрин, пожалуйста.

Заполняйте платежки с актуальными на сегодня КБК, кодами дохода и другими обязательными реквизитами

Цитата (MarinaMorskaya):Татьяна, может быть в фоновом задании дело?

Фоновое задание не должно мешать, на то оно и фоновое.
Но проверить можно
Администрирование — Поддержка и обслуживание — Регламентные операции — Регламентные и фоновые задания — закладка Фоновые задания — что там?

Цитата (Kamushek):закладка Фоновые задания — что там?

там много записей (скрин)

Оставьте только флажок выполняется.

«

Цитата (Kamushek):Оставьте только флажок выполняется.

Все обновления новостей» — осталась 1 строка

Заполните и подайте заявление на патент через интернет

У вас есть расчеты с валютой?
Если да, то как часто вам нужно загружать ее?
У вас валюты загружаются каждые 2 часа. Мне кажется и раз в день при начале работы достаточно?
Оптимизируйте регламентные задания.

Цитата (Kamushek):Оптимизируйте регламентные задания.

Вы подскажете как это сделать, Татьяна?
Расчетов с валютой нет. В программе ведётся простой учет: приход, расход, банк, отчеты, всё.

Цитата (Kamushek):Оптимизируйте регламентные задания.

Татьяна, оптимизировала, сняв все галки. Теперь сообщение не выходит. Вы снова меня выручили, чудесная палочка-выручалочка, спасибо!💐

Администрирование — Интернет-поддержка пользователей — посмотрите настройки управлениями новостями.
Обновление версии программы — указано при запуске?
Что касается Валюты. 
Администрирование — Поддержка и обслуживание — Регламентные операции — Регламентные и фоновые задания — закладка Регламентные задания — Загрузка курсов валют 
Если расчетов в валюте вообще нет, то можно снять флажок Включено.
Если редко, но расчеты в валюте бывают, то Расписание 
Общие — Повторять 1
Дневное время начала — например 13-00 (время перерыва)
Недельное — кроме выходных
Месячное — пусто
В результате настроек внизу на закладке Общие должно быть написано
типа каждый день с 13-00, один раз в день.
Но это не решение проблемы.

Цитата (Kamushek):У вас база находится на этом компьютере или на сервере? В файловом режиме или клиент-серверном работаете?
Используете ли терминальный сервер?

Ответьте на эти вопросы, если проблема повторяется.

Цитата (Kamushek):Ответьте на эти вопросы, если проблема повторяется.

Сообщение больше не выходит, но всё же на будущее… я отвечу на поставленные вопросы. База находится на этом компьютере, терминальный сервер не используется, работаю в файловом режиме (я так полагаю, поскольку 1С нелицензионная).

В Экстерне платежка формируется по данным декларации

Рано или поздно каждому программисту 1с придется познакомится с сообщением об ошибке «В данной транзакции уже происходили ошибки».

В этой статье разберем природу этой ошибки.

Данная ошибка появляется при использовании конструкции Попытка… Исключение внутри транзакции. Дело в том, что если  исключительную ситуацию отрабатывать с помощью скобок Попытка…Исключение…КонецПопытки, расположенных внутри транзакции, то транзакция не завершится в момент возникновения исключительной ситуации, она дойдет до следующего обращения к данным — чтения или записи, продолжая при этом блокировать ресурсы, и откатится с сообщением: «В данной транзакции уже происходили ошибки!». 

НачатьТранзакцию();

//первая попытка

Попытка

Исключение

КонецПопытки;

//вторая попытка

Попытка

Исключение

КонецПопытки;

РезультатЗапроса = Запрос.Выполнить();

ЗафиксироватьТранзакцию();

В  схеме описанной выше ошибка возникнет в строке РезультатЗапроса = Запрос.Выполнить();

Первая неприятность заключается в том, что совершенно не понятно в какой из попыток выше приключилась ошибка, что затрудняет ее поиск и исправление ведь зачастую ОписаниеОшибки()  ничего не сообщает. Вторая неприятность заключается в том, что эти сообщения не могут вызывать положительных эмоций у пользователей, которые часто спешат поделится ими с руководством, а дальше Вы сами знаете).

Таким образом использование Попытка…Исключение… КонецПопытки в транзакции никоим образом не решает наших проблем. 

Поэтому следует по возможности хорошенько подумать как избежать вообще использования попыток в транзакции. 

В моей практике был подобный случай. Фоновые задания загружали в систему заказы от контрагентов. Поначалу мы легкомысленно использовали конструкцию Попытка…Исключение… КонецПопытки. В итоге загрузка спотыкалась, заказы не загружались, все нервничали. Изменить ситуацию удалось очень тщательным предварительным разбором файла перед загрузкой и в случае проблем отправление письма клиенту и на саппорт.

Если же без попытки ни как то следует отработав исключительную ситуацию, вызывать оператор ВызватьИсключение 

Описанное поведение системы позволяет говорить о том, что если возникает ситуация, когда внутри транзакций нужно использовать скобки

Попытка…Исключение… КонецПопытки, необходимо, отработав исключительную ситуацию, вызывать оператор ВызватьИсключение. В таком случае выполнение кода завершится в конце попытки и дальше не пойдет, таким образом пользователи не увидят ошибку «В данной транзакции уже происходили ошибки!». 

Однако не всегда ошибочная ситуация приведет к появлению такой ошибки, это зависит от того восстановимая ошибка случилась или нет. Например:

Попытка

а =6/0;

Исключение

КонецПопытки;

Не приведет к появлению ошибки «В данной транзакции уже происходили ошибки!».

а вот следующий код системе не сможет «прожевать» и ошибка появится.

СпрНом = Справочники.Товары.СоздатьЭлемент();

СпрНом.Код =»000001″ // товар с таким кодом уже был создан ранее

Попытка

СпрНом.Записать();

Исключение

КонецПопытки;

Также не упущу возможность развеять один миф в плену которого я и сам находился.

Миф звучит так «Попытка Исключение организует неявную транзакцию». Причем это сообщение от одного весьма известного методиста на форуме.

На самом деле это не так. Никакой неявной транзакции Попытка Исключение не организует.

Подведем итоги:

1) Крайне нежелательно использовать конструкцию Попытка…Исключение… КонецПопытки в транзакции.

2) Если уж без этого не обойтись то использование оператора ВызватьИсключение уберет появление ошибки «В данной транзакции уже происходили ошибки«.

Программа 1С является самой популярной и наиболее удобной при автоматизации предприятия. В ней предусмотрены решения, созданные на базе одной платформы, соответственно, функционируют они по одному принципу, что значительно упрощает использование ПО. Нередко пользователи сталкиваются с сообщением «В данной транзакции уже происходили ошибки». Рассмотрим как в 1С 8.3 исправить подобную проблему.

1С 8.3 документация по работе с программой

Содержание

  1. Причина появления сообщения о повторных ошибках в 1С 8.3
  2. Есть ли смысл исправлять ошибки транзакции, которые уже происходили
  3. Устраняем ошибку транзакции в 1С Предприятие версии 8.3
  4. Также можно выполнить удаление другим способом:
  5. Особенности написания кода, которые помогут исключить ошибку в транзакциях

Причина появления сообщения о повторных ошибках в 1С 8.3

Главная проблема заключается в том, что сообщение об ошибке «В данной транзакции уже происходили ошибки» неинформативно, нет никакой конкретики. Поэтому будем опираться на проблемы, с которыми чаще всего сталкиваются пользователи. Например, с технической стороны ошибка такого рода может возникнуть при первой транзакции, то есть и при первичном обращении к базе данных.

Часть функций, которые выполняет платформа 1С

Подобная ошибка может произойти при обработки ситуации «Попытка-Исключение». Например, при создании записи «Объект_1» формируется исключительная ситуация, а сама ошибка появляется в «Ссылка_2.Наименование». То есть происходит запрос базы данных объектной модели.

В «Попытке-Исключение» начинается обработка операции, которая также должна быть выполнена в транзакции, которая, в свою очередь, может быть явной или неявной (создается в момент записи объекта).

1С: Предприятие 8.3 не поддерживает транзакций вложенного типа. Однако допускается создание вложенной конструкции сразу нескольких транзакций. Из-за наличия явной и неявной транзакции может возникнуть ошибка. То есть программа запрещает транзакцию 1-го уровня на более низших уровнях.

Читайте также: Значение не является значением объектного типа 1С.

Есть ли смысл исправлять ошибки транзакции, которые уже происходили

При работе с 1С 8.3 не стоит оставлять подобные вещи без внимания. Прежде всего, другой пользователь также может столкнуться с ней, но не поймет причин её возникновения. Если не выполнить отладку системы, то в дальнейшем могут возникнуть дополнительные проблемы. Так как оповещение «В данной транзакции уже происходили ошибки» появляется при первом обращении, то в журнале регистрации данная строка обязательно зафиксируется, но, опять же, без подробного пояснения. Хоть ошибка и располагается на нижнем уровне кода, она нарушит необходимую иерархию. Это приведет к сбою других функций и только еще больше запутает администратора.

При наличие некорректного кода, транзакции будут выполняться с нарушениями или не будут выполняться вовсе. Поэтому при возникновении таких сообщений стоит решить проблему.

Устраняем ошибку транзакции в 1С Предприятие версии 8.3

В первую очередь стоит очистить кэш базы данных. Сделать это можно вручную. Для этого:

  1. Переходим на диск, на котором расположена база 1С.
  2. Переходим в папку с базой (путь может отличаться, но по умолчанию она установлена в той директории, которая показана на фото ниже).Путь в данным кэша 1С версии 8.3
  3. Удаляем кэш вручную.Удаление кэша вручную
  4. То же самое делаем с кэшем в папке 1с8.2.

Также можно выполнить удаление другим способом:

  1. Создаем на рабочем столе пустой документ. Назовем его «Удаление пользовательского кэша».Создание пустого документа на рабочем столе
  2. Указываем в нем следующую строчу и сохраняем документ в формате .bat.

Указание функции для очистки кэша

После того, как файл преобразуется, его можно запустить и весь пользовательский кэш удалится автоматически. Пробуем снова запустить программу и выполнить операцию. Если не помогло, то лучше всего обратиться к администратору. Также нужно помнить про основные особенности написания кода с использованием транзакций. Это поможет исключить ряд распространенных ошибок.

Также вам будет интересно: Ошибка в 1С 7.7 «Порядок сортировки, установленный для базы данных, отличается от системного».

Особенности написания кода, которые помогут исключить ошибку в транзакциях

Прежде всего нужно опираться на нюансы корректной обработки исключений:

  • Метод «Начать транзакцию» должен быть вынесен за пределы «Попытка-Исключение».
  • Действия, осуществляемые после вызова «Начать транзакцию» должны быть в пределах блока «Попытка». К этом также относится чтение, обработка или блокировка данных.
  • Метод «Зафиксировать транзакцию» необходимо прописывать последним в блоке «Попытка» и до «Исключение».
  • В блоке «Исключение» необходимо сначала обратиться к методу «Отменить транзакцию» и уже потом выполнять прочие действия.
  • Если применяются вложенные транзакции, то в конце «Исключение» не лишним будет добавить оператора «Вызвать исключение».
  • В «Исключения» следует добавить соответствующую запись об ошибке.
  • Если транзакция неявная, то нет никакого смысла переходить к методу «Начать транзакцию». Некоторые также пробуют «обернуть» в явную транзакцию те операции, которые и вовсе не нуждаются в согласовании.

Решить проблему транзакций, в которых происходят ошибки, самостоятельно получается не всегда. Поэтому стоит попробовать выполнить простейшие действия – перезагрузить программу или очистить кэш. К более серьезным манипуляциям в 1С стоит переходить только при уверенности, что вы обладаете достаточным опытом.

grpc._common
Exception serializing message!
--------------------------
httplib
POST /api/1/envelope/ [403]
{
reason: Forbidden
}
Info
--------------------------
httplib
POST /api/1/store/ [200]
{
reason: OK
}
--------------------------

Транзакция на сервере sentry не создалась…
В конце:

descriptor 'SerializeToString' requires a 'google.protobuf.pyext._message.CMessage' object but received a 'bytes'

61e8873e66ba5575559741.png

В чем проблема?

Код для транзакций:

def transaction_sentry(logger):
    def debug_request(func):
        @wraps(func)
        def inner(*args, **kwargs):
            task_name = f"{func.__name__}"
            logger.warn("Создана транзакция: `{}`".format(task_name))
            try:
                span = sentry_sdk.Hub.current.scope.span
                if span is None:
                    # нет выполняемых интервалов, создайте новую транзакцию
                    with sentry_sdk.start_transaction(name=task_name):
                        response = func(*args, **kwargs)
                        logger.warn(response)
                else:
                    # дочерняя задача транзакции
                    with span.start_child(op=task_name):
                        response = func(*args, **kwargs)
                return response
            except Exception as e:
                logger.warn(e)
                logger.exception(
                    "Ошибка при выполнении транзакции: `{}`".format(task_name))
                sentry_sdk.capture_exception(error=e)
                raise e
        return inner
    return debug_request

Вызов:

LOG = get_logger(__name__)
class TestService(
    stt_pb2_grpc.TestService
):
    @transaction_sentry(LOG)
    def _sub_func(request):
        #....
        return TestResponse(text=request.text)

    def Method(
        self, request,
        context
    ):
            return self._sub_func(request)

Версия sentry==1.3.1

Добрый день, уважаемые коллеги.

Сегодня поделюсь обзором одной ошибки с неявным генезисом и отсутствующим описанием. Суть в следующем: пользователь внес в базу Бухгалтерия 3.0 документ поступление товаров и услуг (УПД), в котором неверно указан входящий номер. При попытке номер исправить и перепровести документ, 1С ругается «В данной транзакции уже происходили ошибки». Попытки отменить проведение, пометить на удаление или просто перезаписать этот документ вызывают аналогичное сообщение. Соседний аналогичный документ работает корректно.

Проблемная накладная от 01.04.2021, внешних поводов для беспокойства не вызывает. Конфигурация типовая, версии 3.0.89, релиз не самый последний, но довольно свежий и стабильный. База файловая, работает один человек. 

Беда подобной ошибки в том, что она не имеет четкого описания. Нет ссылок на проблемный код в конфигураторе. Нет отсылок к неверным реквизитам или пользовательским данным. С чего начинать поиски причины неясно.

Если спросить у интернета, то он выдаст массу статей и обсуждений. Они верные по сути, но не дают ответа на вопрос что делать. То есть они объясняют суть проблемы: при возникновении ошибки в одном из уровней многоуровневой транзакции, отменяется всё дерево. Связано это с некорректным написанием кода и неверным использованием механизма транзакций. Рекомендуется писать код правильно. Что делать пользователям типовых конфигураций не написано.

Пошёл стандартным путём:

  1. Закрыл все окна, открыл документ заново и попробовал провести. Безрезультатно.
  2. Сохранив предварительно базу, обновил её до 3.0.91 — последнего релиза. Вдруг это действительно ошибка в коде. Не помогло.
  3. Протестировал базу стандартными средствами ТиИ конфигуратора и утилитой chdbfl. Ошибок нет, не помогло.
  4. Очистил кэш в папках AppDataRoaming и AppDataLocal (будьте внимательны, не удалите список баз!). Не помогло.
  5. Отключил ненужные фоновые задания. Остальным установил увеличенный интервал между попытками, расписание проверок сделал ежедневным. Впрочем, это явно лишнее — в списке активных пользователей была только одна строка. Действие не помогло.
  6. Стал размышлять: что ещё перепроводится при проведении поступления? Введённый на основании счет-фактура. При детальном изучении выяснилось, что у с/ф ошибочно была указана дата 01.01.2021. Т.е. документ попал в закрытый для редактирования период — дата запрета установлена на 31.03.2021. 

Снял флаг запрета, поправил дату и указал верный номер. Всё провелось без ошибок.

Однако вопрос к коду типовой конфигурации остался: ошибка очень неявная. Вместо конкретного указания на невозможность перепровести счет-фактуру из-за установленной даты запрета, пользователь видит неинформативную надпись общего характера. Как так получается, что 1С игнорирует собственные стандарты разработки затрудняя поиск источника проблем не только пользователю, но и специалистам — загадка.

Небольшое пояснение. У 1С есть две похожие ошибки: «Объект изменен другим пользователем/ в другой транзакции» и «Ошибка блокировки транзакции». Они имеют пару похожих формулировок, но все они возникают когда записываемый объект занят другим пользователем. Это может быть как физический пользователь, так и регламентное задание. Частный случай — дважды открытый документ или элемент справочника. Именно для исключения этих ситуаций присутствуют действия в п. 1 и п. 5.

Если статья оказалась полезной, вы можете поддержать блог, отправив символическую сумму через форму ниже. Ваша поддержка вдохновляет меня на создание новых статей.  

Понравилась статья? Поделить с друзьями:
  • Ошибка при создании точки восстановления windows 10 0x81000203
  • Ошибка при создании торрента
  • Ошибка при создании тонкостенного тела компас 3d
  • Ошибка при создании соединения bluetooth windows 7
  • Ошибка при создании сервера майнкрафт