Почему возникает ошибка «Ожидается оператор препроцессора» при использовании директив #Удаление и #Вставка в расширениях 1С?

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

При разработке расширений для конфигураций 1С программисты часто используют аннотацию &ИзменениеИКонтроль. Этот механизм позволяет точечно изменять код типовых процедур и функций, используя специальные директивы препроцессора #Вставка и #Удаление. Однако при работе с определенными типами объектов система может выдать ошибку: «Ожидается оператор препроцессора». Для своевременного обнаружения подобных проблем на ранних этапах полезно проводить анализ состава расширений на наличие ошибок, который помогает выявить некорректные вызовы и структурные несоответствия — для этого подойдёт инструмент структурного анализа конфигураций и расширений 1С.

Выясняем причину: ограничения обычных форм

Проанализируем ситуацию. Ошибка чаще всего возникает в модулях обычных форм (Толстый клиент). Основная причина заключается в том, что механизм &ИзменениеИКонтроль вместе с директивами #Вставка, #КонецВставки, #Удаление и #КонецУдаления полноценно поддерживается платформой для модулей объектов, модулей менеджеров и управляемых форм. Чтобы исключить ошибки в самих файлах CFE, можно использовать статический анализатор кода проектов, написанный на чистом 1С.

В модулях обычных форм (которые использовались в версиях 8.1, 8.2 и сохраняются в некоторых типовых решениях на 8.3, например, УПП) работа этого механизма крайне ограничена. Платформа воспринимает символ # как начало стандартной инструкции препроцессора (такой как #Если), и, не находя в своем словаре команд слов Удаление или Вставка, сообщает о синтаксической ошибке.

Проверяем синтаксис и режим совместимости

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

  1. Позиция символа: Символ # должен быть первым в строке. Перед ним не допускаются пробелы или знаки табуляции.
  2. Отсутствие пробелов: Между символом # и командой (например, Вставка) не должно быть пробелов.
  3. Режим совместимости: Механизм &ИзменениеИКонтроль требует режима совместимости конфигурации не ниже 8.3.15. Даже если вы используете последнюю версию платформы 8.3.25, но сама база работает в режиме совместимости 8.3.12, директивы работать не будут.

Решение №1: Использование аннотации &Вместо

Поскольку &ИзменениеИКонтроль часто не срабатывает в модулях обычных форм, рассмотрим наиболее надежный способ внесения изменений — использование аннотации &Вместо. В этом случае мы полностью переопределяем функцию в расширении. Чтобы зафиксировать все подобные вмешательства для заказчика, можно подготовить анализ изменений конфигурации в формате Excel.

Посмотрим на пример реализации для функции получения групп счетов:


&Вместо("Расширение_ПолучитьГруппыСчетов")
Функция Расширение_ПолучитьГруппыСчетов_Вместо(ВидТМЦ)
    // Копируем полностью оригинальный код функции из основной конфигурации
    Перем СписокСчетов;    
    СписокСчетов = Новый СписокЗначений;
    Если ВидТМЦ = Перечисления.ВидыТМЦ.Материал тогда
        СписокСчетов.ЗагрузитьЗначения(обПолучитьМассивГруппСчета10());
        
        // Вносим свои изменения напрямую в код
        СписокСчетов.Добавить(ПланыСчетов.Основной.НайтиПоКоду("41.60"));    
        
    КонецЕсли;
    Возврат СписокСчетов;
КонецФункции

Важно: При использовании &Вместо вы берете на себя ответственность за обновление этого кода в будущем, так как система не будет автоматически контролировать изменения в основной конфигурации, как это делает &ИзменениеИКонтроль.

Решение №2: Вынос логики в общий модуль

Если логика, которую вы хотите изменить, достаточно объемная, проанализируем ситуацию на предмет архитектурной чистоты. Быстро разобраться в хитросплетениях чужого кода поможет AI-Анализатор на базе Gemini, который объяснит работу алгоритмов на естественном языке — для этих задач есть помощник разработчика 1С для проверки синтаксиса. После этого мы можем создать в расширении новый Общий модуль (с установленными флажками "Сервер", "Вызов сервера").

В этом случае в модуле формы мы можем оставить минимальное вмешательство (через &Перед или &После), а основную обработку данных вынести в расширение. Однако для обычных форм этот метод также требует осторожности, так как контекст формы (доступ к элементам управления) в общем модуле будет недоступен.

Резюме по устранению ошибки

Если вы столкнулись с ошибкой препроцессора в 1С при работе с расширением, выполните следующие действия:

← На главную