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