Как реализовать загрузку данных из Excel в 1С через буфер обмена по Ctrl+V

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

В процессе автоматизации часто возникает задача максимально упростить перенос данных из внешних источников, таких как Excel, в информационную базу 1С. Традиционный импорт из файлов (.xlsx, .csv) требует лишних кликов: сохранения файла, его выбора в диалоговом окне и последующего чтения. Прямая вставка через Ctrl+V значительно ускоряет работу пользователя. Рассмотрим подробнее, как реализовать этот механизм, используя различные подходы в зависимости от версии платформы и используемой конфигурации.

Метод 1. Использование промежуточного Поля табличного документа

Проанализируем наиболее надежный и визуально понятный для пользователя паттерн. Вместо того чтобы пытаться перехватить нажатие клавиш непосредственно в табличной части, мы создаем на форме вспомогательное поле типа ТабличныйДокумент. Этот метод широко используется в типовых конфигурациях (например, в УТ 11 или ERP).

Разберем реализацию по шагам:

  1. Разместим на управляемой форме поле табличного документа (назовем его ПолеВводаДанных).
  2. Пользователь копирует область в Excel и вставляет её в это поле. Платформа 1С автоматически обрабатывает Ctrl+V для табличных документов, сохраняя структуру колонок.
  3. Добавим кнопку "Обработать вставленные данные", при нажатии на которую программно прочитаем данные из табличного документа и перенесем их в нужную нам табличную часть.

Рассмотрим пример кода для обхода заполненных ячеек табличного документа:


&НаСервере
Процедура ОбработатьДанныеИзТабДокаНаСервере()
    ТабДок = Объект.ПолеВводаДанных;
    // Определяем границы заполненной области
    Высота = ТабДок.ВысотаТаблицы;
    Ширина = ТабДок.ШиринаТаблицы;
    
    Для НомерСтроки = 1 По Высота Цикл
        НоваяСтрокаТЧ = Объект.Состав.Добавить();
        Для НомерКолонки = 1 По Ширина Цикл
            ЗначениеЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки).Текст;
            // Здесь реализуем логику сопоставления колонок и поиска ссылочных данных
            ЗаполнитьРеквизитПоТексту(НоваяСтрокаТЧ, НомерКолонки, ЗначениеЯчейки);
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

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

Метод 2. Программное чтение буфера обмена через COM-объект (для старых версий)

Если мы работаем в среде Windows и нам нужно получить текст из буфера напрямую без промежуточных полей, можно воспользоваться COM-объектом htmlfile. Выясним, как это работает на практике.

Когда вы копируете ячейки из Excel, данные помещаются в буфер в формате TSV (Tab-Separated Values). Это означает, что колонки разделены символом табуляции, а строки — переводом строки. Посмотрим на пример кода получения этих данных:


&НаКлиенте
Процедура ЗагрузитьИзБуфераОбмена()
    Попытка
        ОбъектБуфер = Новый COMОбъект("htmlfile");
        ТекстБуфера = ОбъектБуфер.ParentWindow.ClipboardData.GetData("Text");
        
        Если ЗначениеЗаполнено(ТекстБуфера) Тогда
            РаспарситьТекстИзБуфера(ТекстБуфера);
        КонецЕсли;
    Исключение
        Сообщить("Не удалось получить доступ к буферу обмена. Возможно, недостаточно прав или используется веб-клиент.");
    КонецПопытки;
КонецПроцедуры

Важный нюанс: Данный метод работает только в тонком или толстом клиенте под Windows и зависит от настроек безопасности Internet Explorer. В веб-клиенте этот код работать не будет.

Метод 3. Современный подход в платформе 8.3.24+: Объект СодержимоеБуфераОбмена

Начиная с версии 8.3.24, фирма "1С" добавила штатную возможность работы с буфером обмена. Теперь нам не нужны внешние компоненты или COM-объекты. Рассмотрим, как это реализовано через асинхронные вызовы.

Проанализируем алгоритм работы с новым объектом СодержимоеБуфераОбмена:


&НаКлиенте
Асинхронная Процедура ВставитьИзБуфераОбмена(Команда)
    // Запрашиваем текст из буфера обмена асинхронно
    ТекстБуфера = Ждать БуферОбмена.ПолучитьТекстАсинхронно();
    
    Если ТекстБуфера <> Неопределено Тогда
        // Обрабатываем полученную строку
        МассивСтрок = СтрРазделить(ТекстБуфера, Символы.ПС, Ложь);
        Для Каждого СтрокаТекста Из МассивСтрок Цикл
            МассивКолонок = СтрРазделить(СтрокаТекста, Символы.Таб, Ложь);
            // Далее логика заполнения табличной части
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Преимущество этого метода заключается в кроссплатформенности: он работает и в Windows, и в Linux. В веб-клиенте браузер может запросить разрешение на доступ к буферу обмена, что является стандартным поведением безопасности.

Особенности парсинга данных из Excel

При реализации собственного парсера текстовой строки из буфера обмена (формат TSV), необходимо учитывать несколько критически важных моментов, которые могут привести к ошибкам загрузки:

  1. Разделители разрядов: Excel часто добавляет неразрывные пробелы в числа (например, "1 000,00"). Перед преобразованием строки в число необходимо удалить все пробельные символы СтрЗаменить(Значение, Символы.НПП, "").
  2. Двойные кавычки: Если ячейка в Excel содержит переносы строк или спецсимволы, при копировании Excel автоматически заключает содержимое такой ячейки в двойные кавычки. Ваш алгоритм должен уметь "очищать" текст от таких обрамляющих кавычек.
  3. Поиск ссылочных типов: Поскольку из буфера приходят только строки, нам нужно реализовать поиск объектов в базе. Рекомендуется сначала искать по Артикулу или Коду, а затем по Наименованию.

Использование Библиотеки Стандартных Подсистем (БСП)

Если вы разрабатываете в конфигурации, где интегрирована БСП (УТ, БП, ERP, УНФ), проверьте наличие подсистемы "Загрузка данных из файла". Разработчики 1С уже создали универсальное окно загрузки, которое поддерживает вставку из буфера обмена.

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

Резюмируем: Для быстрого решения "здесь и сейчас" в старых конфигурациях используйте промежуточное поле табличного документа (Метод 1). Если ваша платформа обновлена до 8.3.24, переходите на использование объекта БуферОбмена (Метод 3). Это обеспечит наиболее чистый код и современный пользовательский интерфейс.

← На главную