Обновление конфигураций на БСП, у которых в расширениях есть собственные объекты с данными

Программирование - Практика программирования

Показан способ обновления конфигураций, основанных на БСП, в тех случаях, когда в расширениях имеются собственные объекты данных (Справочники, Документы, Регистры сведений, Планы обмена).

Как все хорошо начиналось

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

Беда пришла откуда не ждали

При обновлении вдруг выползло страшное окошко, которое ничего хорошего не обещало:

Первая мысль - "WTF?", ведь до этого расширение работало и ни на что не жаловалось.

Вторая мысль - ок, я сделаю как ты просишь, только не бей. И вот тут облом! Сообщение любезно подсказывает, что можно сделать, но эти действия ни к чему не приводят!

За чашечкой кофе приходит третья мысль - хочешь записи в справочниках? Будут тебе записи в справочниках! Быстренько пишу обработку, которая эти записи туда вносит (ну не то чтобы быстренько... пришлось поковырять исходники), запускаю... И ничего! И не просто ничего, а ничего с приколом - мои с любовью внесенные записи оказались помечены на удаление. "WTF?" снова подумал я и сел курить исходники более вдумчиво.

Ларчик открывался достаточно просто

В модуле менеджера справочника ИдентификаторыОбъектовМетаданных есть функция СвойстваКоллекцийОбъектовМетаданных, а в ней вот такие строки:

    // Роли
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("115c4f55-9c20-4e86-a6d0-d0167ec053a1");
	Строка.Имя             = "Роли";
	Строка.Синоним         = НСтр("ru = 'Роли'");
	Строка.ИмяВЕдЧисле     = "Роль";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Роль'");
	Строка.БезДанных       = Истина;
	Строка.БезКлючаОбъектаМетаданных = Истина;
	Строка.ОбъектыРасширений = Истина;
	
	// ПланыОбмена
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("269651e0-4b06-4f9d-aaab-a8d2b6bc6077");
	Строка.Имя             = "ПланыОбмена";
	Строка.Синоним         = НСтр("ru = 'Планы обмена'");
	Строка.ИмяВЕдЧисле     = "ПланОбмена";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'План обмена'");
	
	// Справочники
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("ede89702-30f5-4a2a-8e81-c3a823b7e161");
	Строка.Имя             = "Справочники";
	Строка.Синоним         = НСтр("ru = 'Справочники'");
	Строка.ИмяВЕдЧисле     = "Справочник";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Справочник'");
Что наводит на мысль - БСП писалась во времена, когда добавлять свои объекты в расширение было нельзя, и она тупо не в курсе что такое бывает в природе. За это "знание" реквизит Строка.ОбъектыРасширений. Окей, давайте ей объясним! 
    // Справочники
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("ede89702-30f5-4a2a-8e81-c3a823b7e161");
	Строка.Имя             = "Справочники";
	Строка.Синоним         = НСтр("ru = 'Справочники'");
	Строка.ИмяВЕдЧисле     = "Справочник";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Справочник'");
	Строка.ОбъектыРасширений = Истина;

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

Вот тут есть два пути:

  1. Добавить наши объекты в нужные обработчики. Это конечно самый правильный путь, но это снятие с поддержки. А именно снятия с поддержки мы и хотим избежать используя расширения.
  2. Заставить систему игнорировать наши объекты, для этого в модуле ИнтеграцияСТехнологиейСервиса есть процедура ПриОпределенииИсключенийНеразделенныхДанных

Вот теперь красота и умиротворение.

В присоединенном файле находится расширение, оно полностью повторяет то что написано в статье. Просто добавьте его в свою конфигурацию перед обновлением.

Надеюсь мой опыт кому-то пригодится и поможет сэкономить несколько часов жизни. Обсуждения и конструктивная критика приветствуются.

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

Наименование Файл Версия Размер
Обновление конфигураций на БСП, у которых в расширениях есть собственные объекты с данными:
.cfe 7,95Kb
12.02.18
13
.cfe 7,95Kb 13 Скачать

См. также

Комментарии
1. Айрат Саттаров (kwazi) 215 12.02.18 22:26 Сейчас в теме
какой режим совместимости у конфигурации?
2. Виктор Третьяков (t.v.s.) 53 12.02.18 22:28 Сейчас в теме
(1)
"Не использовать", если у вас платформа 8.3.11;
"8.3.11", если у вас платформа 8.3.12
3. Митя Макаревич (mitia.mackarevich) 27 13.02.18 13:51 Сейчас в теме
Смотрите на версию БСП, раньше такая же проблема с ролями была. Прежде чем что то добавить в типовой на базе БСП, имеет смысл посмотреть какие типы объектов расширения она поддерживает (сама БСП). Для этого есть справочник "Идентификаторы объектов расширения" . Раньше такая проблема была с ролями, в 2.4 проблему решили. Поэтому эта проблема не новость
4. Виктор Третьяков (t.v.s.) 53 13.02.18 13:58 Сейчас в теме
(3) Вы правы, что нужно смотреть какие возможности поддерживает БСП. Моя статья о том, что делать, когда "нельзя, но очень хочется"
5. Dmitriy Kolesnikov (Dmitriy_Kolesnikov) 13.02.18 19:58 Сейчас в теме
Интересно, а в ИТС вы об этом писали? Разработчики в курсе?
6. Виктор Третьяков (t.v.s.) 53 13.02.18 20:03 Сейчас в теме
(5)Я полагаю, что разработчики в курсе и с новых версиях БСП это будет исправлено
user676977_slkruto; +1 Ответить
7. Рустам А (user676977_slkruto) 13.03.18 15:47 Сейчас в теме
Виктор, спасибо! Тоже столкнулся с такой ошибкой при обновлении. С этим расширением все прошло отлично!
8. zender911 Васюткин (zender911) 15.03.18 17:41 Сейчас в теме
Заставить систему игнорировать наши объекты, для этого в модуле ИнтеграцияСТехнологиейСервиса есть процедура ПриОпределенииИсключенийНеразделенныхДанных

Так, а что конкретно прописали, можно поподробнее ?
9. Виктор Третьяков (t.v.s.) 53 16.03.18 07:00 Сейчас в теме
(8)
&После("ПриОпределенииИсключенийНеразделенныхДанных")
Процедура Фикс_ПриОпределенииИсключенийНеразделенныхДанных(Исключения)
	
	//Раскомментировать Возврат, если используется разделение
	//Возврат;
	
	Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
		//Справочники
		Для Каждого ОбъектМетаданных Из Метаданные.Справочники Цикл
			Расш = ОбъектМетаданных.РасширениеКонфигурации();
			Если Расш <> Неопределено Тогда
				Если ОбъектМетаданных.ПринадлежностьОбъекта = Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный Тогда
					Исключения.Добавить(ОбъектМетаданных);					
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		//Регистры сведений
		Для Каждого ОбъектМетаданных Из Метаданные.РегистрыСведений Цикл
			Расш = ОбъектМетаданных.РасширениеКонфигурации();
			Если Расш <> Неопределено Тогда
				Если ОбъектМетаданных.ПринадлежностьОбъекта = Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный Тогда
					Исключения.Добавить(ОбъектМетаданных);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		//Документы
		Для Каждого ОбъектМетаданных Из Метаданные.Документы Цикл
			Расш = ОбъектМетаданных.РасширениеКонфигурации();
			Если Расш <> Неопределено Тогда
				Если ОбъектМетаданных.ПринадлежностьОбъекта = Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный Тогда
					Исключения.Добавить(ОбъектМетаданных);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		//Планы обмена
		Для Каждого ОбъектМетаданных Из Метаданные.ПланыОбмена Цикл
			Расш = ОбъектМетаданных.РасширениеКонфигурации();
			Если Расш <> Неопределено Тогда
				Если ОбъектМетаданных.ПринадлежностьОбъекта = Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный Тогда
					Исключения.Добавить(ОбъектМетаданных);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры
Показать
10. zender911 Васюткин (zender911) 18.03.18 15:37 Сейчас в теме
Огромное спасибо, все получилось. Только один вопрос, ну это понятно, что не к вам, а к разработчикам. Получается все равно нужно править конфигурацию, а вроде как, этого мы хотели избежать с помощью расширений, ну может исправят в будущем...
11. Виктор Третьяков (t.v.s.) 53 18.03.18 19:08 Сейчас в теме
(10) Ну теоретически можно и не править, расширением оно тоже работает.
Другое дело, что если вы хотите использовать новые возможности, то нужно режим совместимости у конфигурации менять. Но это меняет только корень, да и в последующем новые релизы будут штатно поддерживать 8.3.11
Оставьте свое сообщение