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

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

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

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

Платформа версии 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
3
.cfe 7,95Kb 3 Скачать

См. также

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