Ошибка 1с в этой транзакции уже были ошибки

Содержание:

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С стоит переходить только при уверенности, что вы обладаете достаточным опытом.

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

Сегодня поделюсь обзором одной ошибки с неявным генезисом и отсутствующим описанием. Суть в следующем: пользователь внес в базу Бухгалтерия 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с придется познакомится с сообщением об ошибке «В данной транзакции уже происходили ошибки».

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

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

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

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

Попытка

Исключение

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

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

Попытка

Исключение

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

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

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

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

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

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

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

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

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

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

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

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

Попытка

а =6/0;

Исключение

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

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

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

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

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

Попытка

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

Исключение

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

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

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

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

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

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

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

Текст ошибки имеет два варианта:

Для решения ошибки может помочь одно из следующих действий:

1. Очистите кэш платформы 1С.

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

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

Внешний модуль в управляемых конфигурациях (БП 3.0, ЗУП 3.1 и др.) находится в прочих настройках обмена. Если отметка Использовать внешний модуль проставлена — снимите её, после чего перезапустите 1С. 

Внешний модуль в неуправляемых конфигурациях (БП 2.0, ЗУП 2.5, УПП 1.3 и др.) находится по пути Отчеты → Регламентированные отчеты → Настройки → Для настройки параметров документооборота нажмите здесь (внизу). Отметьте пункт Использовать встроенный модуль документооборота, после чего перезапустите 1С. 

4. Произведите групповое изменение реквизитов.

5. Обновите конфигурацию 1С до последней версии.

6. Если ошибка появляется в управляемых конфигурациях при обмене и отправке, пометьте на удаление созданные объекты во Все функции → Справочники → Тома хранения файлов.

Понравилась статья? Поделить с друзьями:
  • Ошибка 195 программа установки amd не может продолжать работу
  • Ошибка 1с в терминальном режиме
  • Ошибка 195 при установке фотошопа
  • Ошибка 1с forbidden что это такое
  • Ошибка 195 при установке драйверов amd как исправить