Скрываем неиспользуемые виды расчета

Опубликовал karpik666 в раздел Программирование - Практика программирования

Копятся ненужные виды расчета в ЗУП? Есть решение с минимальными затратами при последующих обновлениях!

Мне очень понравилось, как реализован механизм «Архив» в справочнике «Сотрудники». Сделаем так же и для видов расчета, но максимально сохранив конфигурацию на поддержке:

Сокращения: ПВР – план видов расчета

  1. Для этого, конечно же, необходимо включить возможность редактирования конфигурации, но замочек необходимо снять только c Корневого элемента конфигурации (чтобы добавлять новые объекты), с ПВР и его формы списка и выбора.
  2. В ПВР добавляем реквизит «Актуальность» - тип «Булево»
  3. Добавляем глобальный модуль «КА_ГлобальныйМодуль» (ИЛИ «ЛКС_ГлобальныйМодуль) код вставляем как указано в публикации TormozIT http://infostart.ru/public/16980/, делаем его глобальным и для обычного приложения. У себя в конфигурации я немного изменил префикс не «ЛКС», а «КА», прошу заранее извинить.
  4. Добавляем модуль «КА_ПодпискиНаСобытия» - директивы исполнения «Сервер» и «Клиент (обычное приложение)»
  5. Добавляем модуль «КА_ГенерацияЭлементовФормы» - «Клиент (обычное приложение)».
  6. Добавляем подписку на событие «УстановитьАктуальностьПВР» для события «ПередЗаписью» ПВР, указываем модуль исполнения КА_ПодпискиНаСобытия. В процедуре пишем:  
Если Источник.ЭтоНовый() Тогда
	Источник.Актуальность = Истина;
КонецЕсли; 
  1. Затем добавляем нужные кнопки и командную панель в форму списка и форму выбора ПВР как в форме списка справочники Сотрудники – это кнопки «Поместить расчет в архив» и «Показывать архив показателей», а также кнопку в контекстной панели «Поместить расчет в архив».
  2. Используя обработку из http://infostart.ru/public/99363/, любезно предоставленную нам Istur – декомпилируем необходимые нам кнопки (кстати я немного переделал его обработку, чтобы действия стандартных командных панелей представлялись в виде текстовой строки с помощью ЗначениеИзстрокиВнутр, так как по-другому их фиг получишь, и также чтобы автоматически добавлялись стандартные картинки). И затем удаляем все, что мы добавили (делаем формы типовыми).
  3. Добавляем полученный декомпилированный код в модуль «Ка_ГенерацияЭлементовФормы» в процедуру  ПланВидовРасчета_ФормаСписка_ПередОткрытием(Форма, Отказ, Подменю, СтандартнаяОбработка = Ложь) Экспорт
  4. Для универсальности основной исполняемый код перенесем в общий модуль "КА_АктуальностьПВР" - ("клиент (обычное приложение)"): 
    Процедура УточнитьНаименованиеИДоступностьКомандыИзменитьАктуальность(лТекСтрока, ЭлементыФормы, Подменю) Экспорт
    	
    	// Если выделенных строк нет - команды недоступны
    	Если лТекСтрока = Неопределено Тогда
    		ТекстЗаголовкаКоманды = "";
    	Иначе	
    	// Если выделенная строка одна - обратимся к текущим данным строки
    		Если лТекСтрока.Актуальность Тогда
    			ТекстЗаголовкаКоманды = "Поместить расчет в архив";
    		Иначе
    			ТекстЗаголовкаКоманды = "Извлечь расчет из архива";
    		КонецЕсли;
    	КонецЕсли;	
    			
    	
    	Если ПустаяСтрока(ТекстЗаголовкаКоманды) Тогда
    		ЭлементыФормы.КоманднаяПанельСписокВидовРасчета.Кнопки.ИзменитьАктуальность.Доступность	= Ложь;
    		Подменю.Кнопки.ИзменитьАктуальность.Доступность		= Ложь;
    	Иначе
    		ЭлементыФормы.КоманднаяПанельСписокВидовРасчета.Кнопки.ИзменитьАктуальность.Доступность	= Истина;
    		ЭлементыФормы.КоманднаяПанельСписокВидовРасчета.Кнопки.ИзменитьАктуальность.Текст		= ТекстЗаголовкаКоманды;
    		Подменю.Кнопки.ИзменитьАктуальность.Доступность		= Истина;
    		Подменю.Кнопки.ИзменитьАктуальность.Текст			= ТекстЗаголовкаКоманды;
    	КонецЕсли;
    	
    КонецПроцедуры
    
    Процедура Кнопка_ИзменитьАктуальность(ЭлементыФормы, Подменю) Экспорт
    	 // команда изменения актуальности доступна только при наличии
    	// выделенных строк и только если у всех выделенных сотрудников одинаковая актуальность
    	
    	лТекСтрока			= ЭлементыФормы.ПланВидовРасчетаСписок.ТекущаяСтрока;
    	Если лТекСтрока = Неопределено Тогда
    		Возврат;		
    	КонецЕсли; 
    	ТекущаяАктуальность	= лТекСтрока.Актуальность;
    	Наименование		= лТекСтрока.Наименование;
    	
    	Форма = ПолучитьОбщуюФорму("ДиалогВопрос");
    	
    	Если ТекущаяАктуальность Тогда
    		Форма.Заголовок	= "Перемещение показателей в архив";
    		Форма.ЭлементыФормы.НадписьТекстВопроса.Заголовок =
    		"Поместить выделенный расчет в архив.
    		|
    		|Показатели, помещенные в архив, не будут показаны в списке.";
    		Форма.ЭлементыФормы.КнопкаДействие1.Заголовок = "Поместить в архив";
    	Иначе
    		Форма.Заголовок	= "Извлечение показателя из архива";
    		Форма.ЭлементыФормы.НадписьТекстВопроса.Заголовок =
    		"Извлечь выделенный расчет из архива. 
    		|
    		|После извлечения из архива показатели будут показываться в списке.";
    		Форма.ЭлементыФормы.КнопкаДействие1.Заголовок = "Извлечь из архива";
    	КонецЕсли;
    	
    	Форма.ЭлементыФормы.КнопкаДействие2.Заголовок = "Отмена";
    	Результат = Форма.ОткрытьМодально();
    	
    	Если ПустаяСтрока(Результат) или Результат = "2" Тогда
    		// отказались от смены актуальности
    		Возврат;
    	Иначе
    		НачатьТранзакцию();
    		лПоказатель = лТекСтрока.ПолучитьОбъект();
    		лПоказатель.Актуальность = Не ТекущаяАктуальность;
    		лПоказатель.Записать();
    		ЗафиксироватьТранзакцию();
    		
    		// после смены актуальности уточним заголовок команды
    		УточнитьНаименованиеИДоступностьКомандыИзменитьАктуальность(лТекСтрока, ЭлементыФормы, Подменю);
    		
    	КонецЕсли;
    
    КонецПроцедуры
    
    Процедура ПВР_ПриПолученииДанных(ОформленияСтрок) Экспорт
    	Для Каждого Оформление Из ОформленияСтрок Цикл
    		ДанныеСтроки = Оформление.ДанныеСтроки.Ссылка;		
    		Если НЕ ДанныеСтроки.Актуальность Тогда
    			Оформление.ЦветТекста = ЦветаСтиля.ЦветРамки;
    		КонецЕсли;
    	КонецЦикла;
    КонецПроцедуры
    
    Процедура ПоказатьАрхив(Форма, Подменю, ПоказыватьАрхив) Экспорт
    	Форма.ПланВидовРасчетаСписок.Отбор.Актуальность.Использование	= Не ПоказыватьАрхив;
    	Форма.ПланВидовРасчетаСписок.Отбор.Актуальность.Значение		= Не ПоказыватьАрхив;
    	Подменю.Кнопки.ПоказыватьАрхив.Пометка							= ПоказыватьАрхив;	
    КонецПроцедуры

    Обратите внимание на передаваемую переменную "Подменю" - в форме списка и форме выбора ПВР кнопки находятся в разных подменю, поэтому для универсальности его нужно передавать.

  5. В форму списка в конец модуля вставляем следующий код:
    Процедура ДействияФормыИзменитьАктуальность(Кнопка)
    	лПодменю = ЭлементыФормы.ДействияФормы.Кнопки.Подменю2;
    	КА_АктуальностьПВР.Кнопка_ИзменитьАктуальность(ЭлементыФормы, лПодменю);	
    КонецПроцедуры
    
    Процедура ДействияФормыПоказыватьАрхив(Кнопка)
    	лПодменю = ЭлементыФормы.ДействияФормы.Кнопки.Подменю2;	
    	КА_АктуальностьПВР.ПоказатьАрхив(ЭтаФорма, лПодменю, НЕ лПодменю.Кнопки.ПоказыватьАрхив.Пометка);	
    КонецПроцедуры
    
    Процедура КаПередЗакрытием(Отказ, СтандартнаяОбработка)
    	Выполнить(КаПолучитьСтароеДействиеФормы(ЭтаФорма, "ПередЗакрытием"));
    	лПодменю = ЭлементыФормы.ДействияФормы.Кнопки.Подменю2;
    	СохранитьЗначение("ПланВидовРасчетаОсновныеНачисления_ФормаСписка_ПоказыватьАрхив",	лПодменю.Кнопки.ПоказыватьАрхив.Пометка);	
    КонецПроцедуры
    
    // Процедура - обработчик события "ПередОткрытием" элемента формы "". 
    // 
    Процедура КаПередОткрытием(Отказ, СтандартнаяОбработка)
    	лПодменю = ЭлементыФормы.ДействияФормы.Кнопки.Подменю2;	
    	
    	КА_ГенерацияЭлементовФормы.ПланВидовРасчета_ФормаСписка_ПередОткрытием(ЭтаФорма, Отказ, лПодменю, СтандартнаяОбработка);
    	
    	Выполнить(КаПолучитьСтароеДействиеФормы(ЭтаФорма, "ПередОткрытием"));		
    	ПоказыватьАрхив = ВосстановитьЗначение("ПланВидовРасчетаОсновныеНачисления_ФормаСписка_ПоказыватьАрхив");
    	Если ПоказыватьАрхив = Неопределено Тогда
    		ПоказыватьАрхив = Ложь;
    	КонецЕсли;
    	
    	КА_АктуальностьПВР.ПоказатьАрхив(ЭтаФорма, лПодменю, ПоказыватьАрхив);
    	
    КонецПроцедуры // КаПередОткрытием() 
    
    // Процедура - обработчик события "ПриИзменении" элемента формы "Склад".
    //
    Процедура КаПланВидовРасчетаСписокПриАктивизацииСтроки(Элемент)
        
        Выполнить(КаПолучитьСтароеДействиеФормы(ЭтаФорма, "ПриАктивизацииСтроки", "ПланВидовРасчетаСписок"));
    	
    	лТекСтрока = ЭлементыФормы.ПланВидовРасчетаСписок.ТекущаяСтрока;
    	лПодменю = ЭлементыФормы.ДействияФормы.Кнопки.Подменю2;
    	КА_АктуальностьПВР.УточнитьНаименованиеИДоступностьКомандыИзменитьАктуальность(лТекСтрока, ЭлементыФормы, лПодменю);
    
    КонецПроцедуры // КаСкладПриИзменении()
    
    // Процедура - обработчик события "НачалоВыбора" элемента "Товары.ЗаказПокупателя".
    // (Событие "НачалоВыбора" поля ввода "ЗаказПокупателя"
    // в строке табличной части "Товары")
    //
    Процедура КаПланВидовРасчетаСписокПриПолученииДанных(Элемент, ОформленияСтрок)
        
        Выполнить(КаПолучитьСтароеДействиеФормы(ЭтаФорма, "ПриПолученииДанных", "ПланВидовРасчетаСписок"));
    	
    	КА_АктуальностьПВР.ПВР_ПриПолученииДанных(ОформленияСтрок);
    	
    КонецПроцедуры // КаТоварыЗаказПокупателяНачалоВыбора()
    
    КаУстановитьДействиеФормы(ЭтаФорма, "ПередЗакрытием");
    КаУстановитьДействиеФормы(ЭтаФорма, "ПередОткрытием");
    КаУстановитьДействиеФормы(ЭтаФорма, "ПриАктивизацииСтроки"  , "ПланВидовРасчетаСписок");
    КаУстановитьДействиеФормы(ЭтаФорма, "ПриПолученииДанных"  	, "ПланВидовРасчетаСписок");
    

    Теперь, если такие же кнопки мы захотим добавить в форму выбора, нужно поменять инициализацию лПодменю на лПодменю = ЭлементыФормы.ДействияФормы.Кнопки.Подменю;, а если захотим добавить для других ПВР, то также необходимо заменить наименование сохраняемых настроек "сохранить/восстановить значение" на имя ваших пвр.

  6. Не забываем про комментарии вида «//{{ДОБАВЛЕНО» «//}}ДОБАВЛЕНО»

По сути все, но когда вы откроете форму списка необходимого вида расчета, то там будет совершенно пусто. Дело в том, что сейчас все ПВР имеют Актуальность = Ложь, чтобы это исправить используйте мою обработку или сделайте сами, нужно для каждого элемента проставить «актуальность = Истина»

Аналогичные действия нужно проделать для формы выбора.

И теперь вы можете скрывать эти ненавистные виды расчета. Ха-ха.

 

P.S. Аналогично можно сделать для показателей схем мотивации,  а также убрать их из редактора формул. Для этого пропишите в общей форме «Редактор формула расчета» в процедуре «ЗаполнитьТаблицуПоказателей» такое условие:

Если ВидПВР = "ПлановыеУдержанияРаботниковОрганизаций" Или ВидПВР = "ПлановыеУдержанияРаботников" Или ВидПВР = "ПлановыеДополнительныеНачисленияРаботниковОрганизаций" Тогда
    Запрос.Текст = Запрос.Текст + Символы.ПС + "И ПоказателиСхемМотивации.Актуальность";
Иначе
    Запрос.Текст = Запрос.Текст + Символы.ПС + "ГДЕ ПоказателиСхемМотивации.Актуальность"; 
КонецЕсли; 

Мои работы:

Общее

Перенос данных XML с Анализом и выборочной загрузкой.

Универсальный редактор таблиц и движения документа (LITE) (Обычная Форма)

Универсальный редактор таблиц и движения документа (PRO) (Обычная Форма)

Универсальный редактор Таблиц и Движений документов (Управляемая форма)

Запуск 1С под другим пользователем без пароля.

 

Управление торговлей 11

Установка цен в УТ11. Произвольный запрос к данным ИБ

 

ЗУП 2.5

Скрываем неиспользуемые виды расчета

Резервы отпусков в Документе "Отражение Зарплаты в Регламентированном Учете" (Оценочные Обязательства)

 

Комплексная И УПП

Форма работы с сотрудниками, как из зуп 2.5

 

См. также

Комментарии

1. karpik666 22.07.2015 12:48
Если кому будет интересно могу выложить пример реализации
# Ответить
2. DoctorRoza 22.07.2015 17:01
Хм .. а на сколько это актуально? Скрывать уволенных сотрудников - это да, элементов то много. А вот элементы ПВР, сомнительно.
Ответили: (3)
# Ответить
3. karpik666 22.07.2015 17:10
(2) DoctorRoza, ну к примеру в торговой организации, где используется множество разных схем мотивации и они постоянно меняются. Да и просто, если база старая, то в ней очень большое количество разных видов расчета, как используемых так и нет. Почему бы не оставить расчетчикам только используемые виды расчета, что упростит подбор их в документы.
Ответили: (9)
# Ответить
4. Константин С. 22.07.2015 17:34
Есть решение с минимальными доработками!

Столько букв, называется минимальные доработки !!!!!))))

Минимально, это добавил реквизит и при открытии формы списка сделал включение отбора по колонке (реквизиту).
Ответили: (5) (6)
# Ответить
5. karpik666 22.07.2015 17:43
(4) Константин С., а вы прочли статью? по сути здесь тоже самое, но сделано так, чтобы минимизировать затраты при обновлении. Плюс мой вариант более навороченный, так как в вашем нужно писать код в обработчик события "при открытии", у меня же это отдельная процедура. Также я добавил возможность интерактивного скрытия вида расчета из списка, и возможность просмотра скрытых элементов, а также их графическое выделения и все это с минимальным изменением типового кода.
# Ответить
6. karpik666 22.07.2015 17:46
(4) Константин С., наверное неправильное название, лучше написать" с минимальными затратами при последующих обновлениях". Кстати, такую реализацию можно экстраполировать и на другие справочники, например, скрытие неиспользуемых контрагентов, или скрытие номенклатуры.
# Ответить
7. Константин С. 22.07.2015 18:08
минимальными затратами при последующих обновлениях"

ага сравнить 12 пунктов по внесению изменений и 2-мя.
Описанное мной решение также не проблемно в обновлении.

более навороченный,

больше вероятности запутаться
Ответили: (8)
# Ответить
8. karpik666 22.07.2015 18:35
(7) Константин С., каждому свое, если вас устраивает ваш вариант пользуйтесь им, меня устраивает мой. тем более он уже проверен на реальных базах и с реальными обновлениями.
больше вероятности запутаться
- здесь-то уж точно не запутаться, от желающего внедрить данную возможность требуется только копировать и вставить свою базу.
# Ответить
9. DoctorRoza 23.07.2015 09:01
(3) karpik666, ИМХО, Ваша доработка хороша как лабораторная работа, не больше. Почему? Ну хотя бы потому, что спрятанные элементы могут быть востребованы в будущем! На дубли ФИО ЗУП еще среагирует, мол, есть уже такой, тут же нет! Значит, опять дорабатывать!? Хм .. сомнительно!
Ответили: (10)
# Ответить
10. karpik666 23.07.2015 10:17
(9) DoctorRoza, на такие случаи есть кнопка "показывать скрытые показатели". Никто не мешает, когда человек заводит новый вид расчета просто отобразить другие виды расчета из списка, при желании их можно восстановить.Некоторые программно правят формулы видов расчета, хотя по ним уже есть рассчитанные документы, а я их просто скрываю.
Ответили: (11)
# Ответить
11. karpik666 23.07.2015 11:41
karpik666, для примера, выкладываю конфигурацию с выполненными изменениями. Из нее можно почерпнуть, как переопределять обработчики событий формы, и программно генерировать новые элементы формы

Прикрепленные файлы:

ПримерРеализацииАрхиваВПвр.cf
# Ответить
12. ccserg 31.07.2015 10:26
копируем алгоритм справочника Сотрудники и всё ))
спрятать в архив
у меня так сделано
Ответили: (13)
# Ответить
13. karpik666 31.07.2015 12:46
(12) ccserg, посмотрите прикрепленный файл в комментарии выше, у меня сделано также, как вы сказали, но при минимуме правки типовой конфигурации. В принципе этот алгоритм можно вставить и в справочник номенклатуры или для контрагентов
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл