При разработке на платформе 1С:Предприятие 8.3 в режиме управляемого приложения часто возникает дилемма: где лучше обрабатывать данные таблиц? С одной стороны, обработка на клиенте позволяет избежать лишних обращений к серверу. С другой стороны, существует механизм порционной подгрузки данных (пейджинг), который может превратить обычный цикл по строкам в череду скрытых серверных вызовов. Разберем детально, как работает этот механизм, и выберем оптимальную стратегию для различных объемов данных.
Рассмотрим ситуацию, которая часто описывается в методической литературе (например, у М. Г. Хрусталевой): когда мы работаем с объектом типа ДанныеФормыКоллекция на клиенте, платформа не передает все строки сразу. Вместо этого передается только первая порция данных (обычно это 35 строк), а остальные подгружаются по мере необходимости.
Проанализируем ситуацию: почему это происходит? Это сделано для оптимизации трафика и ускорения открытия формы. Если в таблице 100 000 строк, пользователю не нужно ждать их полной передачи, чтобы увидеть первые строки на экране. Однако при программном обходе таблицы через цикл Для Каждого, когда индекс переходит за границу уже загруженной порции, платформа инициирует неявный серверный вызов для получения следующего блока данных.
Выясним причину, по которой при переборе 400 строк на клиенте может не возникнуть ни одного обращения к серверу. Рассмотрим несколько факторов, влияющих на это:
ПриСозданииНаСервере, то при первом обращении на клиенте данные могут подкачиваться порциями. Однако, если вы вызвали серверный метод из клиентского кода, заполнили там коллекцию и вернулись на клиент, платформа часто передает всю актуальную информацию сразу.Рассмотрим пример кода, который часто используется для изменения флага во всех строках таблицы. Проанализируем, как это работает на стороне клиента:
&НаКлиенте
Процедура ИнвертироватьФлаги(Команда)
// Прямой обход коллекции на клиенте
Для Каждого СтрокаТЗ Из Объект.Товары Цикл
СтрокаТЗ.Пометка = Истина;
КонецЦикла;
КонецПроцедуры
Если в таблице Товары находится 10 000 строк, и они еще не были полностью прокручены пользователем, этот цикл вызовет серию серверных запросов (примерно по одному на каждые 30–50 строк). Это существенно замедлит выполнение задачи.
Посмотрим на ситуацию с точки зрения серверной обработки. Профессиональная разработка в 1С подразумевает минимизацию передачи контекста формы. Разберем по шагам два способа серверной обработки:
Вариант 1: Контекстный вызов (&НаСервере)
При вызове процедуры &НаСервере вся форма целиком (все ее реквизиты) сериализуется и отправляется на сервер. После обработки она возвращается обратно. Это "дорогой" процесс, если форма содержит много данных.
Вариант 2: Внеконтекстный вызов (&НаСервереБезКонтекста)
Этот метод наиболее эффективен для обработки больших таблиц. Мы передаем на сервер только саму таблицу, обрабатываем ее и возвращаем результат. Рассмотрим реализацию:
&НаКлиенте
Процедура ОбработатьНаСервереБезКонтекста(Команда)
// Получаем таблицу из данных формы
ТаблицаОбъект = Объект.Товары.Выгрузить();
// Выполняем обработку
ОбработатьТаблицуНаСервере(ТаблицаОбъект);
// Загружаем данные обратно
Объект.Товары.Загрузить(ТаблицаОбъект);
КонецПроцедуры
&НаСервереБезКонтекста
СтандартнаяПроцедура ОбработатьТаблицуНаСервере(ТаблицаЗначений)
Для Каждого Стр Из ТаблицаЗначений Цикл
Стр.Пометка = Истина;
КонецЦикла;
КонецПроцедуры
В данном случае мы работаем на сервере не с типом ДанныеФормыКоллекция, а с полноценным объектом ТаблицаЗначений. Это работает в десятки раз быстрее, так как ТаблицаЗначений — это оптимизированная структура данных, а не прокси-объект интерфейса.
Проанализируем ситуацию, когда в колонках таблицы находятся не только Булево или Строка, но и ссылки на тяжелые объекты (Справочники, Документы). Если при обходе на клиенте вы обратитесь к свойству ссылки (например, Строка.Товар.Артикул), платформа выполнит отдельный неявный серверный вызов для получения этого значения. Это "убьет" производительность интерфейса даже при небольшом количестве строк.
Рекомендации по выбору места обработки:
Несмотря на то, что в небольших задачах (около 400 строк) работа на клиенте может выглядеть беспроблемной, следует придерживаться архитектурно верных решений. Выясним основные правила:
&НаСервереБезКонтекста с выгрузкой/загрузкой коллекции.Рассмотренные подходы позволят вам создавать быстрые и отзывчивые интерфейсы, которые не будут "тормозить" при росте объема данных в базе пользователя.