При выполнении процедуры возврата конфигурации на типовую поддержку или при попытке "силового" обновления (загрузки .cf файла) часто возникает неприятная ситуация. Процесс загрузки проходит успешно, но на этапе обновления информационной базы в режиме «Предприятие» система выдает ошибку, в тексте которой фигурирует переменная СтрокаВерсии2. Чаще всего это сопровождается системным сообщением: «Значение не является значением объектного типа» или «Преобразование значения к типу Число не может быть выполнено».
Рассмотрим подробно, почему это происходит, где именно в коде БСП (Библиотеки стандартных подсистем) скрывается проблема и как корректно завершить переход на типовую базу, чтобы подготовить её к работе в облаке или обычном режиме.
Проанализируем архитектуру современных конфигураций 1С. Почти все они (Бухгалтерия предприятия, УНФ, ЗУП, УТ 11) построены на базе БСП. Эта библиотека жестко контролирует процесс обновления. В базе данных хранятся сведения о текущих версиях всех установленных подсистем, а в метаданных конфигурации — сведения о том, какая версия должна быть.
Когда мы заменяем доработанную конфигурацию на типовую методом Загрузить конфигурацию из файла, мы нарушаем логическую цепочку обновлений. В информационной базе остаются записи о старых версиях (возможно, специфических для доработки), а новый код типовой конфигурации ожидает стандартный формат строк версий. Ошибка СтрокаВерсии2 возникает в момент вызова функции сравнения версий. Если одна из сравниваемых строк оказывается пустой (Неопределено или пустая строка), механизмы БСП «падают», так как не могут распарсить номер версии (например, «3.0.140.20») в числовой массив.
Разберем самый надежный способ найти «виновника» — подсистему, которая передает некорректное значение. Для этого нам понадобится конфигуратор.
Скорее всего, мы окажемся в общем модуле ОбновлениеИнформационнойБазыСлужебный или в модуле работы со строками. Посмотрим на стек вызовов. Нас интересуют функции, подобные этим:
Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт
// Здесь система пытается разбить строку по точкам и сравнить части
КонецФункции
В момент остановки наведем курсор на переменную СтрокаВерсии2. Если там Неопределено, поднимемся выше по стеку вызовов, чтобы понять, какая именно подсистема (например, «СтандартныеПодсистемы», «ЗарплатаКадры» или какая-то ваша старая доработка) вернула это пустое значение.
После того как мы выяснили, что система не может найти версию какой-то части программы, нам нужно «подсказать» ей текущее состояние. Данные о версиях хранятся в специальных регистрах. Разберем шаги по их проверке.
Основной регистр, который стоит проверить — Параметры работы программы. В некоторых конфигурациях он может называться Установленные обновления или Версии подсистем.
Параметры работы программы.СтрокаВерсии2.Для исправления можно вручную вписать текущую версию конфигурации (ее можно посмотреть в окне «О программе»).
Иногда система «застревает» на этапе проверки и не дает запустить механизмы обновления, которые могли бы автоматически поправить регистры. Попробуем запустить процедуру регистрации обновления принудительно.
Создадим ярлык для запуска 1С или пропишем в дополнительных параметрах запуска в стартере следующую команду:
/C СтартОбновленияИнформационнойБазы
Этот параметр заставляет БСП игнорировать некоторые проверки и сразу переходить к процедурам обновления и регистрации новых версий подсистем в базе данных. В ряде случаев это позволяет автоматически заполнить пустую СтрокуВерсии2 актуальными данными из метаданных.
Разберем ситуацию, когда простая загрузка .cf не помогает. Чтобы вернуть конфигурацию на полную поддержку («замок») и избежать ошибок метаданных, рекомендуется следующий алгоритм:
.cf той же версии, что и база).Если ошибка возникает в специфическом месте и вы не можете изменить данные в регистрах, можно временно добавить в код проверку, чтобы система не «падала» при пустой строке. Посмотрим на пример модификации функции сравнения:
// В модуле, где происходит сравнение версий
Если СтрокаВерсии2 = Неопределено Или ПустаяСтрока(СтрокаВерсии2) Тогда
СтрокаВерсии2 = "0.0.0.0"; // Принудительно устанавливаем минимальную версию
КонецЕсли;
Важно: Это временная мера! После того как обновление информационной базы будет успешно завершено, все подобные правки в типовом коде нужно откатить, иначе вы потеряете возможность автоматического обновления в будущем.
Ошибка СтрокаВерсии2 — это не приговор конфигурации, а следствие нарушения логики БСП при обновлении. Проанализируем ситуацию еще раз: система пытается сравнить то, что есть в базе, с тем, что пришло в новом коде. Если вы переходите на типовую версию для облака, ваша задача — добиться чистого списка подсистем в регистре Параметры работы программы, соответствующего типовому набору .cf файла. Используйте отладчик для поиска пустых значений и не забывайте про очистку кэша — часто именно старые данные в памяти заставляют систему обращаться к несуществующим уже переменным.