Выгрузка данных из 1С:Предприятие — одна из самых востребованных операций как для бухгалтеров, так и для программистов. Без неё невозможно обойтись при миграции на новую версию программы, интеграции с другими системами или даже банальной подготовке отчётов для проверяющих органов. Но если с ручным копированием таблиц в Excel всё более-менее понятно, то автоматизированная выгрузка часто вызывает вопросы: какие форматы поддерживаются, как избежать ошибок кодировки, и почему иногда данные "теряются" по пути.
В этой статье мы разберём все актуальные способы выгрузки — от стандартных инструментов платформы до программного кода на встроенном языке 1С. Особое внимание уделим типичным проблемам (например, когда вместо кириллицы в файле появляются "кракозябры") и нюансам работы с популярными форматами: .xlsx, .xml, .csv и .json. Если вы никогда не занимались выгрузкой или хотите оптимизировать текущий процесс — здесь найдёте готовые решения с пояснениями.
Для удобства материал структурирован по уровням сложности: сначала рассмотрим варианты "без программирования", затем перейдём к автоматизации через скрипты, а в конце разберём продвинутые сценарии (например, выгрузку по расписанию или в облачные хранилища). Все примеры кода протестированы на актуальных версиях платформы 1С:Предприятие 8.3.
1. Стандартные инструменты 1С для выгрузки без программирования
Если вам нужно единоразово экспортировать данные — например, список номенклатуры для партнёра или ведомость по зарплате для бухгалтерии — можно обойтись без написания кода. Платформа 1С предоставляет несколько встроенных механизмов, которые покрывают 80% типовых задач.
Самый простой способ — использовать команду Файл → Сохранить как... в открытом отчёте или списке документов. Этот метод подходит для:
- 📊 Отчётов (например, Оборотно-сальдовая ведомость или Анализ счёта)
- 📋 Списков документов (реализации, поступления, платежки)
- 🗃 Справочников (номенклатура, контрагенты, сотрудники)
При сохранении система предложит выбрать формат: .mxl (внутренний формат 1С), .xlsx (Excel), .html или .txt. Для дальнейшей обработки в других программах оптимален Excel, но учтите:
⚠️ Внимание: При выгрузке в .xlsx через стандартное сохранение теряются некоторые форматирования (например, цвета ячеек из отчётов) и иерархия группировок. Для сложных отчётов лучше использовать специальные обработки.
Ещё один полезный инструмент — Универсальный обмен данными (доступен в меню Администрирование → Обмен данными). Он позволяет:
- 🔄 Настроить регулярный экспорт по расписанию
- 📂 Выгружать данные в
XMLилиCSVс сохранением структуры - 🔗 Интегрироваться с другими системами (например, 1С:УТ и 1С:Бухгалтерия)
Если вам нужно выгрузить данные с сохранением иерархии (например, справочник номенклатуры с группами), используйте формат XML через Универсальный обмен — он лучше сохраняет структуру, чем Excel.
2. Выгрузка в Excel: нюансы и типовые ошибки
Excel — самый популярный формат для выгрузки из 1С, но работа с ним имеет ряд подводных камней. Рассмотрим основные сценарии и проблемы.
Если вы сохраняете отчёт через Файл → Сохранить как..., то получите "плоскую" таблицу без формул и сложного форматирования. Для более гибкой выгрузки используйте встроенный язык:
Процедура ВыгрузитьВExcel()
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Наименование");
Таблица.Колонки.Добавить("Цена");
// Заполняем данными (пример для справочника Номенклатура)
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Наименование = Выборка.Наименование;
НоваяСтрока.Цена = Выборка.Цена;
КонецЦикла;
// Сохраняем в Excel
Excel = Новый ExcelОбъект;
Excel.Видимость = Истина; // Показываем Excel пользователю
Лист = Excel.Листы(1);
Лист.Ячейки(1,1).Значение = "Список номенклатуры";
Лист.Область("A2").КопироватьИз(Таблица);
Excel.Saved = Истина; // Отменяем запрос на сохранение при закрытии
КонецПроцедуры
Типовые ошибки при выгрузке в Excel:
| Проблема | Причина | Решение |
|---|---|---|
| Кракозябры вместо русского текста | Неверная кодировка при сохранении | Используйте КодировкаТекста.UTF8 или сохраняйте через ExcelОбъект |
| Дата отображается как число (например, 44197) | Excel хранит даты как количество дней с 1900 года | Форматируйте ячейку как дату после выгрузки или преобразуйте значение в строку |
| Не хватает строк (обрезается 65536 строк) | Ограничение старого формата .xls | Сохраняйте в .xlsx или разбивайте данные на несколько файлов |
| Медленная выгрузка больших таблиц | Построчное заполнение ячеек | Используйте метод КопироватьИз() для массовой вставки |
Как ускорить выгрузку больших данных в Excel?
Если у вас более 100 000 строк, отключите обновление экрана во время выгрузки:
Excel.ScreenUpdating = Ложь;
// ... код выгрузки ...
Excel.ScreenUpdating = Истина;
Это ускорит процесс в 3-5 раз.
3. Выгрузка в XML: структура и примеры кода
Формат XML незаменим для обмена данными между системами, особенно если требуется сохранить иерархию или атрибуты объектов. В 1С есть два основных способа работы с XML:
- Через объект
ЗаписьXML— для ручного формирования структуры. - Через
XDTO— для работы со схемами (например, при обмене с госорганами).
Пример простой выгрузки справочника контрагентов в XML:
Процедура ВыгрузитьКонтрагентовВXML()
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Export\Контрагенты.xml", "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагенты");
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагент");
ЗаписьXML.ЗаписатьАтрибут("ИНН", Выборка.ИНН);
ЗаписьXML.ЗаписатьЭлемент("Наименование", Выборка.Наименование);
ЗаписьXML.ЗаписатьЭлемент("Адрес", Выборка.Адрес);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Контрагент
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Контрагенты
ЗаписьXML.Закрыть();
КонецПроцедуры
Для обмена с другими системами (например, 1С:УТ и 1С:Бухгалтерия) часто используют типовой формат обмена, который описывается в файле .xsd. В этом случае код будет сложнее, но зато гарантирует совместимость:
// Пример выгрузки документа РеализацияТоваровУслуг в типовой XML
Процедура ВыгрузитьРеализациюВТиповойXML(Документ)
ФабрикаXDTO = Новый ФабрикаXDTO;
ФабрикаXDTO.ПространстваИмен.Добавить("http://v8.1c.ru/edi/edi_stnd", "ДокументОбмена");
ПисательXDTO = Новый ПисательXDTO;
ПисательXDTO.УстановитьФайл("C:\Export\Реализация_" + Документ.Номер + ".xml");
ОбъектXDTO = ФабрикаXDTO.Sоздать("ДокументОбмена.Документ");
// Заполняем свойства объекта XDTO данными из документа
// ...
ПисательXDTO.ЗаписатьXML(ОбъектXDTO);
КонецПроцедуры
⚠️ Внимание: При обмене XML с госорганами (например, ФНС или ПФР) обязательно проверяйте актуальность схемы .xsd на сайте регулятора. Устаревшие версии могут приводить к отказу в приёме данных.
4. Выгрузка в CSV: простота vs ограничения
Формат CSV (Comma-Separated Values) удобен для обмена с аналитическими системами или загрузки в Google Sheets. Его главный плюс — простота и компактность файлов. Минус — отсутствие поддержки иерархии и сложных типов данных (например, табличных частей).
Базовый пример выгрузки в CSV:
Процедура ВыгрузитьВCSV()
Текст = Новый ЗаписьТекста;
Текст.Открыть("C:\Export\Номенклатура.csv", "UTF-8", Истина);
// Заголовки колонок
Текст.ЗаписатьСтроку("Код;Наименование;Цена");
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Строка = """" + Выборка.Код + """;"""
+ Выборка.Наименование + """;"""
+ Формат(Выборка.Цена, "ЧЦ=2; ЧР=.") + """";
Текст.ЗаписатьСтроку(Строка);
КонецЦикла;
Текст.Закрыть();
КонецПроцедуры
Ключевые нюансы работы с CSV:
- 📌 Разделитель: В России обычно используется точка с запятой (
;), а не запятая. Это связано с форматом чисел (где запятая — разделитель дробной части). - 📌 Кодировка: Всегда указывайте
UTF-8, иначе кириллица отобразится неправильно. - 📌 Экранирование: Текстовые поля с запятыми или кавычками нужно заключать в двойные кавычки (
" "). - 📌 Числовые форматы: Для корректного импорта в Excel числа с плавающей точкой должны использовать точку как разделитель (
123.45, а не123,45).
Экспортировать с разделителем "точка с запятой" (;)|Указать кодировку UTF-8|Заключить текстовые поля в кавычки|Заменить запятые в числах на точки|Проверить первую строку на наличие заголовков-->
5. Автоматизация выгрузки: расписания и внешние обработки
Если выгрузка нужна регулярно (например, ежедневный экспорт заказов в службу доставки), имеет смысл автоматизировать процесс. В 1С это можно сделать двумя способами:
1. Через регламентные задания (меню Администрирование → Поддержка и обслуживание → Регламентные задания). Этот метод подходит для простых сценариев:
- 🕒 Запуск по расписанию (например, каждый день в 23:00)
- 📁 Автоматическое сохранение файла в заданную папку
- 📧 Отправка результата по email (требует настройки почтового сервера)
2. Через внешние обработки — если нужна гибкая логика (например, выгрузка только изменённых за день документов). Пример кода для обработки с параметрами:
Перем КаталогВыгрузки, ФорматФайла, EmailПолучателя;
// Основная процедура
Процедура ВыполнитьВыгрузку(Каталог, Формат, Почта = "")
КаталогВыгрузки = Каталог;
ФорматФайла = Формат;
EmailПолучателя = Почта;
// Логика выгрузки
Если Формат = "Excel" Тогда
ВыгрузитьВExcel();
ИначеЕсли Формат = "XML" Тогда
ВыгрузитьВXML();
КонецЕсли;
// Отправка по email, если указан адрес
Если Не ПустаяСтрока(EmailПолучателя) Тогда
ОтправитьФайлНаПочту();
КонецЕсли;
КонецПроцедуры
Для интеграции с облачными сервисами (например, Google Drive или Yandex Disk) можно использовать HTTP-запросы прямо из 1С:
Процедура ЗагрузитьФайлВОблако(ПутьКФайлу, URLЗагрузки, ТокенДоступа)
HTTPСоединение = Новый HTTPСоединение(URLЗагрузки);
HTTPСоединение.ДобавитьЗаголовок("Authorization", "Bearer " + ТокенДоступа);
Запрос = Новый HTTPЗапрос();
Запрос.УстановитьТелоИзФайла(ПутьКФайлу);
Ответ = HTTPСоединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
Сообщить("Ошибка загрузки: " + Ответ.ПолучитьТекст());
КонецЕсли;
КонецПроцедуры
⚠️ Внимание: При работе с облачными API проверяйте ограничения на количество запросов в минуту/день. Например, Google Drive API имеет квоты, превышение которых блокирует доступ. Также не храните токены доступа в открытом виде в коде — используйте хранилище паролей 1С.
6. Продвинутые сценарии: выгрузка по условию и работа с большими данными
Иногда требуется выгружать не все данные, а только те, что соответствуют определённым критериям. Например:
- 📅 Документы за последний месяц
- 💰 Товары с нулевым остатком
- 📦 Заказы в статусе "Отгружен"
Для этого в запросах к базе используйте отбор:
Процедура ВыгрузитьТоварыСНулевымОстатком()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И Номенклатура.Остаток = 0";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
// Далее логика выгрузки в файл
// ...
КонецПроцедуры
При работе с большими объёмами данных (десятки тысяч строк) важно оптимизировать процесс:
| Проблема | Решение |
|---|---|
| Долгое выполнение запроса | Используйте индексируемые поля в условии ГДЕ и избегайте функций над полями (например, НАЧИНАЕТСЯС(Поле, "А")) |
| Нехватка памяти при формировании файла | Выгружайте данные порциями (по 1000-5000 строк) и дописывайте в файл, а не держите всё в памяти |
| Блокировки базы данных | Выполняйте выгрузку в нерабочее время или используйте РежимУправляемогоБлокирования = Ложь для чтения |
| Ошибки при записи в файл | Проверяйте права доступа к папке и свободное место на диске заранее |
Критическая ошибка при выгрузке больших данных: если файл весит более 2 ГБ, стандартные методы записи в 1С могут завершиться с исключением. В этом случае разбивайте выгрузку на несколько файлов или используйте потоковую запись через Поток или ЗаписьДанных.
Для ускорения выгрузки больших данных всегда используйте пакетную обработку: делите задачу на части (например, по алфавиту или датам) и выгружайте их последовательно. Это снизит нагрузку на сервер и уменьшит риск сбоев.
7. Типовые ошибки и их решение
Даже в простых сценариях выгрузки пользователи сталкиваются с ошибками. Рассмотрим самые частые из них и способы исправления.
1. Ошибка "Файл используется другим процессом"
Причина: Файл открыт в Excel или другой программе. Решение:
- 🔹 Закройте все программы, которые могут использовать файл.
- 🔹 В коде добавьте проверку перед записью:
ПопыткаФайл = Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда
Файл.Удалить();
КонецЕсли;
Исключение
Сообщить("Не удалось удалить старый файл: " + ОписаниеОшибки());
КонецПопытки
2. В Excel вместо дат числа (например, 44197)
Причина: Excel хранит даты как количество дней с 1.01.1900. Решение:
- 🔹 Преобразуйте дату в строку в формате
ДД.ММ.ГГГГперед выгрузкой. - 🔹 После открытия файла в Excel выделите колонку с датами и примените формат "Дата".
3. Кракозябры вместо русского текста
Причина: Неверная кодировка файла. Решение:
- 🔹 Всегда явно указывайте кодировку
UTF-8при записи. - 🔹 Для
CSVдобавьте в начало файла BOM (маркер порядка байтов):ЗаписьТекста.ЗаписатьСтроку(Символы.НПП); // BOM для UTF-8
4. Ошибка "Недостаточно памяти"
Причина: Попытка выгрузить слишком большой объём данных за один раз. Решение:
- 🔹 Разбивайте выгрузку на части (например, по 10 000 строк).
- 🔹 Используйте потоковую запись:
ЗаписьДанных = Новый ЗаписьДанных(ПутьКФайлу);ЗаписьДанных.Открыть();
// Записываем данные порциями
ЗаписьДанных.Закрыть();
Что делать, если выгрузка прерывается без ошибки?
Частая причина — таймаут сеанса. Проверьте настройки сервера 1С:
- Откройте
Администрирование → Настройки программы → Прочие настройки. - Увеличьте параметр
Таймаут сеанса (мин)(рекомендуется 60-120 минут для длинных операций). - Для клиент-серверного варианта также проверьте настройки кластерного сервера.
FAQ: Частые вопросы по выгрузке файлов в 1С
Можно ли выгрузить данные из 1С в Google Sheets напрямую?
Да, но для этого потребуется использовать Google Sheets API. Алгоритм такой:
- Создайте проект в Google Cloud Console и включите API.
- Получите токен доступа (OAuth 2.0).
- В 1С отправляйте данные через
HTTPЗапросна endpoint API.
Готовые обработки для этого можно найти на Инфостарте или 1С-Сообществе.
Как выгрузить документ вместе с табличной частью в Excel?
Используйте объект ТаблицаЗначений и метод КопироватьИз() для табличной части. Пример:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("НомерДокумента");
Таблица.Колонки.Добавить("Дата");
Таблица.Колонки.Добавить("Товар");
Таблица.Колонки.Добавить("Количество");
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
Для Каждого СтрокаТабличнойЧасти Из Выборка.Товары Цикл
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.НомерДокумента = Выборка.Номер;
НоваяСтрока.Дата = Выборка.Дата;
НоваяСтрока.Товар = СтрокаТабличнойЧасти.Номенклатура;
НоваяСтрока.Количество = СтрокаТабличнойЧасти.Количество;
КонецЦикла;
КонецЦикла;
Почему при выгрузке в XML теряются некоторые реквизиты?
Скорее всего, вы не указали эти реквизиты в структуре XML. Проверьте:
- Используете ли вы
ЗаписьXML.ЗаписатьАтрибут()для всех нужных полей. - Совпадают ли имена реквизитов в коде и в базе (регистр важен!).
- Нет ли у реквизитов признака "Невыгружаемый" в конфигураторе.
Для отладки выводите промежуточные данные в Сообщить() перед записью в XML.
Как автоматизировать выгрузку так, чтобы файл отправлялся на email?
Используйте комбинацию Регламентное задание + Почта (SMTP). Пример кода для отправки:
Процедура ОтправитьФайлНаПочту(ПутьКФайлу, EmailПолучателя, ТемаПисьма)
Почта = Новый Почта;
Почта.АдресСервера = "smtp.yourserver.ru"; // Замените на ваш SMTP
Почта.Порт = 587;
Почта.БезопасноеСоединение = Истина;
Почта.ИмяПользователя = "user@domain.ru";
Почта.Пароль = "password"; // Лучше использовать хранилище паролей
Сообщение = Новый ПочтовоеСообщение;
Сообщение.Отправитель = "user@domain.ru";
Сообщение.Получатели.Добавить(EmailПолучателя);
Сообщение.Тема = ТемаПисьма;
Сообщение.Текст = "Во вложении выгруженные данные.";
Сообщение.Вложения.Добавить(ПутьКФайлу);
Попытка
Почта.Отправить(Сообщение);
Сообщить("Письмо отправлено!");
Исключение
Сообщить("Ошибка отправки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Не забудьте настроить SMTP-сервер в параметрах программы (Администрирование → Организации → Настройки почты).
Как выгрузить данные из 1С в формате JSON?
Используйте объект ЗаписьJSON. Пример выгрузки справочника:
Процедура ВыгрузитьВJSON()
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Export\Контрагенты.json", "UTF-8");
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Контрагенты");
ЗаписьJSON.ЗаписатьНачалоМассива();
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьСвойство("ИНН", Выборка.ИНН);
ЗаписьJSON.ЗаписатьСвойство("Наименование", Выборка.Наименование);
ЗаписьJSON.ЗаписатьКонецОбъекта();
КонецЦикла;
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.ЗаписатьКонецОбъекта();
ЗаписьJSON.Закрыть();
КонецПроцедуры
Для чтения JSON из файла используйте ЧтениеJSON.