В процессе разработки на платформе 1С:Предприятие 8 начинающие специалисты часто сталкиваются с вопросом: почему в Синтаксис-помощнике указано, что объект (например, СправочникОбъект) доступен только в толстом клиенте и на сервере, хотя пользователи успешно работают с ним через тонкий клиент? Давайте подробно разберем архитектуру взаимодействия клиента и сервера, выясним, где на самом деле «живут» объекты, и научимся оптимизировать работу приложения.
Для начала проанализируем базовый принцип: объекты базы данных (справочники, документы, планы видов характеристик) никогда не существуют в памяти тонкого клиента. Тонкий клиент предназначен исключительно для отображения интерфейса и выполнения простейшей логики. Когда мы говорим «я работаю с объектом в тонком клиенте», мы совершаем логическую ошибку.
Разберем, что происходит на самом деле. Рассмотрим процесс открытия формы справочника в тонком клиенте:
СправочникОбъект.СправочникОбъект копируются в специальную структуру ДанныеФормыСтруктура.Таким образом, когда пользователь нажимает кнопку «Записать», тонкий клиент отправляет измененные ДанныеФормы обратно на сервер. Там платформа снова создает СправочникОбъект, заполняет его пришедшими данными и только тогда выполняет запись в базу. Тонкий клиент в этой схеме — лишь «окно» для отображения данных.
Выясним причину разного поведения типов клиентов. Толстый клиент (файл 1cv8.exe) содержит в себе все необходимые библиотеки для прямого взаимодействия с СУБД (в файловом варианте) или сервером 1С. Он «тяжелый», потому что несет в себе весь код платформы.
Тонкий клиент (файл 1cv8c.exe) лишен механизмов работы с объектами БД. Он умеет только обмениваться сообщениями с сервером. В этом и заключается ключевое различие: в толстом клиенте (особенно в обычном приложении) вы могли писать код работы с объектами прямо в модуле формы, и система «неявно» обращалась к серверным ресурсам. В тонком клиенте это невозможно — вы обязаны явно вызвать серверную процедуру.
Важно понимать, что использование толстого клиента в режиме управляемого приложения не освобождает вас от необходимости разделять код. Рассмотрим ситуацию: вы создали управляемую форму. Несмотря на то, что вы запустили её под толстым клиентом, правила работы с объектами остаются прежними. Вы не сможете обратиться к СправочникОбъект непосредственно в клиентской процедуре.
Проанализируем пример неправильного кода:
&НаКлиенте
Процедура КомандаВыполнить(Команда)
// ОШИБКА! СправочникОбъект недоступен на клиенте
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Наименование = "Новый товар";
НовыйОбъект.Записать();
КонецПроцедуры
Правильный подход предполагает обязательный переход в серверный контекст:
&НаКлиенте
Процедура КомандаВыполнить(Команда)
СоздатьОбъектНаСервере();
КонецПроцедуры
&НаСервере
Процедура СоздатьОбъектНаСервере()
// Здесь СправочникОбъект доступен
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Наименование = "Новый товар";
НовыйОбъект.Записать();
КонецПроцедуры
Одной из самых жарких тем в обсуждении является передача контекста. Когда вы вызываете процедуру с директивой &НаСервере, платформа берет все данные формы (все реквизиты, таблицы, скрытые поля), упаковывает их и отправляет на сервер. Если форма «тяжелая», это приводит к задержкам.
Рассмотрим 4 варианта вызова сервера и проанализируем их эффективность:
Чтобы лучше прочувствовать разницу, воспользуемся отличной аналогией из обсуждения. Представьте, что сервер — это экскаватор, а клиент — это самосвал. У них абсолютно разные задачи. Экскаватор (сервер) копает землю (работает с данными БД), а самосвал (клиент) перевозит её и показывает результат. В обычном приложении 1С пыталась сделать «самосвал с приделанным ковшом», где кнопки управления были перемешаны. В управляемом приложении разделение стало «железобетонным»: экскаватор копает на своей площадке, а в самосвал попадает только результат в виде груза (сериализованных данных).
При работе в тонком клиенте нужно помнить о сериализации. Не любой тип данных можно передать с сервера на клиент. Например, нельзя передать Запрос, Выборку или сам СправочникОбъект. На клиент может вернуться только «простой» тип (строка, число, дата, булево) или специальные типы вроде Структура, Массив, СписокЗначений, которые платформа умеет упаковывать для передачи по сети.
Посмотрим на пример работы с преобразованием данных формы в объект:
&НаСервере
Процедура ОбработатьОбъектНаСервере()
// Превращаем данные формы (структуру) в полноценный объект метаданных
ТекущийОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Номенклатура"));
// Теперь нам доступны методы модуля объекта
ТекущийОбъект.ЗаполнитьПоУмолчанию();
// Возвращаем изменения обратно в форму
ЗначениеВДанныеФормы(ТекущийОбъект, Объект);
КонецПроцедуры
Используйте этот метод осторожно, так как ДанныеФормыВЗначение — ресурсоемкая операция, создающая копию объекта в памяти сервера.
Подводя итог нашему анализу, зафиксируем основные правила:
Объектами там физически невозможна.&НаСервере — это всегда переход на другую «территорию», даже если вы работаете в файловой базе.Понимание этих принципов позволит вам создавать быстрые и надежные системы, которые будут стабильно работать даже на медленных каналах связи.