В процессе разработки на платформе 1С:Предприятие начинающие разработчики часто сталкиваются с синтаксической ошибкой «Ожидается символ ')'». Эта ошибка может казаться сбивающей с толку, особенно когда визуально все скобки расставлены правильно. Давайте разберем природу этой ошибки на конкретном примере, проанализируем причины ее возникновения и выясним, как правильно организовывать передачу данных в процедуры и функции.
Проанализируем фрагмент кода, который вызвал затруднения у автора темы. Разработчик пытался объявить процедуру следующим образом:
Процедура ОтправкаУведомлений ( Выборка.НаименованиеОбъектаCRM, Выборка.ИдентификаторОтветившегоОператора ) Экспорт
// Логика процедуры
КонецПроцедуры
При проверке этого модуля система выдает ошибку: {ОбщийМодуль.ПоискПропущенныхЗвонков.Модуль(350,40)}: Ожидается символ ')'. Причина кроется в использовании точек (обращения к свойствам) внутри круглых скобок при описании заголовка процедуры.
С точки зрения компилятора 1С, заголовок процедуры — это определение формальных параметров. В этом месте мы должны просто перечислить имена переменных, которые будут использоваться внутри процедуры. Эти имена должны быть простыми идентификаторами. Использование точек (например, Выборка.Наименование) здесь принципиально невозможно, так как точка подразумевает обращение к полю уже существующего объекта, а в заголовке процедуры мы только создаем «контейнеры» для будущих данных.
Для понимания решения проблемы нам необходимо четко разграничить два понятия:
Процедура ИмяПроцедуры(Параметр1, Параметр2). Это «локальные имена», под которыми переданные данные будут известны внутри кода процедуры. Они не могут содержать точек.ОтправкаУведомлений(Выборка.Наименование, Выборка.Оператор). Здесь точки использовать можно и нужно, так как мы обращаемся к свойствам конкретного объекта Выборка.Рассмотрим по шагам, как исправить код из примера, чтобы он стал работоспособным.
Сначала нам нужно изменить заголовок процедуры в общем модуле. Мы заменим обращения к полям выборки на простые и понятные имена переменных. Проанализируем ситуацию и перепишем заголовок:
// Правильное описание процедуры (формальные параметры)
Процедура ОтправкаУведомлений(НаименованиеОбъекта, ИдентификаторОператора, ВремяЗвонка, НомерАбонента, ИдентификаторОбъекта) Экспорт
// Внутри процедуры мы используем эти имена как обычные переменные
Сообщить("Звонок от: " + НомерАбонента);
КонецПроцедуры
Теперь, когда процедура описана правильно, мы можем вызывать ее из нашего цикла обхода результата запроса. Именно здесь мы передаем реальные данные из выборки:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ..."; // Текст запроса из примера
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Здесь мы передаем ФАКТИЧЕСКИЕ параметры. Точки использовать МОЖНО.
ОтправкаУведомлений(
Выборка.НаименованиеОбъектаCRM,
Выборка.ИдентификаторОтветившегоОператора,
Выборка.ВремяИнициализацииЗвонка,
Выборка.НомерСКоторогоЗвонитАбонент,
Выборка.ИдентификаторОбъектаCRM
);
КонецЦикла;
Передача большого количества параметров (в примере их пять) часто делает код трудночитаемым и усложняет его поддержку. Рассмотрим альтернативный подход, который считается «хорошим тоном» в разработке на 1С. Вместо перечисления всех полей по отдельности, мы можем передать в процедуру саму строку выборки или структуру.
Выясним, как это упростит наш код. В заголовке процедуры укажем только один параметр:
Процедура ОтправкаУведомлений(ДанныеЗвонка) Экспорт
// Обращаемся к полям через переданный параметр-объект
ИмяОбъекта = ДанныеЗвонка.НаименованиеОбъектаCRM;
Номер = ДанныеЗвонка.НомерСКоторогоЗвонитАбонент;
// Логика отправки...
КонецПроцедуры
Теперь вызов процедуры в цикле станет максимально лаконичным:
Пока Выборка.Следующий() Цикл
// Передаем всю текущую строку выборки как один параметр
ОтправкаУведомлений(Выборка);
КонецЦикла;
Рассмотрим еще несколько причин, по которым может возникать ошибка Ожидается символ ')', чтобы вы могли быстро их диагностировать:
Процедура МояПроцедура(Пар1, Пар2, ), система выдаст ту же ошибку, так как после последней запятой ожидается еще один параметр, а не закрывающая скобка.Процедура, Функция, Если, Истина и другие ключевые слова языка.Знач (Value). Например: Процедура Обработка(Знач ИмяКлиента). Это гарантирует, что даже если вы измените значение ИмяКлиента внутри процедуры, в вызывающем коде оно останется прежним.Процедура Отправить(Текст, Срочно = Ложь). Помните, что все необязательные параметры должны располагаться в самом конце списка параметров.Резюмируем: основная ошибка автора заключалась в непонимании того, что в описании (декларации) процедуры мы создаем новые имена переменных, а не обращаемся к существующим данным. Соблюдение правил именования формальных параметров и использование структур для передачи большого объема данных сделают ваш код чистым, понятным и свободным от подобных синтаксических ошибок.