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


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

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

Платформа версии 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 не будет опубликован. Обязательные поля помечены *