В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда при обращении к данным на форме мы сталкиваемся с типом ДанныеФормыЭлементКоллекции. У многих начинающих разработчиков возникает закономерный вопрос: как получить из этого типа привычную ссылку на документ и как корректно выполнить массовое изменение данных? Давайте разберем эту задачу по шагам.
Когда вы создаете реквизит формы типа ТаблицаЗначений или используете ДинамическийСписок, платформа 1С при обращении к строке этой таблицы возвращает объект типа ДанныеФормыЭлементКоллекции. Важно помнить: это не сам документ, а лишь отображение данных в текущем сеансе работы пользователя. Если вы попытаетесь вызвать у такой строки методы работы с объектом (например, Записать()), вы получите ошибку, так как такие операции доступны только для объектов информационной базы, полученных на сервере.
Чтобы получить ссылку на документ из колонки таблицы, достаточно просто обратиться к соответствующему полю. Если колонка называется Документ, то запись ТекСтрока.Документ уже содержит ДокументСсылка. Вам не нужно совершать лишних действий — ссылка уже находится у вас в руках.
Архитектура 1С строго разделяет клиентскую и серверную логику. Выполнение серверных методов (запись, проведение, расчеты) на клиенте невозможно по соображениям безопасности и производительности. Попытка вызвать ПолучитьОбъект() на клиенте вызовет ошибку, так как клиентское приложение не имеет прямого доступа к СУБД и механизмам формирования бизнес-логики.
Рассмотрим правильный алгоритм действий:
Рассмотрим пример кода, который поможет вам выполнить задачу корректно. Сначала подготовим массив ссылок на клиенте, а затем выполним обработку на сервере.
Шаг 1. Передача данных с клиента на сервер
Вместо того чтобы передавать всю таблицу с данными, достаточно передать список ссылок. Это значительно снижает объем трафика между клиентом и сервером.
// На клиенте:
МассивДокументов = Новый Массив;
Для Каждого ТекСтрока Из Элементы.ТаблицаЗапроса.ВыделенныеСтроки Цикл
ДанныеСтроки = ТаблицаЗапроса.НайтиПоИдентификатору(ТекСтрока);
МассивДокументов.Добавить(ДанныеСтроки.Документ);
КонецЦикла;
Если МассивДокументов.Количество() > 0 Тогда
ИзменитьДокументыНаСервере(МассивДокументов);
КонецЕсли;
Шаг 2. Обработка документов на сервере
Теперь создадим серверную процедуру, которая примет массив ссылок, получит объекты и выполнит необходимые манипуляции.
&НаСервере
Процедура ИзменитьДокументыНаСервере(МассивДокументов)
Для Каждого СсылкаНаДокумент Из МассивДокументов Цикл
// Получаем объект документа для изменения
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
Если ОбъектДокумента <> Неопределено Тогда
// Очищаем табличные части
ОбъектДокумента.ПоДаннымОрганизации.Очистить();
ОбъектДокумента.ПоДаннымКонтрагента.Очистить();
// Здесь вызываем вашу логику заполнения
// Например: ЗаполнитьДанными(ОбъектДокумента);
// Записываем измененный объект
ОбъектДокумента.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
При массовой обработке данных всегда учитывайте следующие моменты:
НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Это позволит гарантировать, что либо все документы будут изменены корректно, либо ни один (в случае ошибки).БлокировкаДанных, если существует вероятность, что другие пользователи могут открывать или редактировать эти же документы в процессе выполнения вашей обработки.Следуя этим правилам, вы избавитесь от проблем с типами данных и обеспечите надежную работу вашей обработки в расширении конфигурации.