В стандартных конфигурациях, написанных на обычных формах, нет возможности, по умолчанию, открывать документы на просмотр. И при закрытие документа, пользователь частенько нажимает кнопку «ОК» а не «Закрыть» . При этом происходит запись и перепроведение документа. Что не всегда есть правильно.
С помощью минимального изменения конфигурации можно данный недостаток устранить.
Формы документа будут открываться по умолчанию «Только просмотр», а для редактирования документа, пользователю требуется нажать доп. кнопку в командной панели документа. (см. скрин)
Как реализовать этот функционал?
В конфигурациях от 1С (БП, УТ, ЗУП, УПП и т.д.), при открытие формы документа всегда вызывается какая либо процедура которая проверяет дату запрета редактирования данных.
Например:
в конфигурации Бухгалтерия предприятия, редакция 2.0 во всех формах документа ПриОткрытии вызывается:
// Установить доступность формы с учетом даты запрета редактирования
РаботаСДиалогами.УстановитьДоступностьФормыДляРедактирования(ЭтотОбъект, ЭтаФорма);
в конфигурации "Управление торговлей", редакция 10.3
НастройкаПравДоступа.ОпределитьДоступностьВозможностьИзмененияДокументаПоДатеЗапрета(ДокументОбъект, ЭтаФорма);
и т.д.
Также в конфигурациях от 1С, во всех формах документов присутствует процедура ДействияФормыРедактироватьНомер(Кнопка)
Эту процедуру мы будем использовать для обработки действия по нажатию кнопки «Изменить».
Эти процедуры нам и нужны. Дальше, для примера, разберем, как это реализовать в конфигурации Бухгалтерия предприятия, редакция 2.0.
1. Создать новый общий модуль «лМодульДоработок» содержащий всего 1 процедуру:
Процедура ДобавитьКнопкуВКоманднуюПанельФормы(_Метаданные,_Форма) Экспорт
КП =_Форма.ЭлементыФормы.ДействияФормы; ТипКнопки = ТипКнопкиКоманднойПанели.Действие;
Если КП.Кнопки.Найти("РедактированиеДокумента") = Неопределено Тогда
НоваяКнопка = КП.Кнопки.Добавить("РедактированиеДокумента", ТипКнопки, "Изменить" , Новый Действие("ДействияФормыРедактироватьНомер"));
конецесли;
Конецпроцедуры
2. Изменить стандартную процедуру УстановитьДоступностьФормыДляРедактирования общего модуля РаботаСДиалогами. Добавить в конец процедуры (после всех проверок даты редактирования) текст:
//Если после проверки даты запрета, форма доступна для редактирования, откроем ее на просмотр,
//но добавим кнопочку в панель для возможности редактирования
если НЕ ФормаДокумента.ТолькоПросмотр и ДокументОбъект.Проведен тогда
ФормаДокумента.ТолькоПросмотр = Истина;
лМодульДоработок.ДобавитьКнопкуВКоманднуюПанельФормы(ДокументОбъект.Метаданные(),ФормаДокумента);
конецесли;
//конец изменений
3. Процедура форм документов «ДействияФормыРедактироватьНомер» состоит из 1 строчки и вызывает процедуру «ИзменениеВозможностиРедактированияНомера» общего модуля «МеханизмНумерацииОбъектов»
МеханизмНумерацииОбъектов.ИзменениеВозможностиРедактированияНомера(ЭтотОбъект.Метаданные(), ЭтаФорма, ЭлементыФормы.ДействияФормы.Кнопки.Подменю, ЭлементыФормы.Номер);
Изменить процедуру следующим образом:
Процедура ИзменениеВозможностиРедактированияНомера(МетаданныеОбъекта, ФормаОбъекта, ПодменюДействия, ПолеВводаНомера, ПолеВводаНомераДубль = Неопределено, ТекстВопроса = "") Экспорт
//Если при вызове процедуры форма документа не доступна для редактирования, то вызов процедуры произошел по нажатию
кнопки «Изменить»
Если ФормаОбъекта.ТолькоПросмотр тогда
ФормаОбъекта.ТолькоПросмотр = ложь;
ФормаОбъекта.ЭлементыФормы.ДействияФормы.Кнопки.РедактированиеДокумента.Доступность = ложь;
ФормаОбъекта.Обновить();
иначе //иначе на самом деле хотят редактировать номер документа
Кнопка = ПодменюДействия.Кнопки.РедактироватьКодНомер;
Если НЕ Кнопка.Пометка Тогда
Если ПустаяСтрока(ТекстВопроса) Тогда
Если ВРЕГ(ПолеВводаНомера.Данные) = ВРЕГ("Код") Тогда
ТекстВопроса = "Код присваивается автоматически при записи элемента, самостоятельное его редактирование может привести к нарушению в нумерации в системе. Вы действительно хотите установить код вручную?"
Иначе
ТекстВопроса = "Номер документу присваивается автоматически при записи, самостоятельное его редактирование может привести к нарушению в нумерации в системе. Вы действительно хотите установить номер вручную?"
КонецЕсли;
КонецЕсли;
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Если Ответ <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Кнопка.Пометка = Не Кнопка.Пометка;
ПолеВводаНомера.ТолькоПросмотр = НЕ Кнопка.Пометка;
ПолеВводаНомера.ПропускатьПриВводе = ПолеВводаНомера.ТолькоПросмотр;
ОбновитьПодсказкуКодНомерОбъекта(МетаданныеОбъекта, ПодменюДействия, ПолеВводаНомера);
Если ПолеВводаНомераДубль <> Неопределено Тогда
ПолеВводаНомераДубль.ТолькоПросмотр = ПолеВводаНомера.ТолькоПросмотр;
ПолеВводаНомераДубль.ПропускатьПриВводе = ПолеВводаНомераДубль.ТолькоПросмотр;
ОбновитьПодсказкуКодНомерОбъекта(МетаданныеОбъекта, ПодменюДействия, ПолеВводаНомераДубль);
КонецЕсли;
//конец проверки Если ФормаОбъекта.ТолькоПросмотр тогда
конецесли;
//конец изменений
КонецПроцедуры
Это все изменения.
Стандартный функционал сохраняется. Изменений минимум. Легко поддерживать (переносить) при обновление.