Ввод на основании в расширении 1С делается без изменения основной конфигурации: в расширение добавляется общая команда с типом параметра документа-основания, которая открывает форму нового документа со значениями заполнения, а логика заполнения дописывается в ОбработкаЗаполнения заимствованного документа через аннотацию &После. Остается выдать права на команду — и пользователь видит ее в меню «Создать на основании».

Покажу на задаче из «Управления торговлей 11»: создавать «Реализацию товаров и услуг» на основании «Счета на оплату клиенту». Подход переносится на любую конфигурацию.

Почему не свойство «Вводится на основании»

В обычной разработке ввод на основании настраивается свойством «Вводится на основании» у документа-приемника и конструктором ввода на основании. Для заимствованных объектов расширения набор изменяемых свойств ограничен, и он менялся от версии к версии платформы. Поэтому рассчитывать на это свойство в расширении я не советую: универсальный способ, который работает на любой версии, — собственная команда плюс заполнение кодом.

СпособГде работаетОсобенности
Общая команда в расширенииЛюбая конфигурацияПросто, но в формах с собственным меню может оказаться не в том подменю
Подключаемые команды БСПКонфигурации на БСП 3.xКоманда встает в типовое подменю «Создать на основании»
Снятие с поддержки и правка метаданныхЛюбаяНе рекомендую: усложняет обновления

Шаг 1. Расширение и заимствование объектов

  1. В конфигураторе: «Конфигурация» → «Расширения конфигурации» → «Добавить». Назначение — «Дополнение», префикс — короткий и уникальный, например рв_.
  2. Откройте конфигурацию расширения и заимствуйте оба документа: СчетНаОплатуКлиенту и РеализацияТоваровУслуг.
  3. Заимствуйте одну из ролей, которая есть у всех пользователей, работающих с реализациями (в УТ это обычно базовая роль подсистемы продаж). Она понадобится для прав.

Шаг 2. Общая команда «Создать реализацию»

В ветке «Общие» → «Общие команды» добавьте команду рв_СоздатьРеализациюНаОснованииСчета:

СвойствоЗначение
ГруппаКомандная панель формы, «Создать на основании»
Тип параметра командыДокументСсылка.СчетНаОплатуКлиенту
Режим использования параметраОдиночный
ПредставлениеРеализация товаров и услуг

Модуль команды:

1С
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

	ЗначенияЗаполнения = Новый Структура("Основание", ПараметрКоманды);
	ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения);

	ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы,
		ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность,
		ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);

КонецПроцедуры

Структура в ЗначенияЗаполнения попадет в ОбработкаЗаполнения нового документа как параметр ДанныеЗаполнения. Документ при этом не записывается: пользователь увидит заполненную форму и сам решит, записывать ли ее.

Шаг 3. Заполнение через &После

В заимствованном документе РеализацияТоваровУслуг откройте модуль объекта, найдите ОбработкаЗаполнения и добавьте в расширение обработчик с вызовом «После». Платформа сгенерирует заготовку с аннотацией.

Ввод на основании в расширении 1С: в новый документ переносятся только нужные данные основания
Ввод на основании в расширении 1С: в новый документ переносятся только нужные данные основания
1С
&После("ОбработкаЗаполнения")
Процедура рв_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

	Основание = рв_ОснованиеИзДанныхЗаполнения(ДанныеЗаполнения);
	Если ТипЗнч(Основание) <> Тип("ДокументСсылка.СчетНаОплатуКлиенту") Тогда
		Возврат;
	КонецЕсли;

	рв_ЗаполнитьПоСчетуНаОплату(Основание);

КонецПроцедуры

// Возвращает ссылку на основание: команда передает структуру, механизмы БСП — саму ссылку.
Функция рв_ОснованиеИзДанныхЗаполнения(ДанныеЗаполнения)

	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Основание") Тогда
		Возврат ДанныеЗаполнения.Основание;
	КонецЕсли;
	Возврат ДанныеЗаполнения;

КонецФункции

Процедура рв_ЗаполнитьПоСчетуНаОплату(Счет)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Счет.Организация КАК Организация,
	|	Счет.Контрагент КАК Контрагент,
	|	Счет.Партнер КАК Партнер,
	|	Счет.Валюта КАК Валюта
	|ИЗ
	|	Документ.СчетНаОплатуКлиенту КАК Счет
	|ГДЕ
	|	Счет.Ссылка = &Счет
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Количество КАК Количество,
	|	Товары.Цена КАК Цена,
	|	Товары.Сумма КАК Сумма
	|ИЗ
	|	Документ.СчетНаОплатуКлиенту.Товары КАК Товары
	|ГДЕ
	|	Товары.Ссылка = &Счет
	|УПОРЯДОЧИТЬ ПО
	|	Товары.НомерСтроки";
	Запрос.УстановитьПараметр("Счет", Счет);
	Результаты = Запрос.ВыполнитьПакет();

	Шапка = Результаты[0].Выбрать();
	Если Шапка.Следующий() Тогда
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, Шапка);
	КонецЕсли;

	Товары.Очистить();
	Строки = Результаты[1].Выбрать();
	Пока Строки.Следующий() Цикл
		ЗаполнитьЗначенияСвойств(Товары.Добавить(), Строки);
	КонецЦикла;

КонецПроцедуры

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

Почему запрос, а не ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения.Основание), как часто делают:

  • обращение «через точку» к ссылке читает объект целиком, включая все табличные части;
  • копирование без списка свойств переносит все одноименные реквизиты, включая номер, дату, ответственного и комментарий — новый документ получит номер и дату счета;
  • в запросе сразу видно, какие именно поля переносятся, и это проще проверить на ревью.

Если всё же используете ЗаполнитьЗначенияСвойств по объекту, передайте список свойств третьим параметром или исключите служебные четвертым: ЗаполнитьЗначенияСвойств(ЭтотОбъект, Источник, , "Номер, Дата, Проведен, ПометкаУдаления, Ответственный, Комментарий").

&После или &Вместо

&После безопасен, если типовая ОбработкаЗаполнения для неизвестного ей типа основания ничего не делает. Проверьте это в коде типовой: иногда она заполняет значения по умолчанию (организацию, склад, ответственного) — тогда ваше заполнение аккуратно поверх них, это нормально. &Вместо с ПродолжитьВызов здесь не нужен: он сложнее и сильнее ломается при обновлениях.

Шаг 4. Права на команду

Новая команда расширения не видна никому, пока на нее нет права «Просмотр». В заимствованной роли откройте права, найдите свою общую команду и установите «Просмотр». Так команда станет доступна всем пользователям с этой ролью. Права на создание реализации у них уже есть из основной конфигурации.

Вариант для конфигураций на БСП: подключаемые команды

В УТ, ERP, БП и других конфигурациях на БСП подменю «Создать на основании» формируется подсистемой подключаемых команд. Общая команда в некоторых формах может оказаться в стандартной группе командной панели, а не в привычном подменю. Если нужно встроиться именно туда, в модуле менеджера документа-основания есть экспортная процедура добавления команд создания на основании. В расширении к ней добавляется обработчик &После, который регистрирует команду для документа-приемника средствами подсистемы «Создание на основании». Имена процедур и параметры отличаются в версиях БСП — посмотрите, как в вашей конфигурации добавлены уже существующие команды этого документа, и повторите их.

Заполнение при этом то же самое: механизм БСП передаст в ОбработкаЗаполнения саму ссылку на основание, поэтому функция рв_ОснованиеИзДанныхЗаполнения выше обрабатывает оба варианта.

Типичные ошибки

  • Команды не видно. Нет права «Просмотр» в роли расширения или автозаполнение командной панели формы отключено.
  • Номер и дата скопированы из счета. ЗаполнитьЗначенияСвойств без списка свойств.
  • Табличная часть задвоилась. Типовая обработка уже что-то заполнила, а вы добавили строки, не очистив таблицу.
  • Заполнение не срабатывает из БСП-команды. Обработчик ждет только структуру, а пришла ссылка.
  • Расширение не применяется. Не выполнено обновление конфигурации базы данных или установлен «Безопасный режим», а код требует привилегий.
  • После обновления типовой расширение отвалилось. Изменилась сигнатура или имя заимствованной процедуры — проверяйте расширения после каждого обновления.

Доработки типовых конфигураций я выполняю расширениями именно для того, чтобы обновления проходили без боли. Подробнее — расширения 1С и обновление 1С.

Коротко

  • Ввод на основании в расширении 1С: общая команда с типом параметра основания плюс &После("ОбработкаЗаполнения") в документе-приемнике.
  • Переносите данные запросом и явным списком полей, чтобы не скопировать номер и дату.
  • Обрабатывайте основание и как структуру, и как ссылку.
  • Не забудьте право «Просмотр» на команду в заимствованной роли.
  • В конфигурациях на БСП встраивайтесь в подменю через подключаемые команды.