Как исправить ошибку «Ожидается символ ')'» при объявлении процедуры в 1С?

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

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

Разбор ситуации: почему возникает ошибка?

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


Процедура ОтправкаУведомлений ( Выборка.НаименованиеОбъектаCRM, Выборка.ИдентификаторОтветившегоОператора ) Экспорт
    // Логика процедуры
КонецПроцедуры

При проверке этого модуля система выдает ошибку: {ОбщийМодуль.ПоискПропущенныхЗвонков.Модуль(350,40)}: Ожидается символ ')'. Причина кроется в использовании точек (обращения к свойствам) внутри круглых скобок при описании заголовка процедуры.

С точки зрения компилятора 1С, заголовок процедуры — это определение формальных параметров. В этом месте мы должны просто перечислить имена переменных, которые будут использоваться внутри процедуры. Эти имена должны быть простыми идентификаторами. Использование точек (например, Выборка.Наименование) здесь принципиально невозможно, так как точка подразумевает обращение к полю уже существующего объекта, а в заголовке процедуры мы только создаем «контейнеры» для будущих данных.

Формальные и фактические параметры: в чем разница?

Для понимания решения проблемы нам необходимо четко разграничить два понятия:

  1. Формальные параметры — это имена переменных, которые мы указываем в строке Процедура ИмяПроцедуры(Параметр1, Параметр2). Это «локальные имена», под которыми переданные данные будут известны внутри кода процедуры. Они не могут содержать точек.
  2. Фактические параметры — это конкретные значения или объекты, которые мы передаем в процедуру в момент ее вызова. Например: ОтправкаУведомлений(Выборка.Наименование, Выборка.Оператор). Здесь точки использовать можно и нужно, так как мы обращаемся к свойствам конкретного объекта Выборка.

Рассмотрим по шагам, как исправить код из примера, чтобы он стал работоспособным.

Шаг 1. Исправление описания процедуры

Сначала нам нужно изменить заголовок процедуры в общем модуле. Мы заменим обращения к полям выборки на простые и понятные имена переменных. Проанализируем ситуацию и перепишем заголовок:


// Правильное описание процедуры (формальные параметры)
Процедура ОтправкаУведомлений(НаименованиеОбъекта, ИдентификаторОператора, ВремяЗвонка, НомерАбонента, ИдентификаторОбъекта) Экспорт
    // Внутри процедуры мы используем эти имена как обычные переменные
    Сообщить("Звонок от: " + НомерАбонента);
КонецПроцедуры

Шаг 2. Корректный вызов процедуры

Теперь, когда процедура описана правильно, мы можем вызывать ее из нашего цикла обхода результата запроса. Именно здесь мы передаем реальные данные из выборки:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ..."; // Текст запроса из примера
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Здесь мы передаем ФАКТИЧЕСКИЕ параметры. Точки использовать МОЖНО.
    ОтправкаУведомлений(
        Выборка.НаименованиеОбъектаCRM, 
        Выборка.ИдентификаторОтветившегоОператора, 
        Выборка.ВремяИнициализацииЗвонка, 
        Выборка.НомерСКоторогоЗвонитАбонент, 
        Выборка.ИдентификаторОбъектаCRM
    );
КонецЦикла;

Оптимизация: передача объекта целиком

Передача большого количества параметров (в примере их пять) часто делает код трудночитаемым и усложняет его поддержку. Рассмотрим альтернативный подход, который считается «хорошим тоном» в разработке на 1С. Вместо перечисления всех полей по отдельности, мы можем передать в процедуру саму строку выборки или структуру.

Выясним, как это упростит наш код. В заголовке процедуры укажем только один параметр:


Процедура ОтправкаУведомлений(ДанныеЗвонка) Экспорт
    // Обращаемся к полям через переданный параметр-объект
    ИмяОбъекта = ДанныеЗвонка.НаименованиеОбъектаCRM;
    Номер = ДанныеЗвонка.НомерСКоторогоЗвонитАбонент;
    
    // Логика отправки...
КонецПроцедуры

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


Пока Выборка.Следующий() Цикл
    // Передаем всю текущую строку выборки как один параметр
    ОтправкаУведомлений(Выборка);
КонецЦикла;

Дополнительные нюансы и полезные советы

Рассмотрим еще несколько причин, по которым может возникать ошибка Ожидается символ ')', чтобы вы могли быстро их диагностировать:

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

← На главную