При работе в крупных корпоративных системах, таких как 1С:ERP Управление предприятием или Комплексная автоматизация 2, специалисты часто сталкиваются с парадоксальной ситуацией. При попытке заменить помеченный на удаление объект (например, контрагента) на другой элемент через стандартную обработку Удаление помеченных объектов, система выдает ошибку: «Данные изменены другим пользователем». Это происходит даже в тех случаях, когда база находится в монопольном режиме, а все регламентные задания, казалось бы, отключены. Разберем подробно, почему возникает эта проблема и как ее решить различными способами.
Проанализируем ситуацию: ошибка «Данные изменены другим пользователем» (в технической литературе известная как Optimistic Locking) означает, что версия объекта, которую программа пытается записать, не совпадает с версией, хранящейся в базе данных в данный момент. Рассмотрим основные факторы, вызывающие этот конфликт в современных конфигурациях:
Ключи аналитики учета номенклатуры или Ключи аналитики расчетов с партнерами. При замене контрагента система должна обновить или создать новый ключ. Если в этот момент срабатывает фоновый процесс (даже скрытый системный), возникает конфликт версий в этих скрытых таблицах.Версии объектов. Если этот регистр поврежден или занят, 1С интерпретирует это как изменение данных «кем-то другим».Рассмотрим альтернативный стандартный инструмент. Опыт показывает, что встроенная обработка Поиск и удаление дублей (находится в разделе Администрирование — Обслуживание) работает более корректно, чем механизм замены в интерфейсе удаления помеченных объектов. Проанализируем алгоритм действий:
Контрагенты).Этот механизм использует более агрессивные алгоритмы блокировок и часто успешно обходит ошибки версионирования, которые «спотыкают» обычное удаление помеченных.
Если стандартные средства не помогают, наиболее эффективным решением будет написание собственной небольшой обработки. Посмотрим на пример кода, который позволяет выполнить замену «силовым» методом, отключая лишние проверки конфигурации. Ключевым моментом здесь является использование свойства ОбменДанными.Загрузка = Истина.
Разберем пример функции для замены ссылок:
Процедура ЗаменитьСсылкуНаОбъект(СтараяСсылка, НоваяСсылка)
// Получаем массив всех мест использования объекта в базе
МестаИспользования = НайтиПоСсылкам(Новый Массив(СтараяСсылка));
Для Каждого СтрокаИспользования Из МестаИспользования Цикл
Попытка
// Получаем объект для редактирования
ОбъектМетаданных = СтрокаИспользования.Метаданные;
Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
ОбъектДляИзменения = СтрокаИспользования.Данные.ПолучитьОбъект();
// Важный флаг: отключает подписки на события и проверки при записи
ОбъектДляИзменения.ОбменДанными.Загрузка = Истина;
// Здесь должна быть логика поиска реквизита и замены ссылки
// В простейшем случае используется ПоискИЗаменаЗначений
// Но для надежности лучше программно перебрать реквизиты
ОбъектДляИзменения.Записать();
КонецЕсли;
Исключение
Сообщить("Не удалось изменить объект: " + СтрокаИспользования.Данные);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
При использовании ОбменДанными.Загрузка = Истина система игнорирует большинство триггеров (подписки на события ПередЗаписью и ПриЗаписи), которые чаще всего и вызывают ошибку блокировки данных другим пользователем.
Иногда проблема кроется не в коде, а в состоянии индексов и кэша сервера. Проанализируем шаги по технической подготовке системы к массовой замене ссылок:
Агент сервера 1С:Предприятия. Это принудительно завершит все «подвисшие» сессии и очистит сеансовые данные, которые могут генерировать ложные ошибки блокировки.Конфигуратор (раздел Администрирование — Управление итогами).Проверка логической целостности и Реиндексация таблиц. Это исправит «битые» ссылки, на которых часто спотыкается стандартный поиск.Если ваша задача — заменить предопределенный элемент (например, счет 60.01), как упоминалось в сообщениях форума, будьте предельно осторожны. Замена счетов в проводках напрямую может привести к нарушению методологии учета. В таких случаях лучше использовать специализированную обработку «Поиск и замена значений» (входит в состав инструментов разработчика), которая позволяет точечно находить ссылки в регистрах бухгалтерии, но выполнять такие операции следует только после создания резервной копии базы данных.
Подводя итог: если вы видите ошибку «Данные изменены другим пользователем» в монопольном режиме — скорее всего, срабатывает внутренняя логика конфигурации (подписки на события). Используйте программный метод с флагом Загрузка = Истина или типовую обработку Поиск и удаление дублей для успешного завершения операции.