Как все хорошо начиналось
Платформа версии 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 = 'Справочник'");
Вот теперь красота и умиротворение.
В присоединенном файле находится расширение, оно полностью повторяет то что написано в статье. Просто добавьте его в свою конфигурацию перед обновлением.
Надеюсь мой опыт кому-то пригодится и поможет сэкономить несколько часов жизни. Обсуждения и конструктивная критика приветствуются.
какой режим совместимости у конфигурации?
(1)
«Не использовать», если у вас платформа 8.3.11;
«8.3.11», если у вас платформа 8.3.12
Смотрите на версию БСП, раньше такая же проблема с ролями была. Прежде чем что то добавить в типовой на базе БСП, имеет смысл посмотреть какие типы объектов расширения она поддерживает (сама БСП). Для этого есть справочник «Идентификаторы объектов расширения» . Раньше такая проблема была с ролями, в 2.4 проблему решили. Поэтому эта проблема не новость
(3) Вы правы, что нужно смотреть какие возможности поддерживает БСП. Моя статья о том, что делать, когда «нельзя, но очень хочется»
Интересно, а в ИТС вы об этом писали? Разработчики в курсе?
(5)Я полагаю, что разработчики в курсе и с новых версиях БСП это будет исправлено
Виктор, спасибо! Тоже столкнулся с такой ошибкой при обновлении. С этим расширением все прошло отлично!
Заставить систему игнорировать наши объекты, для этого в модуле ИнтеграцияСТехнологиейСервиса есть процедура ПриОпределенииИсключенийНеразделенныхДанных
Так, а что конкретно прописали, можно поподробнее ?
(8)
Показать
Огромное спасибо, все получилось. Только один вопрос, ну это понятно, что не к вам, а к разработчикам. Получается все равно нужно править конфигурацию, а вроде как, этого мы хотели избежать с помощью расширений, ну может исправят в будущем…
(10) Ну теоретически можно и не править, расширением оно тоже работает.
Другое дело, что если вы хотите использовать новые возможности, то нужно режим совместимости у конфигурации менять. Но это меняет только корень, да и в последующем новые релизы будут штатно поддерживать 8.3.11
Дорогой ты просто чудо сделал понимаешь? я думал все кранты моему расширению придется подождать обновления БСП в конфигурации ЗУП 3.1, потом накатить обновления и уже потом цеплять расширение. Но с твоим расширением все идентификаторы появились даже на моей версии БВСП 2.4.2.124. ТАК ДЕРЖАТЬ!!!
Виктор вы не забудете что там еще перечисления и прочее будет появляться я уже перешел на платформу 8.3.121440 из-за перечислений так что думаю надо свое расширение вам своевременно обновлять.
В ближайшем будущем проверю как дела с перечислениями, если что доделаю расширение. Мы на 8.3.12 перешли совсем недавно, месяца три назад
Спасибо! Реально с расширениями пока как на минном поле, вроде с поддержки не снимаешь и должно быть меньше времени уходить, но функционал расширения всеравно приходится проверять и адаптировать под обновления конфигурации.
Я до такого сам дошел, однако не все проблемы это дело решает.
В типовых бывает есть и проверка версии текущего режима совместимости установленного в конфе с тем что в коде зашит как поддерживаемый.
Тогда приходится лезть и ломать эту проверку все так же редактируя типовыую.
В БСП 3.Х ряд проблем 1С уже порешала давно, однако в типовых пока этой БСП не видел.
(16)
Есть стойкое ощущение, что мы БСП 3 еще не скоро увидим в типовых
Либо опять же перекрывать проверку в расширении.
(17) пытался, но видимо в ряде ситуаций перекрываемый код не хочет перекрываться при запуске системы, возможно это багофичи такие в платформе
Придумали как обходить ошибки связанные со сменой режима совместимости с 8.3.10 на 8.3.12?
Например, если к примеру в ERP под юзером с правами маркетолога и манагера по продажам попытаться открыть справочник номенклатуры то ловится ошибка
{ОбщийМодуль.ПодборТоваровСервер.Модуль(2872)}: Поле объекта не обнаружено (ВидыНоменклатурыСоздать)
Форма.Элементы.ВидыНоменклатурыСоздать.Видимость = Ложь;
Я воспринимаю это как ошибку платформы, так как что-то не нашел в описании к платформе 8.3.12 такого нового поведения.
Суть того что происходит: В форме списка номенклатуры есть панель справа в которой можно осуществлять навигацию по иерархии папок или видов номенклатуры. В навигации по видам номенклатуры используется динамический список по справочнику ВидыНоменклатуры. В этом списке есть контекстное меню с добавленными разработчиками конфигурации вручную командами типа Создать, СоздатьГруппу… Команды самые стандартные, платформенные. В коде же разработчики конфы проверяют есть ли у юзера права на редактирование справочника ВидыНоменклатуры и если их нет, то программно прячут пункты контекстного меню. Но вот на 8.3.12 по видимому платформа стала сама прятать эти пункты меню со стандартными командами, если у юзера нет прав. В итоге имеем массу ошибок. Было дело думаю давай заглушек расширением наставлю, а оно то в одном месте, то в другом глюк, и сразу бросил это дело, так как так можно всю конфу заплатками облепить.
(20) ну да, временный компромисс
(21) А чтобы не городить такое в куче мест, можно перехватить процедуру ПриСозданииНаСервере из переопределяемого общего модуля. По крайней мере в УТ, КА и ERP 95% форм в него заходят. Весь код в одном месте будет и удалить потом легко
(22) Идея понятна.
Если не секрет, какой объем затычек таким образом сделан?
В 1С не писали по этой фиче?
Может это реально косяк такой.
Хотя с другой стороны судя по тому количеству кода, что они пишут сейчас в типовой сами, наверное это их забадало и решили платформу научить делать скрытие кнопок самостоятельно.
Спасибо Вам! Помогло данное решение.
(17)
Поддерживаю )))
(17)
Верно, у меня получилось
Спасибо
А что делать, если все выше написанное не помогает? При обновлении все равно выдается сообщение об ошибке…
1С жалуется на справочник и регистр сведений.
В расширении перекрыт метод &После(«ПриОпределенииИсключенийНеразделенныхДанных») модуля ИнтеграцияСТехнологиейСервиса, в менеджере справочника ИдентификаторыОбъектовМетаданных перекрыт &Вместо(«СвойстваКоллекцийОбъектовМетаданных»).
Чего ей ещё не хватает?
(27) Какая у вас версия платформы и режим совместимости? И скриншот ошибки было бы неплохо
(28) Да ошибка та же, что у вас в заголовке темы, только имена объектов другие: справочник и регистр сведений.
Платформа 8.3.11.3034, режим совместимости: не использовать. Конфигурация УП. Модифицированная псевдофранчами (судя по ужастному коду). Пытался обновить до версии 2.4.2.144. Но первый запуск после обновления вызывает «рекурсию»: упомянутая выше ошибка с возможностью лишь выйти, перезапустить, или открыть обработку, т.е. обновление не завершается.
(29) А расширение вообще применилось? Снимите у него безопасный режим и защиту от опасных действий
(30) Спасибо большое. Поиграть с галками расширения не догадался. Самим расширением то пользуемся уже давно, т.е. оно не могло не примениться. Если б оно было новое, то проще было бы отключить, но данные терять не хочется…
Вопрос не совсем по статье, но тоже в тему расширений, вдруг уже были мысли: Как будет правильно настроить обновление данных при изменении версии расширения? Какие модули и функции стоит перекрыть, и как проверить сам факт изменения версии, чтобы вызвать нужные обработчики?
Ситуация на данный момент самая стандартная: производится перенос изменений из основной базы в расширение. Это должно вызвать и перенос данных в объекты расширения. Для каждого этапа ваять отдельную обработку переноса несколько нелогично. Корректнее было бы использовать типовой механизм обновления, но с опорой уже на версию расширения, а не подсистемы.
(32) Таким вопросом не задавался, но думаю стоит посмотреть как это сделано в БСП и перекрыть нужные методы
(33) Этот вопрос решил. там всего 2 модуля надо перекрыть и один добавить. Довольно просто.
Но при переносе объектов из конфы в расширение обнаружена серьезная проблема: Есть справочник, в котором есть только Наименование и еще один реквизит — строка без ограничений. Этот справочник невозможно открыть в 1С, — выдается ошибка «Отсутствует отображение для типа ‘<некий_guid>'». У справочника нет ни одной формы. Не понимаю, чего ему от меня надо…?
Еще хуже обстоит дело с регистром сведений, — выдается ошибка «Отсутствует отображение для типа ‘<некий_guid>'» и далее две кнопки: Закрыть или Перезапустить. Но у РС я догадываюсь о возможной причине: в одном из измерений используется перечисление, а перечисления в расширения добавлены только в 12 релизе. Будем думать, что это глюк именно 11 релиза…
Но почему простейший справочник нельзя создать в расширении? — это непонятно…
Да. Пробовал менять вид расширения, — не помогает (предположил, что новые объекты будут работать только в режиме «Дополнение»).
Думаю, нужно добавить в статью текст ошибки в виде текста, чтобы вероятность ее нахождения другими по тексту ошибки стала ненулевой
Я так понимаю, что в УТ 11.1.10 еще не было модуля ИнтеграцияСТехнологиейСервиса есть процедура ПриОпределенииИсключенийНеразделенныхДанных. ? Как быть в этом случае?
(36)
точно не было, проверил. Есть мысли что за модуль ему предшествовал?
(37) версия БСП 2.2.5.33
(37) Попробуйте тогда просто не делать то что с ним связано
У меня вот какая история, расширения имеют элементы
Документ.bk1_ПримененныеСкидки, РегистрСведений.bk1_ПримененныеСкидки в виде объектов, которые созданы только в расширении. И в этом случае я не могу их например включить в состав ОбластьДанныхОсновныеДанные, так как элементы не видны для конфигурации.:
{ОбщийМодуль.РаботаВМоделиСервиса.Модуль(4014)}: Обнаружены ошибки в структуре метаданных конфигурации:
1. Все объекты метаданных, не входящие в состав разделителей БСП (
ОбластьДанныхОсновныеДанные,
ОбластьДанныхВспомогательныеДанные),
должны быть включены в состав подписок на события
а,
(
КонтрольНеразделенныхНаборовЗаписейПриЗаписи,
КонтрольНеразделенныхНаборовЗаписейПриЗаписиТехнологияСервис
КонтрольНеразделенныхОбъектовПриЗаписи,
КонтрольНеразделенныхОбъектовПриЗаписиТехнологияСервиса,
КонтрольНеразделенныхОбъектовПриЗаписиЭД),
контролирующих
невозможность записи неразделенных данных в разделенных сеансах.
Следующие объекты метаданных не удовлетворяют этому критерию: Документ.bk1_ПримененныеСкидки, РегистрСведений.bk1_ПримененныеСкидки.
ВызватьИсключение РезультирующееИсключение;
(40)Включите в конфигураторе останов по ошибке, возмодно процедура называется по-другому