Пользователь уже начал редактировать эти данные 1с
Точнее более полно тема данного вопроса может звучать так: "Как завершить работу активных пользователей в базе 1С: Предприятие 8"? Рассмотрим возможные варианты завершения сеансов работы пользователей в файловой и серверной базах.
Кому подойдет информация: Администратор 1С, Системный администратор, Бухгалтер
Подойдет для конфигураций: Все типовые конфигурации 1С новых редакций
В данной публикации будет рассмотрено, как завершить работу пользователей в базах новых редакций, работающих в режиме управляемого приложения. Зачастую это необходимо, чтобы можно было выполнить операции, требующие монопольного режима базы (например, удаление помеченных на удаление объектов, выполнение тестирования и исправления базы). Тогда в базе остается активным только один пользователь, выполняющий такие операции.
Вообще необходимо стараться избегать необходимости завершать работу пользователей базы принудительно, а завершать работу пользователей стандартным закрытием сеансов работы. Т.к. каждое такое "выкидывание" пользователей из базы является по своей сути аварийным завершением работы с базой. И именно в такие аварийные завершения работы могут возникать или накапливаться ошибки (но не обязательно каждый раз) в пользовательских файлах, которые могут потом выражаться в нетиповом поведении 1С у отдельных пользователей, потребуется очистка кэша базы на отдельном рабочем месте. Но, когда других вариантов не остается, то приходится удалять активные сеансы работы пользователей принудительно.
Будет рассмотрено три момента: в файловой базе, а так же два варианта с использованием возможностей базы в режиме 1С:Предприятие и с помощью утилиты администрирования баз данных для серверного варианта базы. Понять, какой тип базы у Вас - файловый или серверный можно по ссылке.
Конечно, формально можно признать, что есть один универсальный способ для завершения работы всех пользователей для любого типа базы - перезагрузить сервер или компьютер, на котором расположена файловая база. Но и этот вариант следует стараться избегать, т.к. это так же будет являться аварийным завершением работы пользователей.
Внимание: описанные ниже действия доступны для пользователей с полным набором прав! |
1. Блокировка работы пользователей в файловой базе
Завершить работу пользователей в файловой базе не возможно из-за того, что платформенные механизмы 1С 8 это не позволяют сделать. Но возможно выполнить блокировку базы, установив таким образом монопольный доступ. При блокировке работа других пользователей прерывается до момента, пока блокировка не будет снята.
Для этого необходимо перейти в разделе "Администрирование" ("НСИ и администрирование" - в зависимости от конфигурации может быть такое название) по ссылке "Обслуживание", далее по ссылке "Блокировка работы пользователей". Блокировка базы устанавливается текущим пользователем. После нажатия на кнопку "Установить блокировку" сеансы других пользователей будут прерваны до момента снятия блокировки.
2. Завершение работы пользователей серверной базы в режиме 1С: Предприятие
Переходим в раздел "НСИ и администрирование" или "Администрирование" в зависимости от конфигурации базы 1С 8, далее переход по ссылке "Обслуживание".
Далее, как продемонстрировано на, объединенном изображении переход по ссылке "Активные пользователи" откроет одноименную форму списка работающих пользователей базы 1С. Выделяем несколько строк или отдельные и с помощью кнопки "Завершить сеанс" работа пользователей будет завершена.
3. Завершение работы пользователей серверной базы с помощью "Администрирования серверов 1С Предприятия"
Возможна такая ситуация, что доступ в базу оказался не возможен, например, из-за того, что закончились свободные лицензии. Поэтому завершить работу пользователей базы 1С 8 не получиться вышеописанным способом. Так же, если используется старая редакция конфигурации базы, то вышеописанные способы окажутся попросту невозможными в силу отсутствия функционала. Но это все же возможно сделать с помощью дополнительной возможности.
Этот вариант уже предполагает завершение работы пользователей не в режиме Предприятие или Конфигуратор, а с помощью дополнительной утилитой "Администрирование серверов 1С Предприятия". Поэтому важно, чтобы у пользователя уже не 1С, а операционной системы на компьютере или сервере было достаточно прав для работы с данной утилитой.
Находим базу в ветке "Кластер" - "Локальный кластер" - "Информационные базы" по имени базы и "Сеансы". Имя базы можно найти в "Справка" - "О программе", "Имя базы" или в списке запуска баз, внизу формы списка. Выделяются строки с отдельными сеансами работы или несколько подряд. Правой кнопкой мыши вызывается контекстное меню, в котором необходимо выбрать пункт "Удалить".
Согласится с предупреждением о том, что удаление сеанса может привести к потере не сохраненных изменений в справочниках и документах. Мера вынужденная, поэтому нажимается кнопка "ОК".
Успешным результатом будет исчезновение строк удаляемых сеансов пользователей из списка.
Может возникнуть ситуация, что в списке пользователей окажется пользователь "DefUser" - это значит, что в базе отрабатывает регламентное (фоновое) задание. Необходимо дождаться, когда фоновое здание закончит выполнение и пользователь DefUser сам автоматически отключиться. Иначе, если в настройке фонового задания установлена настройка запускать повторно при аварийном завершении, то пользователь после удаления его сеанса работы практически мгновенно тут же появится. И, если исходная цель была в получении монопольного доступа, то это сделать не получится из-за мгновенно снова запускающегося после завершения работы сеанса фонового задания. Необходимо дождаться самостоятельного завершения.
Здравствуйте! Столкнулась с такой проблемой: Если несколько пользователей открывают один документ, то выходят след. ошибки:
1) Данные были изменены или удалены другим пользователем (при записи)
2) Ошибка блокировки объекта
как избежать этих ошибок? я хочу сделать так, что кто первый зашел в данный документ, тот мог его изменять, а все остальные, пока он работает, могли только просматривать. Подскажите, как это можно сделать и правильно ли я решила избежать данных ошибок?
(2) AllexSoft, а можно ли программно прописать, чтобы при открытии документа, проверялось открыт он уже или нет, и если уже открыт, то нельзя было другим пользователям его открыть?
и не забудьте разблокировать при закрытии.
(6) mymyka, делаю при открытии:
Попытка
ЭтаФорма.ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка);
Исключение
Сообщить("Документ редактируется другим пользователем");
ЭтаФорма.ТолькоПросмотр = Истина;
КонецПопытки;
почему при первом же вхождении в документ, он выдает исключение?
(7)Потому что блокируются данные объекта, а не форма. К тому же
ЗаблокироватьДанныеДляРедактирования имеет несколько иной синтаксис.
(8) mymyka, у меня управляемая форма и в процедуре при открытии если написать ЭтотОбъект.Заблокировать(); выдает ошибку.
а если если на сервере обращаюсь к методу заблокировать он блокирует и первое вхождение в документ и последующие
(11)На будущее, пишите в профильной ветке 1С8.*. Не замусоривается форум, да и Sm капают, тоже приятно )
(10) Цитата:
ЗаблокироватьДанныеФормыДляРедактирования), то при закрытии формы блокировка может быть отменена не сразу, а через некоторое время. Блокировка может быть снята:
автоматически при закрытии формы или завершении сеанса;
с помощью метода глобального контекста РазблокироватьДанныеДляРедактирования с указанием того же идентификатора формы, который указывался для установки блокировки. В этом случае блокировка снимается сразу.
С эти я и столкнулся - блокировка снимается не сразу.
Лучше при закрытии использовать метод РазблокироватьДанныеДляРедактирования
Описание ошибки:
Ошибка " Данные были изменены или удалены другим пользователем" может возинкать при сохранении элемента справочника или при сохранении/проведении какого либо документа.
В управляемом интерфейсе после нажатия кнопки "ОК" откроется еще окно с описанием текста ошибки: "Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!"
В базе с обычным интерфейсом ошибка может возникнут при попытке пользователя просто внести какие-то изменения в форме.
Демонстрация возникновения ошибки на практическом примере:
Если в базе 1С 8 работает несколько (два-три) пользователя, то вероятность встретить данную ошибку стремится к нулю. Если в базе работает несколько десятков пользователей, то шансы возникновения данной ошибки при работе со справочниками и документами повышаются существенно. Но не стоит паниковать при появлении данной ошибки. Она лишь говорит о том, что документ или элемент справочника уже успел изменить и сохранить другой пользователь. Пользователю, который получил такую ошибку ничего не остается, как просто закрыть форму документа или элемента справочника без сохранения внесенных изменений. Открыть форму и снова нести изменения, которые не удалось сохранить.
Рассмотрим более подробно, как развиваются события в базе, приводящие к возникновению ошибки "Данные были изменены или удалены другим пользователем". Условно пусть будет "Пользователь 1" базы и "Пользователь 2". Пользователь 1 открывает форму документа и вносит изменения. При этому Пользователь 2 так же открывает форму этого же документа и тоже вносит изменения и успевает раньше Пользователя 2 нажать кнопку сохранения или проведения документа. Все, в документе сохранились изменения, Пользователь 2 оказался быстрее. 1С не поддерживает совместную одновременную работу в одном объекте базы (в данном примере это документ). Поэтому Пользователь 1 получит ошибку, т.к. пытался сохранить изменения уже после того, как это сделал Пользователь 2. Даже не смотря на то, что Пользователь 1 раньше открыл форму документа для редактирования.
В некоторых конфигурациях, работающих в режиме управляемого приложения разработчики постарались предусмотреть параллельный режим редактирования объектов базы пользователями.
Допустим на форме документа команда, которая вместе с записью (или проведением) документа создает определенный связанный объект содержащие ссылку на текущий документ, а ссылка на подчиненный объект сохраняется в текущем документе.
Причем в случае ошибки при записи (или проведении) документа отменяется также создание подчиненного объекта.
Кроме того при ошибке создания подчиненного объекта также отменяется запись (или проведение) текущего документа.
Через некоторое время нормальной работы в панике звонит пользователь и сообщет, что заведенный непосильным трудом большой документ не сохраняется и при этом постоянно выдается ошибка «Данные были изменены или удалены другим пользователем».
Опытный программист понимает, что документ новый и создан в транзакции, поэтому другие пользователи его видеть не могут.
Поэтому единственная возможность такой ошибки это, когда при определенных условиях где-то при формировании подчиненного объекта по переданной ссылке был получен объект текущего документа и записан.
Перелопачивается код создания подчиненного объекта, но получения объекта по ссылке и его записи нет.
Программист пробует воспроизвести ошибку на тех же данных, но она не появляется.
Вот, что проиходит.
На первый взгляд ошибки уже быть не должно, ведь была попытка и исключение, транзакция отменена и можно пробовать еще несколько раз.
Расмотрим внимательнее версии объекта текущего документа и его ссылки после ошибки.
До отмены транзакции и объект и ссылка записанного в пределах транзакции документа содержат одинаковую версию.
После отмены транзакции версия ссылки очищается, а версия объекта не очищается!
Поэтому при любой попытке последующий записи вызывается ошибка «Данные были изменены или удалены другим пользователем», а значит данные текущего документа уже никогда не удастся сохранить в базе.
Пытливый читатель подумает, а что происходит с версией объекта при отмене транзакции, если документ не открыт, а создан программно.
Исправляется ошибка предварительным получением ссылки, чтобы запись текущего документа в форме производилась в самом конце.
После этого будет повторятся первоначальная ошибка и не затеряется среди множества ошибок «Данные были изменены или удалены другим пользователем».
Надеюсь статья, кому-нибудь поможет отловить настоящую причину ошибки в запутанной конфигурации написанной не очень правильно.
К статье приложена выгрузка тестовой конфигурации, в которой есть документ с кнопками для воспроизведения обманчивой ошибки, исправления ошибки, честной ошибки и программной записи после отмены транзакции.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
вторник, 21 января 2014 г.
Данные были изменены или удалены другим пользователем (тонкий клиент)
Если при попытке записать элемент справочника или документ появляется ошибка "Данные были изменены или удалены другим пользователем", то это значит, что данные, которые отображаются на форме и данные, которые записаны в базе отличаются.
Возможно, их изменил другой пользователь или мы программно их изменили, но форму не обновили. Решить эту проблему можно, используя метод управляемой формы Прочитать(). Этот метод обновляет объект управляемой формы.
&НаКлиенте
Процедура ОбработкаОповещения ( ИмяСобытия , Параметр , Источник )
Если ИмяСобытия = "УправлениеКартамиYandex_ВыбраныКоординаты" Тогда
Если Не ЗначениеЗаполнено ( Объект . Ссылка ) Тогда
Возврат;
КонецЕсли;
ЭтаФорма . Прочитать ();
ЗаполнитьКоординаты ( Параметр );
ЭтаФорма . Прочитать ();
КонецЕсли;
Процедура ЗаполнитьКоординаты ( Параметр )
МассивСтрок = РаботаСоСтроками . РазложитьСтрокуВМассив ( Параметр , ";" );
Если МассивСтрок . Количество ()> 0 Тогда
текОбъект = Объект . Ссылка . ПолучитьОбъект ();
текОбъект . Долгота = СокрЛП ( МассивСтрок [ 0 ]);
текОбъект . Широта = СокрЛП ( МассивСтрок [ 1 ]);
текОбъект . Записать ();
КонецЕсли;
В примере, через обработку оповещения передаем параметр в процедуру, в которой присваиваем полученные координаты долготы и широты и записываем объект. Потом, используя метод Прочитать(), обновляем объект формы. В данном случае метод вызван 2 раза в связи с тем, что до заполнения координат, он изменяется, а второй раз - чтобы прочитать изменения, которые сделали мы.
Читайте также: