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