Разработка и Конфигурация · 10 мин
Как выгрузить строку табличной части в 1С
Как выгрузить строку табличной части в 1С: методы Выгрузить(), ВыгрузитьСтроку(), работа с таблицей значений, примеры кода, типичные ошибки и проверка результата.
Выгрузка строки табличной части — типовая задача при разработке на платформе 1С:Предприятие. Чаще всего она возникает, когда нужно перенести данные одной строки документа в другую структуру: в таблицу значений для обработки, в другую табличную часть, в структуру для передачи на сервер или в запрос. Универсального метода «выгрузить одну строку» у табличной части нет, поэтому задача решается несколькими способами в зависимости от цели.
Ключевой инструмент — метод Выгрузить(), который преобразует табличную часть (или её часть) в таблицу значений. Однако он работает с коллекцией целиком, поэтому для одной строки применяют либо выгрузку с отбором через массив строк, либо копирование данных строки в структуру, либо промежуточную таблицу значений с последующим добавлением нужной строки.
Ниже разобраны рабочие варианты с примерами кода, ограничения каждого подхода и способы проверить, что данные перенесены корректно. Примеры ориентированы на встроенный язык 1С версии 8.3 и подходят как для управляемых, так и для обычных форм.
Что значит «выгрузить строку» и какие есть варианты
Под выгрузкой строки обычно понимают одну из трёх задач: получить данные строки в виде таблицы значений из одной строки, получить их в виде структуры (ключ — имя колонки, значение — данные) или перенести строку в другую табличную часть. От того, какая именно задача стоит, зависит выбор метода.
Табличная часть объекта (документа, справочника) — это коллекция строк типа ТабличнаяЧасть. У неё есть метод Выгрузить(), возвращающий таблицу значений, и метод ВыгрузитьКолонку(). Строка табличной части сама по себе методом Выгрузить() не обладает — это частая причина ошибки «Метод объекта не обнаружен» у начинающих разработчиков.
Выгрузка строки через метод Выгрузить() с массивом строк
Самый прямой способ получить таблицу значений из одной строки — передать в метод Выгрузить() первым параметром массив, содержащий нужную строку. Синтаксис метода: Выгрузить(Строки, Колонки), где первый параметр — массив выгружаемых строк, второй — строка с перечнем колонок через запятую (если не указан, выгружаются все).
СтрокаТЧ = Объект.Товары[0];
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(СтрокаТЧ);
ТаблицаОднойСтроки = Объект.Товары.Выгрузить(МассивСтрок);
// В ТаблицаОднойСтроки теперь одна строка со всеми колонками табличной части
Если нужны не все колонки, передайте их список вторым параметром:
ТаблицаОднойСтроки = Объект.Товары.Выгрузить(МассивСтрок, "Номенклатура, Количество, Цена");
Этот способ удобен, когда результат нужен именно как таблица значений: например, для передачи в запрос через менеджер временных таблиц, для свёртки или для построчного сравнения с другими данными. Учтите, что колонка «НомерСтроки» в выгрузке присутствует, если она входит в состав табличной части, и её значение сохраняется из исходного объекта.
Копирование строки в структуру
Если таблица значений не нужна, а требуется просто набор «имя поля — значение» (например, для передачи между процедурами или сериализации), строку преобразуют в структуру. Готового метода нет, поэтому структуру заполняют вручную или через выгрузку в таблицу значений.
Компактный универсальный вариант — выгрузить строку в таблицу значений и перенести её в структуру циклом по колонкам:
Функция СтрокаВСтруктуру(СтрокаТЧ, ТабличнаяЧасть)
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(СтрокаТЧ);
ТЗ = ТабличнаяЧасть.Выгрузить(МассивСтрок);
Результат = Новый Структура;
Для Каждого Колонка Из ТЗ.Колонки Цикл
Результат.Вставить(Колонка.Имя, ТЗ[0][Колонка.Имя]);
КонецЦикла;
Возврат Результат;
КонецФункции
Если состав полей известен заранее и невелик, проще явно перечислить их: Данные = Новый Структура("Номенклатура, Количество", СтрокаТЧ.Номенклатура, СтрокаТЧ.Количество);. Такой код читается лучше и не тратит ресурсы на выгрузку лишних колонок.
Копирование строки в другую табличную часть
При переносе строки из одной табличной части в другую (в том же документе или в другом объекте) используют метод ЗаполнитьЗначенияСвойств(). Он копирует значения по совпадающим именам свойств, что удобно, когда составы колонок частично совпадают.
НоваяСтрока = ДокументПриемник.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточник);
Если имена колонок различаются, третьим параметром передают список копируемых свойств, а четвёртым — исключения. Помните, что ЗаполнитьЗначенияСвойств() копирует и служебные свойства, если их не исключить: например, «НомерСтроки» перезапишет номер новой строки. Поэтому служебные поля принято указывать в исключениях.
- 1Получите ссылку на строку-источник: по индексу, через Найти() или из параметра обработчика
- 2Добавьте новую строку в табличную часть-приёмник методом Добавить()
- 3Скопируйте данные через ЗаполнитьЗначенияСвойств() с исключением служебных полей
- 4Заполните поля, которые не копируются автоматически (ключи связи, реквизиты приёмника)
- 5Вызовите пересчёт итогов и проверьте результат в отладчике
Выгрузка строки на управляемой форме
На управляемой форме табличная часть представлена объектом ДанныеФормыКоллекция, и метод Выгрузить() у неё отсутствует. Прямая попытка вызвать его приведёт к ошибке. Правильный путь — выполнить выгрузку в серверной процедуре.
Типовой приём: в серверной процедуре преобразовать данные формы в объект через РеквизитФормыВЗначение("Объект"), выполнить Выгрузить() у табличной части объекта и вернуть результат. Либо, если нужна только одна строка, передать на сервер её номер и собрать структуру:
&НаСервере
Функция ПолучитьДанныеСтроки(НомерСтроки)
ДокументОбъект = РеквизитФормыВЗначение("Объект");
СтрокаТЧ = ДокументОбъект.Товары[НомерСтроки - 1];
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(СтрокаТЧ);
Возврат ДокументОбъект.Товары.Выгрузить(МассивСтрок);
КонецФункции
Учтите ограничение: таблица значений не может быть возвращена с сервера на клиент напрямую в тонком клиенте в произвольном виде — её обычно помещают во временное хранилище через ПоместитьВоВременноеХранилище() или преобразуют в массив структур.
Типичные ошибки и как их избежать
Большинство проблем при выгрузке строк связаны с непониманием того, к какому объекту применяется метод, и с контекстом выполнения кода.
Отдельно стоит упомянуть обратную операцию — загрузку. Если вы выгрузили строку в таблицу значений, изменили её и хотите вернуть в документ, простого «загрузить одну строку» тоже нет: либо используйте Загрузить() для всей табличной части (с полной заменой содержимого), либо переносите значения в конкретную строку через ЗаполнитьЗначенияСвойств().
Проверка результата выгрузки
После выгрузки убедитесь, что данные соответствуют ожиданиям. В отладчике проверьте количество строк результирующей таблицы (должна быть одна), состав колонок и значения ключевых полей — особенно ссылочных, так как они выгружаются как ссылки, а не как представления.
Как проверить результат
Таблица значений содержит ровно одну строку
Строк ноль (передан пустой массив) или больше одной (ошибка в отборе)
Присутствуют все нужные поля с ожидаемыми типами
Колонок нет — проверьте строку перечня колонок во втором параметре
Значения совпадают со строкой-источником, ссылки заполнены
Пустые значения — возможно, копировалась не та строка или поля имеют другие имена
Для быстрой проверки в коде удобно вывести результат в сообщение: Сообщить("Выгружено строк: " + ТаблицаОднойСтроки.Количество());. Это сразу покажет, отработал ли отбор корректно, ещё до анализа значений.
Что важно запомнить
Одну строку выгружают через ТабличнаяЧасть.Выгрузить(МассивСОднойСтрокой), данные переносят в другую табличную часть через ЗаполнитьЗначенияСвойств() с исключением служебных полей, а на управляемой форме выгрузка выполняется только на сервере. Выгруженная таблица значений — независимая копия данных.
Частые вопросы
Можно ли выгрузить строку табличной части напрямую, без массива?
Нет, метод Выгрузить() принадлежит коллекции (табличной части), а не строке. Если нужна одна строка, сформируйте массив из одного элемента и передайте его первым параметром метода. Альтернатива — скопировать поля строки в структуру вручную.
Как выгрузить строку по условию, например по номенклатуре?
Сначала найдите строку методом Найти(Значение, "Номенклатура") или НайтиСтроки() с отбором, затем передайте найденные строки массивом в Выгрузить(). НайтиСтроки() возвращает массив, который можно передать в метод без дополнительной обработки.
Почему на управляемой форме ошибка «Метод объекта не обнаружен: Выгрузить»?
Потому что в управляемой форме табличная часть — это ДанныеФормыКоллекция, у которой такого метода нет. Вынесите выгрузку в серверную процедуру: получите объект через РеквизитФормыВЗначение("Объект") и вызовите Выгрузить() у его табличной части.
Сохранится ли связь выгруженной таблицы с документом?
Нет. Таблица значений, полученная методом Выгрузить(), — это независимая копия данных в памяти. Изменения в ней не отражаются на документе. Чтобы вернуть данные, используйте Загрузить() для всей табличной части или ЗаполнитьЗначенияСвойств() для конкретной строки.
Как выгрузить строку вместе с итогами, посчитанными в форме?
Выгрузка забирает только данные реквизитов табличной части. Вычисляемые поля формы (например, сумма, рассчитанная в коде) в выгрузку не попадут, если их нет среди колонок табличной части. Такие значения пересчитывайте после выгрузки или добавьте колонку в таблицу значений вручную.
Что быстрее: Выгрузить() с массивом или ручное копирование полей?
Для одной строки с малым числом полей ручное заполнение структуры обычно быстрее и прозрачнее. Выгрузить() оправдан, когда нужен весь состав колонок или результат требуется именно как таблица значений — например, для передачи в запрос.