Как исправить ошибки метаданных и синтаксиса при обновлении доработанной конфигурации 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

1. Ошибка: «На удаляемый объект есть ссылки в объектах основной конфигурации»

При обновлении платформа 1С может выдать блокирующую ошибку вида: «На удаляемый объект Справочник.ИмяСправочника.Форма.ФормаЭлемента есть ссылки в объектах основной конфигурации: Справочник.ИмяСправочника.Основная форма объекта». Посмотрим на природу этой проблемы.

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

Разберем последовательность действий для устранения конфликта:

  1. Открываем дерево метаданных и переходим к объекту, указанному в ошибке (например, Справочник.ПрограммыСтатей).
  2. Открываем окно свойств данного объекта.
  3. Находим поле «Основная форма объекта» (или «Основная форма списка» / «Основная форма выбора» в зависимости от контекста ошибки).
  4. Выбираем актуальную форму из списка существующих либо очищаем поле (устанавливаем значение по умолчанию / «Авто»).
  5. Если обновление выполняется через режим трехстороннего сравнения и объединения, проверяем, чтобы флаг обновления стоял не только на подчиненных объектах (формах), но и на свойствах самого родительского объекта метаданных.

2. Ошибка: «Переменная не определена» из-за удаления или переноса общего модуля

После успешного сохранения конфигурации при запуске в пользовательском режиме или синтаксической проверке может возникнуть ошибка: «Переменная не определена» при обращении к имени, которое ранее являлось общим модулем. Например, вызов вида:


КодКПС = ПлановыеПоказатели.НовыйКод(СтруктураКБ, ДатаНачала, ДатаОкончания, НаименованиеОМ, ВидКПС);

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

Чтобы восстановить работоспособность вызова, выполним следующие шаги:

  1. Выполняем глобальный поиск по всей конфигурации по имени вызываемой функции (в нашем примере: .НовыйКод или НовыйКод(). Это позволит определить, в какой именно новый модуль поставщик перенес данную логику.
  2. Если функция перенесена в другой модуль, корректируем вызов в нетиповом коде, указав актуальное имя общего модуля.
  3. Если разработчик полностью удалил функционал из поставки, а доработанный код продолжает в нем нуждаться, создаем собственный нетиповой общий модуль с префиксом (например, Кастом_ПлановыеПоказателиКлиентСервер), переносим туда исходный код функции из старого релиза базы и перенаправляем обращение на него.

3. Ошибка: «Оператор Возврат (Return) не может употребляться вне процедуры или функции»

При ручном переносе или некорректном объединении модулей нередко повреждается заголовок объявления процедуры или функции. Рассмотрим типичный пример сбитой структуры кода:


Процедура СогласоватьДокумент(ЭтапМаршрута, Пользователь, Знач ДатаСогласования = Неопределено) Экспорт
        , ПриложенныйФайл = Неопределено
Если НЕ Модуль_1АБ.РазрешеноСогласовыватьЭтапМаршрута(ЭтапМаршрута) Тогда
Возврат;        
КонецЕсли;
КонецПроцедуры

Выясним причину ошибки: ключевое слово Экспорт и закрывающая круглая скобка ) оказались разорваны дополнительным параметром ПриложенныйФайл, перенесенным на следующую строку. Компилятор 1С воспринимает строку с запятой как синтаксическую ошибку вне тела метода, из-за чего парсер теряет границы процедуры и сообщает, что следующий за ним оператор Возврат находится вне контекста процедуры или функции.

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


Процедура СогласоватьДокумент(ЭтапМаршрута, Пользователь, Знач ДатаСогласования = Неопределено, ПриложенныйФайл = Неопределено) Экспорт
    Если НЕ Модуль_1АБ.РазрешеноСогласовыватьЭтапМаршрута(ЭтапМаршрута) Тогда
        Возврат;        
    КонецЕсли;
    // Основной код процедуры
КонецПроцедуры

4. Ошибка: «Слишком много фактических параметров»

Ошибка времени компиляции «Слишком много фактических параметров» возникает, когда сигнатура вызываемой процедуры или функции в новом релизе изменилась, либо вызов не соответствует ее текущему объявлению. Например:


ТекСтрока = ПолучитьСтрокуДляДобавления(дзЭтапы.НайтиПоИдентификатору(Элементы.дзЭтапы.ТекущаяСтрока));

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

Разберем порядок диагностики:

  1. Переходим к определению функции через контекстное меню (горячая клавиша F12) и проверяем список формальных параметров в ее заголовке.
  2. Сравниваем модуль текущей конфигурации с модулем старой базы и конфигурацией поставщика.
  3. Если функция была доработана локально в предыдущем релизе, переносим требуемые параметры и логику их обработки в обновленный модуль.
  4. Если логика функции изменилась у поставщика, адаптируем вызывающий код в соответствии с новым механизмом получения данных.

5. Проверка целостности после объединения

Чтобы гарантированно выявить все скрытые ошибки после сложного обновления, обязательно выполняем штатный контроль платформы:

  1. В главном меню конфигуратора открываем «Конфигурация — Проверка конфигурации».
  2. Отмечаем флаги «Синтаксический контроль модулей» (включая клиентские и серверные контексты), «Поиск некорректных ссылок на объекты» и «Проверка логической целостности».
  3. Анализируем сформированный список ошибок до обновления базы данных в режиме F7.
← На главную