Работа с данными в платформе 1С:Предприятие неразрывно связана с использованием языка запросов. Часто возникает ситуация, когда необходимо обработать полученные данные не в табличном документе или отчете, а непосредственно в коде, передавая их дальше по логике программы. Для этого используется метод Выгрузить, который преобразует результат выполнения запроса в программируемые коллекции.

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

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

Основные типы структур данных

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

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

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

  • 📦 Массив — простейшая коллекция для последовательного перебора элементов без имен колонок.
  • 📊 Таблица Значений — структурированный набор данных с именованными колонками и типами.
  • 🌳 Дерево Значений — иерархическая структура для отображения вложенных данных и группировок.
📊 Какую структуру вы используете чаще всего?
Массив
Таблица Значений
Дерево Значений
Список Значений

Выгрузка результата в Массив

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

Обратите внимание, что при выгрузке в массив теряется явная типизация колонок, хотя значения сохраняются. Доступ к полям осуществляется через квадратные скобки по имени поля или индексу. Это удобно для быстрых скриптов, но менее читаемо в сложных алгоритмах по сравнению с таблицей значений.

Пример кода показывает, как получить выборку и сразу преобразовать её. Если результат запроса содержит десятки тысяч строк, это может потребовать значительного объема ресурсов.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Номенклатура.Наименование ИЗ Справочник.Номенклатура КАК Номенклатура";

Результат = Запрос.Выполнить();

МассивДанных = Результат.Выгрузить();

⚠️ Внимание: При выгрузке в массив все данные считываются с сервера базы данных на клиент (или в память процесса) единым блоком. Убедитесь, что объем выборки не превысит доступную оперативную память.
💡

Если вам нужно просто проверить наличие записей, не выгружайте весь массив. Используйте метод Пустой() у объекта РезультатЗапроса — это гораздо быстрее и экономнее.

Использование Таблицы Значений

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

Синтаксис аналогичен выгрузке в массив, но результатом будет объект типа ТаблицаЗначений. К колонкам можно обращаться по имени, а также добавлять новые колонки или изменять существующие прямо в коде. Это дает гибкость, недоступную при работе с обычным массивом.

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

ТаблицаДанных = Результат.Выгрузить();

// Добавление новой вычисляемой колонки

ТаблицаДанных.Колонки.Добавить("Итог", ТипОписанияТипов("Число"));

Для Каждого Строка Из ТаблицаДанных Цикл

Строка.Итог = Строка.Сумма * Строка.Количество;

КонецЦикла;

☑️ Проверка перед выгрузкой в Таблицу Значений

Выполнено: 0 / 4

Работа с иерархией и Деревом Значений

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

Для корректной работы этого метода запрос должен возвращать определенные поля: Родитель (ссылка на родительский элемент) и УникальныйИдентификатор (или ключевое поле). Платформа сама свяжет строки в дерево на основе этих данных. Это избавляет программиста от написания сложных алгоритмов рекурсивной вложенности.

Полученное Дерево Значений позволяет легко обходить ветви, сворачивать и разворачивать узлы программно. Это особенно актуально при формировании отчетов с группировками или при заполнении полей форм с древовидным представлением.

Метод выгрузки Требуемые поля в запросе Тип результата Лучшее применение
Выгрузить() Любые Массив Простой перебор, временные данные
Выгрузить() в ТЗ Любые Таблица Значений Отчеты, сложная обработка колонок
ВыгрузитьДерево() Родитель, Ключ Дерево Значений Иерархические отчеты, справочники
⚠️ Внимание: Если в запросе для дерева не указано поле Родитель или оно имеет неверный тип, метод ВыгрузитьДерево() вернет плоскую таблицу или вызовет ошибку выполнения. Всегда проверяйте структуру выборки.

Оптимизация и работа с большими данными

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

Построчная обработка позволяет не хранить весь результат в оперативной памяти, а обрабатывать данные по мере их поступления из СУБД. Это значительно снижает потребление памяти и ускоряет старт обработки, хотя общее время выполнения может быть сопоставимым.

Однако, если вам все же нужна выгрузка, убедитесь, что на стороне СУБД выполнены все необходимые отборы. Не выгружайте лишние поля. Используйте только те колонки, которые реально будут использованы в коде, чтобы уменьшить объем передаваемых данных.

Почему построчная обработка быстрее?

Построчная обработка не создает копию всех данных в памяти 1С. Данные читаются потоком из базы данных. Это экономит RAM и время на аллокацию памяти для огромных массивов, но требует, чтобы логика обработки была встроена прямо в цикл чтения.

Частые ошибки и типы данных

Одной из распространенных проблем является несоответствие типов данных при дальнейшей работе с выгруженной структурой. Например, поле даты может прийти в виде строки или некорректного формата, если в запросе использовалось приведение типов. Всегда проверяйте типы полей после выгрузки.

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

Для избежания ошибок используйте функцию ЕСТЬNULL() прямо в тексте запроса, подменяя пустые значения на явные нули или пустые строки. Это сделает выгруженные данные более предсказуемыми и безопасными для арифметических операций.

ТекстЗапроса = "ВЫБРАТЬ

| Номенклатура.Наименование,

| ЕСТЬNULL(ОстаткиТоваров.Количество, 0) КАК Количество

|ИЗ..";

⚠️ Внимание: Интерфейс и возможности конструктора запросов могут отличаться в разных версиях платформы 1С. Если вы используете старую версию (например, 8.2), некоторые методы выгрузки могут работать иначе или отсутствовать. Сверяйтесь с синтаксис-помощником вашей версии.
💡

Использование ЕСТЬNULL() в тексте запроса — лучшая практика для защиты кода от ошибок при работе с пустыми значениями после выгрузки данных.

FAQ: Часто задаваемые вопросы

В чем разница между Выгрузить() и ВыгрузитьКолонки()?

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

Можно ли выгрузить результат запроса сразу в CSV файл?

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

Что делать, если при выгрузке в Дерево Значений теряется иерархия?

Проверьте, что в запросе обязательно присутствуют поля с именами Родитель (ссылка на родителя) и поле ключа (например, Ссылка или УникальныйИдентификатор). Без поля Родитель платформа не сможет построить связи между узлами.

Как очистить выгруженную Таблицу Значений?

Для очистки таблицы значений от всех строк используется метод Очистить(). Если нужно удалить только колонки, используется метод Колонки.Очистить(). Будьте осторожны, эти действия необратимы в рамках текущей сессии работы с объектом.