Изменение данных документа: делать на клиенте или на сервере?

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

При разработке на управляемых формах 1С программисты часто сталкиваются с дилеммой: где именно описывать логику изменения данных объекта? Например, при добавлении строки в табличную часть или пересчете суммы. Существует два полярных мнения: одни эксперты советуют делать все на клиенте для быстродействия интерфейса, другие настаивают на серверных вызовах ради надежности и кроссплатформенности. В этой статье мы подробно разберем оба подхода, проанализируем их сильные и слабые стороны и определим золотую середину, соответствующую стандартам разработки 1С.

Простой подход: манипуляции на клиенте

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

Проанализируем пример кода, в котором обработка выбора номенклатуры происходит непосредственно на клиенте:


&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда
        ТабЧасть = Объект.Состав;
        НСтрока = ТабЧасть.Добавить();
        НСтрока.Номенклатура = ВыбранноеЗначение;
    КонецЕсли;
КонецПроцедуры

Преимущества этого метода:

  1. Мгновенный отклик интерфейса. Пользователь не ждет окончания сетевого запроса.
  2. Отсутствие лишней нагрузки на сервер и сеть.
  3. Идеально подходит для простых визуальных действий: добавление пустой строки, удаление строки, перестановка строк местами.

Однако, как только логика усложняется (например, нужно рассчитать цену по прайс-листу или проверить остатки), клиентский метод начинает давать сбои.

Почему сервер обязателен для сложных расчетов

Выясним причину, по которой опытные преподаватели и стандарты 1С рекомендуют переносить бизнес-логику на сервер. Основная проблема кроется в особенностях работы веб-клиента. В тонком клиенте вычисления выполняются платформой, но в веб-клиенте код исполняется движком JavaScript браузера. В JavaScript работа с числами с плавающей точкой может приводить к микроскопическим ошибкам округления (например, при расчете НДС или сложных скидок). Это может вызвать ситуацию, когда на экране пользователя сумма одна, а при записи в базу данных сервер выполнит пересчет и получит другое значение, что приведет к конфликтам.

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

Проблема передачи контекста: &НаСервере против &НаСервереБезКонтекста

Разберем типичную ошибку начинающих разработчиков. Следуя совету «делать всё на сервере», они используют директиву &НаСервере. Посмотрим, что происходит в этот момент: программа берет весь Объект (со всеми его сотнями строк в табличных частях), упаковывает его в тяжелый пакет, передает по сети на сервер, там распаковывает, выполняет одно действие и отправляет всё это обратно. Это вызывает огромный оверхед и «замирание» формы на несколько секунд.

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


&НаКлиенте
Процедура СоставНоменклатураПриИзменении(Элемент)
    СтрокаТЧ = Элементы.Состав.ТекущиеДанные;
    Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
        // Вызываем сервер без передачи всей формы
        ДанныеНоменклатуры = ПолучитьПараметрыНаСервере(СтрокаТЧ.Номенклатура, Объект.Дата);
        ЗаполнитьЗначенияСвойств(СтрокаТЧ, ДанныеНоменклатуры);
        // Простой расчет суммы делаем прямо на клиенте для скорости
        СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
    КонецЕсли;
КонецПроцедуры

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

Использование тяжелых методов трансформации данных

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

Паттерн «ЗаполнитьНаСервере» в типовых конфигурациях

В современных системах, таких как ERP или Управление торговлей 11, часто используется гибридный подход, который мы рекомендуем применять и вам:

  1. Пользователь совершает действие на клиенте (выбирает товар).
  2. Программа вызывает серверную функцию &НаСервереБезКонтекста для получения всех необходимых данных из базы (цены, единицы измерения, ставки НДС).
  3. Полученная компактная структура данных возвращается на клиент.
  4. На клиенте данные применяются к строке табличной части, и здесь же выполняются простые арифметические операции (умножение количества на цену).

Такой подход обеспечивает идеальный баланс: данные всегда корректны, так как первичные параметры получены с сервера, а интерфейс остается отзывчивым, так как итоговая сумма вычисляется мгновенно без повторного обращения к серверу.

Подведем итоги: когда и где делать?

Делайте на клиенте, если:

Делайте на сервере (желательно без контекста), если:

Помните, что избыточные серверные вызовы — это главный враг производительности управляемого приложения, особенно при работе через медленный интернет или в веб-клиенте. Всегда старайтесь минимизировать количество переходов между клиентом и сервером.

← На главную