Как можно заблокировать документ для редактирования, если в данный момент в нем работает другой пользователь?

Если документ открыт одним пользователем, может ли другой пользователь открыть его только в режиме чтения, без возможности внесения изменений, сохранения или исполнения? <br/> &НаКлиенте <br/> Процедура ПриОткрытии(Отказ) <br/> Если ЭтаФорма.ТолькоПросмотр = Ложь Тогда <br/> Попытка <br/> ЭтаФорма.Заблокировать(); <br/> Исключение <br/> Ошибка = ОписаниеОшибки(); <br/> // Извлечение информации о сеансе <br/> ИмяПользователя = Сред(Ошибка, Найти(Ошибка, "сеанс:") + 7, СтрДлина(Ошибка)); <br/> ИмяПользователя = Сред(ИмяПользователя, 1, Найти(ИмяПользователя, ",") - 1); <br/> <br/> // Формирование текста вопроса <br/> ТекстВопроса = "Документ уже открыт пользователем " + ИмяПользователя + ". Открыть для просмотра?"; <br/> <br/> Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда <br/> Отказ = Истина; <br/> Иначе <br/> ЭтаФорма.ТолькоПросмотр = Истина; <br/> КонецЕсли; <br/> КонецПопытки; <br/> КонецЕсли; <br/> КонецПроцедуры <br/>
  • 28 октября 2024 г. 7:02
Ответы на вопрос 2
Вам необходимо реализовать логику, которая позволит блокировать документ от редактирования, если он уже открыт другим пользователем. По предоставленному вами коду видно, что вы уже на правильном пути. Давайте разберем ваш код и немного его адаптируем.

Процедура `ПриОткрытии` проверяет, открыт ли документ другим пользователем. Если да, то пользователю предлагается открыть документ в режиме просмотра. 

Вот улучшенная версия вашей процедуры:

```1C
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если ЭтаФорма.ТолькоПросмотр = Ложь Тогда
        Попытка
            // Попытка заблокировать документ
            ЭтаФорма.Заблокировать();
        Исключение
            // Если документ уже заблокирован другим пользователем, получаем информацию о сеансе
            Ошибка = ОписаниеОшибки();
            ИмяПользователя = Сред(Ошибка, Найти(Ошибка, "сеанс:") + 7, СтрДлина(Ошибка));
            ИмяПользователя = Сред(ИмяПользователя, 1, Найти(ИмяПользователя, ",") - 1);
            
            // Формирование текста вопроса
            ТекстВопроса = "Документ уже открыт пользователем " + ИмяПользователя + ". Открыть для просмотра?";
            
            // Спрашиваем, хочет ли пользователь открыть документ для просмотра
            Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
                Отказ = Истина; // Отмена открытия документа
            Иначе
                ЭтаФорма.ТолькоПросмотр = Истина; // Устанавливаем только просмотр
            КонецЕсли;
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры
```

### Пояснения к коду:
1. **Попытка заблокировать документ**: `ЭтаФорма.Заблокировать();` — здесь вы пытаетесь заблокировать документ. Если это удастся, то документ будет открыт для редактирования текущим пользователем.
  
2. **Обработка исключений**: Если документ уже заблокирован (т.е. открыт другим пользователем), то срабатывает исключение. Мы извлекаем имя пользователя, который держит блокировку, и формируем сообщение.

3. **Диалог с пользователем**: При возникновении ситуации, когда документ уже открыт, пользователю показывается вопрос: "Открыть для просмотра?" Если пользователь выбирает "Нет", установка `Отказ = Истина;` предотвращает открытие документа. Если "Да", то `ЭтаФорма.ТолькоПросмотр = Истина;` устанавливает режим только для чтения.

### Замечания:
- Убедитесь, что у вас правильно настроены права доступа и блокировки в 1С для тех объектов, которые вы собираетесь использовать.
- Не забудьте протестировать код на различных сценариях, чтобы убедиться, что все работает корректно и не вызывает неожиданных проблем с блокировкой документов.
встали на Заблокировать( и нажали ctrl+f1 

и получил описание:

Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Пример:
Попытка
НовДокумент.Заблокировать();
Исключение
Предупреждение(НСтр("ru = 'Невозможно заблокировать документ.';"
+ " en = 'Can't lock the document.'"));
КонецПопытки;

А из описание понял, что ты открываешь на Клиенте хотя надо на Сервере. И загнал это в ПриСозданииНаСервере
Похожие вопросы