Разработка и Конфигурация · 12 мин
Как перенести данные из одной формы в другую в 1С
Разбираем способы переноса данных между формами в 1С: копирование, обработки заполнения, параметры формы и программные методы. Примеры кода и типичные ошибки.
Перенос данных из одной формы в другую — одна из самых частых задач при работе с 1С:Предприятие. Она возникает и у пользователей, которым нужно скопировать документ или заполнить новый на основании существующего, и у разработчиков, создающих собственные механизмы ввода данных. Способ решения зависит от того, кто выполняет перенос и какие данные нужно переместить.
Под «переносом данных между формами» обычно понимают три разных сценария: копирование значений из одной формы в другую вручную через буфер обмена, автоматическое заполнение нового объекта на основании существующего (ввод на основании) и программную передачу данных между формами через параметры и обработчики. Каждый сценарий решается своими инструментами.
Прежде чем выбирать метод, определите: формы относятся к одному типу объектов или к разным, переносится весь объект целиком или отдельные реквизиты, требуется ли разовая операция или механизм будет использоваться постоянно. От этих ответов зависит, хватит ли стандартных средств или потребуется доработка конфигурации.
Определяем сценарий переноса данных
Если нужно создать новый документ или элемент справочника, похожий на существующий, — это сценарий копирования. Платформа умеет делать его штатно, без какой-либо доработки. Подходит, когда объекты одного типа и переносить нужно почти всё содержимое.
Если из одного типа объекта создаётся другой — например, из заказа покупателя формируется реализация, — это ввод на основании. Связь между объектами фиксируется, и платформа сама переносит сопоставленные реквизиты. Этот механизм работает, только если разработчик конфигурации его предусмотрел.
Третий сценарий — нестандартный: перенести отдельные значения между произвольными формами, например выбранные строки табличной части из формы обработки в документ. Здесь без программирования не обойтись: данные передаются через параметры открываемой формы или через оповещения о выборе.
Как выбрать способ
Копирование объекта целиком штатными средствами
Самый простой перенос — создание копии существующего объекта. В форме списка или в открытой форме объекта нажмите кнопку «Скопировать» (обычно доступна по клавише F9 или через меню «Ещё»). Платформа откроет новую форму, заполненную данными исходного объекта, но без привязки к нему: номер, дата и служебные поля будут новыми.
Второй вариант — копирование через буфер обмена. Выделите объект в списке и нажмите Ctrl+Shift+C, затем перейдите в нужный список и нажмите Ctrl+Shift+V. Этот способ работает и между разными окнами, и в некоторых конфигурациях — между разными типами объектов, если состав реквизитов совместим.
Учтите ограничение: копирование переносит реквизиты и табличные части, но не переносит движения по регистрам, присоединённые файлы и связи с другими объектами. Проведённый документ-копия формирует собственные движения заново при проведении.
Ввод на основании: перенос между связанными объектами
Ввод на основании — штатный механизм, при котором новый объект создаётся из существующего с автоматическим заполнением реквизитов. В форме исходного объекта нажмите «Создать на основании» и выберите нужный тип документа или элемента. Платформа откроет форму нового объекта с уже перенесёнными данными.
Какие поля переносятся, определяется в конфигураторе процедурой ОбработкаЗаполнения в модуле объекта. В типовых конфигурациях цепочки ввода на основании уже настроены: заказ → реализация → счёт-фактура, счёт на оплату → платёжное поручение и т. д. Если нужной связи нет, её может добавить разработчик.
Преимущество метода — сохраняется связь между объектами: в новом документе заполняется реквизит «Основание», и по кнопке «Связанные документы» видна вся цепочка. Это важно для контроля: например, легко проверить, по всем ли заказам оформлена отгрузка.
Если стандартное заполнение переносит не всё, что нужно, не редактируйте типовую процедуру напрямую — при обновлении конфигурации изменения пропадут. Используйте механизм расширений или подсистему внешних обработок заполнения (в типовых — «Администрирование → Печатные формы, отчеты и обработки»).
Программная передача данных через параметры формы
Когда данные нужно передать в открываемую форму программно, используется структура параметров. При вызове ОткрытьФорму() вторым параметром передаётся структура, которая становится доступной в открываемой форме через свойство Параметры.
Типовой приём — передать данные для заполнения нового объекта через параметр «ЗначенияЗаполнения». Форма объекта сама обработает этот параметр и заполнит реквизиты, имена которых совпадают с ключами структуры:
ЗначенияЗаполнения = Новый Структура;
ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);
ЗначенияЗаполнения.Вставить("Контрагент", ВыбранныйКонтрагент);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
Для произвольных данных, не привязанных к реквизитам объекта, передавайте собственные ключи в структуре параметров и обрабатывайте их в обработчике ПриСозданииНаСервере целевой формы. Там же можно заполнить табличную часть, перебрав переданный массив строк.
Через параметры формы можно безопасно передавать примитивные типы, ссылки, массивы и структуры. Таблицу значений напрямую передать нельзя — сначала выгрузите её в массив структур, а в целевой форме загрузите обратно.
Перенос данных из дочерней формы обратно: оповещение о выборе
Обратная задача — когда пользователь выбирает или редактирует данные в отдельной форме, а результат должен вернуться в исходную. Классический пример: форма подбора товаров, из которой выбранные позиции попадают в табличную часть документа.
Механизм реализуется через ОповеститьОВыборе(). Открывающая форма объявляет обработчик ОбработкаВыбора, а дочерняя форма при завершении работы вызывает оповещение с переданным значением:
// В дочерней форме при выборе
ОповеститьОВыборе(ВыбранноеЗначение);
// В исходной форме
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
// Заполняем реквизиты или табличную часть
КонецПроцедуры;
Альтернатива — описание оповещения при открытии формы: передать в ОткрытьФорму() объект ОписаниеОповещения с именем процедуры-обработчика. Этот способ предпочтительнее в управляемых формах, так как не требует объявления стандартного обработчика и позволяет явно указать, какая процедура получит результат.
Если дочерняя форма должна вернуть сложный набор данных (например, несколько строк подобранных товаров с количеством и ценами), упакуйте их в структуру или массив структур и передайте одним значением. Пытаться вернуть данные через глобальные переменные или общие модули клиента — плохая практика, ведущая к ошибкам при одновременной работе нескольких форм.
Массовый перенос и заполнение табличных частей
Когда переносить нужно не отдельные реквизиты, а целые таблицы — например, строки из одного документа в другой, — ручное копирование неудобно. В управляемых формах табличные части поддерживают копирование строк через буфер обмена: выделите строки, нажмите Ctrl+C, перейдите в целевую табличную часть и нажмите Ctrl+V. Состав колонок должен совпадать, иначе часть данных потеряется без предупреждения.
Для регулярного массового переноса создайте внешнюю обработку заполнения табличной части. В типовых конфигурациях она подключается через «Дополнительные отчеты и обработки» и добавляет в форму документа кнопку «Заполнить». Обработка получает объект, выбирает данные запросом из источника и загружает их в табличную часть.
При программной загрузке строк не забывайте про зависимые реквизиты: если переносится номенклатура, обычно нужно пересчитать количество, цены и суммы по правилам целевого документа. Проще всего после добавления каждой строки вызывать те же процедуры пересчёта, что срабатывают при ручном вводе.
Проверка результата и границы безопасной работы
После любого переноса проверьте результат до записи и проведения целевого объекта. Сравните ключевые реквизиты с источником: контрагента, договор, организацию, суммы и количество строк табличной части. Для документов дополнительно проверьте дату и период — они почти всегда подставляются текущие, а не исходные.
Если перенос выполняется обработкой массово, сначала запустите её на одном-двух объектах в копии базы или в тестовом режиме. Ошибка в логике заполнения, применённая к сотням документов, исправляется значительно дольше, чем создаётся.
Самостоятельно без риска можно выполнять: копирование объектов штатными кнопками, ввод на основании, копирование строк табличных частей через буфер обмена. Доработку конфигурации, создание обработок и изменение процедур заполнения стоит поручать специалисту, особенно если база рабочая и резервное копирование не настроено.
Как проверить результат переноса
Контрагент, организация и договор совпадают с источником
Поля пустые или заполнены значениями по умолчанию
Количество строк и итоговая сумма совпадают с исходным объектом
Строк меньше, суммы расходятся
Документ в нужном отчётном периоде
Подставлена текущая дата, документ попал не в тот месяц
В цепочке «Связанные документы» виден источник
Связи нет, документы существуют раздельно
Что важно запомнить
Разовый перенос делайте копированием и вводом на основании, регулярный — через доработку заполнения или обработки. Программная передача между формами выполняется параметрами и оповещениями о выборе. Перед массовым переносом проверяйте логику на единичных объектах и всегда контролируйте итоговые суммы и период.
Частые вопросы
Можно ли перенести данные между формами разных информационных баз?
Напрямую между открытыми формами разных баз — нет, каждая база изолирована. Используйте выгрузку в файл (например, через обработку «Выгрузка и загрузка данных XML» для идентичных конфигураций), универсальный обмен по правилам конвертации или механизмы EnterpriseData. Буфер обмена табличных частей между базами работает только на уровне текста и требует ручной проверки.
Почему при копировании документа не перенеслись прикреплённые файлы?
Штатное копирование переносит только реквизиты и табличные части объекта. Присоединённые файлы хранятся отдельно и привязаны к конкретной ссылке. Их нужно копировать вручную через форму присоединённых файлов или программно — методами работы с хранилищем файлов.
Как перенести данные в форму, если кнопки «Создать на основании» нет?
Значит, разработчик конфигурации не настроил ввод на основании для этой пары объектов. Варианты: скопировать значения вручную через буфер обмена, попросить разработчика добавить обработку заполнения, либо подключить внешнюю обработку заполнения, если конфигурация поддерживает подсистему дополнительных отчетов и обработок.
Что делать, если при вводе на основании переносятся не все нужные поля?
Состав переносимых полей определяется процедурой ОбработкаЗаполнения в модуле целевого объекта. Изменить её может разработчик — желательно через расширение конфигурации, чтобы не потерять правки при обновлении. Самостоятельно без навыков программирования в 1С эту задачу решить нельзя.
Можно ли перенести данные из формы списка сразу в несколько новых документов?
Штатно — нет, ввод на основании создаёт один объект. Для пакетного создания документов по выделенным строкам списка нужна обработка: она обходит выбранные ссылки, программно создаёт новые объекты, заполняет их и записывает. Такие обработки пишутся индивидуально под задачу.
Опасно ли копировать проведённые документы?
Само копирование безопасно: создаётся новый незаписанный объект. Риск появляется при проведении копии — она сформирует собственные движения и может задвоить обороты, если исходный документ остался проведённым. Перед проведением копии убедитесь, что исходник либо распроведён, либо дублирование предусмотрено логикой учёта.