При попытке импортировать данные из 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С и перейдите в раздел
Администрирование → Обмен данными → Универсальный обмен данными. - Выберите
Загрузить данные из файлаи укажите путь к Excel-файлу. - В окне предварительного просмотра сопоставьте столбцы Excel с реквизитами 1С (например, столбец "Цена" → реквизит "Номенклатура.ЦенаЗакупа").
- Нажмите
Загрузитьи дождитесь завершения операции.
Ограничения метода:
- ❌ Не поддерживает формулы 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 и загружать через стандартные механизмы:
- Экспортируйте данные из Excel в XML (в Excel:
Файл → Сохранить как → XML-данные). - В 1С используйте обработку
ЗагрузкаДанныхИзXML(доступна в типовой конфигурации "Управление торговлей"). - Сопоставьте узлы 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), настройте регламентное задание:
- Создайте обработку с кодом загрузки (например,
Обработка.ЗагрузкаExcel). - В 1С перейдите в
Администрирование → Поддержка и обслуживание → Регламентные задания. - Добавьте новое задание, укажите обработку и расписание (например,
Ежедневно в 02:00). - Активируйте задание и проверьте логи выполнения в журнале регламентных заданий.
Для внешней автоматизации (например, если файл Excel обновляется на сетевом диске) используйте Планировщик задач Windows:
- Создайте
.bat-файл с командой запуска 1С в режиме предприятия:start "" "C:\Program Files\1cv8\8.3.20.1500\bin\1cv8.exe" ENTERPRISE /S "ИмяСервера\ИмяБазы" /N "Пользователь" /P "Пароль" /Execute "Обработка.ЗагрузкаExcel.Загрузить()" - В планировщике задач создайте задачу с триггером по расписанию и действием "Запуск программы" (укажите путь к
.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 строк?
Используйте комбинацию методов:
- Разбейте файл на части по 50 000 строк (в Excel:
Данные → Текст по столбцам → Разбить на страницы). - Загружайте через
ADODBс отключенными индексами:
Справочник.Номенклатура.ОтключитьИндексирование();
// Код загрузки
Справочник.Номенклатура.ВключитьИндексирование();
3. Выполняйте загрузку в фоновом задании:
Фон = ФоновыеЗадания.СоздатьФоновоеЗадание("Обработка.ЗагрузкаExcel.ЗагрузитьБольшойФайл");
Фон.ВыполнитьАсинхронно();
Почему после загрузки в 1С появляются пустые строки?
Причины и решения:
- 📄 Пустые строки в Excel: Удалите их перед загрузкой (в Excel: отфильтруйте данные → удалите пустые строки).
- 🔍 Несовпадение типов: Если в Excel пустая ячейка, а в 1С поле обязательное, строка не загрузится. Добавьте проверку:
Если Лист.Cells(Строка, 1).Value = Неопределено ТогдаПродолжить; // Пропускаем пустую строку
КонецЕсли;
- 🛠️ Ошибка в коде: Проверьте цикл чтения — возможно, счетчик строк не увеличивается.