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

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

Что такое метод объекта в 1С и как с ним работать

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

Метод объекта в 1С — это процедура или функция, которая привязана к конкретному объекту встроенного языка и вызывается через точку от имени этого объекта. Когда разработчик пишет Запрос.Выполнить() или ДокументОбъект.Записать(), он вызывает именно методы: действия, которые объект умеет выполнять над собственными данными. Без понимания этой механики невозможно ни читать чужой код, ни писать собственные доработки в конфигураторе.

Методы отличаются от обычных процедур общих модулей тем, что жёстко связаны с типом объекта. У справочника есть методы НайтиПоКоду() и Выбрать(), у табличного документа — Вывести() и Записать(), у запроса — Выполнить() и Выгрузить(). Попытка вызвать метод, которого у объекта нет, приводит к ошибке времени выполнения «Метод объекта не обнаружен» — одной из самых частых у начинающих разработчиков.

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

Чем метод отличается от процедуры и функции

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

Ключевое отличие проявляется в вызове. Обычная функция из общего модуля вызывается по имени: РассчитатьСумму(Документ) — объект передаётся параметром. Метод вызывается от имени объекта: Документ.ПолучитьСумму() — объект стоит слева от точки и является контекстом выполнения. Внутри метода данные объекта доступны напрямую, без передачи через параметры.

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

Какие виды методов объектов существуют в 1С

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

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

Отдельную группу образуют методы глобального контекста — Сообщить(), Найти(), ТекущаяДата(), ЗначениеЗаполнено(). Формально они не привязаны к объекту и вызываются без точки, но в документации и синтакс-помощнике фигурируют как методы глобального контекста. Путать их с методами конкретных объектов не стоит: у них нет контекста данных.

Вызов через точку от переменнойМетод объекта

Слева от точки — объект: Запрос.Выполнить(), СправочникОбъект.Записать()

Вызов через менеджер типаМетод менеджера

Слева — менеджер: Справочники.Номенклатура.НайтиПоКоду(Код)

Вызов без точкиМетод глобального контекста или общего модуля

Сообщить(), ТекущаяДата(), либо ИмяОбщегоМодуля.ИмяФункции()

Как вызывать метод объекта: синтаксис и примеры

Базовый синтаксис одинаков для всех объектов: имя переменной или менеджера, точка, имя метода, круглые скобки с параметрами. Скобки обязательны даже без параметров — Запрос.Выполнить(), а не Запрос.Выполнить. Пропущенные скобки — типичная ошибка тех, кто переходит на 1С с других языков.

// Системный метод объекта "Запрос"

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура";

Результат = Запрос.Выполнить(); // метод-функция

Выборка = Результат.Выбрать(); // метод результата запроса

// Метод менеджера справочника

СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоКоду("000000001");

// Метод объекта справочника

Если Не СсылкаНоменклатура.Пустая() Тогда

ОбъектНоменклатура = СсылкаНоменклатура.ПолучитьОбъект();

ОбъектНоменклатура.Наименование = "Новое наименование";

ОбъектНоменклатура.Записать(); // метод-процедура

КонецЕсли;

Параметры передаются в порядке объявления; необязательные можно опускать с конца списка. Если нужно пропустить параметр в середине, ставится запятая без значения: НайтиПоНаименованию("Кресло", , Родитель). Проверить сигнатуру конкретного метода удобнее всего через контекстную подсказку: поставьте курсор после точки и нажмите Ctrl+Пробел — конфигуратор покажет список методов с типами параметров.

Где описываются собственные методы: модули объектов и менеджеров

Модуль объекта доступен у справочников, документов, планов счетов, регистров и других прикладных объектов. Процедуры и функции, объявленные в нём с ключевым словом Экспорт, становятся методами, доступными извне через точку от переменной-объекта. Без Экспорт процедура остаётся внутренней и вызывается только в пределах модуля.

Модуль менеджера служит для операций над коллекцией: поиск по произвольным условиям, пакетное создание объектов, получение печатных форм. Его экспортные методы вызываются через менеджер типа: Справочники.Номенклатура.СоздатьЭлементыПакетно(Данные). Это правильное место для логики, которой не нужен конкретный объект в памяти.

В типовых конфигурациях прямое изменение модулей затрудняет обновление: при установке релиза изменённый модуль потребует ручного сопоставления. Альтернатива — расширение конфигурации, где методы добавляются или оборачиваются аннотациями &После, &Вместо, &Перед. Такой подход сохраняет доработки при обновлении типового кода.

Как добавить свой метод к объекту через расширение
  1. 1
    Создайте расширение конфигурации и добавьте в него нужный объект, например справочник Номенклатура
  2. 2
    Откройте модуль объекта в расширении и объявите функцию с ключевым словом Экспорт
  3. 3
    Реализуйте логику, обращаясь к реквизитам объекта напрямую через ЭтотОбъект или по имени
  4. 4
    Сохраните расширение, обновите конфигурацию базы данных и проверьте вызов метода из внешнего кода
  5. 5
    Убедитесь, что типовая функциональность объекта продолжает работать без изменений

Как узнать, какие методы есть у объекта

Основной инструмент — синтакс-помощник конфигуратора (меню «Справка» или Ctrl+Shift+F1). В нём объекты сгруппированы по типам, и для каждого перечислены свойства, методы и события с описанием параметров и возвращаемых значений. Для системных методов это единственный полный и достоверный источник.

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

Третий способ — отладчик. Установите точку останова после создания объекта, запустите отладку и посмотрите значение переменной: в окне «Вычислить выражение» (Shift+F9) виден тип объекта, а по типу легко найти его методы в синтакс-помощнике. Этот приём особенно полезен, когда переменная приходит из чужого кода и её тип неочевиден.

Если подсказка после точки не появляется, чаще всего переменная объявлена без инициализации или ей присваивается результат функции с неоднозначным типом. Явно создайте объект через Новый или ПолучитьОбъект() в соседней строке — редактор определит тип и начнёт показывать методы.
ПЗ
Практическое замечание

Типичные ошибки при работе с методами объектов

Самая частая ошибка — «Метод объекта не обнаружен». Она возникает, когда у переменной не тот тип, который ожидал разработчик: например, в переменной лежит ссылка, а вызывается метод объекта Записать(). Ссылка — это лёгкий идентификатор записи, у неё нет методов изменения данных. Сначала нужно получить объект: Объект = Ссылка.ПолучитьОбъект(), и только потом вызывать Объект.Записать().

Вторая группа ошибок связана с контекстом выполнения. Методы работы с базой данных недоступны в некоторых контекстах (например, часть серверных методов нельзя вызвать на клиенте в тонком клиенте), а модуль объекта выполняется только на сервере. Попытка вызвать серверный метод из клиентского кода без директивы &НаСервере приводит к ошибке компиляции модуля.

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

Типичные ошибки
01
Вызов Записать() у ссылки вместо объекта — ошибка «Метод объекта не обнаружен», данные не сохраняются
02
Запись объектов в цикле без транзакции — резкое падение производительности и конфликты блокировок
03
Изменение типовых модулей вместо расширения — доработки теряются или конфликтуют при обновлении
04
Вызов серверного метода из клиентского контекста — ошибка компиляции модуля формы
05
Пропуск скобок при вызове метода без параметров — синтаксическая ошибка или неверная интерпретация выражения

Как проверить, что метод отработал правильно

Для методов, изменяющих данные, проверка сводится к чтению результата из базы. После Объект.Записать() убедитесь, что ссылка заполнена (Объект.Ссылка.Пустая() возвращает Ложь), а реквизиты в базе соответствуют ожиданиям — проще всего через запрос или открытие формы элемента. Для методов-функций проверяйте возвращаемое значение: НайтиПоКоду() при отсутствии элемента возвращает пустую ссылку, а не вызывает исключение, и это нужно обрабатывать явно.

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

Маршрут решения

Как выбрать способ вызова

Нужно изменить и сохранить один конкретный элементПолучите объект через ПолучитьОбъект(), измените реквизиты, вызовите Записать()
Нужно только прочитать реквизиты элементаИспользуйте обращение через точку от ссылки или запрос — ПолучитьОбъект() не требуется
Нужна массовая обработка множества элементовИспользуйте запрос для чтения и запись объектов в явной транзакции порциями
Логика применяется ко всей коллекции, а не к одному объектуРазместите метод в модуле менеджера и вызывайте через Справочники.Имя.Метод()
Итог

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

Метод объекта — процедура или функция, вызываемая через точку от объекта и работающая с его данными. Системные методы описаны в синтакс-помощнике, собственные добавляются в модулях объектов и менеджеров, желательно через расширения. Главные ошибки — вызов методов у ссылки вместо объекта и запись в цикле без транзакции.

Частые вопросы о методах объектов в 1С

Чем метод отличается от свойства объекта?

Свойство хранит данные объекта и читается или присваивается без скобок: Объект.Наименование = "Товар". Метод выполняет действие и вызывается со скобками: Объект.Записать(). В подсказке конфигуратора они показаны в одном списке, но свойства не имеют параметров и не выполняют логику.

Можно ли вызвать метод объекта на клиенте?

Зависит от метода и контекста. Методы, обращающиеся к базе данных (Записать, ПолучитьОбъект, Выполнить у запроса), доступны только на сервере. В управляемой форме серверный вызов оформляется процедурой с директивой &НаСервере, из клиентского кода её вызывают как обычную процедуру формы.

Что делать при ошибке «Метод объекта не обнаружен»?

Сначала выясните фактический тип переменной через отладчик или ТипЗнч(). Чаще всего в переменной ссылка вместо объекта, Неопределено из-за невыполненного условия или значение другого типа. Убедитесь, что метод существует для этого типа в синтакс-помощнике, и при необходимости получите объект через ПолучитьОбъект().

Как добавить метод к типовому объекту, не меняя конфигурацию?

Через расширение конфигурации: добавьте объект в расширение, откройте его модуль и объявите экспортную процедуру или функцию. Для изменения поведения существующих методов используются аннотации &Перед, &После, &Вместо. Расширение сохраняется при обновлении типовой конфигурации.

Почему метод НайтиПоНаименованию() ничего не находит, хотя элемент есть?

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

Нужно ли вызывать Записать() после каждого изменения реквизита?

Нет. Изменения реквизитов объекта накапливаются в памяти, и одного вызова Записать() после всех присваиваний достаточно. Многократная запись одного и того же объекта в цикле — лишняя нагрузка на базу и источник блокировок.