Итак, имеем типовую доработанную конфигурацию УНФ 3.0. Хотим, чтобы пользователи не могли менять в закрытом периоде документы, выгружаемые в бухгалтерию. В то же время, хочется исключить из под запрета такие документы, как складские перемещения и документы производства, т.к. бухгалтерам они вообще неинтересны, а тот же склад хочет править задним числом перемещения регулярно. Кроме того, есть нетиповые документы, которые вообще никак не участвуют в механизме контроля дат и которые тоже хочется контролировать. Благо конфигурация у нас типовая и чтобы все это работало не надо изобретать велосипед, а достаточно слегка модифицировать типовой механизм Даты запрета изменения
В модуль ДатыЗапретаИзмененияПереопределяемый в процедуре ПриЗаполненииРазделовДатЗапретаИзменения вносим описания новых разделов по аналогии с типовыми.
Процедура ПриЗаполненииРазделовДатЗапретаИзменения(Разделы) Экспорт
// ...
//
// наши разделы
Раздел = Разделы.Добавить();
Раздел.Имя = "МК_СкладскиеДокументы";
Раздел.Идентификатор = Новый УникальныйИдентификатор("ea5013a1-13f9-11ee-a63a-ac1f6bb47f39");
Раздел.Представление = НСтр("ru = 'Документы склада'");
Раздел.ТипыОбъектов.Добавить(Тип("СправочникСсылка.Организации"));
Раздел = Разделы.Добавить();
Раздел.Имя = "МК_Производство";
Раздел.Идентификатор = Новый УникальныйИдентификатор("f4ca61c0-13f9-11ee-a63a-ac1f6bb47f39");
Раздел.Представление = НСтр("ru = 'Документы производства'");
Раздел.ТипыОбъектов.Добавить(Тип("СправочникСсылка.Организации"));
КонецПроцедуры
Для получения идентификаторов новых разделов используем конструкцию:
ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.ПолучитьСсылку().УникальныйИдентификатор()
В том же модуле в процедуре ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения описываем состав разделов
Процедура ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных)
ДокументыСПолемОрганизация = Новый Массив;
ДокументыСПолемОрганизация.Добавить("Документ.АвансовыйОтчет");
// ...
// Раздел "Документы склада"
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.ОприходованиеЗапасов", "Дата", "МК_СкладскиеДокументы");
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.ПеремещениеЗапасов", "Дата", "МК_СкладскиеДокументы");
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.ПеремещениеПоЯчейкам", "Дата", "МК_СкладскиеДокументы");
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.СписаниеЗапасов", "Дата", "МК_СкладскиеДокументы");
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.МК_ПеремещениеПоЯчейкамПеринт", "Дата", "МК_СкладскиеДокументы");
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.МК_ФиксацияПалета", "Дата", "МК_СкладскиеДокументы");
// Раздел "Документы производства"
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.МК_КартаЛитья", "Дата", "МК_Производство");
ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.СборкаЗапасов", "Дата", "МК_Производство");
КонецПроцедуры
В модуле формы нашего документа в обработчике события ПриЧтенииНаСервере дергаем строку из типового документа:
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// ...
ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
// ...
КонецПроцедуры
В подписки на события ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента и ПроверитьДатуЗапретаИзмененияПередУдалением в источники надо добавить объекты наших документов - это добавит проверку на изменение документов не через форму (через форму списка либо вообще программно)
Ну и в завершении надо запустить базу в режиме обновления, чтобы в ПВХ Разделы дат запрета изменения сгенерировались новые разделы. (спасибо dhurricane за комментарий)