Как загрузить поступления из файла Excel в 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

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

Типовые механизмы загрузки данных в 1С (без программирования или с минимальными доработками)

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

  1. "Заполнить из внешнего файла" в документах:

    Многие современные конфигурации 1С (например, 1С:Розница 3.0, 1С:УНФ, 1С:Бухгалтерия 8) предоставляют удобный функционал для импорта данных непосредственно в табличные части документов. Обычно это кнопка с названием "Заполнить из внешнего файла" или аналогичная. Она позволяет:

    1. Копирование и вставка: Мы можем выделить данные в файле Excel, скопировать их (Ctrl+C) и затем вставить в табличную часть документа 1С. Программа постарается автоматически сопоставить колонки. Этот метод особенно удобен для загрузки большого списка номенклатуры с количеством и ценой.
    2. Импорт из файла: Некоторые механизмы позволяют выбрать файл Excel, и система сама попытается его прочитать. В таких случаях может потребоваться предварительная настройка соответствия колонок файла Excel реквизитам табличной части документа 1С (например, Штрих-код, Артикул, Наименование). После загрузки система обычно отображает окно предварительного просмотра, где мы можем проверить найденную номенклатуру, внести исправления или дозаполнить недостающие данные.

    Этот способ хорошо подходит для загрузки товаров, где нужно сопоставить штрих-коды, артикулы или наименования. Однако для загрузки полноценных документов "Поступление" с данными шапки (Контрагент, Склад, Дата) и автоматическим созданием документа может потребоваться более сложный подход.

  2. Универсальные обработки для загрузки данных из табличного документа:

    Платформа 1С 8.3 имеет широкие возможности для работы с табличными документами. Часто существуют внешние обработки, универсальные для управляемых форм, которые позволяют массово загружать списки различных объектов (например, номенклатуры, контрагентов) из файлов Excel, OpenDocument, текстовых файлов и других форматов. Эти обработки обычно предоставляют гибкую настройку:

    1. Выбор файла: Мы выбираем файл Excel, который содержит наши данные.
    2. Настройка соответствия: Указываем, какой тип данных мы загружаем (например, справочник "Номенклатура", документ "Поступление"). Затем мы сопоставляем колонки из Excel с полями в 1С.
    3. Автоматическая загрузка: После настройки обработка автоматически загружает данные, создавая или обновляя элементы справочников или документы.

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

  3. Загрузка цен поставщика из файлов:

    В более сложных конфигурациях, таких как 1С:Управление торговлей, 1С:Комплексная автоматизация или 1С:ERP, есть встроенный функционал для работы с прайс-листами поставщиков. Этот механизм позволяет загружать номенклатуру поставщика, сопоставлять ее с нашей номенклатурой и обновлять цены. Хотя это не прямая загрузка документа "Поступление", такой подход может быть частью общего процесса работы с поставщиками и формирования документов на основе их предложений.

  4. Импорт форм сбора данных из Microsoft Excel:

    В специализированных системах, таких как 1С:Управление холдингом, могут существовать более специфичные обработки для полуавтоматического или пакетного импорта файлов Excel. Они предназначены для сбора и консолидации отчетности, но принцип работы с Excel файлами остается тем же.

Программные способы загрузки данных (с написанием кода)

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

Для нашей задачи – загрузки поступлений – нам потребуется выполнить следующие шаги:

  1. Открыть файл Excel и прочитать данные.
  2. Создать новый документ "Поступление (акты, накладные, УПД)" в 1С.
  3. Заполнить реквизиты шапки документа (Контрагент, Склад, Дата) из данных Excel.
  4. Заполнить табличную часть документа (Товары) из данных Excel или по заданной логике.
  5. Провести и записать документ.

Рассмотрим подробнее основные программные подходы к чтению Excel-файлов.

1. Использование объекта ТабличныйДокумент

Этот способ является предпочтительным для современных управляемых форм 1С и обладает значительными преимуществами: он не требует установки Microsoft Office на компьютере, где выполняется код, и работает одинаково на различных операционных системах (Windows, Linux, MacOS). Мы можем читать данные из файла Excel, как будто это внутренний табличный документ 1С, что делает этот подход быстрым и кроссплатформенным.

Разберем по шагам, как мы можем использовать объект ТабличныйДокумент для чтения данных из Excel:

  1. Открыть файл Excel как ТабличныйДокумент:

    Для начала нам нужно загрузить содержимое файла Excel в объект ТабличныйДокумент. Для этого используется метод Прочитать().

    
    &НаКлиенте
    Процедура ЗагрузитьПоступленияИзExcel(Команда)
        // Создаем диалог выбора файла
        ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ДиалогВыбораФайла.Заголовок = "Выберите файл Excel";
        ДиалогВыбораФайла.ПолноеИмяФайла = ""; // Можно задать начальный путь
    
        // Фильтр для файлов Excel
        ДиалогВыбораФайла.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx|Файлы Excel 97-2003 (*.xls)|*.xls";
    
        Если ДиалогВыбораФайла.Выбрать() Тогда
            ИмяФайла = ДиалогВыбораФайла.ПолноеИмяФайла;
            // На клиенте получаем двоичные данные файла
            ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
            // На сервере обрабатываем двоичные данные
            ЗагрузитьДанныеНаСервере(ДвоичныеДанныеФайла);
        КонецЕсли;
    КонецПроцедуры
    
    &НаСервере
    Процедура ЗагрузитьДанныеНаСервере(ДвоичныеДанныеФайла)
        Попытка
            // Создаем временный файл на сервере для ТабличногоДокумента
            ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
            ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);
    
            // Создаем ТабличныйДокумент и читаем из временного файла
            ТабДок = Новый ТабличныйДокумент;
            ТабДок.Прочитать(ИмяВременногоФайла);
    
            // Удаляем временный файл
            УдалитьФайлы(ИмяВременногоФайла);
    
            // Теперь данные из Excel доступны в ТабДок.
            // Можем начать обработку
            ОбработатьДанныеИзТабличногоДокумента(ТабДок);
    
        Исключение
            Сообщить("Ошибка при загрузке файла: " + ОписаниеОшибки());
        КонецПопытки;
    КонецПроцедуры
    
  2. Чтение данных по ячейкам:

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

    
    &НаСервере
    Процедура ОбработатьДанныеИзТабличногоДокумента(ТабДок)
        Для Каждого Лист Из ТабДок.Листы Цикл
            // Предположим, что данные находятся на первом листе или мы знаем его имя
            // Обычно, если файл Excel имеет несколько листов, нам нужно выбрать нужный
            Если Лист.Имя = "Лист1" Или ТабДок.Листы.Индекс(Лист) = 0 Тогда // Обрабатываем первый лист
                        
                // Предполагаем, что шапка документа поступления находится в первой строке
                // (Контрагент, Склад, Дата, Сумма)
                // Для примера, возьмем одну строку с данными для документа "Поступление".
                // В реальном сценарии мы бы итерировались по нескольким строкам,
                // каждая из которых может представлять отдельное поступление или строку ТЧ.
    
                // Пример чтения данных для одного поступления из первой строки
                // (Предполагаем, что Контрагент в A1, Склад в B1, Дата в C1, Сумма в D1)
                КонтрагентСтрока = Лист.Область(1, 1).Текст; // Ячейка A1
                СкладСтрока       = Лист.Область(1, 2).Текст; // Ячейка B1
                ДатаСтрока        = Лист.Область(1, 3).Текст; // Ячейка C1
                СуммаСтрока       = Лист.Область(1, 4).Текст; // Ячейка D1
    
                // Создаем документ "Поступление (акты, накладные, УПД)"
                НовоеПоступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
                НовоеПоступление.Дата = Дата(ДатаСтрока); // Преобразуем строку в дату
                НовоеПоступление.Организация = УказатьОрганизациюПоУмолчанию(); // Ваша логика выбора организации
    
                // Поиск контрагента по наименованию
                НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию(КонтрагентСтрока);
                Если НайденныйКонтрагент <> Неопределено Тогда
                    НовоеПоступление.Контрагент = НайденныйКонтрагент;
                Иначе
                    Сообщить("Не найден контрагент: " + КонтрагентСтрока);
                    Возврат;
                КонецЕсли;
    
                // Поиск склада по наименованию
                НайденныйСклад = Справочники.Склады.НайтиПоНаименованию(СкладСтрока);
                Если НайденныйСклад <> Неопределено Тогда
                    НовоеПоступление.Склад = НайденныйСклад;
                Иначе
                    Сообщить("Не найден склад: " + СкладСтрока);
                    Возврат;
                КонецЕсли;
    
                // Заполняем табличную часть.
                // Если в Excel только данные шапки, а товары не детализированы (как в сообщении автора)
                // мы можем добавить товар по умолчанию.
                Если НовоеПоступление.Товары.Количество() = 0 Тогда
                    НоваяСтрока = НовоеПоступление.Товары.Добавить();
                    НоваяСтрока.Номенклатура = ПолучитьНоменклатуруПоУмолчанию(); // Ваша функция для получения товара по умолчанию
                    НоваяСтрока.Количество = 1; // Предполагаем количество
                    НоваяСтрока.Цена = Число(СуммаСтрока); // Сумма в цене
                    НоваяСтрока.Сумма = Число(СуммаСтрока);
                КонецЕсли;
    
                Попытка
                    НовоеПоступление.Записать(РежимЗаписиДокумента.Проведение);
                    Сообщить("Документ поступления от " + НовоеПоступление.Дата + " для контрагента " + НовоеПоступление.Контрагент + " успешно загружен.");
                Исключение
                    Сообщить("Ошибка записи документа: " + ОписаниеОшибки());
                КонецПопытки;
    
                Прервать; // Выходим после обработки первого листа
            КонецЕсли;
        КонецЦикла;
    КонецПроцедуры
    
    // Вспомогательные функции, которые нужно реализовать
    &НаСервере
    Функция УказатьОрганизациюПоУмолчанию()
        // Ваша логика для получения организации по умолчанию
        // Например:
        Возврат Справочники.Организации.НайтиПоНаименованию("Основная организация");
    КонецФункции
    
    &НаСервере
    Функция ПолучитьНоменклатуруПоУмолчанию()
        // Ваша логика для получения номенклатуры по умолчанию,
        // если детализация товаров не представлена в Excel
        Возврат Справочники.Номенклатура.НайтиПоНаименованию("Услуги");
    КонецФункции
    
  3. Использование ТабличныйДокумент + ПостроительЗапроса:

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

    Например, мы можем указать диапазон ячеек, которые содержат наши данные, и настроить ПостроительЗапроса для чтения этой области.

    
    &НаСервере
    Процедура ОбработатьДанныеЧерезПостроительЗапроса(ТабДок)
        Попытка
            Лист = ТабДок.Листы[0]; // Первый лист
    
            // Задаем область данных (например, A2:D100)
            // Предполагаем, что первая строка - заголовки
            ОбластьДляЗапроса = Лист.Область(2, 1, Лист.ВысотаТаблицы, Лист.ШиринаТаблицы);
    
            ПостроительЗапроса = Новый ПостроительЗапроса();
            ПостроительЗапроса.УстановитьПараметр("Область", ОбластьДляЗапроса);
            ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьДляЗапроса);
    
            // Добавляем поля, соответствующие колонкам Excel
            // Здесь нужно указать имена полей, как они будут называться в запросе
            // Изначально ПостроительЗапроса будет видеть колонки как "Колонка1", "Колонка2" и т.д.
            // Мы можем переименовать их или использовать по индексу.
            // Пример: ПостроительЗапроса.Поля.Добавить("Контрагент", "Колонка1");
    
            // Для простоты, выгрузим все в ТаблицуЗначений и затем обработаем
            ТаблицаДанных = ПостроительЗапроса.Выполнить().Выгрузить();
    
            Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
                // Здесь мы обрабатываем каждую строку из Excel, которая теперь в виде строки ТЗ
                // СтрокаТЗ.Колонка1 - будет содержать значение из первой колонки
                // Пример: Создаем новое поступление для каждой строки
                // СоздатьПоступлениеИзСтрокиТЗ(СтрокаТЗ);
            КонецЦикла;
        Исключение
            Сообщить("Ошибка при обработке через ПостроительЗапроса: " + ОписаниеОшибки());
        КонецПопытки;
    КонецПроцедуры
    

2. Использование COM-объекта Excel.Application

Этот метод применяется, если на компьютере, где выполняется сервер 1С или толстый клиент, установлен Microsoft Excel. Он позволяет программно взаимодействовать с приложением Excel, открывать книги, читать данные из листов и ячеек, а также использовать все функции Excel. Преимущество в полном контроле над файлом Excel, но недостаток в привязке к операционной системе Windows и необходимости установки Office.

Разберем основные шаги:

  1. Создание COM-объекта:

    Мы начинаем с создания экземпляра объекта Excel.Application. Важно помнить, что этот код должен выполняться либо на клиентской машине, где установлен Excel, либо на сервере 1С, если там также установлен Excel.

    
    &НаКлиенте
    Процедура ЗагрузитьПоступленияЧерезCOM(Команда)
        // Создаем диалог выбора файла
        ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ДиалогВыбораФайла.Заголовок = "Выберите файл Excel";
        ДиалогВыбораФайла.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx|Файлы Excel 97-2003 (*.xls)|*.xls";
    
        Если ДиалогВыбораФайла.Выбрать() Тогда
            ИмяФайла = ДиалогВыбораФайла.ПолноеИмяФайла;
            ЗагрузитьДанныеЧерезCOMНаСервере(ИмяФайла); // Передаем имя файла на сервер для обработки
        КонецЕсли;
    КонецПроцедуры
    
    &НаСервере
    Процедура ЗагрузитьДанныеЧерезCOMНаСервере(ИмяФайла)
        Попытка
            Excel = Новый COMОбъект("Excel.Application");
            Excel.Visible = Ложь; // Скрываем окно Excel
    
            РабочаяКнига = Excel.Workbooks.Open(ИмяФайла);
            Лист = РабочаяКнига.Sheets(1); // Обращаемся к первому листу
    
            // Теперь мы можем читать данные из ячеек
            // Пример: чтение ячейки A1, B1, C1, D1
            КонтрагентСтрока = Лист.Cells(1, 1).Value;
            СкладСтрока       = Лист.Cells(1, 2).Value;
            ДатаСтрока        = Лист.Cells(1, 3).Value;
            СуммаСтрока       = Лист.Cells(1, 4).Value;
    
            // Создание документа "Поступление" аналогично примеру с ТабличнымДокументом
            НовоеПоступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
            НовоеПоступление.Дата = Дата(ДатаСтрока); // Преобразуем строку в дату
    
            // Поиск и установка Контрагента, Склада
            // ... (логика аналогична примеру с ТабличнымДокументом) ...
    
            Если НовоеПоступление.Товары.Количество() = 0 Тогда
                НоваяСтрока = НовоеПоступление.Товары.Добавить();
                НоваяСтрока.Номенклатура = ПолучитьНоменклатуруПоУмолчанию();
                НоваяСтрока.Количество = 1;
                НоваяСтрока.Цена = Число(СуммаСтрока);
                НоваяСтрока.Сумма = Число(СуммаСтрока);
            КонецЕсли;
    
            Попытка
                НовоеПоступление.Записать(РежимЗаписиДокумента.Проведение);
                Сообщить("Документ поступления от " + НовоеПоступление.Дата + " для контрагента " + НовоеПоступление.Контрагент + " успешно загружен через COM.");
            Исключение
                Сообщить("Ошибка записи документа через COM: " + ОписаниеОшибки());
            КонецПопытки;
    
        Исключение
            Сообщить("Ошибка при работе с Excel через COM: " + ОписаниеОшибки());
        КонецПопытки;
    
        // Важно! Всегда освобождаем COM-объекты
        Если РабочаяКнига <> Неопределено Тогда
            РабочаяКнига.Close();
        КонецЕсли;
        Если Excel <> Неопределено Тогда
            Excel.Quit();
        КонецЕсли;
    КонецПроцедуры
    

3. Технология ADO (ADODB.Connection)

Этот способ также позволяет читать данные из Excel. Он считается одним из быстрых и эффективных методов, особенно для больших файлов, так как использует механизм баз данных для доступа к данным Excel. Для его использования требуется установка соответствующих драйверов (например, Microsoft Access Database Engine) и построение строки соединения. Этот метод более сложен в настройке, но может быть оправдан для высокопроизводительных задач.

4. Использование внешних источников данных

В конфигурацию 1С можно добавить внешний источник данных, указав файл Excel в качестве источника. Для этого также может потребоваться установка драйвера Microsoft Excel Driver. После настройки соединения мы можем использовать запросы к этому внешнему источнику, как если бы это была обычная база данных, что позволяет получать данные с помощью стандартного языка запросов 1С.

Особенности загрузки поступлений

При загрузке поступлений из Excel есть несколько важных моментов, которые мы должны учесть:

  1. Данные шапки документа:

    Как правило, в файле Excel должны быть колонки, содержащие информацию для заполнения шапки документа "Поступление":

    • Контрагент: Полное или краткое наименование, ИНН. Важно, чтобы это наименование совпадало с наименованием существующего контрагента в 1С, либо мы должны быть готовы создать нового контрагента, если он не найден.
    • Склад: Наименование склада. Аналогично, склад должен существовать в 1С.
    • Дата: Дата поступления. Формат даты в Excel должен быть распознаваем 1С.
    • Номер входящего документа: Часто присутствует в Excel и используется для заполнения соответствующего поля в 1С.
    • Сумма: Если в Excel нет детализации по товарам, но есть общая сумма поступления, мы можем использовать ее для заполнения одной строки табличной части с "товаром по умолчанию".
  2. Табличная часть документа (Товары):

    Заполнение табличной части — наиболее сложная часть. Если в файле Excel присутствует детализация по товарам (номенклатура, количество, цена, сумма), то:

    1. Поиск номенклатуры: Для каждой позиции из Excel нам нужно найти соответствующий элемент справочника "Номенклатура" в 1С. Поиск может осуществляться по артикулу, полному наименованию, штрих-коду. Если номенклатура не найдена, мы должны решить, что делать: создать новую, пропустить строку или вывести сообщение об ошибке.
    2. Заполнение реквизитов строки: После нахождения номенклатуры мы заполняем количество, цену, сумму, ставку НДС и другие реквизиты строки табличной части документа.

    Если же, как упоминалось в исходном сообщении, "Табличным документы не нужны" в смысле детализации по товарам, но требуется создать документ "Поступление", мы можем использовать подход с "товаром по умолчанию". Мы программно добавляем одну строку в табличную часть документа, указывая предопределенную номенклатуру (например, "Услуги", "Товар по умолчанию"), количество 1 и общую сумму поступления из Excel.

  3. Сопоставление колонок и шаблоны:

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

В завершение, выбор метода загрузки зависит от наших требований к производительности, наличия установленного Microsoft Office, а также от сложности структуры Excel-файла. Для простых случаев можно обойтись типовыми механизмами или обработками. Если требуется полная автоматизация и сложная логика, нам потребуется написать собственный код, используя либо объект ТабличныйДокумент (рекомендуется для кроссплатформенности), либо COM-объект Excel.Application (при наличии Excel на машине).

← На главную