При разработке печатных форм в платформе 1С:Предприятие начинающие разработчики часто сталкиваются с ситуацией, когда компилятор выдает ошибки синтаксиса на строке объявления процедуры. Проанализируем типичный пример сообщения об ошибке:
{Документ.ОказаниеУслуг.МодульМенеджера(2,17)}: Ожидается символ '('
Процедура Печать<<?>> для формирования печатной формы документа(ТабДок, Ссылка) Экспорт (Проверка: Сервер)
{Документ.ОказаниеУслуг.МодульМенеджера(2,35)}: Ожидается символ '='
Процедура Печать для формирования <<?>>печатной формы документа(ТабДок, Ссылка) Экспорт (Проверка: Сервер)
Рассмотрим подробно причины возникновения данной проблемы, разберем синтаксические правила именования идентификаторов в языке 1С и изучим способы исправления и оптимизации исходного кода.
Посмотрим на ключевое слово Процедура и текст после него. В исходном коде написано:
Процедура Печать для формирования печатной формы документа(ТабДок, Ссылка) Экспорт
Платформа 1С считывает первое слово после ключевого слова Процедура как имя процедуры. В данном случае имя определено как Печать. В соответствии с синтаксисом языка BSL сразу за именем процедуры должна следовать открывающая скобка ( с перечислением параметров.
Однако синтаксический анализатор обнаруживает после слова Печать пробел и следующее слово для. Компилятор пытается интерпретировать этот текст согласно грамматике языка и выдает две ошибки:
Печать ожидается начало списка параметров.Разберем основные правила, которым обязаны соответствовать идентификаторы процедур, функций, переменных и объектов метаданных:
_.Важно не путать Синоним объекта (наименование для пользователей в интерфейсе, которое может содержать любые символы и пробелы) и Имя (идентификатор в коде BSL и метаданных).
Для исправления ошибки заменим имя процедуры на корректный идентификатор без пробелов, например Печать или ПечатьДокумента.
Посмотрим на правильный вариант объявления процедуры:
Процедура Печать(ТабДок, Ссылка) Экспорт
// Код процедуры
КонецПроцедуры
Проанализируем весь модуль процедуры печати и обратим внимание на дополнительные недочеты, которые стоит исправить:
ПолучитьМакет("Печать для формирования печатной формы документа") также содержит пробелы. В конфигураторе макет должен иметь имя без пробелов, например Печать.Документ.ОказаниеУслуг), нет необходимости вызывать Документы.ОказаниеУслуг.ПолучитьМакет(...). Достаточно вызвать контекстный метод ПолучитьМакет("Печать").Колличество с двумя буквами «л». Имена полей в запросе должны строго соответствовать реквизитам табличной части в конфигураторе (как правило, Количество).СуммаИтог = СуммаИтог + ВыборкаПереченьНоменклатуры.Сумма работает, но более эффективным подходом в 1С является получение итогов прямо в запросе с помощью агрегатной функции СУММА() и секции ИТОГИ.Приведем исправленный и очищенный от ошибок вариант процедуры печати:
Процедура Печать(ТабДок, Ссылка) Экспорт
Макет = ПолучитьМакет("Печать");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслуг.Дата КАК Дата,
| ОказаниеУслуг.Клиент КАК Клиент,
| ОказаниеУслуг.Мастер КАК Мастер,
| ОказаниеУслуг.Номер КАК Номер,
| ОказаниеУслуг.Склад КАК Склад,
| ОказаниеУслуг.ПереченьНоменклатуры.(
| НомерСтроки КАК НомерСтроки,
| Номенклатура КАК Номенклатура,
| Количество КАК Количество,
| Цена КАК Цена,
| Сумма КАК Сумма
| ) КАК ПереченьНоменклатуры
|ИЗ
| Документ.ОказаниеУслуг КАК ОказаниеУслуг
|ГДЕ
| ОказаниеУслуг.Ссылка В (&Ссылка)";
Запрос.Параметры.Вставить("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
Шапка = Макет.ПолучитьОбласть("Шапка");
ОбластьПереченьНоменклатурыШапка = Макет.ПолучитьОбласть("ПереченьНоменклатурыШапка");
ОбластьПереченьНоменклатуры = Макет.ПолучитьОбласть("ПереченьНоменклатуры");
ОбластьИтог = Макет.ПолучитьОбласть("Всего");
ТабДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ТабДок.Вывести(ОбластьПереченьНоменклатурыШапка);
ВыборкаПереченьНоменклатуры = Выборка.ПереченьНоменклатуры.Выбрать();
СуммаИтог = 0;
Пока ВыборкаПереченьНоменклатуры.Следующий() Цикл
ОбластьПереченьНоменклатуры.Параметры.Заполнить(ВыборкаПереченьНоменклатуры);
ТабДок.Вывести(ОбластьПереченьНоменклатуры, ВыборкаПереченьНоменклатуры.Уровень());
СуммаИтог = СуммаИтог + ВыборкаПереченьНоменклатуры.Сумма;
КонецЦикла;
ОбластьИтог.Параметры.ВсегоПоДокументу = СуммаИтог;
ТабДок.Вывести(ОбластьИтог);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
КонецПроцедуры
Соблюдение правил именования и использование корректных идентификаторов в коде BSL исключает ошибки компиляции и обеспечивает стабильную работу модуля.