Почему возникает ошибка «Ожидается символ '('» при синтаксическом контроле процедуры в 1С?

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

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


{Документ.ОказаниеУслуг.МодульМенеджера(2,17)}: Ожидается символ '('
Процедура Печать<<?>> для формирования печатной формы документа(ТабДок, Ссылка) Экспорт (Проверка: Сервер)
{Документ.ОказаниеУслуг.МодульМенеджера(2,35)}: Ожидается символ '='
Процедура Печать для формирования <<?>>печатной формы документа(ТабДок, Ссылка) Экспорт (Проверка: Сервер)

Рассмотрим подробно причины возникновения данной проблемы, разберем синтаксические правила именования идентификаторов в языке 1С и изучим способы исправления и оптимизации исходного кода.

Выясняем причину синтаксической ошибки

Посмотрим на ключевое слово Процедура и текст после него. В исходном коде написано:


Процедура Печать для формирования печатной формы документа(ТабДок, Ссылка) Экспорт

Платформа 1С считывает первое слово после ключевого слова Процедура как имя процедуры. В данном случае имя определено как Печать. В соответствии с синтаксисом языка BSL сразу за именем процедуры должна следовать открывающая скобка ( с перечислением параметров.

Однако синтаксический анализатор обнаруживает после слова Печать пробел и следующее слово для. Компилятор пытается интерпретировать этот текст согласно грамматике языка и выдает две ошибки:

  1. Ожидается символ '(' — так как после имени процедуры Печать ожидается начало списка параметров.
  2. Ожидается символ '=' — компилятор пытается сопоставить последующий текст с другими возможными синтаксическими конструкциями (например, присваиванием).

Правила именования идентификаторов в 1С

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

  1. Имя может состоять из букв (русского или латинского алфавита), цифр и знака подчеркивания _.
  2. Имя не может содержать пробелы, знаки препинания и большинство специальных символов.
  3. Первый символ имени должен быть буквой или знаком подчеркивания (имя не может начинаться с цифры).

Важно не путать Синоним объекта (наименование для пользователей в интерфейсе, которое может содержать любые символы и пробелы) и Имя (идентификатор в коде BSL и метаданных).

Исправление названия процедуры и макета

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

Посмотрим на правильный вариант объявления процедуры:


Процедура Печать(ТабДок, Ссылка) Экспорт
    // Код процедуры
КонецПроцедуры

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

Проанализируем весь модуль процедуры печати и обратим внимание на дополнительные недочеты, которые стоит исправить:

  1. Имя макета: Вызов ПолучитьМакет("Печать для формирования печатной формы документа") также содержит пробелы. В конфигураторе макет должен иметь имя без пробелов, например Печать.
  2. Избыточное обращение к менеджеру: Если код находится в модуле менеджера объекта (например, Документ.ОказаниеУслуг), нет необходимости вызывать Документы.ОказаниеУслуг.ПолучитьМакет(...). Достаточно вызвать контекстный метод ПолучитьМакет("Печать").
  3. Опечатки в именах реквизитов: В поле запроса указано Колличество с двумя буквами «л». Имена полей в запросе должны строго соответствовать реквизитам табличной части в конфигураторе (как правило, Количество).
  4. Подсчет итогов: Подсчет сумм вручную в цикле СуммаИтог = СуммаИтог + ВыборкаПереченьНоменклатуры.Сумма работает, но более эффективным подходом в 1С является получение итогов прямо в запросе с помощью агрегатной функции СУММА() и секции ИТОГИ.

Итоговый корректный вариант кода

Приведем исправленный и очищенный от ошибок вариант процедуры печати:


Процедура Печать(ТабДок, Ссылка) Экспорт

    Макет = ПолучитьМакет("Печать");
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ОказаниеУслуг.Дата КАК Дата,
    |    ОказаниеУслуг.Клиент КАК Клиент,
    |    ОказаниеУслуг.Мастер КАК Мастер,
    |    ОказаниеУслуг.Номер КАК Номер,
    |    ОказаниеУслуг.Склад КАК Склад,
    |    ОказаниеУслуг.ПереченьНоменклатуры.(
    |        НомерСтроки КАК НомерСтроки,
    |        Номенклатура КАК Номенклатура,
    |        Количество КАК Количество,
    |        Цена КАК Цена,
    |        Сумма КАК Сумма
    |    ) КАК ПереченьНоменклатуры
    |ИЗ
    |    Документ.ОказаниеУслуг КАК ОказаниеУслуг
    |ГДЕ
    |    ОказаниеУслуг.Ссылка В (&Ссылка)";

    Запрос.Параметры.Вставить("Ссылка", Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();

    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    Шапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьПереченьНоменклатурыШапка = Макет.ПолучитьОбласть("ПереченьНоменклатурыШапка");
    ОбластьПереченьНоменклатуры = Макет.ПолучитьОбласть("ПереченьНоменклатуры");
    ОбластьИтог = Макет.ПолучитьОбласть("Всего");

    ТабДок.Очистить();
    ВставлятьРазделительСтраниц = Ложь;

    Пока Выборка.Следующий() Цикл
        Если ВставлятьРазделительСтраниц Тогда
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;

        ТабДок.Вывести(ОбластьЗаголовок);
        Шапка.Параметры.Заполнить(Выборка);
        ТабДок.Вывести(Шапка, Выборка.Уровень());

        ТабДок.Вывести(ОбластьПереченьНоменклатурыШапка);
        ВыборкаПереченьНоменклатуры = Выборка.ПереченьНоменклатуры.Выбрать();
        
        СуммаИтог = 0;
        Пока ВыборкаПереченьНоменклатуры.Следующий() Цикл
            ОбластьПереченьНоменклатуры.Параметры.Заполнить(ВыборкаПереченьНоменклатуры);
            ТабДок.Вывести(ОбластьПереченьНоменклатуры, ВыборкаПереченьНоменклатуры.Уровень());
            СуммаИтог = СуммаИтог + ВыборкаПереченьНоменклатуры.Сумма;
        КонецЦикла;

        ОбластьИтог.Параметры.ВсегоПоДокументу = СуммаИтог;
        ТабДок.Вывести(ОбластьИтог);

        ВставлятьРазделительСтраниц = Истина;
    КонецЦикла;

КонецПроцедуры

Соблюдение правил именования и использование корректных идентификаторов в коде BSL исключает ошибки компиляции и обеспечивает стабильную работу модуля.

← На главную