Содержание
- Включение документа или справочника
- Внесение изменений в форму
- Важно обратить внимание
- Примеры функций и процедура
Справка: для предупреждения необдуманного изменения «ключевых» реквизитов формы документа или справочника создана подсистема Запрет редактирования реквизитов объектов. Описание работы есть на сайте ИТС: https://its.1c.ru/db/bsp3110doc#content:2329:hdoc
Для включения нашего документа или справочника выполняем:
- Подключим наш документ или справочник к подсистеме: в процедуре ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами добавляем строку, аналогично уже заполненным: Объекты.Вставить(Метаданные.<"Документы" или "Справочники">.<Наименование документа или справочника>.ПолноеИмя(), "ПолучитьБлокируемыеРеквизитыОбъекта");
- Определим список блокируемых реквизитов: в модуле менеджера добавляемого объекта создаем функцию ПолучитьБлокируемыеРеквизитыОбъекта. Функция должна возвращать массив строк с именами реквизитов формы, объекта и табличных частей, которые предполагается запретить для редактирования. Текст функции можно подсмотреть в других справочниках и документах, добавленных в подсистему ранее. Пример функции ниже — см. пример 1.
- В процедуре ПриСозданииНаСервере требуется добавить вызов общей процедуры ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтотОбъект);
- В процедуре ПослеЗаписиНаСервере добавляем ту же строку.
- Добавляем процедуру Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда). Текст процедуры можно скопировать из объектов, добавленных в подсистему ранее. Пример функции ниже — см. пример 2. Есть несколько вариантов работы с разрешением редактирования реквизитов. Можно просто по кнопке «Разрешить редактирование реквизитов» открывать возможность изменения реквизитов, либо открывать отдельное окно с возможностью выбора нужных реквизитов и особыми предупреждениями по изменению отдельных реквизитов. Для обоих данных случаев есть примеры процедур ниже — см. пример 2.
- Описываем процедуру "Подключаемый_РазрешитьРедактированиеРеквизитовОбъектаЗавершение". Обратите внимание, что эта процедура экспортная. Пример 3
- Если решили добавить отдельную форму РазблокированиеРеквизитов – в качестве основы можно взять уже используемую форму документа или справочника, ранее используемого в подсистеме.
- Не забудьте обязательно внести следующие изменения:
— Каждый блокируемый реквизит размещаем как реквизит формы с типом Булево и размещаем на форме
— Создаем две кнопки "РазрешитьРедактирование" и "Закрыть"
— Если требуется дополнительно описать предупреждения пользователю - добавляем
— В процедуре ПриСозданииНаСервере каждому реквизиту устанавливаем значение "Истина"
— В процедуре кнопки "РазрешитьРедактирование" проверяем значение реквизитов формы, соответствующих блокируемым реквизитам и создаем массив "Результат". В массив помещаем реквизиты, которые требуется разблокировать. Последняя команда "Закрыть(Результат)". Пример процедуры ниже см. пример 4.
— на некоторых формах документа в качестве табличной части может показываться и табличная часть документа и дополнительный реквизит формы с дополнительными данными. В таком случае в функции ПолучитьБлокируемыеРеквизитыОбъекта указываем строку "Результат.Добавить("Товары;ТоварыПоПериодам"). После наименования таблицы "Товары" указываем имя элемента на форме "ТоварыПоПериодам".
— при блокировании поля периода - если блокировать поля "ДатаНачала" и "ДатаОкончания", то блокируются сами поля, но не стандартная кнопка установки периода. В таком случае рекомендуется добавить в список блокируемых добавить элемент "УстановитьИнтервал". В таком случае в функции ПолучитьБлокируемыеРеквизитыОбъекта указываем строку "Результат.Добавить("НачалоПериода;УстановитьИнтервал").
В обоих случаях изменять форму РазблокированиеРеквизитов не требуется.
Следующая особенность нужна. Если требуется блокировать совместно с каким-то реквизитом кнопки, например: "Провести и закрыть", "Записать" и "Провести". Для этого в функции ПолучитьБлокируемыеРеквизитыОбъекта добавляем к блокируемому реквизиту наименования элементов формы, которые нужно заблокировать совместно. Например: "Результат.Добавить("Статус;ФормаПровестиИЗакрыть, ФормаЗакрыть, ФормаПровести");"
Пример 1. Функция ПолучитьБлокируемыеРеквизитыОбъекта
Результат = Новый Массив;
Результат.Добавить("Статус");
Результат.Добавить("Сценарий");
Результат.Добавить("ВидПлана");
Возврат Результат;
КонецФункции
Пример 2. Если просто разрешаем редактирование реквизитов
&НаКлиенте
Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда)
Оповещение = Новый ОписаниеОповещения("Подключаемый_РазрешитьРедактированиеРеквизитовОбъектаЗавершение", ЭтотОбъект);
ОбщегоНазначенияКлиент.РазрешитьРедактированиеРеквизитовОбъекта(ЭтотОбъект,, Оповещение);
КонецПроцедуры
Пример 2. Если требуется открыть особое окно с выбором открываемых реквизитов и предупреждениями об открытии. Не забудьте, что в данном случае саму форму с названием "РазблокированиеРеквизитов" требуется сформировать самим в формах создаваемого объекта.
&НаКлиенте
Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда)
Если НЕ Объект.Ссылка.Пустая() Тогда
ОткрытьФорму("<"Справочник" или "Документ">.<Наименование документа или справочника>.Форма.РазблокированиеРеквизитов",,,,,,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли
КонецПроцедуры
Пример 3. Если после установки разблокировки реквизитов требуется установить доступность других элементов на форме. Обычно это указывается в процедуре УстановитьДоступностьПолей() – в таком случае не забудьте добавить её в конец добавляемой процедуры. В примере ниже эта строка закомментирована:
&НаКлиенте
Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъектаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Результат) = Тип("Массив") И Результат.Количество() > 0 Тогда
ЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы(ЭтотОбъект, Результат);
//УстановитьДоступностьПолей();
КонецЕсли;
КонецПроцедуры
Пример 4.
&НаКлиенте
Процедура РазрешитьРедактирование(Команда)
Результат = Новый Массив;
Если РазрешитьРедактированиеСтатус Тогда
Результат.Добавить("Статус");
КонецЕсли
Если РазрешитьРедактированиеТовары Тогда
Результат.Добавить("Товары");
КонецЕсли
Если РазрешитьРедактированиеПериода Тогда
Результат.Добавить("ДатаНачала");
Результат.Добавить("ДатаОкончания");
КонецЕсли
Закрыть(Результат);
КонецПроцедуры
Автор: Михаил Х.