Каждый разработчик 1С рано или поздно сталкивается с удивительной ситуацией. Вы создаете в модуле управляемой формы новую, абсолютно уникальную функцию — например, для получения макета внешней обработки на сервере. Код выглядит просто и лаконично:
&НаСервере
Функция ПолучитьМакетЛога()
Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет("Лог");
КонецФункции
Однако при запуске синтаксической проверки конфигуратор выдает обескураживающее сообщение: «Процедура или функция с указанным именем уже определена (ПолучитьМакетЛога)». Вы пытаетесь переименовать её в случайный набор символов, но система продолжает упорно утверждать, что и это новое имя уже занято. Проанализируем, почему компилятор 1С ведет себя подобным образом, и разберем по шагам, как локализовать и устранить истинную причину этой неисправности.
Главный секрет компилятора 1С заключается в том, что он анализирует текст модуля последовательно, сверху вниз. Если в коде, расположенном выше вашей новой функции, допущена критическая структурная ошибка, парсер платформы сбивается. Он теряет границы процедур и начинает интерпретировать последующие строки некорректно.
В результате любая новая функция, написанная ниже по тексту, воспринимается системой как попытка объявить процедуру внутри другой процедуры (что в языке 1С запрещено) или как повторное объявление в неверном контексте. Вместо того чтобы прямо указать на пропущенный оператор выше, синтаксический чекер выдает ложное предупреждение о дублировании имени метода.
Рассмотрим основные синтаксические нарушения, которые приводят к такому поведению:
КонецПроцедуры или КонецФункции). Если в каком-то из предыдущих методов вы случайно стерли ключевое слово закрытия, компилятор посчитает весь последующий код продолжением этого метода.#Если... Тогда без соответствующего закрытия #КонецЕсли ломает всю структуру компиляции модуля.#Область обязательно должна заканчиваться директивой #КонецОбласти. Пропуск этой директивы часто приводит к непредсказуемым ошибкам парсинга.", компилятор воспримет последующий программный код (включая объявление вашей функции) как обычный строковый текст. Когда кавычка где-то ниже наконец закроется, остаток модуля превратится в синтаксический хаос.Если вы столкнулись с подобным поведением системы, не нужно пытаться бесконечно переименовывать метод. Применим проверенные на практике инженерные подходы для поиска проблемного участка кода.
Для начала нам нужно полностью исключить влияние внешнего окружения. Вырежьте (или закомментируйте) весь код модуля управляемой формы, кроме вашей новой функции. Запустите синтаксическую проверку (клавиши Ctrl + F7). Если ошибка исчезла, значит, сама функция написана абсолютно верно, а проблема гарантированно кроется в коде, который вы временно убрали.
Верните весь код модуля на место. Выделите весь текст (сочетание клавиш Ctrl + A) и примените автоматическое форматирование кода с помощью комбинации клавиш Alt + Shift + F.
Внимательно прокрутите модуль сверху вниз. Поскольку автоматическое форматирование выравнивает отступы строк строго в соответствии со вложенностью конструкций, вы сразу заметите аномалию. В том месте, где была пропущена закрывающая конструкция (например, КонецПроцедуры), весь последующий код получит лишний сдвиг (табуляцию) вправо. Строка, на которой начался незапланированный сдвиг, и будет являться источником проблемы.
В платформе 1С:Предприятие встроен мощный инструмент работы со структурой текста. Нажмите комбинацию клавиш Ctrl + Shift + - (минус на основной клавиатуре). Это действие свернет все процедуры, функции и области в компактные строки.
Проанализируем свернутый код:
КонецПроцедуры.Если модуль огромный, а визуальный анализ не приносит результатов, воспользуемся классическим методом поиска ошибок программирования:
Хотя в большинстве случаев виной всему является именно нарушенная структура кода, рассмотрим еще несколько ситуаций, когда платформа 1С может выдавать аналогичное сообщение.
Посмотрим на пример неправильного проектирования модуля формы. Начинающие разработчики иногда пытаются создать одноименные методы для клиентского и серверного контекста:
&НаКлиенте
Процедура РассчитатьСумму()
// Клиентская логика
КонецПроцедуры
&НаСервере
Процедура РассчитатьСумму()
// Серверная логика
КонецПроцедуры
В управляемом приложении 1С модуль формы компилируется как единое целое. Объявление процедур с одинаковыми именами, даже под разными директивами компиляции (&НаКлиенте и &НаСервере), категорически запрещено и всегда будет вызывать ошибку компиляции. Для решения этой проблемы разделяйте имена методов, добавляя контекстные префиксы, например: РассчитатьСуммуНаКлиенте() и РассчитатьСуммуНаСервере().
Иногда при обновлении версии платформы 1С:Предприятие разработчики обнаруживают, что их старый, годами работавший код перестает компилироваться. Это происходит из-за того, что фирма «1С» регулярно расширяет состав встроенного языка, добавляя новые глобальные функции (такие как СтрШаблон, СтрНайти, ПрочитатьJSON и другие).
Если в вашем коде была объявлена собственная экспортная функция с таким же именем, возникнет конфликт пространств имен. В этом случае компилятор посчитает ваше объявление попыткой переопределить системный метод. Решением здесь выступает только полное переименование вашей функции во всех местах использования.
Используя предложенные методики диагностики, вы сможете быстро находить истинные причины структурных ошибок в модулях 1С и не тратить время на бесполезное переименование корректно написанных функций.