Методика работы с дополнительными свойствами документов в типовой УТ 10.3, для минимального изменения конфигурации

Опубликовал p m (pm74) в раздел Обработки - Обработка документов

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

Оговорюсь сразу, что с вероятностью 99,9% все это уже было когда-то кем-то сделано, но, к сожалению, поиски по Инфостарту и в гугле не дали результата, который меня бы устраивал на 100%.

Итак, у нас есть типовая Управление Торговлей 10.3 (10.3.37.2) . Требуется добавить несколько реквизитов в документы для формирования нетиповых печатных форм или хранения какой то дополнительной информации.

Для этого в Ут 10.3 существует механизм дополнительных свойств объектов, который нам прекрасно подходит.

Однако, есть "ложка дегтя ", которая все портит - чтобы увидеть эти дополнительные свойства, пользователю нужно жмякнуть кнопку на верхней панели документа, при этом откроется весь список дополнительных свойств. Этих самых свойств может быть довольно много, они могут дублироваться, иметь различную смысловую нагрузку (например, относиться к различным печатным формам). В общем, это не наглядно, неудобно, создает путаницу и лишние вопросы.

Вот этот маленький недстаток мы и будем исправлять.

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

Проблема в том, что, в отличие от обычных реквизитов документа, доп. свойства не сохраняются при записи этого документа, их надо как-то проинициализировать при открытии и записать при записи документа. И тут , к сожалению, не обойтись без изменения конфигурации , но эти изменения минимальны и касаются только 2-х процедур общих модулей.

1. для инициализации дополнительных свойств на форме делаем вставку своего кода в начало процедуры 

МеханизмНумерацииОбъектов.УстановитьДоступностьПоляВводаНомера(МетаданныеОбъекта, ФормаОбъекта, ПодменюДействия, ПолеВводаНомера) Экспорт

	///начало изменений  
		Если НЕ ТипЗнч(ФормаОбъекта)=Тип("ТабличноеПоле")Тогда
			Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
				мпУправлениеФормами.mpУправлениеФормойОбъекта1(ФормаОбъекта.СправочникОбъект,ФормаОбъекта,, Истина);
			ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
				мпУправлениеФормами.mpУправлениеФормойОбъекта1(ФормаОбъекта.ДокументОбъект,ФормаОбъекта,, );
			КонецЕсли;
		КонецЕсли;
	///конец изменений ..

2. для записи дополнительных свойств  вставку в процедуру 

РаботаСДиалогами.УстановитьЗаголовокФормыДокумента(СтрокаВидаОперации = "", ДокументОбъект, ФормаДокумента) Экспорт
	///начало изменений 
	Если НЕ ТипЗнч(ФормаДокумента)=Тип("ТабличноеПоле")Тогда
		мпУправлениеФормами.mpУправлениеФормойОбъекта2(ДокументОбъект,ФормаДокумента);
	КонецЕсли;
	///конец изменений
..

Этот метод работает для большинства типовых документов в УТ 10.3 (10.3.37.2). Протестировано и внедрено для документов ЗаказПокупателя,СчетНаОплату, РеализацияТУ,ПоступлениеТУ.

 

Результат можно посмотреть на картинке.

Ограничение метода: - нельзя установить тип доп. свойства (Справочник.ЗначениеДополнительныхСвойств) и другие типы, где форма выбора открывается с отбором по владельцу

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

Для тех, кому не хочется тратить несколько часов на программирование и отладку - в архиве код модуля (мпУправлениеФормами клиент об/прил), описание изменений конфигурации и обработка, которая содержит инструкции по созданию новых Дополнительных свойств и позволяет корректно (СокрЛП) назначить группу свойств на типовые документы.

В модуле дополнительно описаны экспортные процедуры и функции:

  • Функция ПолучитьЗначенияСвойстваДокумента(ДокСсылка,ИмяСвойства) Экспорт
  • Функция ПолучитьЗначенияСвойстваДокументаПечать(ДокСсылка,ИмяСвойства) Экспорт
  • Процедура ЗаписатьЗначенияСвойстваДокумента(ДокСсылка,ИмяСвойства,ЗначениеСвойства) Экспорт
  • Функция ПолучитьДокументПоЗначениюСвойств(МетаданныеСтрокой,НаборСвойств) Экспорт

для вызова из печатных форм обработок и т.п.

P.S.
Некогда было писать свою функцию преобразования имен реквизитов, поэтому в модуле была использована Функция СформироватьСиноним(ИмяРеквизита) из //infostart.ru/public/162834/ спасибо за нее Vladal

Скачать файлы

Наименование Файл Версия Размер
РаботаСДопСвойствами.rar
.rar 12,14Kb
07.07.16
3
.rar 12,14Kb 3 Скачать

См. также

Комментарии
1. Евгений Дегтярев (DEG156) 5 15.07.16 08:40 Сейчас в теме
Ошибка при вызове метода контекста (Добавить)
Надпись = ФормаОбъекта.ЭлементыФормы.Добавить(Тип("Надпись"), "Заголовок"+СтрТаб.ИмяРеквизита, Истина,ФормаОбъекта.ЭлементыФормы[ИмяОсновнойПанели]);
по причине:
Неверное имя!
Имя должно состоять из одного слова,
начинаться с буквы и не содержать специальных символов кроме "_".

От себя:
СтрТаб.ИмяРеквизита= Водитель
СтрТаб.Наименование= ПечатьТТН_Водитель
2. Евгений Дегтярев (DEG156) 5 15.07.16 08:40 Сейчас в теме
Процедура СоздатьПанельДополнительныхСвойств(ФормаОбъекта,ИмяПанели,ТаблицаСвойств,ИмяОсновнойПанели,ИмяПервойСтраницыПанели)
3. p m (pm74) 50 15.07.16 08:54 Сейчас в теме
(1) DEG156, имена доп свойств , нужно создавать по принципу ИмяПанели_ИмяРеквизита в обработке , которая в архиве лежит написано про это , свойства которые начинаются с _ не выводятся в документ, все свойства с именем вида ИмяРеквизита группируются в отдельной панели
у вас пробелов нет в названии свойства ?
4. Евгений Дегтярев (DEG156) 5 15.07.16 09:21 Сейчас в теме
Так и делал. Свойство называется "ПечатьТТН_Водитель". Пробелов нет !
5. Евгений Дегтярев (DEG156) 5 15.07.16 09:24 Сейчас в теме
Все ! Нашел ошибку ! У меня были в базе "старый" свойства, видимо они создавали проблему.

Спасибо автору - простая и понятная дороботка ! так сказать "дешево и сердито" !
6. p m (pm74) 50 15.07.16 09:25 Сейчас в теме
(5) DEG156, спасибо за спасибо ))
p/s я писал быстро , перед запуском новой базы (переход 10.2 -10.3) поэтому возможны какие то ляпы в коде , но на "боевой" базе (25 пользователей ) работает уже 2 недели пока без проблем
7. Евгений Дегтярев (DEG156) 5 15.07.16 09:34 Сейчас в теме
Предлагаю изменить Процедура мпОтфильтроватьТЗДопСвойств(ТаблЗначений) так как наверно у многих уже есть "старые" свойства к документам, и что бы не переименовывать их сделать проверку по другому

Если Найти(СтрТаб.Наименование,"_")=0 Тогда
8. p m (pm74) 50 15.07.16 09:38 Сейчас в теме
(7) DEG156, если не составит труда выложите здесь , я код уже плохо помню
в принципе обработка считывыает старые свойства их можно перезаписать , но эти свойства могут быть уже где то использованы тут надо аккуратно
9. Евгений Дегтярев (DEG156) 5 15.07.16 09:44 Сейчас в теме
Процедура мпОтфильтроватьТЗДопСвойств(ТаблЗначений) 
	МассивОтборСтрок = Новый Массив;
	Для Каждого СтрТаб Из ТаблЗначений Цикл 
		Если Лев(СокрЛП(СтрТаб.Наименование),1) = "_" Или Найти(СтрТаб.Наименование,"_")=0 Тогда // DEG
			МассивОтборСтрок.Добавить(СтрТаб);
		КонецЕсли;
	КонецЦикла;
	Для А=0 По МассивОтборСтрок.Количество()-1 Цикл
		ТаблЗначений.Удалить(МассивОтборСтрок[А]);
	КонецЦикла;
КонецПроцедуры
...Показать Скрыть
10. p m (pm74) 50 15.07.16 09:46 Сейчас в теме
(9) DEG156,
спасибо , потом выложу модуль с исправлениями
кстати вставку в процедуру УстановитьДоступностьПоляВводаНомера лучше изменить на
	///mp +  09.01.2013  
		Если НЕ ТипЗнч(ФормаОбъекта)=Тип("ТабличноеПоле")Тогда
			Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
				мпУправлениеФормами.mpУправлениеФормойОбъекта1(ФормаОбъекта.СправочникОбъект,ФормаОбъекта,Истина);
			ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
				мпУправлениеФормами.mpУправлениеФормойОбъекта1(ФормаОбъекта.ДокументОбъект,ФормаОбъекта);
			КонецЕсли;
		Иначе
			Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
				мпУправлениеФормами.mpУправлениеФормойСписка(МетаданныеОбъекта.Имя,ФормаОбъекта, Истина);
			ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
				мпУправлениеФормами.mpУправлениеФормойСписка(МетаданныеОбъекта.Имя,ФормаОбъекта);
			КонецЕсли;
		КонецЕсли;
	///mp - 09.01.2013
...Показать Скрыть

и конечно убрать лишний параметр в mpУправлениеФормойОбъекта1
и если уж курочить модуль "РаботаСДиалогаими" тогда полезно еще
вставить в конец процедуры "УстановитьКартинкиВСтрокахТЧ" код
	 мпУправлениеФормами.mpУправлениеФормойТабличнаяЧастьПриПолученииДанных(ОформленияСтрок);

код процедуры mpУправлениеФормойТабличнаяЧастьПриПолученииДанных
Процедура  mpУправлениеФормойТабличнаяЧастьПриПолученииДанных(ОформленияСтрок) Экспорт
	 Возврат;// TODO пока не прописаны алгоритмы обработки
	 СтрокаТипОбъекта=Строка(ОформленияСтрок[0].ДанныеСтроки);
	 Если Найти(СтрокаТипОбъекта,"ДокументТабличнаяЧастьСтрока.")>0 Тогда
		 //ДокументТабличнаяЧастьСтрока.СчетНаОплатуПокупателю.Товары
		 СтрокаТипОбъекта=СтрЗаменить(СтрокаТипОбъекта,"ДокументТабличнаяЧастьСтрока.","");
		 ИндексТочки=Найти(СтрокаТипОбъекта,".");
		 СтрокаТипДокумента=Лев(СтрокаТипОбъекта,ИндексТочки-1);
		 СтрокаИмяТЧ=Прав(СтрокаТипОбъекта,СтрДлина(СтрокаТипОбъекта)-ИндексТочки);
	 КонецЕсли;
КонецПроцедуры

...Показать Скрыть

это работает во многих документах , полезно для разукрашивания строк итп , правда пока не доделал