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

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

Чем отличается метод от свойства в 1С

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

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

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

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

Как отличить метод от свойства по синтаксису

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

Второй признак — поведение в операции присваивания. Свойство обычно можно прочитать и записать: Контрагент = Справочники.Контрагенты.НайтиПоКоду("0000001"); Наименование = Контрагент.Наименование;. Методу присвоить значение нельзя — конструкция вида Объект.Записать() = Истина бессмысленна и вызовет ошибку компиляции.

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

Примеры свойств и методов на реальных объектах

Рассмотрим объект «ДокументОбъект». Его типичные свойства: Номер, Дата, Проведен, Организация, табличная часть Товары. Всё это данные, которые можно прочитать, а до записи — изменить. Например: ДокументОбъект.Дата = ТекущаяДатаСеанса();.

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

Если НЕ ДокументОбъект.ПроверитьЗаполнение() Тогда

Возврат;

КонецЕсли;

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Обратите внимание: Проведен — свойство, а проведение выполняется методом Записать() с параметром режима. Нельзя «провести» документ присваиванием ДокументОбъект.Проведен = Истина — свойство доступно только для чтения, и попытка записи вызовет ошибку.

bsl
// Свойства: читаем и пишем данные
Объект.Дата = ТекущаяДатаСеанса();
СуммаДокумента = Объект.Товары.Итог("Сумма");

// Методы: выполняем действия
Если Объект.ПроверитьЗаполнение() Тогда
    Объект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;

Что умеют методы: параметры и возвращаемые значения

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

Многие методы возвращают значение, которое нужно либо использовать, либо осознанно игнорировать. НайтиПоКоду() возвращает ссылку или пустую ссылку, если ничего не найдено. Частая ошибка — вызвать метод поиска и не проверить результат, после чего обратиться к свойству пустой ссылки и получить ошибку или некорректные данные.

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

Особенности свойств: чтение, запись и вычисляемые значения

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

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

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

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

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

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

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

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

Как быстро определить, что перед вами: свойство или метод

Первый способ — синтакс-помощник. Откройте его (Ctrl+Shift+F1), найдите нужный тип объекта и посмотрите, в какой ветке находится интересующий член: «Свойства» или «Методы». Там же указаны параметры, тип возвращаемого значения и доступность на чтение/запись.

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

Третий способ — отладчик. Поставьте точку останова, остановитесь после создания объекта и посмотрите его в табло (Shift+F9). Значения свойств видны сразу, а методы в списке значений не отображаются — их можно только вызвать. Это наглядно показывает разницу: свойства — это то, что уже есть у объекта, методы — то, что можно с ним сделать.

Порядок действий при незнакомом члене объекта
  1. 1
    Откройте синтакс-помощник и найдите тип объекта
  2. 2
    Проверьте, в ветке «Свойства» или «Методы» находится нужное имя
  3. 3
    Для метода уточните обязательные параметры и тип возвращаемого значения
  4. 4
    Для свойства проверьте, доступно ли оно на запись
  5. 5
    Проверьте код в отладчике на тестовой копии базы

Когда свойство, а когда метод: правила выбора в своём коде

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

Практическое правило именования помогает не путаться: свойства и реквизиты называют существительными (Сумма, Контрагент, ДатаОплаты), а методы — глаголами (РассчитатьСумму, ЗаполнитьПоОснованию, ПроверитьКонтрагента). Если вы читаете чужой код и видите глагол — почти наверняка это метод, который что-то делает, а не просто отдаёт значение.

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

Свойство или метод

Свойство

Нужно прочитать или задать данные объекта: дату, номер, реквизит, видимость элемента формы. Ограничение: часть свойств доступна только для чтения

Метод

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

Запрос

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

FAQ: частые вопросы о свойствах и методах в 1С

Почему нельзя написать Документ.Записать без скобок?

Без скобок система ищет свойство с именем «Записать», а его не существует — это метод. Скобки сообщают платформе, что нужно выполнить действие. Даже если параметров нет, пустые скобки обязательны.

Может ли метод не возвращать значение?

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

Чем свойство отличается от реквизита?

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

Почему обращение Ссылка.Наименование иногда работает медленно?

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

Как узнать, доступно ли свойство для записи?

Откройте описание свойства в синтакс-помощнике: там явно указано «Чтение и запись» или «Только чтение». Попытка записать значение в свойство «только чтение» приведёт к ошибке исполнения, поэтому проверять стоит до написания кода.

Есть ли свойства и методы у элементов формы?

Да. У поля формы, например, есть свойства Видимость, Доступность, Заголовок и методы вроде УстановитьГраницыВыделения(). Логика та же: свойства описывают состояние элемента, методы выполняют действия с ним.

Итог

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

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