// ********************************************************************
Функция ПользовательАктивен(СпрБлокировки)
//если файл отсутствует или его можно удалить, то значит пользователя нет в базе
//если же рользователь в базе, то эти строки просто не срабатывают
//и мы получаем ответ о активности пользователя
имяФайла = СокрЛП(СпрБлокировки.КаталогПользователя) + "1Cv7.LCK";
фс.УдалитьФайл(имяФайла);
Возврат фс.СуществуетФайл(имяФайла);
КонецФункции
// ********************************************************************
Функция ЗаблокироватьДляДругихПользователей()
мИд = Форма.Параметр.Получить("Идентификатор");
Если ПустоеЗначение(мИд) = 1 Тогда
Возврат 1;
КонецЕсли;
СпрБлокировки = СоздатьОбъект("Справочник.Блокировки");
Если СпрБлокировки.НайтиПоНаименованию(мИд) = 1 Тогда
Если СокрЛП(СпрБлокировки.Пользователь) = СокрЛП(ИмяПользователя()) Тогда
Возврат 1;
ИначеЕсли ПользовательАктивен(СпрБлокировки.ТекущийЭлемент()) = 0 Тогда
Возврат 1;
Иначе
Предупреждение("Карточка заблокирована пользователем " + СпрБлокировки.Пользователь);
Возврат 0;
КонецЕсли;
КонецЕсли;
СпрБлокировки.Новый();
СпрБлокировки.Код = мИд;
СпрБлокировки.Наименование = мИд;
СпрБлокировки.Пациент = "" + Форма.Параметр.Получить("ФИОПациента") + " " + Форма.Параметр.Получить("АмбКарта");
СпрБлокировки.КаталогПользователя = КаталогПользователя();
СпрБлокировки.Пользователь = ИмяПользователя();
Попытка
СпрБлокировки.Записать();
Возврат 1;
Исключение
Предупреждение("Карточка заблокирована");
//форма.инфоБлокировки.Заголовок("Только просмотр");
Возврат 0;
КонецПопытки;
Возврат 1;
КонецФункции
//********************************************************************
Процедура РазблокироватьДляДругихПользователей()
мИд = Форма.Параметр.Получить("Идентификатор");
СпрБлокировки = СоздатьОбъект("Справочник.Блокировки");
Если СпрБлокировки.НайтиПоНаименованию(мИд) = 1 Тогда
СпрБлокировки.Удалить(1);
КонецЕсли;
КонецПроцедуры
//**********************************************
Процедура ПриОткрытии()
Если ЗаблокироватьДляДругихПользователей() = 0 Тогда
СтатусВозврата(0);
Форма.Закрыть();
КонецЕсли;
КонецПроцедуры
//**********************************************
Процедура ПриЗакрытии()
РазблокироватьДляДругихПользователей();
КонецПроцедуры
Форма элемента справочника или документа в 1с77 может быть открыта только одним пользователем, но форма отчета или обработки не имеет таких ограничений, и одновременно пользоваться одной обработкой могут несколько пользователей.
В нашем случае возникла задача ограничить это дело программно, поскольку через форму редактировались строки документа и периодически происходил конфликт правок разными пользователями. Я решил выложить материал в статью, поскольку не нашел в инете готовых решений,
Также вы можете в цикле поверить доступы к файлам "1Cv7.LCK" в каталоге пользователей 1с77 и таким образом получить список активных пользователей в базе 1с77.
Предлагаю следующее решение.
1. В документ Запись на прием была добавлена колонка Уникальный идентификатор, которая заполнялась автоматически при добавлении строки в документ
2. Был создан справочник "Блокировки" с реквизитами "Пользователь", "Идентификатор", "КаталогПользователя" в который при открытии формы обработки в процедурах "ПриОткрытии()" и "При Закрытии()" соответственно добавляются и удаляются элементы.
3. Также присутствует проверка доступа к файлу "1Cv7.LCK" в каталоге пользователя 1с.
Таким образом можно контролировать совместный доступ и даже проверять, у какого пользователя открыт данный объект.
Привожу в статье весь основной код. В прилагаемом файле к скачиванию находится он же.
Я буду расценивать его скачивание как донат. Всем благ и удачного кодинга. Спасибо.