При разработке конфигураций на платформе 1С:Предприятие 7.7 часто возникает задача открыть форму справочника для чтения, не блокируя при этом сам элемент. Стандартный метод Форма.ТолькоПросмотр(1), вызванный программно в процедуре ПриОткрытии, зачастую приводит к тому, что платформа все равно накладывает блокировку на запись. В результате другие пользователи при попытке открыть этот же элемент получают сообщение: Запись заблокирована. Разберемся, почему это происходит и как правильно реализовать открытие формы без блокировки.
Когда мы открываем форму элемента интерактивно через кнопку «Просмотр» в интерфейсе, платформа открывает её в режиме, который не препятствует другим пользователям работать с этим объектом. Однако, если мы программно вызываем стандартную форму редактирования, 1С по умолчанию считает, что мы намерены изменять данные, и накладывает блокировку. Установка свойства Форма.ТолькоПросмотр(1) внутри уже открытой формы происходит слишком поздно — блокировка на уровне платформы или СУБД уже активирована.
Самым эффективным способом избежать блокировки является открытие формы с явным указанием режима через функцию ОткрытьФорму(). Если вы вызываете форму из списка справочника или другого документа, используйте третий параметр, который отвечает за режим открытия.
Рассмотрим пример того, как это реализовать:
// Пример вызова из формы списка или обработки
ОткрытьФорму("Справочник.ВашСправочник", Контекст, 1);
Здесь третий параметр 1 (числовой режим) дает платформе команду открыть форму сразу в режиме просмотра. В этом случае блокировка на запись не накладывается, и объект остается доступным для других сеансов.
Если вам необходимо жестко ограничить открытие на редактирование, вы можете использовать механизм перехвата открытия формы. Суть метода заключается в том, чтобы в процедуре ПриОткрытии() проверить, в каком режиме открывается форма, и если это редактирование, то отменить его с последующим вызовом нужной формы.
Разберем логику реализации:
Процедура ПриОткрытии()
Если Форма.ТолькоПросмотр() = 0 Тогда
// Запрещаем стандартное открытие
СтатусВозврата(0);
// Вызываем форму принудительно в режиме просмотра
ОткрытьФорму("Справочник.ВашСправочник", ТекущийЭлемент(), 1);
Возврат;
КонецЕсли;
КонецПроцедуры
Этот метод позволяет гибко управлять доступом. Вы можете добавить дополнительные условия (например, проверку прав текущего пользователя или статуса документа) перед тем, как разрешить открытие в обычном режиме.
Если переоткрытие формы по каким-то причинам невозможно, можно использовать альтернативный подход — принудительное отключение доступности всех элементов формы. Это более трудоемкий метод, но он позволяет избежать изменения режима всей формы целиком.
Проанализируем шаги реализации:
ПриОткрытии() принудительно обходим все элементы управления формы.Доступность(0).Использование компоненты FormEx может значительно упростить эту задачу, так как она предоставляет расширенные методы управления атрибутами формы, которые недоступны в стандартном языке 1С 7.7. Например, можно одним методом заблокировать всю форму или конкретную группу элементов.
Чтобы избежать блокировки записи при открытии формы в 1С 7.7, придерживайтесь следующих правил:
ОткрытьФорму() с параметром режима, если это возможно.СтатусВозврата(0) в процедуре ПриОткрытии(), обязательно сопровождайте это информационным сообщением для пользователя, чтобы он понимал, почему форма закрылась.Комбинируя эти подходы, вы сможете добиться необходимой гибкости системы, обеспечивая комфортную работу пользователей без возникновения конфликтов блокировок в базе данных.