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


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

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

Платформа версии 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. Заставить систему игнорировать наши объекты, для этого в модуле ИнтеграцияСТехнологиейСервиса есть процедура ПриОпределенииИсключенийНеразделенныхДанных

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

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

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

41 Comments

  1. kwazi

    какой режим совместимости у конфигурации?

    Reply ↓
  2. t.v.s.

    (1)

    «Не использовать», если у вас платформа 8.3.11;

    «8.3.11», если у вас платформа 8.3.12

    Reply ↓
  3. mitia.mackarevich

    Смотрите на версию БСП, раньше такая же проблема с ролями была. Прежде чем что то добавить в типовой на базе БСП, имеет смысл посмотреть какие типы объектов расширения она поддерживает (сама БСП). Для этого есть справочник «Идентификаторы объектов расширения» . Раньше такая проблема была с ролями, в 2.4 проблему решили. Поэтому эта проблема не новость

    Reply ↓
  4. t.v.s.

    (3) Вы правы, что нужно смотреть какие возможности поддерживает БСП. Моя статья о том, что делать, когда «нельзя, но очень хочется»

    Reply ↓
  5. Dmitriy_Kolesnikov

    Интересно, а в ИТС вы об этом писали? Разработчики в курсе?

    Reply ↓
  6. t.v.s.

    (5)Я полагаю, что разработчики в курсе и с новых версиях БСП это будет исправлено

    Reply ↓
  7. user676977_slkruto

    Виктор, спасибо! Тоже столкнулся с такой ошибкой при обновлении. С этим расширением все прошло отлично!

    Reply ↓
  8. zender911

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

    Так, а что конкретно прописали, можно поподробнее ?

    Reply ↓
  9. t.v.s.

    (8)

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

    Показать

    Reply ↓
  10. zender911

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

    Reply ↓
  11. t.v.s.

    (10) Ну теоретически можно и не править, расширением оно тоже работает.

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

    Reply ↓
  12. hanio

    Дорогой ты просто чудо сделал понимаешь? я думал все кранты моему расширению придется подождать обновления БСП в конфигурации ЗУП 3.1, потом накатить обновления и уже потом цеплять расширение. Но с твоим расширением все идентификаторы появились даже на моей версии БВСП 2.4.2.124. ТАК ДЕРЖАТЬ!!!

    Reply ↓
  13. hanio

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

    Reply ↓
  14. t.v.s.

    В ближайшем будущем проверю как дела с перечислениями, если что доделаю расширение. Мы на 8.3.12 перешли совсем недавно, месяца три назад

    Reply ↓
  15. dinn

    Спасибо! Реально с расширениями пока как на минном поле, вроде с поддержки не снимаешь и должно быть меньше времени уходить, но функционал расширения всеравно приходится проверять и адаптировать под обновления конфигурации.

    Reply ↓
  16. Brawler

    Я до такого сам дошел, однако не все проблемы это дело решает.

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

    Тогда приходится лезть и ломать эту проверку все так же редактируя типовыую.

    В БСП 3.Х ряд проблем 1С уже порешала давно, однако в типовых пока этой БСП не видел.

    Reply ↓
  17. t.v.s.

    (16)

    В БСП 3.Х ряд проблем 1С уже порешала давно, однако в типовых пока этой БСП не видел.

    Есть стойкое ощущение, что мы БСП 3 еще не скоро увидим в типовых

    Тогда приходится лезть и ломать эту проверку все так же редактируя типовыую.

    Либо опять же перекрывать проверку в расширении.

    Reply ↓
  18. Brawler

    (17) пытался, но видимо в ряде ситуаций перекрываемый код не хочет перекрываться при запуске системы, возможно это багофичи такие в платформе

    Reply ↓
  19. Brawler

    Придумали как обходить ошибки связанные со сменой режима совместимости с 8.3.10 на 8.3.12?

    Например, если к примеру в ERP под юзером с правами маркетолога и манагера по продажам попытаться открыть справочник номенклатуры то ловится ошибка


    {ОбщийМодуль.ПодборТоваровСервер.Модуль(2872)}: Поле объекта не обнаружено (ВидыНоменклатурыСоздать)

    Форма.Элементы.ВидыНоменклатурыСоздать.Видимость = Ложь;

    Я воспринимаю это как ошибку платформы, так как что-то не нашел в описании к платформе 8.3.12 такого нового поведения.

    Суть того что происходит: В форме списка номенклатуры есть панель справа в которой можно осуществлять навигацию по иерархии папок или видов номенклатуры. В навигации по видам номенклатуры используется динамический список по справочнику ВидыНоменклатуры. В этом списке есть контекстное меню с добавленными разработчиками конфигурации вручную командами типа Создать, СоздатьГруппу… Команды самые стандартные, платформенные. В коде же разработчики конфы проверяют есть ли у юзера права на редактирование справочника ВидыНоменклатуры и если их нет, то программно прячут пункты контекстного меню. Но вот на 8.3.12 по видимому платформа стала сама прятать эти пункты меню со стандартными командами, если у юзера нет прав. В итоге имеем массу ошибок. Было дело думаю давай заглушек расширением наставлю, а оно то в одном месте, то в другом глюк, и сразу бросил это дело, так как так можно всю конфу заплатками облепить.

    Reply ↓
  20. t.v.s.
    Reply ↓
  21. Brawler

    (20) ну да, временный компромисс

    Reply ↓
  22. t.v.s.

    (21) А чтобы не городить такое в куче мест, можно перехватить процедуру ПриСозданииНаСервере из переопределяемого общего модуля. По крайней мере в УТ, КА и ERP 95% форм в него заходят. Весь код в одном месте будет и удалить потом легко

    Reply ↓
  23. Brawler

    (22) Идея понятна.

    Если не секрет, какой объем затычек таким образом сделан?

    В 1С не писали по этой фиче?

    Может это реально косяк такой.

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

    Reply ↓
  24. АлександрЯрославичъ

    Спасибо Вам! Помогло данное решение.

    Reply ↓
  25. АлександрЯрославичъ

    (17)

    Есть стойкое ощущение, что мы БСП 3 еще не скоро увидим в типовых

    Поддерживаю )))

    (17)

    Либо опять же перекрывать проверку в расширении.

    Верно, у меня получилось

    Reply ↓
  26. Help Center

    Спасибо

    Reply ↓
  27. wing

    А что делать, если все выше написанное не помогает? При обновлении все равно выдается сообщение об ошибке…

    1С жалуется на справочник и регистр сведений.

    В расширении перекрыт метод &После(«ПриОпределенииИсключенийНеразделенныхДанных») модуля ИнтеграцияСТехнологиейСервиса, в менеджере справочника ИдентификаторыОбъектовМетаданных перекрыт &Вместо(«СвойстваКоллекцийОбъектовМетаданных»).

    Чего ей ещё не хватает?

    Reply ↓
  28. t.v.s.

    (27) Какая у вас версия платформы и режим совместимости? И скриншот ошибки было бы неплохо

    Reply ↓
  29. wing

    (28) Да ошибка та же, что у вас в заголовке темы, только имена объектов другие: справочник и регистр сведений.

    Платформа 8.3.11.3034, режим совместимости: не использовать. Конфигурация УП. Модифицированная псевдофранчами (судя по ужастному коду). Пытался обновить до версии 2.4.2.144. Но первый запуск после обновления вызывает «рекурсию»: упомянутая выше ошибка с возможностью лишь выйти, перезапустить, или открыть обработку, т.е. обновление не завершается.

    Reply ↓
  30. t.v.s.

    (29) А расширение вообще применилось? Снимите у него безопасный режим и защиту от опасных действий

    Reply ↓
  31. wing

    (30) Спасибо большое. Поиграть с галками расширения не догадался. Самим расширением то пользуемся уже давно, т.е. оно не могло не примениться. Если б оно было новое, то проще было бы отключить, но данные терять не хочется…

    Reply ↓
  32. wing

    Вопрос не совсем по статье, но тоже в тему расширений, вдруг уже были мысли: Как будет правильно настроить обновление данных при изменении версии расширения? Какие модули и функции стоит перекрыть, и как проверить сам факт изменения версии, чтобы вызвать нужные обработчики?

    Ситуация на данный момент самая стандартная: производится перенос изменений из основной базы в расширение. Это должно вызвать и перенос данных в объекты расширения. Для каждого этапа ваять отдельную обработку переноса несколько нелогично. Корректнее было бы использовать типовой механизм обновления, но с опорой уже на версию расширения, а не подсистемы.

    Reply ↓
  33. t.v.s.

    (32) Таким вопросом не задавался, но думаю стоит посмотреть как это сделано в БСП и перекрыть нужные методы

    Reply ↓
  34. wing

    (33) Этот вопрос решил. там всего 2 модуля надо перекрыть и один добавить. Довольно просто.

    Но при переносе объектов из конфы в расширение обнаружена серьезная проблема: Есть справочник, в котором есть только Наименование и еще один реквизит — строка без ограничений. Этот справочник невозможно открыть в 1С, — выдается ошибка «Отсутствует отображение для типа ‘<некий_guid>'». У справочника нет ни одной формы. Не понимаю, чего ему от меня надо…?

    Еще хуже обстоит дело с регистром сведений, — выдается ошибка «Отсутствует отображение для типа ‘<некий_guid>'» и далее две кнопки: Закрыть или Перезапустить. Но у РС я догадываюсь о возможной причине: в одном из измерений используется перечисление, а перечисления в расширения добавлены только в 12 релизе. Будем думать, что это глюк именно 11 релиза…

    Но почему простейший справочник нельзя создать в расширении? — это непонятно…

    Да. Пробовал менять вид расширения, — не помогает (предположил, что новые объекты будут работать только в режиме «Дополнение»).

    Reply ↓
  35. Cyberhawk

    Думаю, нужно добавить в статью текст ошибки в виде текста, чтобы вероятность ее нахождения другими по тексту ошибки стала ненулевой

    Reply ↓
  36. uvl

    Я так понимаю, что в УТ 11.1.10 еще не было модуля ИнтеграцияСТехнологиейСервиса есть процедура ПриОпределенииИсключенийНеразделенныхДанных. ? Как быть в этом случае?

    Reply ↓
  37. uvl

    (36)

    ПриОпределенииИсключенийНеразделенныхДанных

    точно не было, проверил. Есть мысли что за модуль ему предшествовал?

    Reply ↓
  38. uvl

    (37) версия БСП 2.2.5.33

    Reply ↓
  39. t.v.s.

    (37) Попробуйте тогда просто не делать то что с ним связано

    Reply ↓
  40. uvl

    У меня вот какая история, расширения имеют элементы

    Документ.bk1_ПримененныеСкидки, РегистрСведений.bk1_ПримененныеСкидки в виде объектов, которые созданы только в расширении. И в этом случае я не могу их например включить в состав ОбластьДанныхОсновныеДанные, так как элементы не видны для конфигурации.:

    {ОбщийМодуль.РаботаВМоделиСервиса.Модуль(4014)}: Обнаружены ошибки в структуре метаданных конфигурации:

    1. Все объекты метаданных, не входящие в состав разделителей БСП (

    ОбластьДанныхОсновныеДанные,

    ОбластьДанныхВспомогательныеДанные),

    должны быть включены в состав подписок на события

    (

    КонтрольНеразделенныхНаборовЗаписейПриЗаписи,

    КонтрольНеразделенныхНаборовЗаписейПриЗаписиТехнологияСервис­а,

    КонтрольНеразделенныхОбъектовПриЗаписи,

    КонтрольНеразделенныхОбъектовПриЗаписиТехнологияСервиса,

    КонтрольНеразделенныхОбъектовПриЗаписиЭД),

    контролирующих

    невозможность записи неразделенных данных в разделенных сеансах.

    Следующие объекты метаданных не удовлетворяют этому критерию: Документ.bk1_ПримененныеСкидки, РегистрСведений.bk1_ПримененныеСкидки.

    ВызватьИсключение РезультирующееИсключение;

    Reply ↓
  41. t.v.s.

    (40)Включите в конфигураторе останов по ошибке, возмодно процедура называется по-другому

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *