В данной транзакции уже происходили ошибки! |
Я |
02.08.19 — 09:06
Ошибка при вызове метода контекста (Выполнить)
Выборка = Запрос.Выполнить().Выбрать();
по причине:
Ошибка выполнения запроса
по причине:
В данной транзакции уже происходили ошибки!
Не могу понять в чем проблема,помогите пожалуйста…
после выполнения
Номенклатура=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры))
Номенклатура =Ошибка получения представления значения: В данной транзакции уже происходили ошибки!
1 — 02.08.19 — 09:08
В поломанной транзакции обращаться к БД нельзя
2 — 02.08.19 — 09:08
Истинная проблема где-то в коде до того места, где тебе показало эту ошибку
3 — 02.08.19 — 09:08
С чего решил,что здесь?
Номенклатура=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры))
4 — 02.08.19 — 09:11
(3) после выполнения этой строки номенклатура=Ошибка получения представления значения: В данной транзакции уже происходили ошибки!. Отладчиком проверяла
5 — 02.08.19 — 09:11
(2) как найти?
6 — 02.08.19 — 09:12
Отладчиком тем более нет смысла проверять, т.к. ты все еще внутри поломанной транзакции
7 — 02.08.19 — 09:13
(5) Написать хитрый метод в общем модуле, в каждой строке кода в режиме трассировки вызывать этот метод, который будет возвращать признак того, что транзакция поломана. Ну это если совсем тямы нет прикинуть по коду, где же факап случился.
8 — 02.08.19 — 09:13
(4)Нет,ищи ранее
9 — 02.08.19 — 09:26
(8) я взяла эту обработку из комплексной и перенесла на нашу самописку. Там все хорошо работает.а тут такая ошибка…
10 — 02.08.19 — 09:27
(9) И че?Ищи,попробуй на копии без транзакции
11 — 02.08.19 — 09:38
(10) так странно. В этой функции ВИНоменклатуры = Неопределено
Функция НайтиСоздатьНоменклатуру(СтрокаТовара, Знач ВидНоменклатуры, СтавкаНДС, ВИНоменклатуры = Неопределено)
Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
ВИНоменклатуры = Неопределено;
УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры= Неопределено);
а при вызове ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам приходит уже Истина.
Функция ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры)
Если НЕ ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаИд) Тогда
Возврат Ложь;
КонецЕсли;
Попытка
ИдНоменклатуры = ПолучитьИдНоменклатуры(СтрокаТовара.ТоварУслугаИд);
Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры));
12 — 02.08.19 — 09:39
Истина это нашла или нет?Я же не вижу что там
13 — 02.08.19 — 10:21
(12) Если посмотреть в комплексной,то там получает так же неопределено. А у меня истина.
14 — 02.08.19 — 10:21
(13) Может стоит подумать над кодом и отличиями?
15 — 02.08.19 — 10:24
в транзакции нельзя записывать с попыткой. все равно ломается
16 — 02.08.19 — 10:27
(14) Вот ищу отличия
17 — 02.08.19 — 10:30
Функция ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры)
Возврат Истина
КонецФункции
Тогда увидишь где ошибка ранее
18 — 02.08.19 — 10:34
Вместо УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры= Неопределено);
нужно УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры);
19 — 02.08.19 — 10:37
УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ВИНоменклатуры= Неопределено);
— ну еще бы оно не приходило «Истина»
20 — 02.08.19 — 10:39
(18) ошибка осталась
21 — 02.08.19 — 10:42
(17) не вижу ошибку ранее,значит она в этой функции
22 — 02.08.19 — 10:51
(15) убрала попытку и вышла вот такая ошибка. {Обработка.ОбменССайтом.МодульОбъекта(5103)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
Если Номенклатура.ПолучитьОбъект() = Неопределено Тогда
по причине:
В данной транзакции уже происходили ошибки!
Функция ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ХарактеристикаНоменклатуры)
Если НЕ ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаИд) Тогда
Возврат Ложь;
КонецЕсли;
//Попытка
ИдНоменклатуры = ПолучитьИдНоменклатуры(СтрокаТовара.ТоварУслугаИд);
Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры));
Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Возврат Ложь;
КонецЕсли;
Если Номенклатура.ПолучитьОбъект() = Неопределено Тогда
// Объект не найден
СообщитьПользователю(«Номенклатура не найдена по уникальному идентификатору: » + ИдНоменклатуры, Ложь);
Возврат Ложь;
КонецЕсли;
Если НЕ Номенклатура.ВестиУчетПоХарактеристикам Тогда
Возврат Истина;
КонецЕсли;
ИдХарактеристики = ПолучитьИдХарактеристики(СтрокаТовара.ТоварУслугаИд);
Если ПустаяСтрока(ИдХарактеристики) Тогда
Возврат Истина;
КонецЕсли;
ХарактеристикаНоменклатуры = Справочники.ВариантыИсполнения.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдХарактеристики));
ПустаяХарактеристикаСсылка=Справочники.ВариантыИсполнения.ПустаяСсылка();
Если ХарактеристикаНоменклатуры = ПустаяХарактеристикаСсылка Тогда
Возврат Истина;
КонецЕсли;
Если ХарактеристикаНоменклатуры.ПолучитьОбъект() = Неопределено Тогда
СообщитьПользователю(«Объект <ХарактеристикаНоменклатуры> не найден: » + Строка(ИдХарактеристики)
+ «. Будет создан новый объект.», Ложь);
Возврат Ложь;
КонецЕсли;
//Исключение
// Возврат Ложь;
//КонецПопытки;
Возврат Истина;
КонецФункции
23 — 02.08.19 — 10:54
(22) нельзя ЗАПИСЫВАТЬ в попытке. ищи запись выше по коду
24 — 02.08.19 — 10:55
(15) (23) Что-то ты несешь ерунду
25 — 02.08.19 — 10:56
(22)Поставь уже в отладчике остановку по ошибке.
26 — 02.08.19 — 10:59
(25) +
27 — 02.08.19 — 11:09
(22) Номенклатура.ПолучитьОбъект()
Что вы тут пытаетесь проверить… Баже святы…
У вас какой уровень в 1С?
28 — 02.08.19 — 11:09
(25) Тут и без отладчика видно ошибку
29 — 02.08.19 — 11:11
+(22) «Если Номенклатура.ПолучитьОбъект() = Неопределено Тогда»
Тут скрыт первый косяк… «Детектит, ГУАНО код»… Рекомендую тут подумать вам, и переписать
30 — 02.08.19 — 11:17
похоже поняла. Ошибка происходит при записи договора контрагента.
31 — 02.08.19 — 11:30
(30) Нужно найти ту первую Попытку с записью данных в БД, которая вываливается в исключение без «В данной транзакции уже происходили ошибки!». После такого исключения продолжать работу в транзакции уже нельзя. Нужно выходить из всех вызывающих процедур. Лучше всего это сделать через ВызватьИсключение с человеческим сообщением об ошибке или вообще не делать попытку.
Возможно, обработка просто не рассчитана на работу в транзакции.
32 — 02.08.19 — 11:59
(27)По-моему, проверяется найденность элемента по переданному ИД. А как надо?
33 — 02.08.19 — 12:08
(32) а точно там «Неопределено» выдаст? может null?
34 — 02.08.19 — 12:27
35 — 02.08.19 — 12:29
(32) Запросом же можно (с условием на ссылку)
36 — 02.08.19 — 12:32
(35)Ну, это дело вкуса, при разовом обращении не вижу тут грубой ошибки.
Cyberhawk
37 — 02.08.19 — 12:34
(36) Все зависит от того, планируется ли дальнейшая работа с объектом. Если только для проверки существования, то избыточное получение данных налицо.
Содержание:
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 уровня, а неявная транзакция записи – транзакция 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С Предприятие версии 8.3
- Также можно выполнить удаление другим способом:
- Особенности написания кода, которые помогут исключить ошибку в транзакциях
Причина появления сообщения о повторных ошибках в 1С 8.3
Главная проблема заключается в том, что сообщение об ошибке «В данной транзакции уже происходили ошибки» неинформативно, нет никакой конкретики. Поэтому будем опираться на проблемы, с которыми чаще всего сталкиваются пользователи. Например, с технической стороны ошибка такого рода может возникнуть при первой транзакции, то есть и при первичном обращении к базе данных.
Подобная ошибка может произойти при обработки ситуации «Попытка-Исключение». Например, при создании записи «Объект_1» формируется исключительная ситуация, а сама ошибка появляется в «Ссылка_2.Наименование». То есть происходит запрос базы данных объектной модели.
В «Попытке-Исключение» начинается обработка операции, которая также должна быть выполнена в транзакции, которая, в свою очередь, может быть явной или неявной (создается в момент записи объекта).
1С: Предприятие 8.3 не поддерживает транзакций вложенного типа. Однако допускается создание вложенной конструкции сразу нескольких транзакций. Из-за наличия явной и неявной транзакции может возникнуть ошибка. То есть программа запрещает транзакцию 1-го уровня на более низших уровнях.
Читайте также: Значение не является значением объектного типа 1С.
Есть ли смысл исправлять ошибки транзакции, которые уже происходили
При работе с 1С 8.3 не стоит оставлять подобные вещи без внимания. Прежде всего, другой пользователь также может столкнуться с ней, но не поймет причин её возникновения. Если не выполнить отладку системы, то в дальнейшем могут возникнуть дополнительные проблемы. Так как оповещение «В данной транзакции уже происходили ошибки» появляется при первом обращении, то в журнале регистрации данная строка обязательно зафиксируется, но, опять же, без подробного пояснения. Хоть ошибка и располагается на нижнем уровне кода, она нарушит необходимую иерархию. Это приведет к сбою других функций и только еще больше запутает администратора.
При наличие некорректного кода, транзакции будут выполняться с нарушениями или не будут выполняться вовсе. Поэтому при возникновении таких сообщений стоит решить проблему.
Устраняем ошибку транзакции в 1С Предприятие версии 8.3
В первую очередь стоит очистить кэш базы данных. Сделать это можно вручную. Для этого:
- Переходим на диск, на котором расположена база 1С.
- Переходим в папку с базой (путь может отличаться, но по умолчанию она установлена в той директории, которая показана на фото ниже).
- Удаляем кэш вручную.
- То же самое делаем с кэшем в папке 1с8.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, релиз не самый последний, но довольно свежий и стабильный. База файловая, работает один человек.
Беда подобной ошибки в том, что она не имеет четкого описания. Нет ссылок на проблемный код в конфигураторе. Нет отсылок к неверным реквизитам или пользовательским данным. С чего начинать поиски причины неясно.
Если спросить у интернета, то он выдаст массу статей и обсуждений. Они верные по сути, но не дают ответа на вопрос что делать. То есть они объясняют суть проблемы: при возникновении ошибки в одном из уровней многоуровневой транзакции, отменяется всё дерево. Связано это с некорректным написанием кода и неверным использованием механизма транзакций. Рекомендуется писать код правильно. Что делать пользователям типовых конфигураций не написано.
Пошёл стандартным путём:
- Закрыл все окна, открыл документ заново и попробовал провести. Безрезультатно.
- Сохранив предварительно базу, обновил её до 3.0.91 — последнего релиза. Вдруг это действительно ошибка в коде. Не помогло.
- Протестировал базу стандартными средствами ТиИ конфигуратора и утилитой chdbfl. Ошибок нет, не помогло.
- Очистил кэш в папках AppDataRoaming и AppDataLocal (будьте внимательны, не удалите список баз!). Не помогло.
- Отключил ненужные фоновые задания. Остальным установил увеличенный интервал между попытками, расписание проверок сделал ежедневным. Впрочем, это явно лишнее — в списке активных пользователей была только одна строка. Действие не помогло.
- Стал размышлять: что ещё перепроводится при проведении поступления? Введённый на основании счет-фактура. При детальном изучении выяснилось, что у с/ф ошибочно была указана дата 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С:Предприятии 8 ошибки базы данных подразделяются на следующие две категории:
К невосстановимым относятся такие ошибки базы данных, при возникновении которых функционирование 1С:Предприятия 8 может быть серьезно нарушено. Поэтому, во избежание более серьезных неприятностей (например, порчи данных), при возникновении невосстановимой ошибки выполнение 1С:Предприятия 8 прекращается. Если невосстановимая ошибка базы данных произошла в процессе выполнения транзакции, то все изменения сделанные в рамках этой транзакции отменяются.
При возникновении восстановимой ошибки считается, что серьезных нарушений в работе 1С:Предприятия 8 не произошло и работа может быть продолжена, но сама вызвавшая ошибку операция прекращается, и вызывается исключение, которое может быть перехвачено и обработано средствами встроенного языка. Казалось бы, все понятно. Но есть тонкость. Если восстановимая ошибка базы данных произошла в процессе выполнения транзакции, то, вне зависимости от того, было исключение, вызванное этой ошибкой, перехвачено и обработано или нет, транзакция уже не может быть продолжена или зафиксирована. Единственная операция с базой данных, которую можно произвести в такой ситуации — это отмена транзакции. Таким образом, приведенный фрагмент кода не вполне корректен:
Если при выполнении оператора Данные.Записать() произойдет восстановимая ошибка базы данных (например, по причине того, что элемент данных был заблокирован другим пользователем), то вызванное этой ошибкой исключение будет перехвачено, но повторное выполнение этого же оператора в цикле уже безусловно приведет к ошибке, так как при выполнении данной транзакции уже имела место ошибка базы данных. Следует заметить, что не всякая ошибка приводит к невозможности продолжения выполнения и фиксации транзакции, а именно ошибка базы данных. Исключения, не имеющие отношения к ошибкам базы данных, никакого влияния на возможность продолжения выполнения транзакции не оказывают.
Как же выйти из такой ситуации? Общее правило состоит в следующем: если при выполнении транзакции имели место ошибки базы данных, то следует отменить всю транзакцию в целом и, в случае необходимости, повторить попытку ее выполнения с самого начала. Таким образом, приведенный выше пример должен быть переработан следующим образом:
В данном варианте, если при выполнении оператора Данные.Записать() произойдет восстановимая ошибка базы данных, то при обработке исключения, вызванного этой ошибкой, транзакция будет отменена и при повторном выполнении цикла транзакция будет начата сначала.
Следует однако сделать предостережение. Дело в том, что в рамках уже выполняемой транзакции можно обращаться к методам НачатьТранзакцию() , ЗафиксироватьТранзакцию() и ОтменитьТранзакцию() . Однако вызов метода НачатьТранзакцию() при уже выполняющейся транзакции не означает начала новой транзакции. В этом случае просто произойдет увеличение на 1 значения внутреннего счетчика транзакций. Метод НачатьТранзакцию() начинает новую транзакцию только в том случае, если значение внутреннего счетчика транзакций равно 0. Аналогично, обращение к методам ЗафиксироватьТранзакцию() или ОтменитьТранзакцию() приводит к реальному завершению транзакции только в том случае, если значение внутреннего счетчика транзакций равно 1. Если при значении счетчика транзакций большем 1 произойдет обращение к методу ЗафиксироватьТранзакцию() , то значение счетчика будет просто уменьшено на 1:
Если же при значении счетчика траназкций большем 1 произойдет обращение к методу ОтменитьТранзакцию() , то значение счетчика транзакций не только будет уменьшено на 1, но и произойдет установка признака, не позволяющего зафиксировать результаты выполнения всей транзакции в целом. И последующее обращение к методу ЗафиксироватьТранзакцию() , выполняемое при значении счетчика транзакций равном 1, фактически приведет к отмене транзакции:
Аналогично, ошибка базы данных, произошедшая при значении счетчика транзакций большем 1, приведет к невозможности продолжения и фиксации всей транзакции в целом.
Таким образом, не всегда можно быть уверенным, что обращение к методу НачатьТранзакцию() действительно начинает новую транзакцию, а обращение к методам ЗафиксироватьТранзакцию() и ОтменитьТранзакцию() означает завершение транзакции в целом. Поэтому, конструкции с циклическим повторением попытки «прорваться через транзакцию» следует применять только в тех случаях, когда есть уверенность, что обращение к методу НачатьТранзакцию() действительно начинает новую транзакцию. И только при условии, что действительно есть необходимость «прорваться». Во многих случаях, при возникновении ошибки, разумнее выдать сообщение пользователю и предоставить ему самому решать: повторить попытку выполнения операции еще раз, или перед повторением попытки следует предпринять какие-то действия по разрешению ситуации, приведшей к ошибке.
Заметки на свободную тему
Сегодня поделюсь обзором одной ошибки с неявным генезисом и отсутствующим описанием. Суть в следующем: пользователь внес в базу Бухгалтерия 3.0 документ поступление товаров и услуг (УПД), в котором неверно указан входящий номер. При попытке номер исправить и перепровести документ, 1С ругается «В данной транзакции уже происходили ошибки». Попытки отменить проведение, пометить на удаление или просто перезаписать этот документ вызывают аналогичное сообщение. Соседний аналогичный документ работает корректно.
Проблемная накладная от 01.04.2021, внешних поводов для беспокойства не вызывает. Конфигурация типовая, версии 3.0.89, релиз не самый последний, но довольно свежий и стабильный. База файловая, работает один человек.
Беда подобной ошибки в том, что она не имеет четкого описания. Нет ссылок на проблемный код в конфигураторе. Нет отсылок к неверным реквизитам или пользовательским данным. С чего начинать поиски причины неясно.
Пошёл стандартным путём:
- Закрыл все окна, открыл документ заново и попробовал провести. Безрезультатно.
- Сохранив предварительно базу, обновил её до 3.0.91 — последнего релиза. Вдруг это действительно ошибка в коде. Не помогло.
- Протестировал базу стандартными средствами ТиИ конфигуратора и утилитой chdbfl. Ошибок нет, не помогло.
- Очистил кэш в папках AppDataRoaming и AppDataLocal (будьте внимательны, не удалите список баз!). Не помогло.
- Отключил ненужные фоновые задания. Остальным установил увеличенный интервал между попытками, расписание проверок сделал ежедневным. Впрочем, это явно лишнее — в списке активных пользователей была только одна строка. Действие не помогло.
- Стал размышлять: что ещё перепроводится при проведении поступления? Введённый на основании счет-фактура. При детальном изучении выяснилось, что у с/ф ошибочно была указана дата 01.01.2021. Т.е. документ попал в закрытый для редактирования период — дата запрета установлена на 31.03.2021.
Снял флаг запрета, поправил дату и указал верный номер. Всё провелось без ошибок.
Однако вопрос к коду типовой конфигурации остался: ошибка очень неявная. Вместо конкретного указания на невозможность перепровести счет-фактуру из-за установленной даты запрета, пользователь видит неинформативную надпись общего характера. Как так получается, что 1С игнорирует собственные стандарты разработки затрудняя поиск источника проблем не только пользователю, но и специалистам — загадка.
Небольшое пояснение. У 1С есть две похожие ошибки: «Объект изменен другим пользователем/ в другой транзакции» и «Ошибка блокировки транзакции». Они имеют пару похожих формулировок, но все они возникают когда записываемый объект занят другим пользователем. Это может быть как физический пользователь, так и регламентное задание. Частный случай — дважды открытый документ или элемент справочника. Именно для исключения этих ситуаций присутствуют действия в п. 1 и п. 5.
Делаю программное изменение документа в транзакции. Вначале просто записываю, а потом в попытке проведение. Если Документ не провелся, то Объект.Ссылка становиться «Ошибка получения представления значения». База файловая. В чем проблема?
Проблема в транзакции. Если записывать без транзакции, то ссылка не пропадает, я так понимаю это глюк платформы.
садись два, повтори материал про транзакции
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- Главная
- /
- Статьи
- /
- Программирование на 1С:Предприятие
- /
- Ошибка получения представления значения
Прикладные объекты. При невозможности вычисления текстового представления значения во время работы отладчика, в качестве текстового представления будет возвращена строка Ошибка получения представления значения. Невозможность вычисления текстового представления значения могло привести к зависанию конфигуратора.
Прикладные объекты. При невозможности вычисления текстового представления значения во время работы отладчика, в качестве текстового представления будет возвращена строка Ошибка получения представления значения. Невозможность вычисления текстового представления значения могло привести к зависанию конфигуратора.
Возврат к списку