В процессе работы с программами «1С:Предприятие 8» пользователи и администраторы регулярно сталкиваются с рутинными задачами, требующими дублирования информации. Например, когда необходимо перевыставить пакет ежемесячных актов, счетов или накладных из одного периода в другой. Логичным решением кажется выделить нужные документы в списке журнала и нажать кнопку «Копировать» (или клавишу F9). Однако на практике платформа копирует только один активный документ. В этой статье мы подробно разберем, почему существует такое ограничение, и рассмотрим все возможные способы его обхода — от простых пользовательских лайфхаков до готовых программных решений.
Для начала проанализируем архитектурную логику платформы «1С:Предприятие». Процесс копирования документа по умолчанию спроектирован как интерактивная операция. Когда пользователь нажимает клавишу F9, программа выполняет следующие действия:
На этом этапе документ еще не записан в базу данных. Платформа ожидает контроля со стороны пользователя. Пользователь должен проверить правильность заполнения полей, при необходимости изменить контрагента, договор или цены, после чего осознанно нажать кнопку «Провести и закрыть». Если бы платформа позволяла выделить 10 документов и нажать «Копировать», системе пришлось бы либо открыть одновременно 10 тяжелых управляемых форм (что привело бы к зависанию интерфейса), либо записать новые документы автоматически без проверки. Автоматическая запись без контроля пользователя противоречит концепции контроля целостности данных, так как могут быть созданы некорректные или дублирующиеся проводки.
Если перед вами стоит задача автоматизировать процесс дублирования документов, лучшим решением будет написание небольшого алгоритма. Разберем по шагам, как правильно скопировать группу документов программным путем.
Самый простой и надежный метод — использовать встроенную функцию Скопировать() объекта метаданных. Этот метод полностью копирует всю структуру документа, включая табличные части и дополнительные реквизиты, избавляя вас от необходимости вручную переносить каждую строку.
Рассмотрим пример кода, который выполняет копирование массива документов-источников:
// Процедура массового копирования документов
Процедура ВыполнитьГрупповоеКопирование(МассивДокументов) Экспорт
Для Каждого СсылкаДокумента Из МассивДокументов Цикл
// Получаем объект исходного документа для чтения данных
ОбъектИсточник = СсылкаДокумента.ПолучитьОбъект();
// Используем штатный метод платформы для создания точной копии
НовыйДокумент = ОбъектИсточник.Скопировать();
// Назначаем актуальную дату для нового документа
НовыйДокумент.Дата = ТекущаяДата();
// Очищаем номер. При записи платформа автоматически сгенерирует новый уникальный номер
НовыйДокумент.Номер = "";
Попытка
// Записываем документ в режиме обычной записи (без проведения)
// Это позволит пользователю позже проверить и провести документы вручную
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
Исключение
// Обрабатываем возможные ошибки блокировок или прав доступа
ВызватьИсключение "Не удалось скопировать документ: " + СсылкаДокумента + ". Ошибка: " + ОписаниеОшибки();
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Почему мы используем именно метод Скопировать(), а не универсальное заполнение свойств? На форуме часто предлагают альтернативный вариант с использованием функции ЗаполнитьЗначенияСвойств(). Проанализируем эту ситуацию. Если вы попытаетесь создать новый документ и просто скопировать свойства, как показано ниже:
// Пример неполного копирования через заполнение свойств
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
ЗаполнитьЗначенияСвойств(НовыйДокумент, ОбъектИсточник, , "Номер, Дата");
Этот код скопирует только реквизиты шапки (такие как организация, контрагент, договор). Все табличные части (например, список товаров и услуг) останутся пустыми! Чтобы их перенести, вам придется писать циклы обхода для каждой табличной части и вручную копировать каждую строку. Это делает код громоздким и уязвимым к изменениям в структуре метаданных. Поэтому использование метода Скопировать() является наиболее предпочтительным стандартом разработки.
Что делать обычному пользователю, у которого нет доступа к конфигуратору и возможности писать программный код? В современных управляемых формах на базе Библиотеки стандартных подсистем (БСП) реализован мощный скрытый инструмент — буфер обмена для табличных частей.
Этот механизм позволяет перенести все строки из одного документа в другой за пару кликов. Давайте разберем этот процесс по шагам:
Этот механизм чрезвычайно интеллектуален. Платформа «1С:Предприятие 8.3» способна сопоставлять колонки табличных частей на лету. Вы можете скопировать строки из документа «Поступление товаров и услуг» и вставить их в документ «Реализация товаров и услуг» или даже в «Списание товаров». Программа автоматически перенесет только совпадающие реквизиты (номенклатуру, количество, единицы измерения), пропустив специфические поля.
Если вам необходимо создать документы другого типа на основе группы существующих (например, выписать 10 накладных на основании 10 заказов покупателей), вам поможет штатный групповой ввод на основании. Этот механизм реализован во многих типовых конфигурациях торгового и производственного учета (УТ, ERP, КА):
Когда требуется полноценное дублирование документов «один в один» (например, регулярное копирование актов за прошлый месяц), лучшим выбором станет подключение готовой внешней обработки через механизм БСП «Дополнительные отчеты и обработки». Это позволяет расширить возможности программы без снятия конфигурации с поддержки.
Такие обработки обычно предоставляют пользователю удобное рабочее место, где можно:
Подводя итог, можно сказать, что хотя прямого инструмента группового копирования документов одной кнопкой в платформе 1С не предусмотрено из соображений безопасности учета, в распоряжении пользователей и разработчиков есть обширный арсенал альтернативных средств. Выбирайте наиболее подходящий метод исходя из ваших задач и прав доступа в системе!