К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как выгрузить строку табличной части в 1С

Как выгрузить строку табличной части в 1С: методы Выгрузить(), ВыгрузитьСтроку(), работа с таблицей значений, примеры кода, типичные ошибки и проверка результата.

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

Ключевой инструмент — метод Выгрузить(), который преобразует табличную часть (или её часть) в таблицу значений. Однако он работает с коллекцией целиком, поэтому для одной строки применяют либо выгрузку с отбором через массив строк, либо копирование данных строки в структуру, либо промежуточную таблицу значений с последующим добавлением нужной строки.

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

Что значит «выгрузить строку» и какие есть варианты

Под выгрузкой строки обычно понимают одну из трёх задач: получить данные строки в виде таблицы значений из одной строки, получить их в виде структуры (ключ — имя колонки, значение — данные) или перенести строку в другую табличную часть. От того, какая именно задача стоит, зависит выбор метода.

Табличная часть объекта (документа, справочника) — это коллекция строк типа ТабличнаяЧасть. У неё есть метод Выгрузить(), возвращающий таблицу значений, и метод ВыгрузитьКолонку(). Строка табличной части сама по себе методом Выгрузить() не обладает — это частая причина ошибки «Метод объекта не обнаружен» у начинающих разработчиков.

Выгрузка строки через метод Выгрузить() с массивом строк

Самый прямой способ получить таблицу значений из одной строки — передать в метод Выгрузить() первым параметром массив, содержащий нужную строку. Синтаксис метода: Выгрузить(Строки, Колонки), где первый параметр — массив выгружаемых строк, второй — строка с перечнем колонок через запятую (если не указан, выгружаются все).

СтрокаТЧ = Объект.Товары[0];

МассивСтрок = Новый Массив;

МассивСтрок.Добавить(СтрокаТЧ);

ТаблицаОднойСтроки = Объект.Товары.Выгрузить(МассивСтрок);

// В ТаблицаОднойСтроки теперь одна строка со всеми колонками табличной части

Если нужны не все колонки, передайте их список вторым параметром:

ТаблицаОднойСтроки = Объект.Товары.Выгрузить(МассивСтрок, "Номенклатура, Количество, Цена");

Этот способ удобен, когда результат нужен именно как таблица значений: например, для передачи в запрос через менеджер временных таблиц, для свёртки или для построчного сравнения с другими данными. Учтите, что колонка «НомерСтроки» в выгрузке присутствует, если она входит в состав табличной части, и её значение сохраняется из исходного объекта.

Копирование строки в структуру

Если таблица значений не нужна, а требуется просто набор «имя поля — значение» (например, для передачи между процедурами или сериализации), строку преобразуют в структуру. Готового метода нет, поэтому структуру заполняют вручную или через выгрузку в таблицу значений.

Компактный универсальный вариант — выгрузить строку в таблицу значений и перенести её в структуру циклом по колонкам:

Функция СтрокаВСтруктуру(СтрокаТЧ, ТабличнаяЧасть)

МассивСтрок = Новый Массив;

МассивСтрок.Добавить(СтрокаТЧ);

ТЗ = ТабличнаяЧасть.Выгрузить(МассивСтрок);

Результат = Новый Структура;

Для Каждого Колонка Из ТЗ.Колонки Цикл

Результат.Вставить(Колонка.Имя, ТЗ[0][Колонка.Имя]);

КонецЦикла;

Возврат Результат;

КонецФункции

Если состав полей известен заранее и невелик, проще явно перечислить их: Данные = Новый Структура("Номенклатура, Количество", СтрокаТЧ.Номенклатура, СтрокаТЧ.Количество);. Такой код читается лучше и не тратит ресурсы на выгрузку лишних колонок.

Копирование строки в другую табличную часть

При переносе строки из одной табличной части в другую (в том же документе или в другом объекте) используют метод ЗаполнитьЗначенияСвойств(). Он копирует значения по совпадающим именам свойств, что удобно, когда составы колонок частично совпадают.

НоваяСтрока = ДокументПриемник.Товары.Добавить();

ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточник);

Если имена колонок различаются, третьим параметром передают список копируемых свойств, а четвёртым — исключения. Помните, что ЗаполнитьЗначенияСвойств() копирует и служебные свойства, если их не исключить: например, «НомерСтроки» перезапишет номер новой строки. Поэтому служебные поля принято указывать в исключениях.

Порядок действий при переносе строки
  1. 1
    Получите ссылку на строку-источник: по индексу, через Найти() или из параметра обработчика
  2. 2
    Добавьте новую строку в табличную часть-приёмник методом Добавить()
  3. 3
    Скопируйте данные через ЗаполнитьЗначенияСвойств() с исключением служебных полей
  4. 4
    Заполните поля, которые не копируются автоматически (ключи связи, реквизиты приёмника)
  5. 5
    Вызовите пересчёт итогов и проверьте результат в отладчике

Выгрузка строки на управляемой форме

На управляемой форме табличная часть представлена объектом ДанныеФормыКоллекция, и метод Выгрузить() у неё отсутствует. Прямая попытка вызвать его приведёт к ошибке. Правильный путь — выполнить выгрузку в серверной процедуре.

Типовой приём: в серверной процедуре преобразовать данные формы в объект через РеквизитФормыВЗначение("Объект"), выполнить Выгрузить() у табличной части объекта и вернуть результат. Либо, если нужна только одна строка, передать на сервер её номер и собрать структуру:

&НаСервере

Функция ПолучитьДанныеСтроки(НомерСтроки)

ДокументОбъект = РеквизитФормыВЗначение("Объект");

СтрокаТЧ = ДокументОбъект.Товары[НомерСтроки - 1];

МассивСтрок = Новый Массив;

МассивСтрок.Добавить(СтрокаТЧ);

Возврат ДокументОбъект.Товары.Выгрузить(МассивСтрок);

КонецФункции

Учтите ограничение: таблица значений не может быть возвращена с сервера на клиент напрямую в тонком клиенте в произвольном виде — её обычно помещают во временное хранилище через ПоместитьВоВременноеХранилище() или преобразуют в массив структур.

Типичные ошибки и как их избежать

Большинство проблем при выгрузке строк связаны с непониманием того, к какому объекту применяется метод, и с контекстом выполнения кода.

Типичные ошибки
01
Вызов СтрокаТЧ.Выгрузить() — у строки табличной части нет такого метода, выгружать нужно коллекцию с массивом строк
02
Вызов Выгрузить() на клиенте в управляемой форме — метод доступен только на сервере, требуется серверная процедура
03
Копирование служебных полей через ЗаполнитьЗначенияСвойств() без исключений — ломается нумерация строк и ключи связей
04
Обращение к строке по индексу без проверки количества строк — при пустой табличной части возникает ошибка выхода за границы
05
Ожидание, что выгруженная таблица связана с объектом — таблица значений это копия, изменения в ней не попадают обратно в документ автоматически

Отдельно стоит упомянуть обратную операцию — загрузку. Если вы выгрузили строку в таблицу значений, изменили её и хотите вернуть в документ, простого «загрузить одну строку» тоже нет: либо используйте Загрузить() для всей табличной части (с полной заменой содержимого), либо переносите значения в конкретную строку через ЗаполнитьЗначенияСвойств().

Проверка результата выгрузки

После выгрузки убедитесь, что данные соответствуют ожиданиям. В отладчике проверьте количество строк результирующей таблицы (должна быть одна), состав колонок и значения ключевых полей — особенно ссылочных, так как они выгружаются как ссылки, а не как представления.

Контрольные точки

Как проверить результат

Количество строк в выгрузке
Норма

Таблица значений содержит ровно одну строку

Тревожный признак

Строк ноль (передан пустой массив) или больше одной (ошибка в отборе)

Состав колонок
Норма

Присутствуют все нужные поля с ожидаемыми типами

Тревожный признак

Колонок нет — проверьте строку перечня колонок во втором параметре

Значения полей
Норма

Значения совпадают со строкой-источником, ссылки заполнены

Тревожный признак

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

Для быстрой проверки в коде удобно вывести результат в сообщение: Сообщить("Выгружено строк: " + ТаблицаОднойСтроки.Количество());. Это сразу покажет, отработал ли отбор корректно, ещё до анализа значений.

Итог

Что важно запомнить

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

Частые вопросы

Можно ли выгрузить строку табличной части напрямую, без массива?

Нет, метод Выгрузить() принадлежит коллекции (табличной части), а не строке. Если нужна одна строка, сформируйте массив из одного элемента и передайте его первым параметром метода. Альтернатива — скопировать поля строки в структуру вручную.

Как выгрузить строку по условию, например по номенклатуре?

Сначала найдите строку методом Найти(Значение, "Номенклатура") или НайтиСтроки() с отбором, затем передайте найденные строки массивом в Выгрузить(). НайтиСтроки() возвращает массив, который можно передать в метод без дополнительной обработки.

Почему на управляемой форме ошибка «Метод объекта не обнаружен: Выгрузить»?

Потому что в управляемой форме табличная часть — это ДанныеФормыКоллекция, у которой такого метода нет. Вынесите выгрузку в серверную процедуру: получите объект через РеквизитФормыВЗначение("Объект") и вызовите Выгрузить() у его табличной части.

Сохранится ли связь выгруженной таблицы с документом?

Нет. Таблица значений, полученная методом Выгрузить(), — это независимая копия данных в памяти. Изменения в ней не отражаются на документе. Чтобы вернуть данные, используйте Загрузить() для всей табличной части или ЗаполнитьЗначенияСвойств() для конкретной строки.

Как выгрузить строку вместе с итогами, посчитанными в форме?

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

Что быстрее: Выгрузить() с массивом или ручное копирование полей?

Для одной строки с малым числом полей ручное заполнение структуры обычно быстрее и прозрачнее. Выгрузить() оправдан, когда нужен весь состав колонок или результат требуется именно как таблица значений — например, для передачи в запрос.