В процессе разработки самописных конфигураций на платформе 1С:Предприятие часто возникает необходимость повысить удобство работы пользователя. Одной из самых востребованных функций является возможность копирования строк из одной табличной части в другую (или внутри одной таблицы). В типовых решениях от 1С этот функционал уже реализован через сложные механизмы общих модулей, но для небольшой базы мы можем разработать собственное, более легкое и понятное решение. В данной статье мы разберем несколько способов реализации кнопок "Скопировать" и "Вставить", проанализируем их плюсы и минусы, а также изучим конкретные примеры кода.
Разберем самый распространенный и рекомендуемый для управляемых форм метод — использование Временного хранилища. Этот механизм позволяет передавать данные между сервером и клиентом, а также между разными формами в рамках одного сеанса. Основная идея заключается в том, что при нажатии кнопки "Скопировать" мы выгружаем выделенные строки в таблицу значений, помещаем ее во временное хранилище и сохраняем адрес этого хранилища.
Рассмотрим по шагам, как это реализовать. Сначала подготовим команду на клиенте для копирования:
&НаКлиенте
Процедура СкопироватьСтроки(Команда)
МассивВыбранныхСтрок = Элементы.Товары.ВыделенныеСтроки;
Если МассивВыбранныхСтрок.Количество() = 0 Тогда
Возврат;
КонецЕсли;
АдресБуфера = СкопироватьНаСервере(МассивВыбранныхСтрок);
// Сохраняем адрес в переменной модуля или параметре формы
ЭтаФорма.АдресХранилищаБуфера = АдресБуфера;
КонецПроцедуры
Проанализируем серверную часть. Нам необходимо создать таблицу значений, структура которой совпадает с нашей табличной частью, заполнить ее данными и отправить в хранилище:
&НаСервере
Функция СкопироватьНаСервере(МассивИдентификаторов)
ТЗ = Объект.Товары.Выгрузить(МассивИдентификаторов);
// Помещаем во временное хранилище с фиксированным UUID сеанса,
// чтобы данные не пропали при закрытии формы-источника
Возврат ПоместитьВоВременноеХранилище(ТЗ, Новый УникальныйИдентификатор);
КонецФункции
Теперь реализуем команду вставки. Выясним, как правильно извлечь данные и добавить их в целевой объект:
&НаКлиенте
Процедура ВставитьСтроки(Команда)
Если ПустаяСтрока(ЭтаФорма.АдресХранилищаБуфера) Тогда
Возврат;
КонецЕсли;
ВставитьНаСервере(ЭтаФорма.АдресХранилищаБуфера);
КонецПроцедуры
&НаСервере
Процедура ВставитьНаСервере(Адрес)
ДанныеИзБуфера = ПолучитьИзВременногоХранилища(Адрес);
Если ТипЗнч(ДанныеИзБуфера) = Тип("ТаблицаЗначений") Тогда
Для Каждого СтрокаИсточник Из ДанныеИзБуфера Цикл
НоваяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточник);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Обратите внимание на использование функции ЗаполнитьЗначенияСвойств. Это критически важный момент, так как он позволяет копировать данные даже в том случае, если структуры таблиц в разных документах немного отличаются. Система автоматически сопоставит колонки по их именам.
Если нам требуется, чтобы скопированные данные были доступны пользователю в течение всего рабочего дня, даже если он закрыл все формы документов, рассмотрим вариант с использованием Параметров сеанса. Для этого в конфигураторе нужно создать параметр сеанса (например, БуферОбменаТЧ) с типом ХранилищеЗначения.
Рассмотрим преимущества этого метода: данные хранятся на сервере в контексте конкретного пользователя. Посмотрим на пример реализации записи в такой буфер:
&НаСервере
Процедура СохранитьВПараметрСеанса(МассивСтрок)
ТЗ = Объект.Товары.Выгрузить(МассивСтрок);
ПараметрыСеанса.БуферОбменаТЧ = Новый ХранилищеЗначения(ТЗ);
КонецПроцедуры
При вставке мы просто считываем значение обратно. Этот метод считается наиболее надежным для работы в рамках всей информационной базы.
Разберем более продвинутый "хакерский" способ, который позволяет передавать данные даже между разными базами 1С. Мы можем сериализовать таблицу в строку JSON и поместить ее в системный буфер обмена операционной системы. Для этого часто используется объект HTMLFile или специализированные внешние компоненты.
Проанализируем процесс сериализации:
// Пример преобразования ТЗ в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТаблицаДляКопирования);
СтрокаРезультат = ЗаписьJSON.Закрыть();
Важный нюанс: при использовании JSON ссылочные типы данных (например, СправочникСсылка.Номенклатура) превратятся в строковые GUID. При вставке в другой базе или сеансе нам нужно будет выполнить обратный поиск объекта по этому идентификатору или по коду/артикулу. Это делает способ более сложным, но универсальным.
Иногда вместо классических кнопок "Скопировать/Вставить" целесообразно реализовать механизм перетаскивания. Выясним, как это работает в 1С. В свойствах элемента формы "Таблица" необходимо установить флаги РазрешитьНачалоПеретаскивания и РазрешитьПеретаскивание.
Затем мы программируем два события:
ПроверкаПеретаскивания — здесь мы определяем, можно ли сбросить данные в эту область.Перетаскивание — здесь описываем саму логику копирования строк.Этот подход значительно ускоряет работу пользователя, так как исключает лишние клики по меню.
При реализации любого из способов мы должны проанализировать проблему "битых" ссылок. Если вы копируете строку из одной базы в другую (например, через текст или JSON), ссылка на товар может не существовать в целевой базе. В таких случаях мы рекомендуем:
ЭтоПустая() или получением объекта.XDTO для более строгой сериализации типов, если это необходимо.Мы рассмотрели основные подходы к реализации копипаста в 1С. Для простых задач в рамках одной формы идеально подходит Временное хранилище. Если нужно обеспечить работу между разными документами — выбирайте Параметры сеанса. Для самых сложных интеграционных задач используйте JSON или XML. Внедрение любого из этих методов значительно повысит лояльность пользователей к вашей самописной системе.