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

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

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

═══

1. Что такое «наклиенте» в 1С: определение и назначение

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

Ключевое слово «наклиенте» явным образом указывает, что процедура или функция должна работать только в клиентском контексте.

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

Ключевые моменты:

  • 🔹 Явное указание контекста: «наклиенте» гарантирует, что код выполнится на стороне клиента, даже если он вызван из серверной процедуры.
  • 🔹 Разделение ответственности: серверные процедуры работают с данными, клиентские — с интерфейсом.
  • 🔹 Безопасность: некоторые операции (например, работа с файловой системой) разрешены только на клиенте.

Пример из реального кода:

Процедура ОткрытьФормуНаклиенте()

// Этот код выполнится только на клиенте

ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора");

КонецПроцедуры

📊 Как часто вы сталкиваетесь с ошибками "Метод не найден (Наклиенте)"?
Часто, это моя головная боль
Иногда, обычно при обновлениях
Рядом не стояло
Не знаю, что это такое

═══

2. Отличие «наклиенте» от «на сервере» и «на клиенте без контекста»

В есть три способа указать, где должен выполняться код: «наклиенте», «насервере» и «на клиенте без контекста» (если не указано ничего).

Разберём различия на практике.

«Наклиенте» — жёстко привязывает процедуру к клиентскому контексту. Если попытаться вызвать её с сервера, получим ошибку. Это полезно для методов, которые обязательно должны работать только на стороне пользователя (например, взаимодействие с оборудованием или локальными файлами).

«Насервере» — противоположность: код выполняется на сервере , даже если вызван с клиента. Используется для тяжелых вычислений или операций с базой данных.

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

Сравнительная таблица:

Тип контекста Где выполняется Пример использования Ограничения
Наклиенте Только на клиенте Открытие форм, работа с файлами, показы сообщений Нельзя вызвать с сервера
Насервере Только на сервере Запросы к базе, транзакции, тяжелые вычисления Нет доступа к клиентскому интерфейсу
Без указания Зависит от вызова Универсальные процедуры (например, расчёт формул) Риск ошибок при смене контекста
💡

Если процедура должна работать и на клиенте, и на сервере, разделите её на две части: клиентскую (с «наклиенте») и серверную (с «насервере»), а общую логику вынесите в третью процедуру без указания контекста.

═══

3. Типичные ошибки с «наклиенте» и как их исправить

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

Разберём самые частые случаи.

Ошибка 1: «Метод не найден (Наклиенте)»

Возникает, когда серверный код пытается вызвать процедуру, помеченную «наклиенте». Решение:

  • 🛠️ Проверьте, откуда вызывается метод. Если с сервера — перенесите логику в серверную процедуру.
  • 🛠️ Используйте ВыполнитьНаКлиенте() для явного переноса выполнения:
Процедура СервернаяПроцедура()

ВыполнитьНаКлиенте("КлиентскаяПроцедура"); // Явный вызов

КонецПроцедуры

Процедура КлиентскаяПроцедура() НаКлиенте

// Код для клиента

КонецПроцедуры

Ошибка 2: «Недопустимый вызов серверного метода на клиенте»

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

  • 🔧 Используйте ВыполнитьНаСервере() для передачи управления:
Процедура КлиентскаяПроцедура() НаКлиенте

ВыполнитьНаСервере("СервернаяПроцедура", Параметр1, Параметр2);

КонецПроцедуры

Ошибка 3: Зацикливание при взаимных вызовах

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

Проверьте все вызовы клиентских процедур из серверного кода|Используйте ВыполнитьНаКлиенте()/ВыполнитьНаСервере() для явной передачи контекста|Убедитесь, что в клиентском коде нет вызовов серверных методов без обёртки|Тестируйте логику в разных режимах (тонкий клиент, веб-клиент, толстый клиент)-->

═══

4. Когда обязательно использовать «наклиенте»

Есть ситуации, где указание «наклиенте» не просто рекомендуется, а обязательно.Ignoring this rule can lead to runtime errors or security violations. Вот ключевые случаи:

1. Работа с интерфейсом пользователя

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

  • 🖥️ ОткрытьФорму(), ПоказатьВопрос()
  • 🖥️ Обработчики событий форм (например, ПриОткрытии)
  • 🖥️ Работа с элементами управления (ЭлементыФормы.Поле.Значение)

2. Взаимодействие с локальными ресурсами

Доступ к файловой системе, реестру Windows или подключённому оборудованию (сканерам, принтерам) возможен только на клиенте. Примеры:

  • 📁 Новый Файл(), ЗаписатьФайл()
  • 🖨️ Работа с COM-объектами (например, Excel.Application)

3. Использование клиентских API

Некоторые методы платформы доступны только на клиенте, например:

  • 🔗 ПолучитьИмяКомпьютера()
  • 🔗 ПолучитьПутьКФайлуБазы() (в файловом варианте)
Что будет, если выполнить серверный код на клиенте?

Серверный код не может работать на клиенте по определению — платформа либо проигнорирует его, либо выбросит исключение. Например, попытка выполнить запрос к базе данных (Запрос = Новый Запрос;) в клиентской процедуре приведёт к ошибке "Недопустимый вызов серверного метода на клиенте".

═══

5. Как правильно тестировать код с «наклиенте»

Код с «наклиенте» может вести себя по-разному в зависимости от режима работы : толстый клиент, тонкий клиент или веб-клиент.

Вот как избежать проблем при тестировании:

1. Проверяйте в разных клиентах

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

2. Используйте отладочную печать

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

Процедура ТестоваяПроцедура() НаКлиенте

Сообщить("Выполняется на клиенте!");

КонецПроцедуры

3. Имитируйте серверные вызовы

Если процедура должна работать и на клиенте, и на сервере, протестируйте оба сценария:

  • 🧪 Вызовите её напрямую из клиентского кода.
  • 🧪 Вызовите через ВыполнитьНаСервере() и проверьте, что логика не ломается.
💡

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

═══

6. Примеры кода: «наклиенте» в реальных задачах

Рассмотрим практические примеры, где «наклиенте» необходим для корректной работы.

Пример 1: Открытие формы с предварительной проверкой

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

Процедура ОткрытьФормуНоменклатуры() НаКлиенте

Если Не ВыполнитьНаСервере("ПроверитьПраваДоступа") Тогда

Предупреждение("Доступ запрещён!");

Возврат;

КонецЕсли;

ОткрытьФорму("Справочник.Номенклатура.ФормаСписка");

КонецПроцедуры

Функция ПроверитьПраваДоступа() НаСервере

Возврат ПравДоступа.Номенклатура.Чтение;

КонецФункции

Пример 2: Экспорт данных в Excel

Работа с Excel через COM возможна только на клиенте:

Процедура ЭкспортироватьВExcel(ТаблицаДанных) НаКлиенте

Excel = Новый COMОбъект("Excel.Application");

// ... логика экспорта ...

Сообщить("Экспорт завершён!");

КонецПроцедуры

Пример 3: Обработчик события формы

Все обработчики событий форм (например, нажатие кнопки) автоматически выполняются на клиенте, но явное указание «наклиенте» делает код понятнее:

Процедура КнопкаВыполнитьНажатие(Элемент) НаКлиенте

Если Не ВыполнитьНаСервере("ПроверитьДанные") Тогда

Сообщить("Ошибка в данных!");

Возврат;

КонецЕсли;

// ... дальнейшая логика ...

КонецПроцедуры

💡

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

═══

7. Частые вопросы и мифы о «наклиенте»

Даже опытные разработчики иногда путаются в нюансах работы «наклиенте». Разберём распространённые заблуждения.

Миф 1: «Наклиенте» ускоряет выполнение кода

Нет! Контекст выполнения («наклиенте»/«насервере») не влияет на скорость напрямую. Он определяет где будет выполняться код, а не как быстро. Производительность зависит от оптимизации самого кода и распределения нагрузки.

Миф 2: В тонком клиенте «наклиенте» не нужно

Это не так. Даже в тонком клиенте код делится на клиентский и серверный. Указание «наклиенте» остаётся обязательным для методов, которые не могут выполняться на сервере (например, работа с формами).

Миф 3: «Наклиенте» и «&НаКлиенте» — это одно и то же

Almost, но не совсем. В современных версиях синтаксис «наклиенте» (через пробел) и «&НаКлиенте» (через амперсанд) эквивалентны. Однако в старых конфигурациях (до платформы 8.3.6) использовался только вариант с амперсандом. Сейчас оба варианта корректны, но «наклиенте» (с пробелом) считается более читаемым.

Миф 4: На клиенте можно выполнять любые запросы к базе

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

💡

В веб-клиенте и мобильном приложении некоторые клиентские возможности ограничены. Например, работа с COM-объектами (как в примере с Excel) в веб-клиенте невозможна.

═══

FAQ: Ответы на популярные вопросы

Можно ли вызвать процедуру с «наклиенте» из другой клиентской процедуры?

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

Как передать параметры в процедуру с «наклиенте», если она вызывается с сервера?

Используйте метод ВыполнитьНаКлиенте() с указанием параметров:

ВыполнитьНаКлиенте("КлиентскаяПроцедура", Параметр1, Параметр2);

Параметры будут автоматически сериализованы и переданы на клиент.

Почему в отчётах иногда пишут «наклиенте», если отчёты выполняются на сервере?

В отчётах «наклиенте» может использоваться для обработчиков событий, которые срабатывают при взаимодействии с пользователем (например, настройка параметров отчёта перед формированием). Само формирование отчёта происходит на сервере, но подготовка данных для него может требовать клиентского кода.

Можно ли в одной процедуре совместить клиентский и серверный код?

Нет, это невозможно. Процедура может выполняться либо на клиенте, либо на сервере. Если нужна смешанная логика, разделите её на две отдельные процедуры и используйте ВыполнитьНаСервере()/ВыполнитьНаКлиенте() для передачи управления.

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

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

Если ТолстыйКлиент() Тогда

Сообщить("Код выполняется в толстом клиенте!");

КонецЕсли;

📊 Какой клиент 1С вы используете чаще всего?
Толстый клиент
Тонкий клиент
Веб-клиент
Мобильное приложение