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

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

Что такое методы в 1С и как ими пользоваться

Методы в 1С — встроенные функции платформы для работы с данными, строками, датами и объектами. Разбираем виды методов, синтаксис и примеры кода.

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

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

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

Что такое метод и чем он отличается от свойства

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

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

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

Какие виды методов существуют в платформе

Методы платформы условно делятся на несколько групп, и важно понимать, где какая группа доступна. Это избавит от типовой ошибки «Метод объекта не обнаружен».

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

Дополнительно методы различаются по контексту исполнения. Директивы &НаКлиенте, &НаСервере, &НаСервереБезКонтекста определяют, где выполняется код модуля формы. Например, интерактивные методы вроде Предупреждение() или ОткрытьЗначение() работают только на клиенте — вызов на сервере приведёт к ошибке времени выполнения.

Синтаксис вызова методов: параметры и возвращаемые значения

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

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

bsl
// Вызов встроенного метода
Длина = СтрДлина("Пример строки");

// Собственная функция с параметрами
Функция РассчитатьСумму(Количество, Цена, СтавкаНДС = 20) Экспорт
    Сумма = Количество <em> Цена;
    Возврат Сумма + Сумма </em> СтавкаНДС / 100;
КонецФункции

// Вызов с пропуском необязательного параметра
Итог = РассчитатьСумму(5, 100);

Чтобы узнать сигнатуру любого встроенного метода, используйте синтакс-помощник конфигуратора (Ctrl+F1 на имени метода). Там указаны все параметры, их типы, значения по умолчанию, тип возвращаемого значения и ограничения по контексту выполнения — это основной справочный инструмент разработчика.

Методы объектов: работа со справочниками и документами

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

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

Как изменить элемент справочника программно
  1. 1
    Найдите ссылку: Справочники.Номенклатура.НайтиПоКоду("000001")
  2. 2
    Проверьте, что ссылка не пустая: Если НЕ Ссылка.Пустая() Тогда
  3. 3
    Получите объект: Объект = Ссылка.ПолучитьОбъект()
  4. 4
    Измените нужные реквизиты объекта
  5. 5
    Вызовите Объект.Записать() и проверьте отсутствие исключений

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

Методы работы со строками, датами и числами

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

Для дат ключевые методы: ТекущаяДата() (на клиенте — дата компьютера пользователя, на сервере — дата сервера), НачалоДня(), КонецДня(), ДобавитьМесяц(). Арифметика с датами выполняется в секундах: Дата + 86400 — плюс одни сутки. Для чисел доступны Окр(), Цел(), Мин(), Макс(), Формат() для представления значения строкой.

Универсальный метод Формат() заслуживает отдельного внимания: он преобразует числа и даты в строку по шаблону, например Формат(Сумма, "ЧДЦ=2; ЧН=0,00") или Формат(Дата, "ДЛФ=D"). Это правильный способ вывода значений в сообщения и печатные формы вместо ручной конкатенации.

Как создавать собственные методы в модулях

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

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

Где размещать собственный метод

Общий модуль

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

Модуль объекта

Логика, привязанная к записи и проведению конкретного объекта. Ограничение: недоступна на клиенте в управляемом приложении.

Модуль формы

Интерактивная логика: обработчики команд, события элементов. Ограничение: код живёт только пока открыта форма.

Модуль менеджера

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

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

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

Типичные ошибки
01
Вызов метода без скобок — платформа ищет свойство с таким именем и выдаёт ошибку «Поле объекта не обнаружено»
02
Попытка изменить реквизиты через ссылку без ПолучитьОбъект() — ссылка доступна только для чтения
03
Использование клиентского интерактивного метода на сервере — ошибка времени выполнения при вызове
04
Игнорирование возвращаемого значения строковых методов: СокрЛП(Строка) не меняет переменную, нужно Строка = СокрЛП(Строка)
05
Непроверенный результат НайтиПоКоду() — при отсутствии элемента возвращается пустая ссылка, и ПолучитьОбъект() вызовет исключение

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

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

Итог

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

Метод — это действие, вызываемое со скобками; свойство — данные объекта. Встроенные методы смотрите в синтакс-помощнике, собственные размещайте в общих модулях. Всегда учитывайте контекст выполнения (клиент/сервер) и проверяйте результат методов поиска перед обращением к объекту.

Часто задаваемые вопросы

Чем процедура отличается от функции в 1С?

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

Почему возникает ошибка «Метод объекта не обнаружен»?

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

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

Установите курсор на имя метода в модуле и нажмите Ctrl+F1 — откроется синтакс-помощник с полным описанием: параметры, их типы, значения по умолчанию, возвращаемое значение и ограничения по контексту выполнения. Это быстрее и точнее поиска по документации.

Что означает ключевое слово «Экспорт» у процедуры?

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

Можно ли вызвать серверный метод с клиента?

Да, через процедуру или функцию с директивой &НаСервере в модуле формы либо через экспортный метод серверного общего модуля. Учитывайте: каждый такой вызов — обращение к серверу, поэтому в циклах вызовы группируют, собирая данные одним пакетом, а не по одному элементу.

Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?

ТекущаяДата() возвращает время того компьютера, где выполняется код — на клиенте это часы рабочей станции пользователя. ТекущаяДатаСеанса() учитывает часовой пояс сеанса и всегда согласована с сервером. Для дат документов и регистров корректнее использовать дату сеанса, чтобы избежать расхождений между пользователями в разных поясах.