Обманчивая ошибка "Данные были изменены или удалены другим пользователем"

25.03.18

Разработка - Механизмы платформы 1С

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

Скачать файлы

Наименование Файл Версия Размер
Данные были изменены или удалены другим пользователем:
.dt 34,18Kb
7
.dt 34,18Kb 7 Скачать

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

Причем в случае ошибки при записи (или проведении) документа отменяется также создание подчиненного объекта.

Кроме того при ошибке создания подчиненного объекта также отменяется запись (или проведение) текущего документа.

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

Пример реализации алгоритма с обманчивым сообщением об ошибке:

  1. Команда вызывает запись документа из серверного контекста формы для получения ссылки на документ.
  2. Полученная ссылка передается в процедуру модуля менеджера документа или общего модуля для создания связанного объекта.
  3. Выполняется сохранение ссылки подчиненного объекта в текущем документе и запись текущего документа.
  4. Запись документа и создание подчиненного объекта производится в транзакции с попыткой, с отменой транзакции при ошибке и выводом сообщения об ошибке.

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

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

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

Перелопачивается код создания подчиненного объекта, но получения объекта по ссылке и его записи нет...

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

Вот, что проиходит.

Пользователь при заведении документа столкнулся с ошибкой при формирования подчиненного объекта, получил сообщение об ошибке, поправил настройки создания подчиненного объекта и пробует еще раз записать (или провести) текущий документ.

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

Расмотрим внимательнее версии объекта текущего документа и его ссылки после ошибки.

До отмены транзакции и объект и ссылка записанного в пределах транзакции документа содержат одинаковую версию.

После отмены транзакции версия ссылки очищается, а версия объекта не очищается!

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

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

В последнем случае программной работы сообщение об ошибке будет: «Документ не выбран».

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

После этого будет повторятся первоначальная ошибка и не затеряется среди множества ошибок «Данные были изменены или удалены другим пользователем».

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

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4545    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5296    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6411    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18479    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

14.09.2023    12090    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8831    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6281    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15989    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. vasilev2015 2687 25.03.18 21:07 Сейчас в теме
При отмене транзакции отменяются только изменения СУБД, а изменения локальных переменных, в том числе объектного типа остаются. Так и есть. Чтобы не использовать запись два раза, используйте процедуру "УстановитьСсылкуНового". Не делайте вложенных транзакций записи - используйте фоновые задания. (Все, что смог сказать полезного)
DrAku1a; maxli28; Светлый ум; A_Max; Shmell; nvv1970; +6 Ответить
3. rinat_alp2 61 26.03.18 12:55 Сейчас в теме
(1) Спасибо, добавил исправление через "ПолучитьСссылку".
4. rinat_alp2 61 26.03.18 13:02 Сейчас в теме
(1) Думаю было бы удобнее, если бы платформа выдавала сообщение об ошибке:
"Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)", не так конкретно:
"Данные были изменены или удалены другим пользователем".
jobkostya1c_ERP; +1 Ответить
8. DrAku1a 1679 16.12.23 10:30 Сейчас в теме
(1) Я бы ещё добавил - изучите механизмы БСП по записи дополнительных реквизитов, сведений и адресной информации при записи объекта - в старых версиях конфигураций (УТ 10). В новых же (УТ11) - например, можно посмотреть как работает механизм записи контрагента и партнера (при отключенной опции "Вести партнеров отдельно"), как работает запись сч-фактур при записи реализации.

Ну и дополнительно - почитать статью: Обработчики событий при записи объектов. Зачем и что за чем?

Это позволит организовывать запись доп.объектов при записи основного без внешних транзакций ("НачатьТранзакцию" / "ЗафиксироватьТранзакцию").
2. nvv1970 26.03.18 08:52 Сейчас в теме
Обманчивая ошибка идёт из недостатка знаний и применения неправильных методов.
Все работает именно так как и должно работать.
DrAku1a; sukorskis; Waanneek; Shmell; +4 Ответить
5. user970589 10 29.09.19 09:20 Сейчас в теме
(2)у меня в типовой базе УТ11 такая ошибка вылетает. в понедельник выгоню всех лишних и повторю, но сдается, что толку может и не быть. Посмотрим завтра.
6. Работник 204 07.04.20 10:39 Сейчас в теме
У меня случилась такая оказия. Только случай другой. Никто ничего не создавал паралельно. Просто документ пересчета товаров с несколькими тысячами позиций перестал записываться после очередной порции внесения данных. Пользователь не обратил внимания на это сообщение и продолжил. Когда уже половину данных внес, давай беспокоиться и звонить.

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

Удалось вывести список таблицной части в табличный документ штатной командой меню. Сохранил этот список в файл mxl (можно и excel). Потом создал новый документ пересчета с той же датой/временем и настройками. Штатной обработкой от 1С "...заполнение табличных частей..." загрузил данные из сохраненного файла в новый документ.

На все про все ушел 1час на осознание происшедшего, обдумыванием что сделать, загрузкой и контрольной сверкой с данными из глючного документа. Так же пришлось через универсальный отчет посмотреть какие данные записываются в скрытые колонки.
7. sttt 115 08.06.20 12:13 Сейчас в теме
(6)
ВыгрузкаДанных = Внешние Обработки.Создать("http://devtool1c.ucoz.ru/load/0-0-0-16-20", ложь);
Выгрузка Данных.СохранитьЗначениеВФайлЛкс(тз, ПутьФайла, Истина);

Пару минут работы))
Оставьте свое сообщение