Функциональное отключение контроля запрета изменений

Клиенту нужно, чтобы при зачете оплаты в заказе покупателя или поставщика не выполнялся контроль даты запрета изменений.

Эти операции происходят в форме обработки ПомощникЗачетаОплат.

Сначала я пошел по классическому пути, в процедуре ОтразитьЗачетОплатыВДокументе формы обработки ПомощникЗачетаОплат делал вставку через изменение и контроль:

И в процедуре ЗаблокироватьДокументыДляРедактирования этой же формы:

Это позволяло записывать документ, но потом я столкнулся с записью движений. Попробовал отключить так:

Но обнаружил, что дополнительные свойства для некоторых движений не сохраняются — набор записей создается заново.

В общем с контекстно-ориентированным программированием у 1С туго.

Поэтому решил применить немного усовершенствованный метод спуска параметра, завел параметр сеанса дор_ОтключитьКонтрольДатыЗапретаИзменений с типом строка неограниченной длины.

Контроль надо отключать по кнопкам «Зачесть платеж», «Выполнить» и «Отменить».

В помощнике соответственно расширяем рабочие серверные методы этих команд:

&НаСервере
&Вместо("ЗачестьНаСервере")
Процедура дор_ЗачестьНаСервере(МассивСтрок, ЭтоОплата)
	//Осипов 2024-03-21 отключаем контроль даты запрета изменений
	дор_Сервер.ОтключитьКонтрольДатыЗапретаИзменений();
	Адрес = ПоместитьВоВременноеХранилище(Истина);
	ПродолжитьВызов(МассивСтрок, ЭтоОплата);
	дор_Сервер.ВключитьКонтрольДатыЗапретаИзменений();
КонецПроцедуры

&НаСервере
&Вместо("ЗаписатьИзмененияНаСервере")
Процедура дор_ЗаписатьИзмененияНаСервере(МассивОбработанныхДокументов, Отказ)
	//Осипов 2024-03-21 отключаем контроль даты запрета изменений
	дор_Сервер.ОтключитьКонтрольДатыЗапретаИзменений();
	ПродолжитьВызов(МассивОбработанныхДокументов, Отказ);
	дор_Сервер.ВключитьКонтрольДатыЗапретаИзменений();
КонецПроцедуры

&НаСервере
&Вместо("ОтменитьЗачетНаСервере")
Процедура дор_ОтменитьЗачетНаСервере(СоответствиеСтрок, СуммаСтрокиИзменена, Отказ)
	//Осипов 2024-03-21 отключаем контроль даты запрета изменений
	дор_Сервер.ОтключитьКонтрольДатыЗапретаИзменений();
	ПродолжитьВызов(СоответствиеСтрок, СуммаСтрокиИзменена, Отказ);
	дор_Сервер.ВключитьКонтрольДатыЗапретаИзменений();
КонецПроцедуры

Сам контроль отключаем в модуле контроля даты запрета изменений. К сожалению, нет единой точки входа, приходится затрагивать три метода.:

&Вместо("ИзменениеЗапрещено")
Функция дор_ИзменениеЗапрещено(ДанныеИлиПолноеИмя, ИдентификаторДанных, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки)
	//Осипов 2024-03-21 отключаем контроль даты запрета изменений
	Если дор_Сервер.ОтключенКонтрольДатыЗапретаИзменений() Тогда
		Возврат ложь;
	КонецЕсли;
	Результат = ПродолжитьВызов(ДанныеИлиПолноеИмя, ИдентификаторДанных, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки);
	Возврат Результат;
КонецФункции

&Вместо("ПроверитьДатыЗапретаИзмененияДанных")
Процедура дор_ПроверитьДатыЗапретаИзмененияДанных(Источник, Отказ, ИсточникРегистр, Замещение, Удаление)
	//Осипов 2024-03-21 отключаем контроль даты запрета изменений
	Если дор_Сервер.ОтключенКонтрольДатыЗапретаИзменений() Тогда
		Возврат;
	КонецЕсли;
	ПродолжитьВызов(Источник, Отказ, ИсточникРегистр, Замещение, Удаление);
КонецПроцедуры

&Вместо("НайденЗапретИзмененияДанных")
Функция дор_НайденЗапретИзмененияДанных(Знач ДанныеДляПроверки, ПараметрыСообщенияОЗапрете, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки)
	//Осипов 2024-03-21 отключаем контроль даты запрета изменений
	Если дор_Сервер.ОтключенКонтрольДатыЗапретаИзменений() Тогда
		Возврат ложь;
	КонецЕсли;
	Результат = ПродолжитьВызов(ДанныеДляПроверки, ПараметрыСообщенияОЗапрете, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки);
	Возврат Результат;
КонецФункции

Ну и, собственно, функции по установке параметров сеанса в модуле дор_Сервер:

&НаСервере
Функция ПолучитьПараметраСеанса(Имя) Экспорт
	УстановитьПривилегированныйРежим(истина);
	Попытка
		Возврат ПараметрыСеанса[Имя];
	Исключение
		Возврат Неопределено;
	КонецПопытки;
КонецФункции

&НаСервере
Функция УстановитьПараметрСеанса(Имя, Значение) Экспорт
	УстановитьПривилегированныйРежим(истина);
	ПараметрыСеанса[Имя] = Значение;
КонецФункции

&НаСервере
Процедура ОтключитьКонтрольДатыЗапретаИзменений() Экспорт
	Адрес = ПоместитьВоВременноеХранилище(истина);
	УстановитьПараметрСеанса("дор_ОтключитьКонтрольДатыЗапретаИзменений", Адрес);
КонецПроцедуры

&НаСервере
Процедура ВключитьКонтрольДатыЗапретаИзменений() Экспорт
	Адрес = ПолучитьПараметраСеанса("дор_ОтключитьКонтрольДатыЗапретаИзменений");
	Если Адрес = Неопределено Тогда Возврат ; КонецЕсли;
	УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры

&НаСервере
Функция ОтключенКонтрольДатыЗапретаИзменений() Экспорт
	Адрес = ПолучитьПараметраСеанса("дор_ОтключитьКонтрольДатыЗапретаИзменений");
	Если Адрес = Неопределено Тогда Возврат ложь; КонецЕсли;
	Возврат ПолучитьИзВременногоХранилища(Адрес) = истина;
КонецФункции

Логичнее было бы вызывать методы запрета изменения из клиента, тогда бы параметры точно очищались при повторном серверном обращении, но пока сделано так. По крайней мере если отключение не произойдет, то разрешение отключится при первом же серверном вызове. Если бы мы просто использовали параметр сеанса, он так бы и давал разрешения на изменение.

Было бы неплохо иметь метод, который сохраняет значение только до выхода из сервера.

Среда: УТ 11.4.13.46. Объем 2.5 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *