/// <summary>
        /// The set lock.
        /// </summary>
        /// <param name="LockKey">
        /// The lock key.
        /// </param>
        /// <param name="userName">
        /// The user name.
        /// </param>
        /// <returns>
        /// The set lock.
        /// </returns>
        /// <exception cref="DataServiceNotFoundException">
        /// </exception>
        public string SetLock(string LockKey, string userName)
        {
            if (dataService == null)
            {
                throw new DataServiceNotFoundException();
            }

            var ld = new LockData();

            ld.LockKey  = LockKey;
            ld.UserName = userName + (UseMachineNameInKey ? " @ " + Environment.MachineName : string.Empty);
            try
            {
                dataService.LoadObject(ld, false, true);
                return(ld.UserName);
            }
            catch
            {
                DataObject dobj = ld;
                dataService.UpdateObject(ref dobj);
                if (!AllLocks.ContainsKey(ld.CombinedKey()))
                {
                    AllLocks.Add(ld.CombinedKey(), ld);
                }

                return(string.Empty);
            }
        }
        /// <summary>
        /// Снять блокировку по ключу для указанного пользователя
        /// </summary>
        /// <param name="LockKey">
        /// ключ блокировки
        /// </param>
        /// <param name="userName">
        /// пользователь
        /// </param>
        /// <param name="ds">
        /// Сервис данных
        /// </param>
        public void ClearWebLock(string LockKey, string userName, IDataService ds)
        {
            var ld = new LockData();

            ld.LockKey  = LockKey;
            ld.UserName = userName;
            try
            {
                ds.LoadObject(ld);
                ld.SetStatus(ObjectStatus.Deleted);
                DataObject dobj = ld;
                ds.UpdateObject(ref dobj);
            }
            catch
            {
            }
        }
        /// <summary>
        /// Очистить блокировку
        /// </summary>
        /// <param name="LockKey">
        /// </param>
        /// <param name="userName">
        /// </param>
        public void ClearLock(string LockKey, string userName)
        {
            if (dataService == null)
            {
                throw new DataServiceNotFoundException();
            }

            var ld = new LockData();

            ld.LockKey  = LockKey;
            ld.UserName = userName + (UseMachineNameInKey ? " @ " + Environment.MachineName : string.Empty);
            if (AllLocks.Contains(ld.CombinedKey()))
            {
                ld.SetStatus(ObjectStatus.Deleted);
                DataObject dobj = ld;
                dataService.UpdateObject(ref dobj);
                AllLocks.Remove(ld.CombinedKey());
            }
        }
        /// <summary>
        /// Получить блокировку
        /// </summary>
        /// <param name="dobj">
        /// Объект данных, для которого получаем блокировку
        /// </param>
        /// <param name="ds">
        /// Сервис данных
        /// </param>
        /// <returns>
        /// The get web lock.
        /// </returns>
        public string GetWebLock(DataObject dobj, IDataService ds)
        {
            if (ds == null)
            {
                throw new DataServiceNotFoundException();
            }

            var ld = new LockData();

            ld.LockKey  = dobj.GetType().FullName + ":" + dobj.__PrimaryKey;
            ld.UserName = GetUserName() + (UseMachineNameInKey ? " @ " + Environment.MachineName : string.Empty);
            try
            {
                ds.LoadObject(ld, false, true);
                return(ld.UserName);
            }
            catch
            {
                return(string.Empty);
            }
        }
        /// <summary>
        /// Установить блокировку
        /// </summary>
        /// <param name="LockKey">
        /// Ключ
        /// </param>
        /// <param name="userName">
        /// Пользователь
        /// </param>
        /// <param name="ds">
        /// Сервис данных
        /// </param>
        /// <returns>
        /// Имя пользователя, под которым блокировка находится,
        /// string.Empty - если блокировки не было и мы её только поставили
        /// </returns>
        public string SetWebLock(string LockKey, string userName, IDataService ds)
        {
            var ld = new LockData();

            ld.LockKey  = LockKey;
            ld.UserName = userName;
            try
            {
                // try/catch это не является хорошим вариантом
                // по соображениям производительности,
                // поэтому, в целях оптимизации скорее всего
                // придётся переписать данный код на цивилизованную проверку
                // наличия блокировок
                ds.LoadObject(ld, false, true);
                return(ld.UserName);
            }
            catch
            {
                DataObject dobj = ld;
                ds.UpdateObject(ref dobj);
                return(string.Empty);
            }
        }