В процессе разработки часто возникает задача сделать интерфейс максимально удобным для пользователя. Одной из таких задач является возможность вставки списка значений (например, кодов товаров или артикулов), скопированных из внешнего источника (Excel, текстовый файл), напрямую в поле ввода на форме 1С. Стандартное поведение платформы предполагает выбор одного значения, но с помощью небольших доработок мы можем научить систему обрабатывать целые списки.
Рассмотрим подробнее, как реализовать этот механизм, разберем программный код и проанализируем различные подходы к решению этой задачи — от простых обработчиков событий до создания специализированных диалоговых форм.
Самый логичный момент для перехвата данных — это когда пользователь нажимает на кнопку выбора в поле или пытается начать ввод. Мы можем использовать событие НачалоВыбора, чтобы проверить, нет ли в поле редактирования уже вставленного текста, который нужно превратить в список ссылок.
Разберем алгоритм по шагам:
СтандартнаяОбработка = Ложь, чтобы прервать обычное открытие формы выбора.ТекстРедактирования элемента формы.СписокЗначений.Посмотрим на пример реализации клиентской части:
&НаКлиенте
Процедура СписокОбъектовНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный выбор
Если Не ПустаяСтрока(Элемент.ТекстРедактирования) Тогда
// Если пользователь вставил строку с кодами, разделенными пробелом
МассивКодов = СтрРазделить(Элемент.ТекстРедактирования, " ");
// Получаем ссылки по кодам на сервере
НайденныеСсылки = НайтиСсылкиПоКодамНаСервере(МассивКодов);
// Загружаем полученные ссылки в реквизит формы (тип СписокЗначений)
Объект.СписокДляОтбора.ЗагрузитьЗначения(НайденныеСсылки);
// Очищаем текст редактирования для корректного отображения
Элемент.ТекстРедактирования = "";
Иначе
// Если текста нет, открываем обычную форму выбора
ПараметрыВыбора = Новый Структура("МножественныйВыбор", Истина);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыВыбора, Элемент);
КонецЕсли;
КонецПроцедуры
На стороне сервера нам необходимо выполнить запрос к базе данных, чтобы сопоставить строковые коды с реальными ссылками СправочникСсылка. Проанализируем серверную функцию:
&НаСервере
Функция НайтиСсылкиПоКодамНаСервере(МассивКодов)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Код В(&МассивКодов)";
Запрос.УстановитьПараметр("МассивКодов", МассивКодов);
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции
Иногда пользователю неудобно вставлять данные прямо в поле ввода, особенно если разделители в источнике данных (Excel) могут быть разными (табуляция, запятая, переносы строк). В этом случае эффективнее создать небольшую вспомогательную форму с многострочным полем ввода.
Преимущества такого подхода:
Выясним, как это реализовать. На основной форме добавляется кнопка (например, "Заполнить списком"). При нажатии открывается форма, где есть поле ПолеВводаТекста. После нажатия кнопки "ОК" на этой форме, текст обрабатывается аналогично первому способу, и результат возвращается в основную форму.
В реальной эксплуатации данные редко приходят в идеальном виде. Проанализируем ситуацию: пользователь копирует колонку из Excel. В этом случае разделителем будет Символы.ПС (перенос строки) или Символы.ВК. Если копируется строка — Символы.Таб.
Для надежной работы рекомендуем использовать универсальный метод подготовки строки перед вызовом СтрРазделить:
Функция ПодготовитьМассивИзСтроки(ИсходнаяСтрока)
// Заменяем все возможные разделители на один универсальный (запятую)
Результат = СтрЗаменить(ИсходнаяСтрока, Символы.ПС, ",");
Результат = СтрЗаменить(Результат, Символы.ВК, ",");
Результат = СтрЗаменить(Результат, Символы.Таб, ",");
Результат = СтрЗаменить(Результат, " ", ",");
// Разбиваем строку и удаляем пустые элементы
Массив = СтрРазделить(Результат, ",", Ложь);
// Очищаем каждый элемент от лишних пробелов по краям
Для Ит = 0 По Массив.ВГраница() Цикл
Массив[Ит] = СокрЛП(Массив[Ит]);
КонецЦикла;
Возврат Массив;
КонецФункции
Если вы работаете на платформе 8.3.15 и выше, можно использовать событие Автоподбор. Оно срабатывает автоматически, когда пользователь вставляет текст в поле. Это позволяет сделать интерфейс еще более «бесшовным».
В обработчике Автоподбор можно программно наполнить параметр ДанныеВыбора. Если система увидит, что в ДанныеВыбора попал список значений, она предложит пользователю выбрать их или автоматически подставит в связанный реквизит типа СписокЗначений.
При реализации массовой вставки важно помнить о нескольких технических моментах, которые влияют на комфорт работы:
СписокЗначений, обязательно установите Элемент.ТекстРедактирования = "". Если этого не сделать, 1С может попытаться интерпретировать всю вставленную строку как одно значение и выдать ошибку поиска.ПоказатьОповещениеПользователя.ГДЕ Код В (&Список) ИЛИ Артикул В (&Список).Используя предложенные методы, мы превращаем стандартное поле ввода в мощный инструмент массовой обработки данных, что значительно ускоряет работу конечных пользователей в системе 1С.