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

Эту ошибку можно часто увидеть у неопытных разработчиков 1С 8.3. Рассмотрим основные причины и способы исправления ошибки.

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

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

Внутри транзакции вызывается исключительная ситуация, что откатывает всю транзакцию и некорректно отрабатывает. Например:

  1. НачатьТранзакцию();
  2. ….
  3. ….
  4. Попытка
  5. ….
  6. Исключение // если тут будет вызвано исключение, то Вы увидите ошибку «В данной транзакции уже происходили ошибки»
  7. ….
  8. КонецПопытки;
  9. ….
  10. КонецТранзакцию();

Во избежание таких ситуаций нужно избегать использования попытки внутри транзакции.

Если у Вас появляется данная ошибка, но Вы не в курсе, что такое транзакция и как программировать в 1С 8.3, Вам лучше обратиться за помощью к опытному программисту 1С.

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->

Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003—2014 (2.3.20.1)

В документе РКО в модулях по проведению и распроведения имеется код:

Именно этот код мне сейчас и создает проблемы при проведении и отмены проведения, выдает сообщение "В данной транзакции уже происходили ошибки"

Если его убрать, то всё нормально. Однако данный код вынужденное зло, т.к. начальника потребовал, чтобы после формирования РКО в соответствующей Заявке (у нас ведется обязательный учет по Заявкам).

Именно применение "Попытка" и создает проблемы, но если это убрать, то тоже создаются проблемы при проведении и антипроведении, т.к. на филиалах применение Заявок не обязательно.

Что можно придумать, чтобы ошибки не было, но и код выполнялся для записи ссылки на документ?

Оратор

Группа: Пользователи
Сообщений: 306
Спасибо сказали: 73 раз
Рейтинг: 70.6 -->

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->

Ну и код при отмене проведения

Т.е. ссылка на РКО в Заявке удаляется.

Мож есть какой другой метод записи ссылки в другом документе?

podcast @ Сегодня, 16:02 ,

Прерыватель отладчика ничего не дал.

Вот не совсем понял про НачатьТранзакцию();

Мне вначале модуля проведения поставить? И что дает эта штука?

Живет на форуме

Группа: Местный
Сообщений: 2171
Из: Проскуров
Спасибо сказали: 516 раз
Рейтинг: 502.6

-->

не поможет
проведение уже проходит в транзакции

попробуйте перед записью менять документы, а не при проведении

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->

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

Подскажите как правильно сделать перед записью, т.е. осуществить проверку на действие (проведение, отмена проведения, удаление)?


Крутой

Группа: Местный
Сообщений: 1993
Из: Киева и окрестностей
Спасибо сказали: 403 раз
Рейтинг: 0

-->

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->
Читайте также:  Дано отрицание числа a10 74 найти a10

Попробовал убрать "Попытку"

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

С "Попыткой" Записывает, без не записывает. Что не так я сделал?

Попробовал в модуле объекта "При записи"

Та жа ошибка при записи


Крутой

Группа: Местный
Сообщений: 1993
Из: Киева и окрестностей
Спасибо сказали: 403 раз
Рейтинг: 0

-->

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->

Хотелка начальника. Он хочет видеть на форме списка Заявок сделан ли РКО по данной Заявке или нет.

Может есть другой способ отразить закрытую Заявку?

Завсегдатай

Группа: Пользователи
Сообщений: 214
Из: Сумы
Спасибо сказали: 38 раз
Рейтинг: 38 -->

Хотелка начальника. Он хочет видеть на форме списка Заявок сделан ли РКО по данной Заявке или нет.

Может есть другой способ отразить закрытую Заявку?


Крутой

Группа: Местный
Сообщений: 1993
Из: Киева и окрестностей
Спасибо сказали: 403 раз
Рейтинг: 0

-->

Проведите РКО с указанными Заявками и посмотрите Движения. Там все уже есть. Выбирайте по Заявке и показывайте где нужно.

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->

Идеи хорошие, не могу их как-то реализовать.
Создал реквизит формы списка "РКО" (на вкладке "Реквизиты") с ссылкой на документы РКО

Пытаюсь вставить новую колонку в ТЧ формы списка Заявок, но там нет возможность выбрать данные, т.е. выбрать этот новый реквизит "РКО".

Теперь о регистрах. Да в РН "Движения денежных средств" есть ссылка на Заявку.

Как можно одной строкой вытащить Регистратор (РКО), зная "ДокументПланированияПлатежа" (Заявка) из этого регистра накопления и "получайте ссылки на РКО "ПриВыводеСтроки" в табличном поле Заявок" как это предложил Vidocq05.

Значит не я один затаил сомнения.

Живет на форуме

Группа: Местный
Сообщений: 2638
Из: Київ, Україна
Спасибо сказали: 726 раз
Рейтинг: 703.1

-->

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->

иЙолки-палочки. Всё перепробовал, даже открытие формы Заявок

Но как сохранить изменения в открытой форме и закрыть её не получается.

Вообщем я начал паниковать

Подскажите детально как бы Вы сделали эту хотелку без "Попытка"?
Интересная идея с дополнительным реквизитом формы списка и как при этом использовать "ПриВыводеСтроки", если это действительно не кушает ресурсы при открытии, т.к. нужно будет выделять строки, где есть РКО.


Крутой

Группа: Местный
Сообщений: 1993
Из: Киева и окрестностей
Спасибо сказали: 403 раз
Рейтинг: 0

-->

Я бы не курочил Список, а склепал бы простой отчет для начальника.
Все хотелки в виде отчетов собрал бы в отдельную красивую форму, нпр "Пульт управления компанией".
И начальник был бы счастлив и юзеры не натыкались бы на побочные эффекты его хотелок и конфа бы обновлялась.

Напишите в списке Заявок запрос к регистру, где РКО пишет Заявки.
Пусть выполняется для начальника — по Роли.

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->

Вот сделал такую вещч:

Вроде срабатывает, но явно тормозит. Может есчо есть пооптимальней?

Как можно получить данные из РН одной строкой, типа


Крутой

Группа: Местный
Сообщений: 1993
Из: Киева и окрестностей
Спасибо сказали: 403 раз
Рейтинг: 0

-->

"Во избежание дефицита. "

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->
Читайте также:  Глонасс саранск общественный транспорт мобильная версия

Как раз в Списке Заявок, есть левая колонка, вот туда и прописываются.

Я выложил код. Вы предложили другую идею "Запрос должен выполняться не по каждой строке, а 1 раз по списку выведенных в форму Заявок"

Как это осуществить?

Ветеран

Группа: Пользователи
Сообщений: 847
Спасибо сказали: 5 раз
Рейтинг: 4 -->

На ИТС нашел вот такой код: [необходимо зарегистрироваться для просмотра ссылки]

Код переделал под свои нужды, но выдает такую ошибку:

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

Транзакции применяются для целостного изменения связанных данных, т.е. все действия с базой данных, выполняемые в рамках транзакции или выполняются целиком, или целиком откатываются.

1. Использование транзакций в 1С:Предприятии обладает рядом особенностей:

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

1.1. Поскольку исключение не отменяет транзакцию сразу, но запрещает успешное завершение транзакции, то все вызовы НачатьТранзакцию с одной стороны и ЗафиксироватьТранзакцию или ОтменитьТранзакцию с другой стороны должны быть парными.

1.2. Начало транзакции и ее фиксация (отмена) должны происходить в контексте одного метода

Попытка
. // чтение или запись данных
ДокументОбъект.Записать()
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
. // дополнительные действия по обработке исключения
КонецПопытки;

Попытка
. // чтение или запись данных
ДокументОбъект.Записать()
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
. // дополнительные действия по обработке исключения
КонецПопытки;

1.3. При использовании транзакций необходимо предусмотреть обработку исключений, придерживаясь следующих правил:

НачатьТранзакцию();
Попытка
БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("Документ.ПриходнаяНакладная");
ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", СсылкаДляОбработки);
ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный;
БлокировкаДанных.Заблокировать();

. // чтение или запись данных

ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции'"),
УровеньЖурналаРегистрации.Ошибка,
,
,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));

ВызватьИсключение; // есть внешняя транзакция

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

1.4.1. Не стоит усложнять код, явно используя метод НачатьТранзакцию , когда кроме записи объекта другие действия c базой данных не делаются – платформа при записи сама откроет транзакцию.

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

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

Попытка
ДокументОбъект = Документы.ПриходнаяНакладная.СоздатьДокумент();
. // действия по заполнению объекта
ДокументОбъект.Записать();
Исключение
. // действия по обработке исключения
КонецПопытки;

НачатьТранзакцию();
Попытка
ДокументОбъект = Документы.ПриходнаяНакладная.СоздатьДокумент();
. // действия по заполнению объекта
ДокументОбъект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
КонецПопытки;

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

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

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

Читайте также:  Блок питания польской антенны схема

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

2. Ограничение на длину транзакции.

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

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

2.1.1. Если с точки зрения бизнес-логики действия могут быть выполнены по отдельности, то их в общем случае не следует объединять в одну транзакцию.

2.1.2. Исключением из п.2.1.1 могут быть случаи, когда с целью оптимизации несколько несвязанных объектов обрабатываются в рамках одной транзакции. В этом случае необходимо взвешенно подходить к выбору порции обработки данных: нужно стремиться к достижению золотой середины между длительностью одной транзакции и объемом фиксируемых данных с одной стороны и количеством транзакций с другой.

2.2. Следует избегать транзакций, которые выполняются длительное время.

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

Т.к. данных по одной версии классификатора много (объем около 1 Гб), то для выполнения такой транзакции, во-первых, может не хватить оперативной памяти (особенно при использовании файловой информационной базы на 32-разрядной ОС), а, во-вторых, такая операция будет выполняться достаточно долго и ее нельзя будет оптимизировать за счет выполнения в несколько потоков.

Разбить загрузку новой версии классификатора ФИАС на небольшие транзакции и реализовать функциональность по откату к предыдущей версии в случае ошибки.

2.2.1 Чем дольше выполняется транзакция, тем большее время будут заняты ресурсы сервера 1С:Предприятия и СУБД. Как правило длинные транзакции занимают следующие ресурсы:

  • в ходе выполнения транзакции все изменения в базе данных записываются в журнал транзакций, что необходимо для возможности откатить транзакцию;
  • блокировки, установленные в транзакции, остаются до конца транзакции;
  • на сервере 1С:Предприятия блокировки занимают оперативную память;
  • другие ресурсы, необходимые самой бизнес-логике, которая выполняется в транзакции.

Все это в целом может снижать эффективность использования ресурсов.

2.2.2. Если две транзакции пересекаются по блокируемым ресурсам, то транзакция, которая начала выполняться позже, будет ожидать возможность установления блокировки ограниченное время (по умолчанию – 20 секунд), после чего будет завершена с исключением «Превышено время ожидания установки блокировки». Поэтому длинные транзакции могут сильно снижать удобство параллельной работы пользователей.

Возникновение таких исключений – это повод провести анализ действий, которые выполняются в конфликтующих транзакциях

2.3. В рамках транзакции нужно стремиться выполнять минимум действий – только те, которые нельзя в соответствии с бизнес-логикой выполнять вне транзакции. В частности:

Оцените статью
Добавить комментарий

Adblock
detector