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