К статье
Практический материал

Разработка и Конфигурация · 13 мин

Ошибка использования встроенного языка 1С: как найти и исправить

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

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

Текст ошибки почти всегда содержит ключевую информацию: имя объекта конфигурации, номер строки в модуле и краткое описание проблемы, например «Переменная не определена», «Процедура или функция с указанным именем не определена» или «Несоответствие типов». Игнорировать эти подсказки и переписывать код «вслепую» — главная причина затянутого поиска.

Большинство таких ошибок исправляется самостоятельно за несколько минут, если действовать последовательно: локализовать строку, понять тип ошибки, внести правку и проверить модуль штатными средствами платформы. Ниже разобраны основные сценарии и порядок действий для каждого.

Как прочитать сообщение об ошибке и найти проблемное место

Первый шаг — точно определить, где возникла ошибка. В сообщении платформа указывает объект метаданных (например, «Документ.РеализацияТоваровУслуг.МодульОбъекта»), имя процедуры и номер строки в фигурных скобках, например {(45,12)} — это строка 45, позиция 12. Откройте конфигуратор, перейдите в указанный модуль и нажмите Ctrl+G, чтобы перейти к нужной строке.

Если ошибка возникает в пользовательском режиме, а конфигуратор недоступен, запишите полный текст сообщения и условия воспроизведения: какой документ, какая операция, какие данные вводились. Это существенно ускорит диагностику, особенно если ошибка плавающая и зависит от конкретных данных.

Обратите внимание на разницу между ошибкой компиляции и ошибкой выполнения. Первая обнаруживается при проверке модуля или обновлении конфигурации базы данных — код не запускается вообще. Вторая проявляется только при выполнении конкретной ветки кода, поэтому может долго оставаться незамеченной.

Ошибка при проверке модуляСинтаксическая проблема

Код не компилируется: ищите пропущенные операторы, скобки, опечатки в именах

Ошибка при выполнении операцииОшибка времени выполнения

Код синтаксически верен, но данные или контекст не соответствуют ожиданиям

Ошибка только у части пользователейПроблема данных или прав

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

Ошибка после обновления конфигурацииНесовместимость версий

Сравните изменённые модули с типовой поставкой, проверьте переименованные методы

Синтаксические ошибки: незакрытые конструкции и опечатки

Самая частая группа — нарушения синтаксиса: пропущенное КонецЕсли;, КонецЦикла; или КонецПроцедуры;, лишняя или недостающая скобка, незакрытый литерал строки в кавычках. Платформа сообщает об этом фразами вида «Ожидается символ ';'», «Неожиданный конец исходного текста» или «Синтаксическая ошибка».

Особенность таких ошибок в том, что указанная строка часто не совпадает с реальным местом проблемы. Если пропущено КонецЕсли; в середине процедуры, компилятор «споткнётся» значительно ниже — на КонецПроцедуры или следующем операторе. Поэтому при синтаксической ошибке проверяйте баланс конструкций выше указанной строки.

Быстро найти парную скобку помогает сочетание Ctrl+] — курсор перемещается к соответствующей открывающей или закрывающей скобке. Для длинных условий и циклов полезно временно свернуть блоки кода через значки сворачивания на полях редактора: визуально видно, где структура «поехала».

1c
Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
	ПроверитьДоговор(Объект.Контрагент);
КонецЕсли; // без этого оператора компилятор выдаст ошибку ниже по коду

Переменная или процедура не определена

Сообщения «Переменная не определена (ИмяПеременной)» и «Процедура или функция с указанным именем не определена» означают, что идентификатор используется раньше объявления или не существует в доступной области видимости. Типичные причины: опечатка в имени (встроенный язык регистронезависим, но символы должны совпадать), переменная объявлена внутри другой ветки условия, вызов локальной процедуры из другого модуля.

Проверьте три вещи. Во-первых, точное написание имени — используйте Ctrl+Пробел для автоподстановки, это исключает опечатки. Во-вторых, область видимости: переменная, объявленная внутри Если...КонецЕсли;, доступна после блока, но только если ветка выполнилась; безопаснее инициализировать переменные в начале процедуры. В-третьих, экспортность: процедура общего модуля доступна извне только с ключевым словом Экспорт.

Отдельный случай — вызов метода, который существует только в определённой версии платформы или режиме совместимости. Если конфигурация работала, а после обновления платформы появились ошибки «метод не обнаружен», сверьтесь с документацией по используемой версии и проверьте свойство «Режим совместимости» в свойствах конфигурации.

Несоответствие типов и ошибки преобразования

Ошибки вида «Несоответствие типов», «Преобразование значения к типу не может быть выполнено» возникают, когда операция применяется к данным несовместимого типа: строка складывается с числом, дата сравнивается со строкой, метод вызывается у значения Неопределено или NULL из запроса.

Классический сценарий — обращение к полю результата запроса, где из-за левого соединения значение равно NULL. Перед использованием такого значения проверяйте его или приводите к нужному типу. Аналогично с реквизитами составного типа: перед вызовом метода конкретного типа убедитесь, что значение заполнено и имеет ожидаемый тип.

Для диагностики используйте функции проверки и преобразования типов, а в отладчике — просмотр фактического типа переменной через окно «Вычислить выражение» (Shift+F9). Часто выясняется, что в переменной совсем не тот тип, который предполагал разработчик, — например, строка вместо ссылки из-за обмена данными.

Типичная ситуацияПричинаСпособ исправления
Ошибка при сложении значенийОдин из операндов — строка или НеопределеноПроверить заполненность, явно привести к числу
Метод не обнаружен у значения из запросаПоле содержит NULL из соединения таблицОбработать NULL в запросе или проверить значение в коде
Ошибка при сравнении датДата передана строкой из внешнего источникаПреобразовать строку в дату до сравнения
Ошибка обращения к реквизиту ссылкиСсылка пустая или битаяПроверить заполненность и существование объекта

Ошибки контекста: где код может выполняться, а где нет

Встроенный язык 1С исполняется в разных контекстах: на клиенте, на сервере, в толстом или тонком клиенте, во внешнем соединении. Часть методов доступна не везде. Например, модальные диалоги запрещены в режиме отказа от модальности, а серверные вызовы недоступны из некоторых клиентских обработчиков без директив компиляции.

Типичное сообщение — «Использование метода невозможно в данном контексте» или ошибка при вызове серверной процедуры из клиентского модуля формы. Решение — правильно расставить директивы компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Серверная логика, работающая с данными, выносится в серверные процедуры, а клиентский код только вызывает их.

Ещё один контекстный сюрприз — обращение к реквизитам объекта в модуле формы. Реквизит формы типа «ДанныеФормыСтруктура» не поддерживает прямых методов объекта: чтобы вызвать, например, запись объекта, нужно преобразовать данные формы в объект и обратно штатными средствами. Попытка вызвать метод объекта у данных формы даёт ошибку «Метод объекта не обнаружен».

Типичные ошибки
01
Правка кода по номеру строки без чтения текста ошибки — исправляется не то место, проблема остаётся
02
Вызов серверной процедуры из клиентского кода без директивы &НаСервере — ошибка контекста при выполнении
03
Использование результата запроса без проверки на NULL — ошибки преобразования на реальных данных
04
Исправление модуля без проверки конфигурации — синтаксическая ошибка обнаруживается у пользователей
05
Правка типовой конфигурации без копии модуля — при обновлении исправление теряется

Пошаговый порядок исправления ошибки

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

Порядок действий
  1. 1
    Зафиксируйте полный текст ошибки: объект, модуль, номер строки, описание, условия воспроизведения
  2. 2
    Откройте указанный модуль в конфигураторе и перейдите к строке через Ctrl+G
  3. 3
    Определите тип ошибки: синтаксис, неопределённый идентификатор, типы данных или контекст исполнения
  4. 4
    Внесите минимальную правку, устраняющую причину, а не симптом
  5. 5
    Выполните «Конфигурация → Проверка конфигурации» с включённой проверкой модулей
  6. 6
    Обновите конфигурацию базы данных (F7) и воспроизведите исходную операцию
  7. 7
    Если ошибка плавающая — пройдите код отладчиком с точкой останова на проблемной строке

Отладчик — основной инструмент для ошибок времени выполнения. Установите точку останова (F9) перед проблемной строкой, запустите отладку (F5), воспроизведите операцию и пошагово (F10/F11) проследите значения переменных через Shift+F9. В большинстве случаев причина становится очевидна за один проход: переменная пуста, тип не тот, условие не срабатывает.

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

Контрольные точки

Как проверить результат

Проверка конфигурации
Норма

Ошибок и предупреждений по исправленному модулю нет

Тревожный признак

Остались сообщения о синтаксисе или неопределённых идентификаторах

Воспроизведение операции
Норма

Операция выполняется, сообщение об ошибке не появляется

Тревожный признак

Ошибка сохраняется или появилась новая в соседнем коде

Смежные сценарии
Норма

Связанные операции (проведение, отмена, печать) работают

Тревожный признак

Исправление сломало другую ветку кода

Работа на реальных данных
Норма

Операция проходит на данных, где ошибка возникала ранее

Тревожный признак

На тестовых данных работает, на боевых — нет

Когда ошибку нельзя исправить самостоятельно

Есть ситуации, где самостоятельная правка рискованна. Если ошибка находится в типовом модуле защищённой конфигурации без исходного кода, вмешательство невозможно — нужно обновление релиза от поставщика. Если ошибка связана с обменом данными или регламентными операциями, неосторожная правка может привести к рассинхронизации баз или потере данных.

Также осторожности требуют конфигурации снятые с поддержки и сильно доработанные: правка одного модуля может конфликтовать с десятками доработок. В таких случаях перед изменением сравните модуль с поставкой предыдущего релиза через «Конфигурация → Сравнить, объединить», чтобы понять, какие изменения уже вносились.

Если ошибка возникает в механизме обмена, интеграции или фоновом задании, а её причина неочевидна, безопаснее зафиксировать ситуацию (текст ошибки, журнал регистрации, данные, на которых происходит сбой) и передать диагностику специалисту по сопровождению, чем экспериментировать с кодом на боевой базе.

Итог

Что важно запомнить

Читайте полный текст ошибки — модуль, строка и описание уже содержат половину ответа. Определите тип проблемы (синтаксис, идентификаторы, типы, контекст), внесите минимальную правку, проверьте конфигурацию и воспроизведите операцию. Работайте на копии базы, а сложные случаи в типовых и обменных механизмах передавайте специалисту.

Частые вопросы

Что делать, если ошибка указывает на строку, где всё написано правильно?

Это типичный признак синтаксической ошибки выше по коду: компилятор обнаруживает проблему с запозданием. Проверьте баланс конструкций Если/КонецЕсли, Цикл/КонецЦикла, Попытка/КонецПопытки и парность скобок во всех строках выше указанной. Используйте сворачивание блоков кода, чтобы визуально увидеть структуру процедуры.

Почему ошибка появляется только у одного пользователя?

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

Можно ли исправить ошибку без конфигуратора?

Нет, изменение программного кода модулей возможно только в конфигураторе. В пользовательском режиме можно лишь зафиксировать условия возникновения ошибки и временно обойти проблемную операцию, если бизнес-процесс это позволяет. Исключение — внешние обработки и расширения: их файл можно заменить без входа в конфигуратор основной базы.

Ошибка появилась сразу после обновления конфигурации. Что проверить в первую очередь?

Сначала убедитесь, что обновление завершилось полностью и обработчики обновления отработали без ошибок. Затем сравните проблемный модуль с предыдущим релизом: возможно, доработки конфликтуют с новым типовым кодом. Также проверьте, что версия платформы соответствует требованиям нового релиза конфигурации.

Чем отличается «Переменная не определена» от «Метод объекта не обнаружен»?

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

Как найти все места, где вызывается изменённая процедура?

В конфигураторе выделите имя процедуры, откройте контекстное меню и выберите поиск ссылок на объект или используйте глобальный поиск (Ctrl+Shift+F) по имени с областью «Вся конфигурация». Это покажет все точки вызова, которые нужно проверить после правки сигнатуры или логики процедуры.