www.mamboteam.com
ДС бибилиотека  
Главная arrow Статьи по 1С arrow "Внутренние" блокировки в 1С
18.01.2018 г.
 
 
Главное меню
Главная
Каталог книг
Ссылки
Поиск
Правообладателям
Статьи по 1С
1С для начинающих
Rambler's Top100
"Внутренние" блокировки в 1С Печать E-mail
Рейтинг: / 0
ХудшаяЛучшая 
Автор Administrator   
24.09.2008 г.
В предыдущей статье по "гибким" блокировкам, я пожалуй, не сделал акцент на то ,что блокировки в контексте 1С бываю двух видов. Первый вид - это блокировки данных на уровне SQL Servera. Второй вид - это блокировки объектов 1С (клиентских форм). Хочу исправить свою ошибку и остановиться на описании второго вида блокировок подробнее. В предыдущей статье по "гибким" блокировкам, я пожалуй, не сделал акцент на то ,что блокировки в контексте 1С бываю двух видов. Первый вид - это блокировки данных на уровне SQL Servera. Второй вид - это блокировки объектов 1С (клиентских форм). Хочу исправить свою ошибку и остановиться на описании второго вида блокировок подробнее.

Для чего вообще 1С реализовала внутренний механизм блокировок ? Ну во-первых для того, чтобы не решать вопрос разрешения конфликтов отображения и записи данных из разных экранных форм одного и того же объекта. То есть предполагается, что если пользователь открыл расходную накладную №5, то никто другой не сможет открыть экранную форму этой накладной, пока он ее не закроет. На попытку открыть документ выведется на экран сообщение «Запись заблокирована». Аналогичные по смыслу сообщения будут выводиться в обработках при попытках изменить объект данных, который заблокирован.Это кстати многие не учитывают в своих обработках.

Давайте теперь попытаемся понять, как устроен механизм «внутренней» блокировки 1С. Ну во-первых, при каждом открытии формы документа создается, если он еще не существует, временный файл 1sjourn.$lk. Размер этого файла всегда 0 и казалось бы в нем вряд ли может быть заложена информация по блокировкам. На самом деле это заблуждение. 1С используя функцию LockFile блокирует конкретный байт в фале указывая тем самым, что тот или иной документ заблокирован. Номер байта соответствует Row-Id(первичный ключ) данного документа. Перед открытием формы или исполнением метода объекта 1С пытается заблокировать байт. Если попытка проходит, то он остается заблокированным до завершения операции, если же нет - то выдается соответствующее сообщение.

Вот простейший пример на Delphi отображения заблокированных объектов в 1С.
procedure TForm1.Button1Click(Sender: TObject);
var

 i : integer;
begin
  h:=FileOpen('d:ПроверкаКонфликтов1sjourn.$lk',fmOpenRead+fmShareDenyNone);
  showmessage(inttostr(h));
  for i:=0 to 10000 do
  if LockFile(h,i,0,1,0) then
  begin
  UnlockFile(h,i,0,1,0);
  end
  else
  begin
  Memo1.Lines.Add(IntToStr(i)+' - Locked');
  end;
  FileClose(h);
end;
Для того чтобы понять, какой у документа номер и вид для этого достаточно выполнить простейший select. 
SELECT IDDOCDEF AS ТипДокумента, IDDOC AS ВнутреннийИдентификатор, DOCNO AS НомерДокумента
FROM _1SJOURN
WHERE (ROW_ID = @i) 

Где @i это номер байта полученный вышеописанной процедурой.

Для справочников это будет файл не 1sjourn.$lk а scXXX.$lk где ХХХ – внутренний идентификатор объекта метаданных.

Также нужно отметить, что блокировку установить или снять в пределах своей сессии можно с помощью метода Блокировать(). Значение, которое возвращает этот метод собственно и указывает на то, заблокирован он или нет. Нужно отметить, что пример приведенный на Delphi, гораздо производительней, т.к. в этом случае не нужно открывать выборку данных и проверять каждый элемент на блокировку, а достаточно лишь взять заведомо заблокированные байты и сопоставить их объектам данных в 1С.

Возникает вопрос: а можно ли снимать блокировки не из своей сессии, и что произойдет, например, если мы попытаемся удалить файл 1sjourn? Сразу нужно отметить, что просто так удалить нам его не удастся, если он задействован хотя бы в одном сеансе 1С. Даже если мы возьмем и удалим все хэндлы на него и затем удалим его, то и в этом случае нас постигнет неудача т.к. в этом случае при обращении ко всем документа будет появляться надпись «запись заблокирована». Косвенные причины этого понятны, неудача в LockFile(h,i,0,1,0) ,а в данном случае хэндл теряется, 1С интерпретируется как блокировка объекта. И даже если мы создадим заново этот файл, то блокировок не будет только у тех клиентов, которые загрузили 1С после создания файла. Скорее всего, это происходит потому, что 1С хранит в локальной переменной информацию об открытии файла. Если он уже открывался, то 1С не пытается за нового его открыть и получить новый хендл. Однако принципиальная возможность создания такого менеджера управления блокировками существует(возможно, он уже и написан).


Автор статьи - Владимир Сердюк
www.softpoint.ru
 
« Пред.   След. »
Новые поступления

1С:Предприятие 8. Руководство разработчика 8.2
 

1С:Предприятие 8. Руководство администратора 8.2
 

Интернет-Курс Расчет зарплаты и управление персоналом в 1С Предприятии 8.0
 

1С:Предприятие 7.7 Регламентированная отчетность 1С:Предприятие 7.7 Регламентированная отчетность за I квартал 2009 года
 

Документация по 1С 7.7
 

Самые скачиваемые
Документация по 1С 7.7 (66509)
1С:Предприятие 8. Руководство администратора 8.2 (10076)
Армагеддон (5507)
1С:Предприятие 7.7 Регламентированная отчетность 1С:Предприятие 7.7 Регламентированная отчетность за I квартал 2009 года (3708)
Интернет-Курс Расчет зарплаты и управление персоналом в 1С Предприятии 8.0 (3387)
Единая Справочно - Информационная Система 1С:Предприятие 8.0 (3041)
1С:Предприятие. Бухгалтерский учет. Секреты работы (2758)
1С Бухгалтерия. Пошаговые инструкции для начинающих (1928)
Профессиональная разработка в системе 1С:Предприятие 8 (1654)
1С:Предприятие 8.0. Полное описание функциональных возможностей и приемов работы (1640)
Rambler's Top100
 
Top! Top!