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

25.03.18

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

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

Скачать исходный код

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Сервисы интеграции без Шины и интеграции

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    3225    dsdred    16    

65

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

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

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

24.01.2024    7520    YA_418728146    25    

69

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

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

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

11.12.2023    7762    dsdred    36    

115

1С-ная магия

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

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

06.10.2023    20119    SeiOkami    46    

124

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

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

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

14.09.2023    14051    human_new    27    

77

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

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

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

28.08.2023    10421    YA_418728146    7    

148

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

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

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

20.08.2023    7018    sebekerga    54    

99
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vasilev2015 2713 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 1725 16.12.23 10:30 Сейчас в теме
(1) Я бы ещё добавил - изучите механизмы БСП по записи дополнительных реквизитов, сведений и адресной информации при записи объекта - в старых версиях конфигураций (УТ 10). В новых же (УТ11) - например, можно посмотреть как работает механизм записи контрагента и партнера (при отключенной опции "Вести партнеров отдельно"), как работает запись сч-фактур при записи реализации.

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

Это позволит организовывать запись доп.объектов при записи основного без внешних транзакций ("НачатьТранзакцию" / "ЗафиксироватьТранзакцию").
2. nvv1970 26.03.18 08:52 Сейчас в теме
Обманчивая ошибка идёт из недостатка знаний и применения неправильных методов.
Все работает именно так как и должно работать.
DrAku1a; sukorskis; Waanneek; Shmell; +4 Ответить
5. user970589 11 29.09.19 09:20 Сейчас в теме
(2)у меня в типовой базе УТ11 такая ошибка вылетает. в понедельник выгоню всех лишних и повторю, но сдается, что толку может и не быть. Посмотрим завтра.
6. Работник 206 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", ложь);
Выгрузка Данных.СохранитьЗначениеВФайлЛкс(тз, ПутьФайла, Истина);

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