Как правильно передавать данные из динамического списка на сервер в 1С?

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

При разработке на управляемых формах в 1С:Предприятие 8.3 часто возникает соблазн использовать ДинамическийСписок как хранилище данных, которые нужно передать на сервер для дальнейшей обработки. Давайте разберем, почему попытки «вытащить» данные из списка напрямую являются ошибкой и как правильно организовать архитектуру взаимодействия между клиентом и сервером.

Почему нельзя передавать данные из Динамического списка напрямую?

Главная ошибка заключается в непонимании назначения ДинамическогоСписка. Этот объект платформы создан исключительно для отображения данных. Он работает по принципу «ленивой загрузки»: подгружает данные из базы данных порциями только тогда, когда они нужны пользователю для просмотра на экране. Попытка передать ДанныеФормыКоллекция, полученную из списка, на сервер часто приводит к ошибкам сериализации или к тому, что вы получаете неполный набор данных, который был доступен только в контексте текущей видимости на клиенте.

Если вам нужно обработать данные (например, для печати ценников или проведения документов), вы должны следовать правилам архитектуры тонкого клиента:

  1. Клиентская часть не должна содержать тяжелых данных.
  2. Сервер — это место, где выполняется основная бизнес-логика и запросы к базе данных.
  3. Передача данных должна минимизировать сетевой трафик.

Решение: передача идентификаторов (ссылок)

Самый эффективный и «правильный» с точки зрения идеологии 1С подход — это передача на сервер только ключевых идентификаторов. Вместо того чтобы пытаться «упаковать» всю таблицу, которую видит пользователь, передавайте ссылки на выбранные объекты.

Разберем это по шагам:

  1. Пользователь выбирает строки в ДинамическомСписке.
  2. При нажатии кнопки «Выполнить» мы собираем массив Ссылка всех выбранных документов.
  3. Этот массив передается в процедуру на сервере.
  4. На сервере мы выполняем новый запрос к базе данных, используя переданный массив ссылок, чтобы получить актуальные данные (например, табличную часть).

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


// Пример на клиенте: собираем ссылки
МассивСсылок = Новый Массив;
Для Каждого Строка Из Элементы.Список.ВыделенныеСтроки Цикл
    ДанныеСтроки = Список.НайтиПоИдентификатору(Строка);
    МассивСсылок.Добавить(ДанныеСтроки.Ссылка);
КонецЦикла;

// Вызов серверной процедуры
ОбработатьДанныеНаСервере(МассивСсылок);

Решение: использование Таблицы значений как посредника

Если вам необходимо, чтобы пользователь видел данные на форме и мог их редактировать (например, проставлять отметки для печати), рекомендуется использовать ТаблицуЗначений в качестве реквизита формы, расположенного отдельно от ДинамическогоСписка.

Как это реализовать:

Этот метод позволяет избежать лишних запросов при каждом клике, если данные уже загружены в ТЗ, при этом вы сохраняете полный контроль над данными на сервере.

Основные рекомендации по архитектуре

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

Помните, что следование архитектурным стандартам 1С делает код более производительным и устойчивым к изменениям в конфигурации. Используйте ТекущиеДанные только для получения идентификатора, а всю остальную работу переносите на серверную сторону.

← На главную