Загрузка из Excel с выбором листа на управляемых формах

21.09.22

Интеграция - Загрузка и выгрузка в Excel

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Загрузка из Excel с выбором листа на управляемых формах:
.epf 10,58Kb
9
9
1 SM
Скачать Купить за 1 850 руб.

Для работы этого способа необходимо чтобы на компьютере пользователя был установлен MS Excel.

1) Создайте пустую форму и отредактируйте её модуль

`

 


///*
//* Copyright (c) 2022, Ilham Djumatov. All rights reserved.
//* Copyrights licensed under the GNU GPLv3.
//* See the accompanying LICENSE file for terms.
//*/

&AtClient
Var ExcelApp;
&AtClient
Var Book;
&AtClient
Var Sheet;

&AtServer
Procedure OnCreateAtServer(Cancel, StandardProcessing)
    
    // Реквизиты формы
    AttributesToAdd = New Array;
    AttributesToAdd.Add(New FormAttribute("FirstRow",     New TypeDescription("Number", New NumberQualifiers(10, 0)), ""));
    AttributesToAdd.Add(New FormAttribute("FirstCol",     New TypeDescription("Number", New NumberQualifiers(10, 0)), ""));
    AttributesToAdd.Add(New FormAttribute("LastRow",      New TypeDescription("Number", New NumberQualifiers(10, 0)), ""));
    AttributesToAdd.Add(New FormAttribute("LastCol",      New TypeDescription("Number", New NumberQualifiers(10, 0)), ""));
    AttributesToAdd.Add(New FormAttribute("List",         New TypeDescription("ValueList"), ""));
    ChangeAttributes(AttributesToAdd);
    
    Parameters.Свойство("FirstRow",     ThisObject["FirstRow"]);
    Parameters.Свойство("FirstCol",     ThisObject["FirstCol"]);
    Parameters.Свойство("LastRow",      ThisObject["LastRow"]);
    Parameters.Свойство("LastCol",      ThisObject["LastCol"]);
    
    If ThisObject["FirstRow"] = 0 Then
        ThisObject["FirstRow"] = 1;
    EndIf;
    
    If ThisObject["FirstCol"] = 0 Then
        ThisObject["FirstCol"] = 1;
    EndIf;
    
    ThisForm.CommandBar.Visible = False;
    ThisForm.Title = "Выберите лист";
    ThisForm.AutoTitle = False;
    ThisForm.WindowOpeningMode = FormWindowOpeningMode.Independent;
    
    Item = Items.Add("List", Type("FormTable"));
    Item.DataPath = "List";
    Item.ReadOnly = True;
    Item.CommandBar.Visible = False;
    Item.SetAction("Selection", "ListSelection");
    
    Item = Items.Add("ListValue", Type("FormField"), Items["List"]);
    Item.DataPath = "List.Value";
    
EndProcedure

&AtClient
Procedure ListSelection(Item, SelectedValue, Field, StandardProcessing)
    
    Status("Выполняется чтение данных");
    
    FirstRow = ThisObject["FirstRow"];
	FirstCol = ThisObject["FirstCol"];
	LastRow = ThisObject["LastRow"];
	LastCol = ThisObject["LastCol"];
    
    WorksheetNumber = Item.CurrentData.Value;
    Try // Открываем лист
        Sheet = Book.WorkSheets(WorksheetNumber);
    Except
        ShowMessageBox(, "Не удалось открыть лист.");
        Return;
    EndTry;
    
    // Определение версии EXCEL.
    Version = Left(ExcelApp.Version,Найти(ExcelApp.Version,".")-1);
    ColCount = 0;
    RowCount = 0;
    If Version = "8" Then
        ColCount = Sheet.Cells.CurrentRegion.Columns.Count;
        RowCount = Sheet.Cells.CurrentRegion.Rows.Count;
    Else 
        // Метод SpecialCells не отображает только количество в области
        // если в области несколько областей, то количество получится неверным
        //ColCount = Sheet.Cells.SpecialCells(11).Column;
        //RowCount = Sheet.Cells.SpecialCells(11).Row;
        
        // Метод UsedRange количество использованных ячеек
        // если первая стрчка или колонка пропущены и то они не будут включаться в количество
        ColCount = Sheet.UsedRange.Columns.Count;
        RowCount = Sheet.UsedRange.Rows.Count;
        
        // Вычисляем правильное количество колонок и строк
        ColCount = Sheet.UsedRange.Column + Sheet.UsedRange.Columns.Count-1;
        RowCount = Sheet.UsedRange.Row + Sheet.UsedRange.Rows.Count-1;
    EndIf;
    
    If LastCol = 0 Then
        LastCol = ColCount;
    ElsIf ColCount < LastCol Then // не хватает колонок //Увеличение проверочного числа (как и захваченной области в самих документах) на дополнительные колонки
        ShowMessageBox(, "В файле не хватает колонок.");
        Return;
    EndIf;
    
    If LastRow = 0 Then
        LastRow = RowCount;
    ElsIf RowCount < LastRow Then // не хватает строк
        ShowMessageBox(, "В файле не хватает строк.");
        Return;
    EndIf;
    
    Range = Sheet.Range(Sheet.Cells(FirstRow,FirstCol), Sheet.Cells(LastRow,LastCol));
    Data = Range.Value.Unload();
    
    NotifyChoice(Data);
    
EndProcedure

&AtClient
Procedure OnOpen(Cancel)
    
    Dialog = New FileDialog(FileDialogMode.Open);
    Dialog.Title = "Выберите файл";
    Dialog.FullFileName = "";
    Dialog.Filter = "Excel документ (*.xls/*.xlsx)|*.xls?";
    Dialog.Multiselect = False;
    Dialog.Directory = "С:\";
    
    Notify = New NotifyDescription("ProcessFileSelection", ThisObject);
    Try
        BeginPuttingFiles(Notify,Dialog, True);
    Except
        ErrorDescription = ErrorDescription();
        ErrorInfo = ErrorInfo();
        If Find(ErrorDescription, "32(0x00000020)") > 0 Then 
            ShowMessageBox(, "Ошибка совместного доступа к файлу. Пожалуйста сперва закройте файл.");
        Else 
            ShowMessageBox(, ErrorDescription);
        EndIf;
        Cancel = True;
    EndTry;
    
    If Dialog.SelectedFiles.Count() = 0 Then 
        Cancel = True;
    EndIf;
    
EndProcedure

&AtClient
Procedure ProcessFileSelection(Files, Params) Export 
    If Files <> Undefined Then 
        For Each TransferedFileDescription In Files Do 
            File = New File(TransferedFileDescription.FullName);
            Notify = New NotifyDescription("ProcessFile", ThisObject, File);
            File.НачатьПроверкуСуществования(Notify);
        EndDo;
    Else 
        Close();
    EndIf;
EndProcedure

&AtClient
Procedure ProcessFile(Exists, File) Export 
    
    If Exists Then
        
        Status("Выполняется чтение листов");
        
        FilePath = File.FullName;
        
        Try
            ExcelApp = New COMОбъект("Excel.Application");
        Except
            Закрыть();
            Return;
        EndTry;
        
        ExcelApp.DisplayAlerts = False;
        ExcelApp.FileValidation = 1;
        
        Try // Открываем файл
            Book = ExcelApp.Workbooks.Open(FilePath);
        Except
            // Debug
            ErrorInfo = ErrorInfo();
            ErrorDescription = ErrorDescription();
            // App
            ExcelApp.Quit();
            ExcelApp = NULL;
            Close();
            Return;
        EndTry;
        
        For SheetNumber = 1 To Book.WorkSheets.Count Do
            ThisObject["List"].Add(SheetNumber, Book.WorkSheets(SheetNumber).Name);
        EndDo;
    Else 
        ShowMessageBox(, "Файл не найден: " + File.FullName);
        Close();
    EndIf;
    
EndProcedure

&AtClient
Procedure BeforeClose(Cancel, Exit, MessageText, StandardProcessing)
    
    If Book <> Undefined Then
        Try
            Book.Close();
        Except
            // Debug
            ErrorInfo = ErrorInfo();
            ErrorDescription = ErrorDescription();
        EndTry;
    EndIf;
    Book = NULL;
    
    // App
    If ExcelApp <> Undefined Then
        Try
            ExcelApp.Quit();
        Except
            // Debug
            ErrorInfo = ErrorInfo();
            ErrorDescription = ErrorDescription();
        EndTry;
    EndIf;
    ExcelApp = NULL;
    
EndProcedure

// Прикрепим обработчики событий
#If Server Then
ThisForm.SetAction("OnCreateAtServer", "OnCreateAtServer");
ThisForm.SetAction("OnOpen", "OnOpen");
ThisForm.SetAction("BeforeClose", "BeforeClose");
#EndIf

 

 

2) Протестируйте загрузку

 

 


&НаСервере
Процедура ЗагрузкаНаСервере(МассивКолонкиСтроки)
    
    // Мы знаем с какой строчки начинаются данные в загружаемом шаблоне
    Для НомерСтроки = 3 По МассивКолонкиСтроки[0].Количество() Цикл 
        
        // Мы знаем в каких колонках содержатся данные в загружаемом шаблоне
        Знч1 = МассивКолонкиСтроки[1-1][НомерСтроки-1]; // Значение R{ИндексСтроки}C1
        Знч2 = МассивКолонкиСтроки[2-1][НомерСтроки-1]; // Значение R{ИндексСтроки}C2
        Знч3 = МассивКолонкиСтроки[3-1][НомерСтроки-1]; // Значение R{ИндексСтроки}C2
        
        // Если в указанной ячейке нету данных то пропускаем эту строчку
        Если ПустаяСтрока(Знч1) Тогда 
            Продолжить;
        КонецЕсли;
        
        Сообщить("" + Знч1 + Символы.Таб + Знч2 + Символы.Таб + Знч3);
        
    КонецЦикла;
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаКомандыЗагрузка(Результат, Параметры) Экспорт 
    
    Если Результат = Неопределено Тогда 
    ИначеЕсли ТипЗнч(Результат) = Тип("Массив") Тогда 
        // Проверяем количество колонок в загружаемом шаблоне
        Если Результат.Количество() < 3 Тогда 
            ПоказатьПредупреждение(,"Ошибка! В файле не хватает колонок.");
        Иначе
            // Проверяем определённые ячейки загружаемого шаблона
            ШаблонПодходит = Истина;
            ШаблонПодходит = ШаблонПодходит И Найти(Результат[01-1][2-1], "Сотрудник") > 0;
            ШаблонПодходит = ШаблонПодходит И Найти(Результат[02-1][2-1], "Должность") > 0;
            ШаблонПодходит = ШаблонПодходит И Найти(Результат[03-1][2-1], "Оклад") > 0;
            Если ШаблонПодходит Тогда 
                ЗагрузкаНаСервере(Результат);
                ПоказатьПредупреждение(, "Готово!");
            Иначе 
                ПоказатьПредупреждение(, "Выбран не корректный файл для загрузки.");
            КонецЕсли;
        КонецЕсли;
    Иначе 
        ПоказатьПредупреждение(, "Загрузка не поддерживается.");
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура Загрузка(Команда)
    П = Новый Структура;
    Оповещение = Новый ОписаниеОповещения("ОбработкаКомандыЗагрузка", ЭтотОбъект);
    ОткрытьФорму("ВнешняяОбработка.БыстраяЗагрузкаИзExcel.Форма.ФормаЧтенияExcel", П,,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры

 

 

Тестировалось на платформе 1С:Предприятие 8.3 (8.3.16.1224).

excel йоксель уф управляемые формы выбор листа загрузка чтение клиент сервер клиент-сервер

См. также

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С одним нажатием. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

5000 4000 руб.

09.11.2016    222398    957    891    

964

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы сделаете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, "Детский мир", МагнитЭкспресс (бывш.Казань-Экспресс), "Леруа Мерлен", ЭНФАНТА (Акушерство), ЛаМода, Летуаль, "Твой дом" в документы "Отчет комиссионера (агента) о продажах" и другие, может работать в "Бухгалтерия 3", "Бухгалтерия 3 КОРП", УТ 11, УНФ, КА 2, ERP. Возможность подключить любые маркетплейсы. Анализ продаж ОЗОН. 30 дней БЕСПЛАТНОГО пользования!

1800 руб.

12.08.2021    33672    286    65    

141

Маркетплейсы Загрузка и выгрузка в Excel Программист Пользователь Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса Яндекс.Маркета «Беру» в 1С из Отчетов Excel для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3 и Управление нашей фирмой, редакция 3.0 в документ «Отчет комиссионера о продажах».

4800 руб.

09.12.2020    23893    230    1    

95

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    214547    636    526    

451

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса СберМегаМаркет для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3 и Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

4800 руб.

07.06.2022    16239    97    0    

76

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 10.07.2024, версия 9.8 - 9.11)

14400 руб.

20.11.2015    153429    373    376    

507
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ivnik 588 27.09.22 09:52 Сейчас в теме
Где обработка берет файл для загрузки? На скринах не увидел поля выбора загружаемого файла....
2. idjumatov 17 27.09.22 10:52 Сейчас в теме
(1) Выбор файла осуществляется стандартным диалогом выбора файла
3. ivnik 588 27.09.22 19:45 Сейчас в теме
(2)
(2)Это понятно, просто на скринах не увидел поля выбора загружаемого файла. Диалог возникает при открытии обработки?
4. idjumatov 17 28.09.22 07:08 Сейчас в теме
(3) Диалог возникает при открытии формы

&AtClient
Procedure OnOpen(Cancel)
    ...
        BeginPuttingFiles(Notify,Dialog, True);

...
5. ivnik 588 28.09.22 12:30 Сейчас в теме
Оставьте свое сообщение