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