Копирование строк в 1С 8.3: от горячих клавиш до кода

· 8 мин

Содержание

Многие копируют строку в табличной части через 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С присвоит его при записи. То же работает для документов:

// Копия документа с новой датой
НовыйДокумент = СсылкаНаДокумент.Скопировать();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Записать();

У скопированного документа номер очищается и выдаётся заново при записи, а движения по регистрам не переносятся — они формируются только при проведении. Поэтому новую копию документа после записи нужно ещё провести, если нужны проводки.

Что именно нужно скопировать?

Внешние обработки для массового копирования

Когда копий нужно много и регулярно — например, завести 50 почти одинаковых номенклатурных позиций, — удобнее внешняя обработка. Это файл .epf, который подключается через Файл → Открыть или в разделе Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки (в типовых на БСП).

Логика обработки простая: пользователь выбирает образец, указывает количество копий и что менять, обработка в цикле создаёт копии методом Скопировать() и записывает их. В типовых конфигурациях на БСП часто уже есть подходящий механизм — «Групповое изменение реквизитов» и подобные обработки в меню Все функции или в сервисных разделах.

Массовую запись объектов запускайте на тестовой копии базы или в нерабочее время: каждая запись элемента — это транзакция, а при большом объёме возможны блокировки, если с теми же данными работают пользователи.

Внешняя обработка хороша тем, что не требует изменения конфигурации: её можно отключить от поддержки не снимая, и типовая остаётся на штатном обновлении.

Копирование с учётом подчинённых объектов

Простой Скопировать() переносит только реквизиты самого объекта и его табличные части. А вот связи с другими объектами копируются не всегда так, как ожидаешь:

  • 📁 Подчинённые справочники. Если у номенклатуры есть подчинённый справочник (например, штрихкоды или характеристики), копия элемента их не унесёт — на них ссылается владелец, а у копии владелец уже другой. Подчинённые записи придётся копировать отдельным циклом, подставляя новый элемент как владельца.
  • 📄 Документы на основании. Копия документа не тянет за собой связанные документы, введённые «на основании». Это самостоятельные объекты.
  • 🔗 Ссылки внутри строк. Если в строке есть ссылка на другой объект (контрагент, склад), копируется сама ссылка, а не копия того объекта. Это обычно и нужно — два документа ссылаются на одного контрагента.

Если задача — размножить элемент вместе с подчинёнными записями, порядок такой: сначала записать копию владельца, получить её ссылку, затем в цикле копировать подчинённые объекты, подставляя новую ссылку в реквизит «Владелец» каждой записи.

Копирование строк в мобильном клиенте 1С

В мобильном клиенте 1С клавиатуры с F9 нет, поэтому копирование живёт в контекстном меню. Долгое нажатие (long tap) на строке списка или табличной части открывает меню с командами создания и копирования — набор тот же, что в десктопном клиенте, если разработчик конфигурации их туда вывел.

Доступность команд в мобильном приложении зависит от конкретной конфигурации: часть типовых мобильных решений урезает редактирование табличных частей. Если нужной команды в меню нет, значит, в этой форме она не предусмотрена — копирование придётся делать в полной (десктопной или веб) версии базы.

Расширения конфигурации: своя команда копирования

Расширения конфигурации (доступны с платформы 8.3.6) позволяют добавить свою кнопку копирования в типовую форму, не меняя саму конфигурацию и не снимая её с поддержки. Это аккуратный способ автоматизировать повторяющееся копирование строк под конкретный участок.

Общий порядок:

  1. В Конфигураторе создайте расширение (Конфигурация → Расширения конфигурации).
  2. Добавьте в расширение нужную форму списка или документа «через заимствование».
  3. Создайте команду формы — например, «Скопировать выделенные строки» — и разместите её на командной панели.
  4. В обработчике команды получите выделенные строки через Элементы.<ИмяТаблицы>.ВыделенныеСтроки и размножьте их уже знакомым циклом с ЗаполнитьЗначенияСвойств().
  5. Сохраните расширение. Загрузка .cfe и обновление конфигурации базы — отдельный шаг (Конфигурация → Обновить конфигурацию базы данных).

Расширение переживает обновления типовой: при штатном обновлении платформа сама пытается применить его заново. Если структура заимствованной формы в новом релизе сильно изменится, расширение подсветит это предупреждением — тогда форму нужно будет перезаимствовать.

Монопольный доступ к базе для подключения расширения не нужен — его можно включать и отключать в пользовательском режиме через Функции для технического специалиста или в разделе администрирования. Структуру данных расширение здесь не меняет, поэтому перезапуск базы не требуется.

Частые вопросы

Чем `F9` отличается от `Ctrl+C` / `Ctrl+V`?
F9 сразу создаёт копию текущей строки или элемента без буфера обмена. Ctrl+C/Ctrl+V кладёт выделенные строки в буфер и позволяет вставить их в другое место или в другой документ — удобно для нескольких строк и для обмена с Excel.
Как скопировать документ вместе с проводками?
Метод Скопировать() проводки не переносит — они формируются при проведении. Скопируйте документ, запишите и проведите копию: движения создадутся заново по её данным. Копировать сами записи регистров вручную не нужно и небезопасно.
Почему при вставке строк часть значений пустая?
Переносятся только одноимённые колонки. Если в приёмнике нет такого реквизита или он ссылается на объект, которого нет в этой базе, значение не подставится. Сверьте состав колонок табличных частей источника и приёмника.
Можно ли скопировать элемент справочника вместе с его подчинёнными записями?
Обычным копированием — нет: у копии другой владелец. Сначала запишите копию элемента, затем отдельным циклом перенесите подчинённые записи, указав новую ссылку в реквизите «Владелец».
Как размножить один элемент в несколько копий сразу?
Для разовой задачи — внешняя обработка с циклом по Скопировать(). Для регулярной — команда в расширении конфигурации. В типовых на БСП посмотрите обработку группового изменения реквизитов в сервисных разделах.