Часто на предприятии бывает так, что для какого-то вида документов необходимо иметь возможность менять в нем какие-либо данные задним числом. Например, Заказ покупателя оформлен, но в работу не запущен по причине отсутствия оплаты. И вот через полгода оплата пришла, но банковский счет уже поменялся или еще что-нибудь поменялось. Новый заказ оформлять менеджерам лень.
Или, например, период закрыли для изменения бух учете, а в упр. учете еще что-то необходимо менять.
Короче масса случаев, когда это необходимо, но в типовых конфигурациях этого не предусмотрено. Данная доработка позволяет установить свою дату запрета для какого-либо вида документов. Эту дату запрета можно также периодически пододвигать.
Доработка не подходит для тех случаев, когда необходимо "срочно-срочно" открыть период для изменения одного документа и "срочно-срочно" опять закрыть период.
Итак , изменения. Добавляем один новый объект и изменяем идин типовой:
I. Создаем Новы регистр сведений.
Я его назвал РасширениеГраницДоступаОтдельныхОбъектов. Одно измерение ОбъектДоступа (Строка, 50). Один ресурс ГраницаЗапретаИзменений (Дата).
В это регистре будем хранить записи для типов документов с датами запрета изменения данных отличных от общей даты запрета редактирования
II.Вносим изменения в общий модуль "НастройкаПравДоступа"
1. Добавляем новую функцию ЕстьРасширениеГраницДоступа, которая вернет истину, если в нашем новом регистре сведений есть запись для данного типа документов и ложь в обратном случае. Также в параметрах эта функция вернет нам дату запрета редактирования этого типа документов
//Функция ЕстьРасширениеГраницДоступа возвращает булево,
//параметр ИмяОбъекта - строка с именем документа, как оно задано в конфигураторе,
//параметр ДатаДляПроверки - в эту переменную фукнция запишет дату запрета для данного типа документов
Функция ЕстьРасширениеГраницДоступа(ИмяОбъекта, ДатаДляПроверки) Экспорт
Запрос = Новый Запрос("ВЫБРАТЬ
| ГраницаЗапретаИзменений
|ИЗ
| РегистрСведений.РасширениеГраницДоступаОтдельныхОбъектов КАК РасширениеГраницДоступаОтдельныхОбъектов
|ГДЕ
| РасширениеГраницДоступаОтдельныхОбъектов.ОбъектДоступа = &ОбъектДоступа");
Запрос.УстановитьПараметр("ОбъектДоступа",ИмяОбъекта);
ТЗ = Запрос.Выполнить().Выгрузить();
Если ТЗ.Количество() > 0 Тогда
ДатаДляПроверки = КонецДня(ТЗ[0].ГраницаЗапретаИзменений);
КонецЕсли;
Возврат НЕ ТЗ.Количество() = 0;
КонецФункции
2. Изменяем Функцию ПолучитьДатуПроверкиПоТипуДокумента. Эта функция в типовой конф. вызывается перед записью любого документа, подписанного на событие ПередЗаписьюДокументаДатаЗапретаРедактирования.
В эту функцию в самое начало добавляем код:
ДатаДляПроверки = Неопределено;
Если ЕстьРасширениеГраницДоступа(ПараметрыПроверкиДокумента.МетаданныеДокумента.Имя, ДатаДляПроверки) Тогда
Если ДокументОбъект.Дата > ДатаДляПроверки Тогда
Возврат ТекущаяДата();
КонецЕсли;
КонецЕсли;
В некоторых конфигурациях фукнции ПолучитьДатуПроверкиПоТипуДокумента нет, тогда ищем процедуру ПроверитьВерсиюДокумента и тоже можно в самое начало или после первого блока вставить:
ДатаДляПроверки = Неопределено;
Если ЕстьРасширениеГраницДоступа(ПараметрыПроверкиДокумента.МетаданныеДокумента.Имя, ДатаДляПроверки) Тогда
Если ДокументОбъект.Дата > ДатаДляПроверки Тогда
Возврат ; //убираем ТекущаяДата()
КонецЕсли;
КонецЕсли;
3. Изменяем Процедуру ПроверкаПериодаЗаписейРегистров. Эта процедура в типовой конф. вызывается перед записью любого набора данных в регистры. Также в начало добавляем код:
Если ВидРегистра = "РегистрСведений" Тогда
ПроверятьСуществующиеЗаписиПоРегистратору = (НаборЗаписей.Метаданные().РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору);
Иначе
// Регистр накопления, регистр расчета, регистр сведений, подчиненный регистратору
ПроверятьСуществующиеЗаписиПоРегистратору = Истина;
КонецЕсли;//Этот блок в УПП можно не добавлять, он там уже есть
Если ПроверятьСуществующиеЗаписиПоРегистратору Тогда
ДатаДляПроверки = Неопределено;
Регистратор = НаборЗаписей.Отбор.Регистратор.Значение;
Если ЕстьРасширениеГраницДоступа(Регистратор.Метаданные().Имя, ДатаДляПроверки) Тогда
Если Регистратор.Дата > ДатаДляПроверки Тогда
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Вот собственно и все. Изменения рабочие. Использую в своих конфигурациях. Буду рад, если кому-нибудь пригодится