Групповое изменение реквизитов объектов расширений

07.11.20

Разработка - Механизмы платформы 1С

Доработка встроенной обработки "Групповое изменение реквизитов" для возможности изменения ссылочных реквизитов с ссылками на объекты расширения. Работает в Комплексной конфигурации 2.4.

Началось все как всегда с малого.

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

И все было бы хорошо, если бы эти объекты не стали плодиться как... ну дальше понятно все )

И вот однажды понадобилось нам изменить объекты за период. Ну способ то известный: Администрирование - Обслуживание - Корректировка данных - Групповое изменение реквизитов.

А не тут то было. Не видит обработка типы наших объектов. Не видит по причине отсутствия таковых в ТипВсеСсылки().

Пришлось взять напильник и...  все описание взято из реально работающего расширения, в котором присутствуют 2 новых объекта метаданных:

  1. Перечисление.ПРП_СтатусыПропусков

  2. Справочник ПРП_РеестрПропусков с реквизитом статус с типом - ПеречислениеСсылка.ПРП_СтатусыПропусков

 

   

Что и как было сделано:

1. в расширение была "затянута" основная форма обработки ГрупповоеИзменениеРеквизитов,

и добавлен реквизит этой формы: РеквизитыОбъекта (таблица значений).

В этой таблице был изменен тип колонки Значение на Произвольный.

   

 

2. в модуль формы были добавлены 4 функции, обрабатывающие типы значений:

   

 
ВидОбъектаПоТипу() 
 
ЭтоСсылка() 
 
ЗначениеСсылочногоТипа() 
&НаСервереБезКонтекста
&Вместо("ЗначениеСсылочногоТипа")
Функция ПРП_ЗначениеСсылочногоТипа(Значение)
	Возврат Значение <> Неопределено И ПРП_ЭтоСсылка(ТипЗнч(Значение));
КонецФункции

 

 
СтроковоеПредставлениеТипа()

В которых, как не сложно догадаться, и прописаны типы объектов из нашего расширения. Все функции были добавлены с типом вызова &Вместо.

 

3. Кроме того, в модуле объекта все той же обработки были изменены еще две функции

   

 
ВидОбъектаПоТипу()
 
ЗначениеСсылочногоТипа() 

И здесь функции были добавлены с типом вызова &Вместо.

 

Больше никаких изменений не потребовалось, и обработка "увидела" наши объекты.

Причем если у вас несколько расширений, то можно сделать это в каждом из них, для собственных объектов этих самых расширений. И оно будет работать... проверено.

Все это делалось на КА-2.4, не проверял, но думаю что на УТ11 и ERP2 тоже будет работать

Обработка реквизитов Групповое изменение

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    8450    bayselonarrend    20    

156

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    6457    dsdred    18    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    19898    YA_418728146    26    

72

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24399    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15471    YA_418728146    7    

169
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1752 07.11.20 16:19 Сейчас в теме
(0) молодцы! рабочий инструмент описали.
только укажите еще какая версия платформы (обычно без этой информации статью не допускают до публикации)
2. Alfn 60 07.11.20 16:21 Сейчас в теме
да любая, с которой работает КА-2
3. chg 08.11.20 09:12 Сейчас в теме
(2)ну тогда и ERP, разница незначительна для расширений
4. pr_woland 01.12.20 08:58 Сейчас в теме
Как Вы поменяли тип колонки таблицы значений в расширении формы? (пункт 1). У меня расширение не дает изменять тип... Платформа 8.3.17.1549
5. Alfn 60 01.12.20 10:37 Сейчас в теме
(4) выделил реквизит и нажал кнопку "Добавить в расширение"
Прикрепленные файлы:
6. pr_woland 02.12.20 07:58 Сейчас в теме
(5) Реквизит "РеквизитыОбъекта" (таблица значений) и его колонки добавились без проблем, но изменить тип колонки "Значение" невозможно (кнопки в окне выбора типов неактивны). Хотя изменить тип самого реквизита формы "РеквизитыОбъекта" можно. Видимо, это баг платформы, потому что я сталкивался с похожей ситуацией раньше... Короче, решил добавлением нужного мне объекта расширения в ОписаниеТипов этого реквизита. Написал в модуле формы:


&НаСервере
Процедура БКР_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	МассивРеквизитов = ЭтаФорма.ПолучитьРеквизиты("РеквизитыОбъекта");
	Для Каждого ОчереднойРеквизит Из МассивРеквизитов Цикл
		Если ОчереднойРеквизит.Имя <> "Значение" Тогда
			Продолжить;
		Иначе
			РасширенныеТипы = Новый ОписаниеТипов(ОчереднойРеквизит.ТипЗначения, "СправочникСсылка.БК_ОстаткиПоБанковскимВыпискам");
			ОчереднойРеквизит.ТипЗначения = РасширенныеТипы;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
Показать



Это на заметку тем, кто с такой же проблемой столкнётся.
igor-gtc; +1 Ответить
7. un2qum 6 18.01.21 08:25 Сейчас в теме
(6)

Это на заметку тем, кто с такой же проблемой столкнётся.

Попробывал, тип добавился. Но при присвоении значения преобразуется к строка.
(8.3.15.1778) ут 11.4.6.207
8. pr_woland 18.01.21 09:11 Сейчас в теме
(7) А все остальные пункты сделали? Мне кажется, в модуле объекта что-то забыли (или неправильно работает). Проверьте процедуры ВидОбъектаПоТипу и ЗначениеСсылочногоТипа
9. un2qum 6 18.01.21 14:46 Сейчас в теме
(8) Да нет, я проверил. суть в том что при таком указании типа как у вас, он меняется
в МассивРеквизитов
но в самом объекте остается тем же. если еще раз получить ПолучитьРеквизиты("РеквизитыОбъекта");
то будет видно что тип не указался. Кроме того возможности изменить тип используя функцию изменитьреквизиты тоже нет,
потом что она не может удалить реквизиты созданные не программно
10. pr_woland 19.01.21 03:00 Сейчас в теме
(9) Видимо, это глюк платформы =( Я уже не раз сталкивался с тем, что в расширении много проблем именно с формами - в частности, с реквизитами...
15. Varozh 27.05.23 15:07 Сейчас в теме
(6) Так не работает, тип значения у реквизита остается прежний. В интерфейсе выбрать свой по-прежнему не удается. Если заново вызвать метод ПолучитьРеквизиты() после вашего кода, то можно увидеть, что тип значения у реквизита "Значение" остался прежний.
11. igor-gtc 21.01.21 14:29 Сейчас в теме
1С:Предприятие 8.3 (8.3.17.1851)
Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.87.28)
Для тех кому по каким-либо причинам не подходит данное решение могу сказать свое- просто выгрузить обработку как внешнюю и в таблице "РеквизитыОбъекта " изменить тип колонки Значение на Произвольный.
Проверено- работает.
Автору статьи огромное спасибо.
12. o6opkot 14 08.09.21 14:12 Сейчас в теме
У меня тоже платформа не даёт изменить тип колонки "Значение" в "РеквизитыОбъекта". Проблему решил не заимствованием таблицы значений, а созданием на заимствованной форме нового реквизита с типом "Таблица значений" с именем "РеквизитыОбъекта". В него уже добавил колонку реквизита "Значение" с типом "Произвольный". После этого всё заработало.
Прикрепленные файлы:
user2041726; asdPerepel; +2 Ответить
13. check2 380 04.12.21 14:17 Сейчас в теме
Здравствуйте!

Мне хватило в модуле объекта - обработки написать так:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда

&ИзменениеИКонтроль("ВидОбъектаПоТипу")
Функция GLI_ВидОбъектаПоТипу(Тип) Экспорт
	
#Удаление
	Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "Справочник";
	
	ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "Документ";
	
	ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "БизнесПроцесс";
	
	ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "ПланВидовХарактеристик";
	
	ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "ПланСчетов";
	
	ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "ПланВидовРасчета";
	
	ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "Задача";
	
	ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "ПланОбмена";
	
	ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда
		Возврат "Перечисление";
	
	Иначе
		ВызватьИсключение ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный тип значения параметра (%1)'"), Строка(Тип));
	
	КонецЕсли;
#КонецУдаления
#Вставка
	XMLИмяТипа = XMLТип(Тип).ИмяТипа;
	ИмяКлассаМетаданных = СтрРазделить(XMLИмяТипа, ".")[0];
	
	Если ИмяКлассаМетаданных = "CatalogRef" Тогда
	    Возврат "Справочник";    
	ИначеЕсли ИмяКлассаМетаданных = "ChartOfAccountsRef" Тогда
	    Возврат "ПланСчетов"
	ИначеЕсли ИмяКлассаМетаданных = "ChartOfCharacteristicTypesRef" Тогда
	    Возврат "ПланВидовХарактеристик"
	ИначеЕсли ИмяКлассаМетаданных = "BusinessProcessRef" Тогда
	    Возврат "БизнесПроцесс"
	ИначеЕсли ИмяКлассаМетаданных = "TaskRef" Тогда
	    Возврат "Задача"    
	ИначеЕсли ИмяКлассаМетаданных = "ChartOfCalculationTypesRef" Тогда
	    Возврат "ПланВидовРасчета"
	ИначеЕсли ИмяКлассаМетаданных = "DocumentRef" Тогда
	    Возврат "Документ"
	ИначеЕсли ИмяКлассаМетаданных = "EnumRef" Тогда
		Возврат "Перечисление"
	ИначеЕсли ИмяКлассаМетаданных = "ExchangePlanRef" Тогда
		Возврат "ПланОбмена"
	Иначе
		ВызватьИсключение ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный тип значения параметра (%1)'"), Строка(Тип));
	КонецЕсли;

#КонецВставки	
КонецФункции

#КонецЕсли
Показать


Возможно сложности модификации, описанные автором касались замен в штатных объектах реквизитов с нештатным типом, однако у меня была задача проще, мне в объекте, созданном в расширении нужно было подменить реквизиты.

В любом случае огромное спасибо автору, за сэкономленное время за идею решения проблемы.
BarsukM; user728942; buy_sale; +3 Ответить
14. buy_sale 220 22.12.21 17:41 Сейчас в теме
Спасибо за рабочее решение !
16. user2041726 08.02.24 09:10 Сейчас в теме
Подскажите пожалуйста! В документе есть реквизит ссылочного типа на справочник, но когда пытаешься обработкой изменить выделенные в форме списка, обработка реквизит видит, а там справа напротив реквизита в поле "Новое значение" нет этого справочника в списке.
17. user2041726 09.02.24 15:33 Сейчас в теме
(16) Проблема была в том, что не менялся тип реквизита Значение. Сделал как в (12), все заработало! Спасибо!
Оставьте свое сообщение