Что такое контекст выполнения?
В управляемом приложении 1С код выполняется в двух основных контекстах:
-
Клиентский контекст — выполняется на компьютере пользователя
-
Серверный контекст — выполняется на сервере 1С
Клиентский контекст
bsl// Этот код выполняется на компьютере пользователя &НаКлиенте Процедура ПриОткрытии(Отказ) // Работа с элементами формы Элементы.ПолеВвода.Видимость = Ложь; // Можно обращаться к реквизитам формы Объект.Наименование = "Новое значение"; // Вывод сообщений пользователю Сообщить("Форма открыта!"); КонецПроцедуры
Серверный контекст
bsl// Этот код выполняется на сервере &НаСервере Процедура ОбработатьДанныеНаСервере() // Работа с базой данных Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Справочник.Номенклатура"; // Обращение к любым глобальным объектам Документ = Документы.ЗаказПокупателя.СоздатьДокумент(); КонецПроцедуры
Почему возникает ошибка "Переменная не определена"?
Пример 1: Прямой вызов серверного метода из клиента
bsl// НЕПРАВИЛЬНО! Так работать не будет &НаКлиенте Процедура КнопкаВыполнитьНажатие(Кнопка) ПеременнаяНаКлиенте = "Привет"; // Ошибка! Серверный метод не видит клиентские переменные Результат = ОбработатьНаСервере(ПеременнаяНаКлиенте); КонецПроцедуры &НаСервере Функция ОбработатьНаСервере(Параметр) // Здесь переменная ПеременнаяНаКлиенте не существует! Возврат Верх(Параметр); // Будет ошибка КонецФункции
Пример 2: Неправильная передача параметров
bsl// НЕПРАВИЛЬНО &НаКлиенте Процедура Кнопка1Нажатие(Кнопка) СписокДанных = Новый СписокЗначений; СписокДанных.Добавить("Значение1"); // Ошибка! Нельзя передать объект с клиента на сервер напрямую ОбработатьНаСервере(СписокДанных); КонецПроцедуры
Как правильно работать с контекстами
Способ 1: Передача простых параметров
bsl// ПРАВИЛЬНО &НаКлиенте Процедура КнопкаВыполнитьНажатие(Кнопка) ИсходныйТекст = "текст для обработки"; // Передаем простые параметры на сервер Результат = ОбработатьНаСервере(ИсходныйТекст); Сообщить(Результат); // Выведет: "ТЕКСТ ДЛЯ ОБРАБОТКИ" КонецПроцедуры &НаСервере Функция ОбработатьНаСервере(ТекстДляОбработки) // Работаем с данными на сервере Результат = Верх(ТекстДляОбработки); Возврат Результат; КонецФункции
Способ 2: Использование серверных переменных и методов
bsl// ПРАВИЛЬНО &НаСервере Перем СервернаяПеременная; // Объявляем на сервере &НаСервере Процедура ПриСозданииНаСервере(Отказ) // Инициализируем серверную переменную СервернаяПеременная = "Данные, доступные на сервере"; КонецПроцедуры &НаСервере Функция ПолучитьДанныеССервера() // Имеем доступ к серверной переменной Возврат СервернаяПеременная; КонецФункции &НаКлиенте Процедура КнопкаПоказатьНажатие(Кнопка) // Получаем данные с сервера Данные = ПолучитьДанныеССервера(); Сообщить(Данные); КонецПроцедуры
Практические примеры
Пример 1: Работа с базой данных
bsl// Клиентский код &НаКлиенте Процедура ЗагрузитьНоменклатуру(Команда) // Вызываем серверный метод для работы с БД СписокНоменклатуры = ПолучитьНоменклатуруССервера(); // Заполняем клиентскую коллекцию ЗаполнитьТаблицуНаКлиенте(СписокНоменклатуры); КонецПроцедуры // Серверный код &НаСервере Функция ПолучитьНоменклатуруССервера() Запрос = Новый Запрос; Запрос.Текст = " | ВЫБРАТЬ | Номенклатура.Наименование, | Номенклатура.Артикул | ИЗ | Справочник.Номенклатура КАК Номенклатура"; Результат = Запрос.Выполнить().Выгрузить(); Возврат Результат; КонецФункции
Пример 2: Комплексная обработка данных
bsl&НаКлиенте Процедура ОбработатьДокументНажатие(Кнопка) // Собираем параметры на клиенте Параметры = Новый Структура; Параметры.Вставить("ДатаНачала", Элементы.ДатаНачала.Значение); Параметры.Вставить("ДатаОкончания", Элементы.ДатаОкончания.Значение); // Передаем на сервер для сложной обработки РезультатОбработки = ВыполнитьСложнуюОбработкуНаСервере(Параметры); // Показываем результат пользователю ПоказатьРезультат(РезультатОбработки); КонецПроцедуры &НаСервере Функция ВыполнитьСложнуюОбработкуНаСервере(ПараметрыОбработки) // Здесь выполняем ресурсоемкие операции // Работа с базой данных, сложные расчеты и т.д. Возврат РезультатРасчетов; КонецФункции
Таблица: Что можно делать в разных контекстах
| Действие | Клиент | Сервер |
|---|---|---|
| Работа с элементами формы | ✅ Да | ❌ Нет |
| Вывод сообщений пользователю | ✅ Да | ❌ Нет |
| Работа с базой данных (запросы) | ❌ Нет | ✅ Да |
| Создание объектов (документы, справочники) | ❌ Нет | ✅ Да |
| Обращение к глобальным объектам | ❌ Нет | ✅ Да |
| Использование системных переменных | ✅ Да | ✅ Да |
Частые ошибки и их решения
Ошибка 1: Передача сложных объектов
bsl// НЕПРАВИЛЬНО &НаКлиенте Процедура Тест() ОбъектКлиента = Новый Структура("Ключ", "Значение"); ОбработатьНаСервере(ОбъектКлиента); // Ошибка! КонецПроцедуры // ПРАВИЛЬНО &НаКлиенте Процедура Тест() // Передаем простые значения Значение1 = "Данные"; Значение2 = 100; ОбработатьНаСервере(Значение1, Значение2); КонецПроцедуры
Ошибка 2: Обращение к элементам формы с сервера
bsl// НЕПРАВИЛЬНО &НаСервере Процедура ОбновитьФорму() Элементы.ПолеВвода.Значение = "Новое значение"; // Ошибка! КонецПроцедуры // ПРАВИЛЬНО &НаКлиенте Процедура ОбновитьПоле() Элементы.ПолеВвода.Значение = "Новое значение"; КонецПроцедуры &НаСервере Процедура ПодготовитьДанные() Данные = ПолучитьНовыеДанные(); // Возвращаем данные на клиент Возврат Данные; КонецПроцедуры
Золотые правила работы с контекстами
-
Все операции с базой данных выполняйте на сервере
-
Вся работа с интерфейсом выполняется на клиенте
-
Передавайте между контекстами только простые данные
-
Сложные объекты создавайте в том контексте, где они будут использоваться
-
Всегда указывайте директиву компиляции (&НаКлиенте, &НаСервере)
Заключение
Понимание контекстов выполнения — ключевой навык для разработчика управляемых форм в 1С. Запомните простое правило: "Клиент — для интерфейса, сервер — для данных". Следуя этому принципу и используя правильные методы передачи данных между контекстами, вы избавитесь от большинства ошибок, связанных с областью видимости переменных.
Начните применять эти практики в своих проектах, и вы увидите, как код станет более стабильным и предсказуемым!
