В процессе автоматизации часто возникает задача максимально упростить перенос данных из внешних источников, таких как Excel, в информационную базу 1С. Традиционный импорт из файлов (.xlsx, .csv) требует лишних кликов: сохранения файла, его выбора в диалоговом окне и последующего чтения. Прямая вставка через Ctrl+V значительно ускоряет работу пользователя. Рассмотрим подробнее, как реализовать этот механизм, используя различные подходы в зависимости от версии платформы и используемой конфигурации.
Проанализируем наиболее надежный и визуально понятный для пользователя паттерн. Вместо того чтобы пытаться перехватить нажатие клавиш непосредственно в табличной части, мы создаем на форме вспомогательное поле типа ТабличныйДокумент. Этот метод широко используется в типовых конфигурациях (например, в УТ 11 или ERP).
Разберем реализацию по шагам:
ПолеВводаДанных).Рассмотрим пример кода для обхода заполненных ячеек табличного документа:
&НаСервере
Процедура ОбработатьДанныеИзТабДокаНаСервере()
ТабДок = Объект.ПолеВводаДанных;
// Определяем границы заполненной области
Высота = ТабДок.ВысотаТаблицы;
Ширина = ТабДок.ШиринаТаблицы;
Для НомерСтроки = 1 По Высота Цикл
НоваяСтрокаТЧ = Объект.Состав.Добавить();
Для НомерКолонки = 1 По Ширина Цикл
ЗначениеЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки).Текст;
// Здесь реализуем логику сопоставления колонок и поиска ссылочных данных
ЗаполнитьРеквизитПоТексту(НоваяСтрокаТЧ, НомерКолонки, ЗначениеЯчейки);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Этот подход хорош тем, что пользователь видит данные перед их окончательным занесением в базу. Мы можем подсветить ошибки (например, ненайденную номенклатуру) прямо в табличном документе красным цветом, обеспечивая интерактивность процесса.
Если мы работаем в среде Windows и нам нужно получить текст из буфера напрямую без промежуточных полей, можно воспользоваться COM-объектом htmlfile. Выясним, как это работает на практике.
Когда вы копируете ячейки из Excel, данные помещаются в буфер в формате TSV (Tab-Separated Values). Это означает, что колонки разделены символом табуляции, а строки — переводом строки. Посмотрим на пример кода получения этих данных:
&НаКлиенте
Процедура ЗагрузитьИзБуфераОбмена()
Попытка
ОбъектБуфер = Новый COMОбъект("htmlfile");
ТекстБуфера = ОбъектБуфер.ParentWindow.ClipboardData.GetData("Text");
Если ЗначениеЗаполнено(ТекстБуфера) Тогда
РаспарситьТекстИзБуфера(ТекстБуфера);
КонецЕсли;
Исключение
Сообщить("Не удалось получить доступ к буферу обмена. Возможно, недостаточно прав или используется веб-клиент.");
КонецПопытки;
КонецПроцедуры
Важный нюанс: Данный метод работает только в тонком или толстом клиенте под Windows и зависит от настроек безопасности Internet Explorer. В веб-клиенте этот код работать не будет.
Начиная с версии 8.3.24, фирма "1С" добавила штатную возможность работы с буфером обмена. Теперь нам не нужны внешние компоненты или COM-объекты. Рассмотрим, как это реализовано через асинхронные вызовы.
Проанализируем алгоритм работы с новым объектом СодержимоеБуфераОбмена:
&НаКлиенте
Асинхронная Процедура ВставитьИзБуфераОбмена(Команда)
// Запрашиваем текст из буфера обмена асинхронно
ТекстБуфера = Ждать БуферОбмена.ПолучитьТекстАсинхронно();
Если ТекстБуфера <> Неопределено Тогда
// Обрабатываем полученную строку
МассивСтрок = СтрРазделить(ТекстБуфера, Символы.ПС, Ложь);
Для Каждого СтрокаТекста Из МассивСтрок Цикл
МассивКолонок = СтрРазделить(СтрокаТекста, Символы.Таб, Ложь);
// Далее логика заполнения табличной части
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Преимущество этого метода заключается в кроссплатформенности: он работает и в Windows, и в Linux. В веб-клиенте браузер может запросить разрешение на доступ к буферу обмена, что является стандартным поведением безопасности.
При реализации собственного парсера текстовой строки из буфера обмена (формат TSV), необходимо учитывать несколько критически важных моментов, которые могут привести к ошибкам загрузки:
СтрЗаменить(Значение, Символы.НПП, "").Артикулу или Коду, а затем по Наименованию.Если вы разрабатываете в конфигурации, где интегрирована БСП (УТ, БП, ERP, УНФ), проверьте наличие подсистемы "Загрузка данных из файла". Разработчики 1С уже создали универсальное окно загрузки, которое поддерживает вставку из буфера обмена.
Вам достаточно вызвать форму этой подсистемы, передав ей структуру вашей таблицы. Это избавит вас от написания кода парсинга TSV и реализации сопоставления колонок. Система сама предложит пользователю выбрать, какая колонка из Excel соответствует реквизиту в 1С.
Резюмируем: Для быстрого решения "здесь и сейчас" в старых конфигурациях используйте промежуточное поле табличного документа (Метод 1). Если ваша платформа обновлена до 8.3.24, переходите на использование объекта БуферОбмена (Метод 3). Это обеспечит наиболее чистый код и современный пользовательский интерфейс.