Как загрузить данные из Excel в 1С: подробное руководство с примерами кода

При попытке импортировать данные из Excel в 1С:Предприятие 8.3 пользователи часто сталкиваются с ошибкой Ошибка при чтении файла: неверный формат данных (поле: СтрокаX). Проблема возникает из-за несоответствия типов данных (например, когда в Excel дата хранится как текст, а 1С ожидает формат Дата) или при использовании устаревших методов загрузки через ТекстовыйДокумент. Решение зависит от версии платформы и структуры файла: для файлов до 10 000 строк подойдет встроенный механизм ЗагрузкаДанныхИзТабличногоДокумента, а для больших объемов потребуется COM-соединение или ADODB.

В 80% случаев сбой происходит на этапе сопоставления колонок — 1С не может автоматически определить соответствие между заголовками Excel и реквизитами справочников. Например, если в файле столбец назван "Артикул", а в справочнике "Номенклатура.Код", система выдаст пустые значения. Перед загрузкой обязательно проверьте соответствие типов данных и имен полей через предварительный просмотр в конструкторе загрузки (Файл → Открыть → Предварительный просмотр).

Эта статья покрывает все актуальные способы импорта — от ручного копирования для небольших таблиц до программной загрузки с обработкой ошибок. Особое внимание уделено работе с Excel 2019+ (формат .xlsx), так как старые методы для .xls могут не работать в новых версиях 1С из-за изменений в библиотеке Microsoft ActiveX Data Objects.

1. Подготовка файла Excel для корректной загрузки в 1С

Перед импортом данные в Excel должны соответствовать пяти ключевым требованиям 1С:

  • 📌 Формат ячеек: Даты — только как Дата (не текст!), числа — без разделителей тысяч (используйте формат "Общий").
  • 🔤 Заголовки столбцов: Должны точно совпадать с реквизитами справочников (например, "Контрагент.Наименование", а не просто "Название").
  • 📊 Пустые строки: Удалите все пустые строки и столбцы — 1С воспринимает их как конец данных.
  • 🔢 Уникальные идентификаторы: Для справочников (например, номенклатуры) добавьте столбец с кодами или артикулами.
  • 📁 Кодировка: Сохраните файл в UTF-8 (особенно если есть кириллица), иначе возможны "кракозябры".

Типичная ошибка: в Excel дата хранится как 31.12.2023, а 1С ожидает формат 20231231000000. Чтобы избежать проблем, используйте формулу в Excel для преобразования:

=ТЕКСТ(A1; "yyyyMMdd000000")
Тип данных в ExcelСоответствие в 1СПример корректного значения
ДатаДата20260515000000
ЧислоЧисло12345.67
ТекстСтрока"Товар №1"
ЛогическоеБулевоИстина/Ложь

2. Способ 1: Ручная загрузка через "Универсальный обмен данными"

Самый простой метод для одноразового импорта небольших файлов (до 5 000 строк). Подходит для пользователей без навыков программирования:

  1. Откройте 1С и перейдите в раздел Администрирование → Обмен данными → Универсальный обмен данными.
  2. Выберите Загрузить данные из файла и укажите путь к Excel-файлу.
  3. В окне предварительного просмотра сопоставьте столбцы Excel с реквизитами 1С (например, столбец "Цена" → реквизит "Номенклатура.ЦенаЗакупа").
  4. Нажмите Загрузить и дождитесь завершения операции.

Ограничения метода:

  • ❌ Не поддерживает формулы Excel (только значения).
  • ❌ Медленная работа с файлами >10 000 строк.
  • ❌ Нет обработки ошибок — при сбое загрузка прерывается.

Сохранил файл в формате .xlsx (не .xls)|Удалил все объединенные ячейки|Проверил соответствие заголовков столбцов реквизитам 1С|Убрал все формулы (оставил только значения)-->

⚠️ Внимание: Если при загрузке появляется ошибка Не удалось определить формат файла, проверьте расширение файла. Иногда Excel сохраняет файлы с двойным расширением (например, data.xlsx.xlsx). Переименуйте файл вручную.

3. Способ 2: Программная загрузка через COM-соединение

Для автоматизации импорта используйте встроенный объект Excel.Application. Этот метод работает быстрее универсального обмена и позволяет обрабатывать ошибки. Пример кода для обработки:

Процедура ЗагрузитьИзExcel(ПутьКФайлу)

Excel = Новый COMОбъект("Excel.Application");

Книга = Excel.Workbooks.Open(ПутьКФайлу);

Лист = Книга.Worksheets(1); // Первый лист

// Чтение данных начиная со 2-й строки (1-я - заголовки)

Строка = 2;

Пока Лист.Cells(Строка, 1).Value <> Неопределено Цикл

Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Лист.Cells(Строка, 1).Value);

Если Номенклатура = Неопределено Тогда

Сообщить("Не найдена номенклатура: " + Лист.Cells(Строка, 1).Value);

Иначе

// Запись данных в документ или справочник

Документ = Документы.ПоступлениеТоваров.СоздатьДокумент();

Документ.ДобавитьТовар(Номенклатура, Лист.Cells(Строка, 3).Value); // Кол-во

Документ.Записать();

КонецЕсли;

Строка = Строка + 1;

КонецЦикла;

Книга.Close(False);

Excel.Quit();

КонецПроцедуры

Ключевые моменты:

  • 🔌 Требуется установленный Microsoft Excel на компьютере (COM-объект использует локальную установку).
  • 🚀 Быстрее универсального обмена в 3-5 раз для файлов >20 000 строк.
  • 🛠️ Позволяет добавлять логику обработки (например, пропуск строк с ошибками).
⚠️ Внимание: При работе с COM-объектами всегда освобождайте ресурсы командой Excel.Quit(). Иначе процесс EXCEL.EXE останется висеть в диспетчере задач, что приведет к утечке памяти.

4. Способ 3: Использование ADODB для больших файлов

Для файлов >50 000 строк оптимально использовать ADODB.Connection. Этот метод не требует открытого Excel и работает напрямую с файлом:

Процедура ЗагрузитьЧерезADODB(ПутьКФайлу)

Соединение = Новый COMОбъект("ADODB.Connection");

НаборДанных = Новый COMОбъект("ADODB.Recordset");

// Строка подключения для Excel 2007+ (.xlsx)

СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES""";

Соединение.Open(СтрокаПодключения);

НаборДанных.Open("SELECT * FROM [Лист1$]", Соединение);

Пока Не НаборДанных.EOF Цикл

// Обработка данных

Сообщить(НаборДанных.Fields("Наименование").Value);

НаборДанных.MoveNext();

КонецЦикла;

НаборДанных.Close();

Соединение.Close();

КонецПроцедуры

Преимущества ADODB:

  • Скорость: Обрабатывает 100 000 строк за 2-3 минуты (против 10-15 минут через COM).
  • 📂 Нет зависимости от Excel: Работает даже если Excel не установлен.
  • 🔍 SQL-подобные запросы: Можно фильтровать данные прямо при чтении (SELECT * FROM [Лист1$] WHERE Цена > 1000).

Для работы ADODB требуется установленный драйвер Microsoft Access Database Engine (скачать с сайта Microsoft). Если при подключении возникает ошибка Provider cannot be found, установите драйвер версии 2010 или 2016 (в зависимости от разрядности 1С).

Как определить разрядность 1С

Откройте информацию о системе в 1С (Справка → О программе). Если указано "x64", скачивайте 64-битный драйвер. Для "x86" — 32-битный. Установка неверной версии приведет к ошибке Class not registered.

5. Способ 4: Загрузка через XML (для обмена между системами)

Если Excel-файл является промежуточным звеном в обмене между 1С и другой системой (например, МойСклад или Bitrix24), оптимально конвертировать данные в XML и загружать через стандартные механизмы:

  1. Экспортируйте данные из Excel в XML (в Excel: Файл → Сохранить как → XML-данные).
  2. В 1С используйте обработку ЗагрузкаДанныхИзXML (доступна в типовой конфигурации "Управление торговлей").
  3. Сопоставьте узлы XML с объектами 1С в конструкторе загрузки.

Пример структуры XML для загрузки номенклатуры:

<Документ>

<Товары>

<Товар>

<Код>0001</Код>

<Наименование>Монитор 24"</Наименование>

<Цена>18500.00</Цена>

</Товар>

</Товары>

</Документ>

Преимущества XML:

  • 🔄 Кроссплатформенность: Подходит для обмена между разными системами.
  • 🛡️ Валидация данных: Можно проверить структуру файла перед загрузкой.
  • 📦 Поддержка больших объемов: XML-файлы весят меньше, чем Excel, при аналогичном количестве данных.

6. Обработка ошибок при загрузке

Наиболее частые ошибки и способы их решения:

ОшибкаПричинаРешение
Ошибка при чтении файла: неверный формат данных Несовпадение типов (например, текст вместо числа) Проверьте формат ячеек в Excel (Ctrl+1 → "Число")
Не удалось найти объект по ссылке Отсутствует справочник или документ в 1С Создайте недостающие элементы вручную или добавьте логику создания в код
Ошибка OLE: Сервер выдал исключение Проблемы с COM-объектом Excel Переустановите Microsoft Office или используйте ADODB
Файл используется другим процессом Файл открыт в Excel или другой программе Закройте все экземпляры Excel через диспетчер задач

Для отладки добавьте в код обработку исключений:

Попытка

// Код загрузки

Исключение

ЗаписатьЛог(ОписаниеОшибки());

Сообщить("Ошибка загрузки: " + ОписаниеОшибки());

КонецПопытки;

Ручная загрузка через "Универсальный обмен данными"|COM-соединение (Excel.Application)|ADODB|XML|Другой вариант-->

7. Оптимизация загрузки больших файлов (>100 000 строк)

При работе с большими объемами данных следуйте этим рекомендациям:

  • 🔄 Пакетная обработка: Разбейте файл на части по 20 000 строк и загружайте последовательно.
  • 📂 Отключите индексы: Перед загрузкой отключите индексы в справочниках (Справочник.Индексирование = Ложь), затем включите обратно.
  • 🕒 Выполняйте в фоне: Используйте ФоновоеЗадание для загрузки, чтобы не блокировать интерфейс.
  • 🗑️ Очищайте кэш: После загрузки выполните ОчиститьКэшКонфигурации().

Пример кода для пакетной загрузки:

Процедура ЗагрузитьПакетно(ПутьКФайлу, РазмерПакета = 20000)

Соединение = Новый COMОбъект("ADODB.Connection");

// ... инициализация соединения ...

НаборДанных.Open("SELECT * FROM [Лист1$]", Соединение);

Счетчик = 0;

Пакет = Новый Массив();

Пока Не НаборДанных.EOF Цикл

Пакет.Добавить(НаборДанных.Fields("Код").Value);

Счетчик = Счетчик + 1;

Если Счетчик >= РазмерПакета Тогда

ОбработатьПакет(Пакет); // Ваша функция обработки

Пакет.Очистить();

Счетчик = 0;

КонецЕсли;

НаборДанных.MoveNext();

КонецЦикла;

Если Пакет.Количество() > 0 Тогда

ОбработатьПакет(Пакет);

КонецЕсли;

КонецПроцедуры

8. Автоматизация: планировщик задач и регламентные задания

Чтобы загрузка данных из Excel выполнялась автоматически (например, каждый день в 2:00), настройте регламентное задание:

  1. Создайте обработку с кодом загрузки (например, Обработка.ЗагрузкаExcel).
  2. В 1С перейдите в Администрирование → Поддержка и обслуживание → Регламентные задания.
  3. Добавьте новое задание, укажите обработку и расписание (например, Ежедневно в 02:00).
  4. Активируйте задание и проверьте логи выполнения в журнале регламентных заданий.

Для внешней автоматизации (например, если файл Excel обновляется на сетевом диске) используйте Планировщик задач Windows:

  1. Создайте .bat-файл с командой запуска 1С в режиме предприятия:
    start "" "C:\Program Files\1cv8\8.3.20.1500\bin\1cv8.exe" ENTERPRISE /S "ИмяСервера\ИмяБазы" /N "Пользователь" /P "Пароль" /Execute "Обработка.ЗагрузкаExcel.Загрузить()"
  2. В планировщике задач создайте задачу с триггером по расписанию и действием "Запуск программы" (укажите путь к .bat-файлу).
⚠️ Внимание: При автоматической загрузке всегда добавляйте в код отправку уведомлений об ошибках (например, на email через Почта.Отправить()). Иначе вы рискуете пропустить сбои, которые могут привести к некорректным данным в базе.

FAQ: Частые вопросы по загрузке Excel в 1С

Как загрузить Excel с несколькими листами?

При использовании ADODB укажите имя листа в запросе: SELECT * FROM [Лист2$]. Для COM-объекта переключайтесь между листами через Книга.Worksheets(2) (индексация с 1).

Пример для ADODB:

НаборДанных.Open("SELECT * FROM [Лист2$]", Соединение);
Почему 1С не видит столбец с датой?

1С ожидает дату в формате ГГГГММДДЧЧММСС, а Excel может передавать ее как текст или число. Преобразуйте дату в Excel формулой:

=ТЕКСТ(A1; "yyyyMMdd000000")

Или обработайте в коде 1С:

ДатаИзExcel = Лист.Cells(Строка, 3).Value;

Если ТипЗнч(ДатаИзExcel) = Тип("Строка") Тогда

Дата1С = Дата(Лев(ДатаИзExcel, 10)); // Преобразуем "31.12.2023" в дату

КонецЕсли;

Можно ли загрузить Excel в 1С:Зарплата и Управление Персоналом?

Да, но в типовой конфигурации "Зарплата и Управление Персоналом 3.1" нет встроенного механизма загрузки. Используйте:

  • Для небольших файлов: Универсальный обмен данными (требует доработки конфигурации).
  • Для автоматизации: COM-соединение или ADODB (примеры кода выше подходят и для ЗУП).

Для загрузки сотрудников или начислений создайте обработку с сопоставлением полей Excel и реквизитов справочника ФизическиеЛица.

Как ускорить загрузку файла на 200 000 строк?

Используйте комбинацию методов:

  1. Разбейте файл на части по 50 000 строк (в Excel: Данные → Текст по столбцам → Разбить на страницы).
  2. Загружайте через ADODB с отключенными индексами:
Справочник.Номенклатура.ОтключитьИндексирование();

// Код загрузки

Справочник.Номенклатура.ВключитьИндексирование();

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

Фон = ФоновыеЗадания.СоздатьФоновоеЗадание("Обработка.ЗагрузкаExcel.ЗагрузитьБольшойФайл");

Фон.ВыполнитьАсинхронно();

Почему после загрузки в 1С появляются пустые строки?

Причины и решения:

  • 📄 Пустые строки в Excel: Удалите их перед загрузкой (в Excel: отфильтруйте данные → удалите пустые строки).
  • 🔍 Несовпадение типов: Если в Excel пустая ячейка, а в 1С поле обязательное, строка не загрузится. Добавьте проверку:
    Если Лист.Cells(Строка, 1).Value = Неопределено Тогда
    

    Продолжить; // Пропускаем пустую строку

    КонецЕсли;

  • 🛠️ Ошибка в коде: Проверьте цикл чтения — возможно, счетчик строк не увеличивается.