Как правильно получить ссылку на документ из таблицы на управляемой форме и изменить его данные?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда при обращении к данным на форме мы сталкиваемся с типом ДанныеФормыЭлементКоллекции. У многих начинающих разработчиков возникает закономерный вопрос: как получить из этого типа привычную ссылку на документ и как корректно выполнить массовое изменение данных? Давайте разберем эту задачу по шагам.

Понимаем природу данных на форме

Когда вы создаете реквизит формы типа ТаблицаЗначений или используете ДинамическийСписок, платформа 1С при обращении к строке этой таблицы возвращает объект типа ДанныеФормыЭлементКоллекции. Важно помнить: это не сам документ, а лишь отображение данных в текущем сеансе работы пользователя. Если вы попытаетесь вызвать у такой строки методы работы с объектом (например, Записать()), вы получите ошибку, так как такие операции доступны только для объектов информационной базы, полученных на сервере.

Чтобы получить ссылку на документ из колонки таблицы, достаточно просто обратиться к соответствующему полю. Если колонка называется Документ, то запись ТекСтрока.Документ уже содержит ДокументСсылка. Вам не нужно совершать лишних действий — ссылка уже находится у вас в руках.

Почему нельзя изменять документы на клиенте?

Архитектура 1С строго разделяет клиентскую и серверную логику. Выполнение серверных методов (запись, проведение, расчеты) на клиенте невозможно по соображениям безопасности и производительности. Попытка вызвать ПолучитьОбъект() на клиенте вызовет ошибку, так как клиентское приложение не имеет прямого доступа к СУБД и механизмам формирования бизнес-логики.

Рассмотрим правильный алгоритм действий:

  1. На клиенте мы собираем массив ссылок на выбранные пользователем документы.
  2. Передаем этот массив в процедуру на сервере.
  3. На сервере получаем объект документа, вносим изменения и сохраняем их.

Разбор процесса реализации

Рассмотрим пример кода, который поможет вам выполнить задачу корректно. Сначала подготовим массив ссылок на клиенте, а затем выполним обработку на сервере.

Шаг 1. Передача данных с клиента на сервер

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


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

Если МассивДокументов.Количество() > 0 Тогда
    ИзменитьДокументыНаСервере(МассивДокументов);
КонецЕсли;

Шаг 2. Обработка документов на сервере

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


&НаСервере
Процедура ИзменитьДокументыНаСервере(МассивДокументов)
    Для Каждого СсылкаНаДокумент Из МассивДокументов Цикл
        // Получаем объект документа для изменения
        ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
        
        Если ОбъектДокумента <> Неопределено Тогда
            // Очищаем табличные части
            ОбъектДокумента.ПоДаннымОрганизации.Очистить();
            ОбъектДокумента.ПоДаннымКонтрагента.Очистить();
            
            // Здесь вызываем вашу логику заполнения
            // Например: ЗаполнитьДанными(ОбъектДокумента);
            
            // Записываем измененный объект
            ОбъектДокумента.Записать(РежимЗаписиДокумента.Запись);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Советы по оптимизации процесса

При массовой обработке данных всегда учитывайте следующие моменты:

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

← На главную