Копирование строк в 1С 8.3: от горячих клавиш до кода
Содержание
Многие копируют строку в табличной части через Ctrl+C и Ctrl+V, как в Excel. Способ рабочий, но в 1С для этого есть клавиша быстрее — F9: она создаёт копию текущей строки одним нажатием, без промежуточного буфера.
Разберём три уровня задачи. Руками в интерфейсе — горячие клавиши
и контекстное меню. Из кода — добавление строк и метод Скопировать() для элементов и документов. И массово — через внешнюю обработку
или расширение конфигурации
, когда копировать нужно десятками.
Горячие клавиши для копирования строк
Самый быстрый способ — клавиатура. Встаньте на нужную строку табличной части или списка и нажмите:
- ⌨️
F9— создать новую строку (или элемент справочника) копированием текущей. Значения всех колонок переносятся в новую строку. - ⌨️
Ins— добавить пустую строку (не копия, для сравнения). - ⌨️
Ctrl+C/Ctrl+V— скопировать выделенные строки в буфер обмена и вставить. Работает и между разными документами одного вида. - ⌨️
Del— пометить строку на удаление.
Чтобы скопировать сразу несколько строк, выделите их: зажмите Ctrl и кликайте по нужным, либо выделите диапазон через Shift. Затем Ctrl+C — и Ctrl+V в то же место или в табличную часть другого документа.
Ctrl+C из табличной части копирует строки в текстовом виде. Их можно вставить в Excel, поправить и вернуть обратно в 1С тем же Ctrl+V — удобно, когда правок много.
Проверьте колонки после вставки: если структура табличных частей отличается (разный набор реквизитов), часть значений не перенесётся, а ссылки на несуществующие в приёмнике объекты останутся пустыми.
Контекстное меню вместо клавиш
Если клавиши под рукой нет или вы не помните сочетание, те же действия лежат в правой кнопке мыши. Кликните по строке правой кнопкой — в меню будут команды:
- «Скопировать» — создать копию строки или элемента (аналог
F9); - «Добавить» — пустая строка;
- «Пометить на удаление».
В формах списков справочников и документов эти же команды дублируются на командной панели над таблицей — кнопками «Создать новый элемент копированием текущего» (значок двух листов) и «Создать». Наводите курсор на кнопки: во всплывающей подсказке видно и название команды, и её горячую клавишу.
Для элемента справочника копирование через меню удобно тем, что код нового элемента 1С присвоит автоматически, а остальные реквизиты подставит из исходного. Останется поправить наименование и сохранить.
Копирование строк на встроенном языке
Когда копий нужно много или они создаются по условию, строки добавляют кодом. Базовый приём — метод Добавить() табличной части и функция ЗаполнитьЗначенияСвойств(), которая переносит одноимённые реквизиты из одной строки в другую:
// Копируем отмеченные флажком строки внутри одной табличной части
КопируемыеСтроки = Новый Массив;
Для Каждого Строка Из Объект.Товары Цикл
Если Строка.Скопировать Тогда
КопируемыеСтроки.Добавить(Строка);
КонецЕсли;
КонецЦикла;
Для Каждого Строка Из КопируемыеСтроки Цикл
НоваяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
КонецЦикла;
Нельзя добавлять строки в ту же коллекцию, по которой идёт цикл Для Каждого — обход собьётся. Поэтому отмеченные строки сначала складываем в отдельный массив, а добавляем уже из него.
Чтобы перенести табличную часть целиком в другой документ, не нужен цикл — есть пара методов Выгрузить() и Загрузить():
// Переносим все строки из документа-источника в приёмник
МассивСтрок = ДокументИсточник.Товары.Выгрузить();
ДокументПриёмник.Товары.Загрузить(МассивСтрок);
Выгрузить() возвращает таблицу значений с теми же колонками, Загрузить() заполняет табличную часть из неё. Если нужны не все колонки, у Выгрузить() можно указать их список: Выгрузить(, "Номенклатура,Количество").
Отдельный случай — скопировать строки, которые пользователь выделил в форме списка или табличной части. Выделенные строки лежат в свойстве элемента формы ВыделенныеСтроки — это массив идентификаторов, по которым строку достают из данных формы:
// Дублируем в табличной части строки, выделенные пользователем
Для Каждого Идентификатор Из Элементы.Товары.ВыделенныеСтроки Цикл
Строка = Объект.Товары.НайтиПоИдентификатору(Идентификатор);
НоваяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
КонецЦикла;
Здесь цикл идёт по выделенным идентификаторам, а не по самой коллекции, поэтому добавлять строки внутри него безопасно.
Когда копировать нужно не все поля, у ЗаполнитьЗначенияСвойств() есть третий и четвёртый параметры — список переносимых реквизитов и список исключений:
// Перенести только количество и цену
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка, "Количество, Цена");
// Перенести всё, кроме суммы (пересчитаем сами)
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка, , "Сумма");
Копирование элементов и документов целиком
Для справочников и документов есть отдельный метод Скопировать() — он вызывается у ссылки и возвращает новый объект-копию, ещё не записанный в базу:
// Копия элемента справочника
НовыйЭлемент = СсылкаНаТовар.Скопировать();
НовыйЭлемент.Наименование = СсылкаНаТовар.Наименование + " (копия)";
НовыйЭлемент.Записать();
Код нового элемента останется пустым — 1С присвоит его при записи. То же работает для документов:
// Копия документа с новой датой
НовыйДокумент = СсылкаНаДокумент.Скопировать();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Записать();
У скопированного документа номер очищается и выдаётся заново при записи, а движения по регистрам не переносятся — они формируются только при проведении. Поэтому новую копию документа после записи нужно ещё провести, если нужны проводки.
F9 либо правую кнопку → «Скопировать». Для элемента справочника — та же клавиша.Добавить() + ЗаполнитьЗначенияСвойств(). Всю табличную часть — через Выгрузить()/Загрузить().Скопировать() у ссылки: вернёт готовую копию, останется поправить реквизиты и записать.Внешние обработки для массового копирования
Когда копий нужно много и регулярно — например, завести 50 почти одинаковых номенклатурных позиций, — удобнее внешняя обработка. Это файл .epf, который подключается через Файл → Открыть или в разделе Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки (в типовых на БСП).
Логика обработки простая: пользователь выбирает образец, указывает количество копий и что менять, обработка в цикле создаёт копии методом Скопировать() и записывает их. В типовых конфигурациях на БСП часто уже есть подходящий механизм — «Групповое изменение реквизитов» и подобные обработки в меню Все функции или в сервисных разделах.
Массовую запись объектов запускайте на тестовой копии базы или в нерабочее время: каждая запись элемента — это транзакция, а при большом объёме возможны блокировки, если с теми же данными работают пользователи.
Внешняя обработка хороша тем, что не требует изменения конфигурации: её можно отключить от поддержки не снимая, и типовая остаётся на штатном обновлении.
Копирование с учётом подчинённых объектов
Простой Скопировать() переносит только реквизиты самого объекта и его табличные части. А вот связи с другими объектами копируются не всегда так, как ожидаешь:
- 📁 Подчинённые справочники. Если у номенклатуры есть подчинённый справочник (например, штрихкоды или характеристики), копия элемента их не унесёт — на них ссылается владелец, а у копии владелец уже другой. Подчинённые записи придётся копировать отдельным циклом, подставляя новый элемент как владельца.
- 📄 Документы на основании. Копия документа не тянет за собой связанные документы, введённые «на основании». Это самостоятельные объекты.
- 🔗 Ссылки внутри строк. Если в строке есть ссылка на другой объект (контрагент, склад), копируется сама ссылка, а не копия того объекта. Это обычно и нужно — два документа ссылаются на одного контрагента.
Если задача — размножить элемент вместе с подчинёнными записями, порядок такой: сначала записать копию владельца, получить её ссылку, затем в цикле копировать подчинённые объекты, подставляя новую ссылку в реквизит «Владелец» каждой записи.
Копирование строк в мобильном клиенте 1С
В мобильном клиенте 1С клавиатуры с F9 нет, поэтому копирование живёт в контекстном меню. Долгое нажатие (long tap) на строке списка или табличной части открывает меню с командами создания и копирования — набор тот же, что в десктопном клиенте, если разработчик конфигурации их туда вывел.
Доступность команд в мобильном приложении зависит от конкретной конфигурации: часть типовых мобильных решений урезает редактирование табличных частей. Если нужной команды в меню нет, значит, в этой форме она не предусмотрена — копирование придётся делать в полной (десктопной или веб) версии базы.
Расширения конфигурации: своя команда копирования
Расширения конфигурации (доступны с платформы 8.3.6) позволяют добавить свою кнопку копирования в типовую форму, не меняя саму конфигурацию и не снимая её с поддержки. Это аккуратный способ автоматизировать повторяющееся копирование строк под конкретный участок.
Общий порядок:
- В Конфигураторе создайте расширение (
Конфигурация → Расширения конфигурации). - Добавьте в расширение нужную форму списка или документа «через заимствование».
- Создайте команду формы — например, «Скопировать выделенные строки» — и разместите её на командной панели.
- В обработчике команды получите выделенные строки через
Элементы.<ИмяТаблицы>.ВыделенныеСтрокии размножьте их уже знакомым циклом сЗаполнитьЗначенияСвойств(). - Сохраните расширение. Загрузка
.cfeи обновление конфигурации базы — отдельный шаг (Конфигурация → Обновить конфигурацию базы данных).
Расширение переживает обновления типовой: при штатном обновлении платформа сама пытается применить его заново. Если структура заимствованной формы в новом релизе сильно изменится, расширение подсветит это предупреждением — тогда форму нужно будет перезаимствовать.
Монопольный доступ к базе для подключения расширения не нужен — его можно включать и отключать в пользовательском режиме через Функции для технического специалиста или в разделе администрирования. Структуру данных расширение здесь не меняет, поэтому перезапуск базы не требуется.
Частые вопросы
Чем `F9` отличается от `Ctrl+C` / `Ctrl+V`?
F9 сразу создаёт копию текущей строки или элемента без буфера обмена. Ctrl+C/Ctrl+V кладёт выделенные строки в буфер и позволяет вставить их в другое место или в другой документ — удобно для нескольких строк и для обмена с Excel.Как скопировать документ вместе с проводками?
Скопировать() проводки не переносит — они формируются при проведении. Скопируйте документ, запишите и проведите копию: движения создадутся заново по её данным. Копировать сами записи регистров вручную не нужно и небезопасно.Почему при вставке строк часть значений пустая?
Можно ли скопировать элемент справочника вместе с его подчинёнными записями?
Как размножить один элемент в несколько копий сразу?
Скопировать(). Для регулярной — команда в расширении конфигурации. В типовых на БСП посмотрите обработку группового изменения реквизитов в сервисных разделах.