Разработка и Конфигурация · 13 мин
Что такое метод объекта в 1С и как с ним работать
Метод объекта в 1С — что это, чем отличается от функции и процедуры, какие бывают методы объектов, как их вызывать и какие ошибки встречаются чаще всего.
Метод объекта в 1С — это процедура или функция, которая привязана к конкретному объекту встроенного языка и вызывается через точку от имени этого объекта. Когда разработчик пишет Запрос.Выполнить() или ДокументОбъект.Записать(), он вызывает именно методы: действия, которые объект умеет выполнять над собственными данными. Без понимания этой механики невозможно ни читать чужой код, ни писать собственные доработки в конфигураторе.
Методы отличаются от обычных процедур общих модулей тем, что жёстко связаны с типом объекта. У справочника есть методы НайтиПоКоду() и Выбрать(), у табличного документа — Вывести() и Записать(), у запроса — Выполнить() и Выгрузить(). Попытка вызвать метод, которого у объекта нет, приводит к ошибке времени выполнения «Метод объекта не обнаружен» — одной из самых частых у начинающих разработчиков.
Встроенный язык 1С поддерживает два источника методов: системные, которые платформа предоставляет для объектов автоматически (справочники, документы, запросы, таблицы значений), и пользовательские, которые разработчик описывает в модулях объектов, менеджеров, форм. Вторые позволяют расширить поведение типовой конфигурации без изменения её кода — если использовать механизм расширений.
Чем метод отличается от процедуры и функции
В терминологии 1С процедура и функция — это способы описания именованного блока кода: процедура не возвращает значение, функция возвращает его через оператор Возврат. Метод — это не отдельная конструкция языка, а роль: любая процедура или функция, вызываемая в контексте объекта, становится его методом. Поэтому корректно говорить «метод-функция» НайтиПоНаименованию() возвращает ссылку, а «метод-процедура» Записать() просто выполняет действие.
Ключевое отличие проявляется в вызове. Обычная функция из общего модуля вызывается по имени: РассчитатьСумму(Документ) — объект передаётся параметром. Метод вызывается от имени объекта: Документ.ПолучитьСумму() — объект стоит слева от точки и является контекстом выполнения. Внутри метода данные объекта доступны напрямую, без передачи через параметры.
Практическое следствие: один и тот же алгоритм можно оформить и как метод (если он логически принадлежит объекту, например проверка заполнения документа), и как функцию общего модуля (если это вспомогательный расчёт, применимый к разным типам данных). Выбор влияет на читаемость кода и удобство сопровождения.
Какие виды методов объектов существуют в 1С
Системные методы встроены в платформу и появляются у объекта автоматически вместе с его типом. Справочник получает методы поиска и выборки, документ — проведения и записи, запрос — выполнения и выгрузки результата. Полный перечень для каждого типа описан в синтакс-помощнике конфигуратора, и состав методов может меняться между версиями платформы.
Пользовательские методы разработчик создаёт в модулях. В модуле объекта справочника или документа описываются процедуры и функции, работающие с данными конкретного объекта. В модуле менеджера — методы, применимые ко всей коллекции объектов типа, например поиск или создание. В модуле формы — обработчики действий пользователя и вспомогательные операции с данными формы.
Отдельную группу образуют методы глобального контекста — Сообщить(), Найти(), ТекущаяДата(), ЗначениеЗаполнено(). Формально они не привязаны к объекту и вызываются без точки, но в документации и синтакс-помощнике фигурируют как методы глобального контекста. Путать их с методами конкретных объектов не стоит: у них нет контекста данных.
Слева от точки — объект: Запрос.Выполнить(), СправочникОбъект.Записать()
Слева — менеджер: Справочники.Номенклатура.НайтиПоКоду(Код)
Сообщить(), ТекущаяДата(), либо ИмяОбщегоМодуля.ИмяФункции()
Как вызывать метод объекта: синтаксис и примеры
Базовый синтаксис одинаков для всех объектов: имя переменной или менеджера, точка, имя метода, круглые скобки с параметрами. Скобки обязательны даже без параметров — Запрос.Выполнить(), а не Запрос.Выполнить. Пропущенные скобки — типичная ошибка тех, кто переходит на 1С с других языков.
// Системный метод объекта "Запрос"
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура";
Результат = Запрос.Выполнить(); // метод-функция
Выборка = Результат.Выбрать(); // метод результата запроса
// Метод менеджера справочника
СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоКоду("000000001");
// Метод объекта справочника
Если Не СсылкаНоменклатура.Пустая() Тогда
ОбъектНоменклатура = СсылкаНоменклатура.ПолучитьОбъект();
ОбъектНоменклатура.Наименование = "Новое наименование";
ОбъектНоменклатура.Записать(); // метод-процедура
КонецЕсли;
Параметры передаются в порядке объявления; необязательные можно опускать с конца списка. Если нужно пропустить параметр в середине, ставится запятая без значения: НайтиПоНаименованию("Кресло", , Родитель). Проверить сигнатуру конкретного метода удобнее всего через контекстную подсказку: поставьте курсор после точки и нажмите Ctrl+Пробел — конфигуратор покажет список методов с типами параметров.
Где описываются собственные методы: модули объектов и менеджеров
Модуль объекта доступен у справочников, документов, планов счетов, регистров и других прикладных объектов. Процедуры и функции, объявленные в нём с ключевым словом Экспорт, становятся методами, доступными извне через точку от переменной-объекта. Без Экспорт процедура остаётся внутренней и вызывается только в пределах модуля.
Модуль менеджера служит для операций над коллекцией: поиск по произвольным условиям, пакетное создание объектов, получение печатных форм. Его экспортные методы вызываются через менеджер типа: Справочники.Номенклатура.СоздатьЭлементыПакетно(Данные). Это правильное место для логики, которой не нужен конкретный объект в памяти.
В типовых конфигурациях прямое изменение модулей затрудняет обновление: при установке релиза изменённый модуль потребует ручного сопоставления. Альтернатива — расширение конфигурации, где методы добавляются или оборачиваются аннотациями &После, &Вместо, &Перед. Такой подход сохраняет доработки при обновлении типового кода.
- 1Создайте расширение конфигурации и добавьте в него нужный объект, например справочник Номенклатура
- 2Откройте модуль объекта в расширении и объявите функцию с ключевым словом Экспорт
- 3Реализуйте логику, обращаясь к реквизитам объекта напрямую через ЭтотОбъект или по имени
- 4Сохраните расширение, обновите конфигурацию базы данных и проверьте вызов метода из внешнего кода
- 5Убедитесь, что типовая функциональность объекта продолжает работать без изменений
Как узнать, какие методы есть у объекта
Основной инструмент — синтакс-помощник конфигуратора (меню «Справка» или Ctrl+Shift+F1). В нём объекты сгруппированы по типам, и для каждого перечислены свойства, методы и события с описанием параметров и возвращаемых значений. Для системных методов это единственный полный и достоверный источник.
Второй способ — контекстная подсказка в редакторе модуля: после ввода точки конфигуратор предлагает список доступных методов и свойств. Подсказка работает, только если редактор может вывести тип переменной из контекста. Для переменных произвольного типа список может быть неполным или отсутствовать — тогда помогает явное указание типа через комментарий или обращение к синтакс-помощнику.
Третий способ — отладчик. Установите точку останова после создания объекта, запустите отладку и посмотрите значение переменной: в окне «Вычислить выражение» (Shift+F9) виден тип объекта, а по типу легко найти его методы в синтакс-помощнике. Этот приём особенно полезен, когда переменная приходит из чужого кода и её тип неочевиден.
Если подсказка после точки не появляется, чаще всего переменная объявлена без инициализации или ей присваивается результат функции с неоднозначным типом. Явно создайте объект через Новый или ПолучитьОбъект() в соседней строке — редактор определит тип и начнёт показывать методы.
Типичные ошибки при работе с методами объектов
Самая частая ошибка — «Метод объекта не обнаружен». Она возникает, когда у переменной не тот тип, который ожидал разработчик: например, в переменной лежит ссылка, а вызывается метод объекта Записать(). Ссылка — это лёгкий идентификатор записи, у неё нет методов изменения данных. Сначала нужно получить объект: Объект = Ссылка.ПолучитьОбъект(), и только потом вызывать Объект.Записать().
Вторая группа ошибок связана с контекстом выполнения. Методы работы с базой данных недоступны в некоторых контекстах (например, часть серверных методов нельзя вызвать на клиенте в тонком клиенте), а модуль объекта выполняется только на сервере. Попытка вызвать серверный метод из клиентского кода без директивы &НаСервере приводит к ошибке компиляции модуля.
Третья группа — работа с необъявленными или устаревшими методами. После обновления платформы или конфигурации отдельные методы могут быть помечены как устаревшие или удалены. Код, который работал раньше, начинает падать. Проверка модулей конфигуратором («Конфигурация — Проверка конфигурации») выявляет такие обращения до запуска.
Как проверить, что метод отработал правильно
Для методов, изменяющих данные, проверка сводится к чтению результата из базы. После Объект.Записать() убедитесь, что ссылка заполнена (Объект.Ссылка.Пустая() возвращает Ложь), а реквизиты в базе соответствуют ожиданиям — проще всего через запрос или открытие формы элемента. Для методов-функций проверяйте возвращаемое значение: НайтиПоКоду() при отсутствии элемента возвращает пустую ссылку, а не вызывает исключение, и это нужно обрабатывать явно.
Исключения методов перехватываются конструкцией Попытка ... Исключение ... КонецПопытки. В блоке исключения доступно ОписаниеОшибки() — по тексту можно понять причину: нарушение уникальности индекса, отказ в проверке заполнения, конфликт блокировок. Проглатывать исключение пустым блоком нельзя: ошибка записи, оставшаяся незамеченной, приводит к расхождению данных.
Как выбрать способ вызова
Что важно запомнить
Метод объекта — процедура или функция, вызываемая через точку от объекта и работающая с его данными. Системные методы описаны в синтакс-помощнике, собственные добавляются в модулях объектов и менеджеров, желательно через расширения. Главные ошибки — вызов методов у ссылки вместо объекта и запись в цикле без транзакции.
Частые вопросы о методах объектов в 1С
Чем метод отличается от свойства объекта?
Свойство хранит данные объекта и читается или присваивается без скобок: Объект.Наименование = "Товар". Метод выполняет действие и вызывается со скобками: Объект.Записать(). В подсказке конфигуратора они показаны в одном списке, но свойства не имеют параметров и не выполняют логику.
Можно ли вызвать метод объекта на клиенте?
Зависит от метода и контекста. Методы, обращающиеся к базе данных (Записать, ПолучитьОбъект, Выполнить у запроса), доступны только на сервере. В управляемой форме серверный вызов оформляется процедурой с директивой &НаСервере, из клиентского кода её вызывают как обычную процедуру формы.
Что делать при ошибке «Метод объекта не обнаружен»?
Сначала выясните фактический тип переменной через отладчик или ТипЗнч(). Чаще всего в переменной ссылка вместо объекта, Неопределено из-за невыполненного условия или значение другого типа. Убедитесь, что метод существует для этого типа в синтакс-помощнике, и при необходимости получите объект через ПолучитьОбъект().
Как добавить метод к типовому объекту, не меняя конфигурацию?
Через расширение конфигурации: добавьте объект в расширение, откройте его модуль и объявите экспортную процедуру или функцию. Для изменения поведения существующих методов используются аннотации &Перед, &После, &Вместо. Расширение сохраняется при обновлении типовой конфигурации.
Почему метод НайтиПоНаименованию() ничего не находит, хотя элемент есть?
Частые причины: лишние пробелы или отличия в регистре при поиске без учёта точного соответствия, поиск внутри группы, когда параметр Родитель не задан или задан неверно, и поиск помеченных на удаление элементов — по умолчанию они тоже участвуют в поиске. Проверьте точное значение наименования в базе и параметры вызова.
Нужно ли вызывать Записать() после каждого изменения реквизита?
Нет. Изменения реквизитов объекта накапливаются в памяти, и одного вызова Записать() после всех присваиваний достаточно. Многократная запись одного и того же объекта в цикле — лишняя нагрузка на базу и источник блокировок.