Волшебство
программирования на 1С:Предприятие 7.7 и 8.0
Выпуск 81 / 11.10.2004
«Внутренние» блокировки в 1С 7.7
Автор: Владимир
Сердюк
Источник: http://serduk.ru/article.php?id=2
В предыдущей статье по «гибким» блокировкам я пожалуй не сделал акцент
на то ,что блокировки в контексте 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С не пытается заново его открыть и
получить новый хендл. Однако принципиальная возможность создания такого
менеджера управления блокировками существует (возможно он уже и написан).
P.s. На данный момент автором реализован механизм отображения заблокированных
объектов 1С. Менеджер блокировок, с помощью которого было бы возможно отключение
блокировок, не реализован только по той причине, что автор не видит явного
коммерческого применения данному продукту.
Интересные ветки форума по версии 7.7 (коэф-т 5%):
Смелее задавайте
вопросы по 8.0 и 7.7 на форуме www.forum.mista.ru
Используйте поиск и отбор по рубрике
- это очень удобно,
а также экономит наше и ваше время.
Объекты
конфигурации
справочники, документы, отчеты, регистры, бухгалтерский
учет, расчет
Приемы
программирования
встроенный
язык, дата-время, запросы, таблица
значений, список
значений, формы, файловая
система, внешние
обработки, внешние
компоненты, интернет-технологии, обмен
данными, OLE
и COM, торговое
оборудование
Типовые
конфигурации
бухгалтерия
7.7, Торговля
и склад 7.7, Зарплата
и кадры 7.7, Управление
торговлей 8.0, Управление
персоналом 8.0, УПП
8.0
Администрирование
установка, ключи
защиты, безопасность, производительность, особенности
версии, железо
и сети
Общие
вопросы
архитектура, политика, обучение
и сертификация, законодательство, обновление
и ИТС, конкуренты
См. также:
1С:Предприятие 7.7: учебник, курс
лекций, статьи, ссылки
Книга "Разработка в системе 1С:Предприятие 8.0" -
http://www.v8.1c.ru/book/v8develop.htm
Официальный
сайт рассылки - www.mista.ru
Волшебный форум - www.forum.mista.ru,
Форум по 1С - http://www.forum.mista.ru/index.php?forum=1c
Архив выпусков этой рассылки - http://www.mista.ru/subscribe
Новое!
Раздел
форума исключительно по 8.0
http://www.forum.mista.ru/index.php?forum=1c&v8=1
С уважением,
Станислав Митичкин (Волшебник)
stasmit@mail.ru
<< Предыдущий
выпуск | Список
выпусков |
Следующий выпуск >>
|