Как записать документ, если 1С пишет «данные были изменены или удалены другим пользователем»
Содержание
Сообщение «Данные были изменены или удалены другим пользователем » значит одно: пока вы держали форму открытой, кто-то (человек, регламентное задание, обмен) уже записал этот же объект. Версия в базе новее той, что на вашем экране. 1С отказывает в записи, чтобы вы не затёрли чужие правки.
Быстрое решение зависит от ситуации. Если правил только один человек и вы это знаете — закройте форму без сохранения и откройте документ заново. Если успели ввести много данных — сначала скопируйте их, потом перечитайте объект. Если ошибка повторяется у всех на одном документе — ищите фоновый процесс, который его постоянно пишет.
Не путайте эту ошибку с «Конфликтом блокировок при выполнении транзакции». Там дело не в устаревшей форме, а в том, что две транзакции не поделили одни и те же данные, и одна не дождалась другую. Лечится иначе, разбор — ниже.
Откуда берётся ошибка: версия данных и блокировки
У каждого объекта в базе (документа, элемента справочника, записи регистра сведений) есть версия данных. Когда вы открываете форму, 1С запоминает версию. При записи платформа сравнивает её с текущей в базе. Совпала — пишет. Не совпала — выдаёт ошибку. Это оптимистичная блокировка: система не запрещает открывать объект двоим, а проверяет конфликт в момент записи.
Типичные причины:
- 👥 Два пользователя открыли один документ, один уже записал.
- 🔁 Вы открыли документ в двух окнах (или на двух вкладках в веб-клиенте) и записываете из старого.
- ⚙️ Объект правит регламентное задание: пересчёт, закрытие месяца , обмен данными.
- 🔌 Проведение документа по движению-«хвосту» из другого документа (например, перепроведение при групповой обработке) пишет в тот же объект.
- 🧩 Расширение или обработка меняет объект в
ПриЗаписи, а форма об этом не знает. - 📎 Для присоединённых файлов: файл взят на редактирование другим пользователем, а вы пытаетесь сохранить свою версию.
Эти же причины стоят за запросом «1с ошибка файл документа изменен »: речь о том, что документ или присоединённый файл уже изменён, пока вы с ним работали.
Если нужно записать документ прямо сейчас
Главное — не потерять то, что вы уже ввели. Порядок такой:
- Не закрывайте форму. Сфотографируйте экран или скопируйте введённые значения (табличную часть можно выделить и скопировать
Ctrl+C, затем вставить в Excel). - Закройте форму, откажитесь от сохранения.
- Откройте документ из списка заново. Посмотрите, что именно изменил другой человек: поле
Авторили история изменений, если она включена. - Внесите свои правки поверх актуальной версии и запишите.
Не нажимайте «записать любой ценой», если не знаете, что изменил коллега. Вы можете стереть исправленную им сумму или чужую строку в таблице.
Включённая история изменений (Администрирование → Общие настройки, поиск по слову «история» в форме настроек) показывает, кто и когда менял объект. Без неё приходится спрашивать коллег голосом.
Ошибка у одного документа и у всех: быстрая диагностика
Администрирование → Обслуживание → Регламентные и фоновые задания и посмотрите, что выполняется в этот момент.ОбработкаПроведения, подписка на событие). Нужна проверка кода: нет ли записи самого документа внутри проведения.Конфликт блокировок при транзакции: что происходит на самом деле
Если в тексте ошибки есть слова «Конфликт блокировок при выполнении транзакции» или «Превышено время ожидания блокировки», картина другая. Одна транзакция уже держит данные, вторая ждёт, а время ожидания вышло.
Это зависит от режима работы базы:
| Режим | Как блокирует | Когда ждать проблем |
|---|---|---|
| Файловая база | Блокировка на уровне файла или страницы | Много одновременных пользователей, тяжёлые операции |
| Клиент-серверная, автоматический режим | Платформа ставит блокировки сама, часто с запасом | Массовое проведение, закрытие месяца |
| Клиент-серверная, управляемый режим | Блокировки задаёт код (БлокировкаДанных) | Неточные пространства блокировок в коде |
Для обычного пользователя ответ простой: повторите операцию через минуту. Если повторяется часто — ищите, кто держит блокировку.
Кто держит блокировку
В клиент-серверном варианте это видно в консоли администрирования серверов 1С: найдите нужную информационную базу, откройте её сеансы и посмотрите, какой сеанс сейчас выполняет долгий вызов. Сеанс с зависшей операцией можно завершить, но сначала узнайте у владельца, что он делал.
В файловой базе проще: посмотрите в Администрирование → Активные пользователи, кто сейчас работает, и попросите зависшего выйти. Если сеанс завис и не отвечает, завершайте клиент из диспетчера задач на его компьютере.
Принудительное завершение сеанса прерывает транзакцию. Всё, что человек не записал, пропадёт. Предупредите его заранее.
Как снять блокировку на уровне администрирования
Порядок действий от безопасного к жёсткому:
- 🕒 Подождать 1–2 минуты и повторить. Большинство блокировок снимаются сами, когда соседняя транзакция фиксируется.
- 📋 Открыть список активных пользователей (
Администрирование→Активные пользователи) и найти того, кто работает с тем же объектом. - ⚙️ Проверить регламентные задания:
Администрирование→Обслуживание→Регламентные и фоновые задания. Если идёт массовый пересчёт или обмен, подождите его завершения или перенесите задание на ночь. - 🛑 Завершить сеанс виновника через консоль серверов 1С или список активных пользователей. Только после предупреждения.
- 🔄 В крайнем случае перезапустить рабочий процесс кластера. Это затронет всех пользователей базы.
Регистрация и резервные копии: зачем они при конфликтах
Журнал регистрации — главный источник фактов. Откройте Администрирование → Журнал регистрации (в некоторых конфигурациях он находится в разделе Сервис или Поддержка и обслуживание), отфильтруйте по пользователю, по событию «Данные.Изменение» и по времени, когда возникла ошибка. Там видно, кто последним записал объект.
С резервными копиями картина такая. Перед чисткой «лишних» блокировок и массовым перепроведением сделайте копию базы
. Для файловой базы это копия каталога с файлом 1Cv8.1CD. Для серверной — выгрузка средствами СУБД или Администрирование → Выгрузить информационную базу в конфигураторе. Если после вашего вмешательства документы разошлись, копия даёт точку возврата.
Не копируйте файл базы, пока в ней работают пользователи — копия может получиться битой.
Настройка прав и процессов: меньше конфликтов без кода
Часть ошибок лечится организацией работы, а не техникой.
Разделите зоны ответственности
- Один документ — один ответственный. Если счета правит и менеджер, и бухгалтер, они будут конфликтовать.
- Закрытый период. Включите запрет редактирования данных за прошлые периоды:
Администрирование→Настройки программы→Даты запрета изменения данных(название раздела может отличаться в вашей версии, ищите по слову «запрет»). Это защищает закрытые документы от случайных записей. - Права на изменение объекта. Роли без права
Изменениене смогут записать документ и не будут с ним конфликтовать.
Разнесите тяжёлые операции
Закрытие месяца, массовое перепроведение, обмен с сайтом, расчёт зарплаты — не запускайте их в разгар рабочего дня. Регламентные задания лучше ставить на ночь или на обед.
Не держите документы открытыми часами
Открытая с утра форма к вечеру устарела. Хорошая привычка: закончил — закрыл. Для длинных операций (ввод на основании, подбор товаров) сохраняйте промежуточный результат чаще.
Для разработчиков: как программно избежать конфликта
Код тоже виноват: запись одного и того же объекта из двух мест без блокировок порождает конфликты. Дальше — основные приёмы.
Блокировать объект на время редактирования
Для интерактивного редактирования используют механизм блокировки данных для редактирования:
Процедура ПередНачаломРедактирования(Ссылка)
Попытка
ЗаблокироватьДанныеДляРедактирования(Ссылка);
Исключение
Сообщить("Объект сейчас редактирует другой пользователь: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
После записи и закрытия формы блокировку снимают РазблокироватьДанныеДляРедактирования(Ссылка).
Блокировать данные в транзакции (управляемый режим)
Если база работает в управляемом режиме блокировок, перед чтением и записью в одной транзакции захватите нужные данные:
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
Элемент = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
Элемент.УстановитьЗначение("Номенклатура", Номенклатура);
Элемент.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
// здесь чтение и запись данных
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Правила, которые снижают число конфликтов:
- Держите транзакцию как можно короче. Тяжёлые запросы выносите до
НачатьТранзакцию. - Блокируйте только то, что нужно: по отбору (
Номенклатура), а не весь регистр. - Берите ресурсы всегда в одном порядке: так две транзакции не заклинят друг друга.
- Не вызывайте внешние сервисы и не показывайте диалоги внутри транзакции.
Попытка записи с повтором
Для фоновых заданий, где конфликт возможен по природе, разумно сделать повтор:
Для Счетчик = 1 По 3 Цикл
Попытка
Объект.Записать();
Прервать;
Исключение
Если Счетчик = 3 Тогда
ВызватьИсключение;
КонецЕсли;
// пауза между попытками, например через фоновое задание с отсрочкой
КонецПопытки;
КонецЦикла;
Повтор не заменяет причину. Если конфликт возникает постоянно, ищите источник, а не увеличивайте число попыток.
Типичные ошибки при борьбе с блокировками
- ❌ Завершать все сеансы подряд. Можно прервать закрытие месяца или обмен, и потом разгребать последствия.
- ❌ Увеличивать таймаут блокировок до огромных значений. Пользователи будут «висеть» минутами вместо того, чтобы получить понятное сообщение.
- ❌ Включать для всех прав ролью «Полные права». Любая случайная запись становится потенциальным конфликтом.
- ❌ Записывать объект внутри собственных обработчиков
ПриЗаписи,ОбработкаПроведениябез необходимости: объект меняется во время собственной записи. - ❌ Копировать базу «на горячую» перед чисткой. Копия получается нерабочей.
Как не возвращаться к этой ошибке
Итоговый набор мер: