Разработка и Конфигурация · 14 мин
Как выгрузить таблицу значений в 1С
Как выгрузить таблицу значений 1С в Excel, CSV, MXL и файл обработкой. Примеры кода на встроенном языке, проверка результата и типичные ошибки.
Таблица значений — один из самых используемых объектов встроенного языка 1С. В ней хранятся результаты запросов, промежуточные расчёты, данные для обмена с другими системами. Рано или поздно возникает задача выгрузить эту таблицу наружу: в Excel для анализа, в CSV для загрузки в стороннюю программу или в файл для передачи коллеге.
Единой кнопки «выгрузить таблицу значений» в платформе нет, потому что таблица значений — это объект в памяти, а не элемент интерфейса. Способ выгрузки зависит от того, где таблица находится: в отладчике, в форме обработки, в результате запроса или в консоли кода. Ниже разобраны все рабочие варианты с примерами кода и проверкой результата.
Материал ориентирован на разработчиков и продвинутых пользователей, работающих с управляемыми и обычными формами 1С:Предприятие 8.3. Примеры кода приведены на встроенном языке и подходят для большинства типовых и самописных конфигураций.
Что такое таблица значений и где она находится
Таблица значений — это несохраняемый в базе объект: набор строк и колонок, существующий только в оперативной памяти сеанса. Она появляется как результат метода Выгрузить() запроса, как реквизит формы типа «ТаблицаЗначений», как результат загрузки данных из файла или как временная структура внутри алгоритма.
Из-за того, что объект живёт только в памяти, «выгрузить» его можно двумя принципиально разными путями. Первый — преобразовать в другой объект, который умеет сохраняться: табличный документ, текстовый документ, XML. Второй — обойти строки в цикле и записать данные в файл нужного формата вручную.
Перед выбором способа определите, где сейчас находится таблица и кто будет выполнять выгрузку. Если это разовая задача разработчика — достаточно консоли кода или внешней обработки. Если выгружать будут пользователи регулярно — понадобится кнопка в форме с записью файла на диск или отправкой на клиент.
Выгрузка через табличный документ: универсальный способ
Самый простой и надёжный метод — вывести таблицу значений в табличный документ, а затем сохранить его в нужном формате. Табличный документ 1С поддерживает запись в MXL (родной формат), XLSX, XLS, ODS, PDF, HTML и TXT. Это покрывает большинство практических задач без единой строки цикла.
Последовательность такая: создаётся объект ТабличныйДокумент, в него построчно выводятся значения колонок, затем вызывается метод Записать() с указанием пути и типа файла. Для красивого результата с заголовками и границами используют макет с областями, но для служебной выгрузки достаточно прямого вывода значений в ячейки.
ТабДок = Новый ТабличныйДокумент;
// Заголовки колонок
НомерКолонки = 1;
Для Каждого Колонка Из ТЗ.Колонки Цикл
ТабДок.Область(1, НомерКолонки).Текст = Колонка.Имя;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Данные
НомерСтроки = 2;
Для Каждого СтрокаТЗ Из ТЗ Цикл
НомерКолонки = 1;
Для Каждого Колонка Из ТЗ.Колонки Цикл
ТабДок.Область(НомерСтроки, НомерКолонки).Текст =
Строка(СтрокаТЗ[Колонка.Имя]);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Записать("C:\Temp\Выгрузка.xlsx", ТипФайлаТабличногоДокумента.XLSX);
После выполнения откройте файл и проверьте, что количество строк совпадает с количеством строк таблицы значений плюс строка заголовков. Если таблица большая, учитывайте, что табличный документ тоже хранится в памяти — при сотнях тысяч строк лучше использовать потоковую запись в CSV.
- 1Создайте объект ТабличныйДокумент
- 2Выведите в первую строку имена колонок таблицы значений
- 3В цикле по строкам ТЗ заполните ячейки значениями
- 4Вызовите метод Записать с путём к файлу и типом XLSX или MXL
- 5Откройте файл и сверьте количество строк и содержимое колонок
Выгрузка в CSV построчной записью
CSV — стандарт обмена с внешними системами: его понимают Excel, базы данных, скрипты на Python и большинство программ. Для выгрузки таблицы значений в CSV используют объект ТекстовыйДокумент или ЗаписьТекста, формируя строки с разделителем.
Ключевые моменты: выберите разделитель (точка с запятой привычнее для русской локали Excel, запятая — стандарт для многих зарубежных систем), экранируйте значения, содержащие разделитель или кавычки, и задайте кодировку файла. UTF-8 с BOM корректно открывается в Excel, ANSI (windows-1251) — в старых программах.
Запись = Новый ЗаписьТекста("C:\Temp\Выгрузка.csv",
КодировкаТекста.UTF8);
// Заголовок
МассивЗаголовков = Новый Массив;
Для Каждого Колонка Из ТЗ.Колонки Цикл
МассивЗаголовков.Добавить(Колонка.Имя);
КонецЦикла;
Запись.ЗаписатьСтроку(СтрСоединить(МассивЗаголовков, ";"));
// Данные
Для Каждого СтрокаТЗ Из ТЗ Цикл
МассивЗначений = Новый Массив;
Для Каждого Колонка Из ТЗ.Колонки Цикл
Значение = СтрокаТЗ[Колонка.Имя];
Текст = Строка(Значение);
Текст = СтрЗаменить(Текст, """", """""");
Если СтрНайти(Текст, ";") > 0 Тогда
Текст = """" + Текст + """";
КонецЕсли;
МассивЗначений.Добавить(Текст);
КонецЦикла;
Запись.ЗаписатьСтроку(СтрСоединить(МассивЗначений, ";"));
КонецЦикла;
Запись.Закрыть();
Обратите внимание на типы данных: даты, числа и булево при преобразовании в строку принимают вид по умолчанию, который может не подойти принимающей системе. Дату часто форматируют явно через Формат(Значение, "ДФ=yyyy-MM-dd"), а числа выводят без разделителей групп.
Выгрузка на клиенте и в тонком клиенте
В файловом режиме или при работе под толстым клиентом запись файла на диск выполняется напрямую. В тонком клиенте и веб-клиенте сервер не имеет доступа к диску пользователя, поэтому схема двухэтапная: файл формируется на сервере, помещается во временное хранилище, а затем передаётся на клиент и сохраняется через диалог.
Типовой фрагмент для управляемой формы выглядит так: серверная процедура строит табличный документ, записывает его во временный файл и помещает двоичные данные в хранилище; клиентская процедура вызывает НачатьПолучениеФайлаССервера или ПолучитьФайл с диалогом выбора места сохранения.
&НаСервере
Функция СформироватьФайлНаСервере()
ТабДок = Новый ТабличныйДокумент;
// ... заполнение табличного документа из ТЗ ...
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
УдалитьФайлы(ИмяФайла);
Возврат Адрес;
КонецФункции
&НаКлиенте
Процедура Выгрузить(Команда)
Адрес = СформироватьФайлНаСервере();
ПолучитьФайл(Адрес, "Выгрузка.xlsx", Истина);
КонецПроцедуры
Если выгрузка выполняется регламентным заданием на сервере, диалоги недоступны — файл сразу пишется в каталог на сервере, доступный учётной записи агента. Заранее проверьте права на запись в целевой каталог, иначе получите ошибку без файла.
Выгрузка из отладчика и консоли кода
Частая ситуация у разработчика: таблица значений получена в отладке, и нужно быстро посмотреть её содержимое целиком или передать коллеге. В конфигураторе таблицу значений можно открыть через «Вычислить выражение» (Shift+F9), выбрав переменную и нажав «Показать значение в отдельном окне». Данные отобразятся в виде таблицы, которую можно скопировать.
Для копирования в буфер обмена выделите ячейки в окне просмотра и нажмите Ctrl+C — данные вставятся в Excel с сохранением колонок. Это самый быстрый способ для разового анализа без написания кода. Ограничение: при очень больших таблицах просмотр в отладчике может работать медленно.
Более гибкий вариант — консоль кода (внешняя обработка, позволяющая выполнить произвольный код в пользовательском режиме). В ней можно получить таблицу запросом и тут же выгрузить её любым из описанных способов, не меняя конфигурацию. Такой подход безопасен для базы, если код только читает данные и пишет файл на диск.
Сравнение способов выгрузки
Выбор способа выгрузки
Когда нужен готовый файл Excel с минимумом кода. Ограничение: вся таблица держится в памяти, при очень больших объёмах возможна нехватка памяти.
Когда файл принимает внешняя система или данных очень много. Ограничение: нет форматирования, нужно вручную управлять разделителем, экранированием и кодировкой.
Когда нужен разовый просмотр при разработке. Ограничение: только для разработчика, не подходит пользователям и регулярных задач.
Когда таблицу нужно передать в другую базу 1С с сохранением типов. Ограничение: файл читается только средствами 1С, для Excel не подходит.
Для пользовательских задач чаще всего выбирают XLSX через табличный документ: файл сразу открывается в Excel, колонки подписаны, ничего настраивать не нужно. Для интеграций и больших объёмов — CSV с явным форматированием значений. XML через ЗначениеВФайл или XDTO-сериализацию применяют, когда таблицу должна прочитать другая база 1С с сохранением типов данных.
Проверка результата и контрольные точки
После выгрузки не ограничивайтесь тем, что файл появился на диске. Откройте его и сверьте ключевые показатели с исходной таблицей: количество строк, итоги по числовым колонкам, содержимое нескольких случайных строк. Расхождение в итогах почти всегда означает потерю или дублирование строк при записи.
Особое внимание уделите датам и числам: при выгрузке в XLSX через табличный документ значения записываются как текст, если вы выводили Строка(Значение). Для дальнейших расчётов в Excel это неудобно — при необходимости записывайте в ячейки сами значения и задавайте формат ячейки.
Как проверить результат выгрузки
Совпадает с количеством строк ТЗ плюс строка заголовков
Строк меньше или больше — потеря или дублирование данных
Итог по колонке в файле равен итогу по ТЗ
Итог не сходится, числа выглядят как текст с разделителями групп
Значения целиком в одной ячейке
Строка разорвана на несколько, колонки смещены
Даты читаемы, кириллица отображается без искажений
Кракозябры вместо русского текста, даты в неверном формате
Типичные ошибки и ограничения
Отдельно стоит упомянуть ограничения объёма. Табличный документ, Excel и оперативная память имеют практические пределы: файл XLSX с миллионом строк формируется долго и может не открыться. Если таблица значений получена из большого запроса, разумнее выгружать её порциями через пакетный запрос или сразу писать в CSV потоково.
Ещё одна граница самостоятельной работы: не выгружайте в открытый файл данные, содержащие персональные сведения или коммерческую тайну, без понимания, кто получит к нему доступ. Файл выгрузки не защищён правами 1С — любой, кто получит файл, увидит всё содержимое.
Частые вопросы
Можно ли выгрузить таблицу значений без программирования?
Частично. Если таблица отображается в форме как табличное поле, её можно вывести в табличный документ через стандартную команду «Вывести список» (кнопка «Ещё» в форме списка или контекстное меню) и сохранить результат. Для таблицы значений внутри алгоритма без кода не обойтись — нужна хотя бы консоль кода.
Как выгрузить таблицу значений в Excel без табличного документа?
Можно через COM-объект Excel.Application, заполняя ячейки напрямую. Способ требует установленного Excel на машине, где выполняется код, работает медленнее табличного документа и уязвим к «зависшим» процессам Excel при ошибках. В большинстве случаев выгрузка через табличный документ проще и надёжнее.
Почему в выгруженном CSV вместо русских букв кракозябры?
Причина в несовпадении кодировки файла и кодировки, в которой его открывает программа. Excel ожидает UTF-8 с BOM или ANSI. Записывайте файл с кодировкой UTF-8 и добавляйте BOM, либо открывайте CSV в Excel через мастер импорта текста с явным указанием кодировки.
Как выгрузить таблицу значений в другую базу 1С?
Используйте сериализацию: функцию ЗначениеВСтрокуВнутр для строки, ЗначениеВФайл для файла или XDTO-сериализатор. В принимающей базе примените обратную функцию — ЗначениеИзСтрокиВнутр или ЗначениеИзФайла. Типы колонок сохранятся полностью, в отличие от CSV и Excel.
Что делать, если таблица значений слишком большая для выгрузки?
Выгружайте порциями: получайте данные пакетным запросом с отбором по диапазону ключей и дописывайте в CSV построчно. Избегайте промежуточного табличного документа — он держит весь объём в памяти. Также проверьте, действительно ли нужны все колонки: сокращение состава полей заметно уменьшает расход памяти.
Можно ли выгрузить таблицу значений на сервере Linux?
Да, методы Записать табличного документа и ЗаписьТекста работают на сервере под Linux. Учитывайте различия в путях (прямые слэши, регистр имён) и права доступа учётной записи агента сервера 1С к целевому каталогу. COM-объект Excel на Linux недоступен.
Что важно запомнить
Таблица значений живёт только в памяти, поэтому её преобразуют в сохраняемый объект: табличный документ для XLSX и MXL, текстовый поток для CSV, сериализацию для передачи в другую базу 1С. В клиент-серверном режиме файл передают на клиент через временное хранилище. После выгрузки обязательно сверяйте количество строк, итоги по числам и кодировку — большинство ошибок обнаруживается именно на этом шаге.