Как работать с объектами в тонком и толстом клиенте 1С:Предприятие 8?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Где физически существует объект?

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

Разберем, что происходит на самом деле. Рассмотрим процесс открытия формы справочника в тонком клиенте:

  1. На сервере создается экземпляр СправочникОбъект.
  2. Система считывает данные из базы данных в этот объект.
  3. Происходит трансформация (сериализация): данные из СправочникОбъект копируются в специальную структуру ДанныеФормыСтруктура.
  4. Эта структура передается по сети на тонкий клиент.
  5. Тонкий клиент отображает эти данные пользователю.

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

Различия между тонким и толстым клиентом

Выясним причину разного поведения типов клиентов. Толстый клиент (файл 1cv8.exe) содержит в себе все необходимые библиотеки для прямого взаимодействия с СУБД (в файловом варианте) или сервером 1С. Он «тяжелый», потому что несет в себе весь код платформы.

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

Управляемые формы: тонкий vs толстый клиент

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

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


&НаКлиенте
Процедура КомандаВыполнить(Команда)
    // ОШИБКА! СправочникОбъект недоступен на клиенте
    НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент(); 
    НовыйОбъект.Наименование = "Новый товар";
    НовыйОбъект.Записать();
КонецПроцедуры

Правильный подход предполагает обязательный переход в серверный контекст:


&НаКлиенте
Процедура КомандаВыполнить(Команда)
    СоздатьОбъектНаСервере();
КонецПроцедуры

&НаСервере
Процедура СоздатьОбъектНаСервере()
    // Здесь СправочникОбъект доступен
    НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйОбъект.Наименование = "Новый товар";
    НовыйОбъект.Записать();
КонецПроцедуры

Оптимизация контекстных вызовов

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

Рассмотрим 4 варианта вызова сервера и проанализируем их эффективность:

  1. &НаСервере Процедура(Параметр) — самый «тяжелый» вариант. Передается весь контекст формы, а параметры инициализируются с возможностью возврата изменений.
  2. &НаСервереБезКонтекста Процедура(Параметр) — контекст формы (данные) не передается. Это значительно ускоряет работу, если вам не нужны реквизиты формы для вычислений.
  3. &НаСервере Процедура(ЗНАЧ Параметр) — контекст формы передается, но сам параметр передается «по значению». Система не тратит ресурсы на отслеживание изменений этого параметра для возврата на клиент.
  4. &НаСервереБезКонтекста Процедура(ЗНАЧ Параметр) — самый быстрый способ. Мы не тянем данные формы и передаем параметры в одну сторону.

Аналогия для понимания

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

Особенности передачи данных

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

Посмотрим на пример работы с преобразованием данных формы в объект:


&НаСервере
Процедура ОбработатьОбъектНаСервере()
    // Превращаем данные формы (структуру) в полноценный объект метаданных
    ТекущийОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Номенклатура"));
    
    // Теперь нам доступны методы модуля объекта
    ТекущийОбъект.ЗаполнитьПоУмолчанию();
    
    // Возвращаем изменения обратно в форму
    ЗначениеВДанныеФормы(ТекущийОбъект, Объект);
КонецПроцедуры

Используйте этот метод осторожно, так как ДанныеФормыВЗначение — ресурсоемкая операция, создающая копию объекта в памяти сервера.

Итоги

Подводя итог нашему анализу, зафиксируем основные правила:

Понимание этих принципов позволит вам создавать быстрые и надежные системы, которые будут стабильно работать даже на медленных каналах связи.

← На главную