К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как добавить команду «Создать на основании» в 1С

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

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

Механизм реализуется двумя связанными элементами: настройкой в свойствах объекта (поля «Вводится на основании» и «Является основанием для») и процедурой «ОбработкаЗаполнения» в модуле объекта, которая описывает, какие данные копировать из документа-основания. В управляемых формах дополнительно используется команда формы и общая команда ввода на основании.

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

Проверьте возможность изменения конфигурации

Прежде чем что-либо менять, убедитесь, что конфигурация доступна для редактирования. Откройте конфигуратор и посмотрите статус в меню «Конфигурация → Поддержка → Настройка поддержки». Если конфигурация типовая и стоит на полной поддержке, объекты будут заблокированы — при попытке редактирования платформа предложит включить возможность изменения.

Есть три безопасных варианта действий в зависимости от ситуации:

  • Конфигурация собственная или уже снята с поддержки — изменяйте объекты напрямую.
  • Типовая конфигурация на поддержке, изменения минимальны — используйте механизм расширений конфигурации: он не нарушает поддержку и не усложняет обновления.
  • Типовая конфигурация, но расширения по каким-то причинам не подходят — включите возможность изменения для конкретных объектов, понимая, что при обновлении потребуется ручное сопоставление.

Настройте связь объектов в свойствах конфигурации

Основная работа выполняется в дереве конфигурации. Откройте конфигуратор, найдите документ, который должен быть основанием (например, «ЗаказПокупателя»), и откройте его свойства. На вкладке «Ввод на основании» есть два списка: «Вводится на основании» и «Является основанием для».

Заполнить связь можно с любой стороны, результат одинаковый:

  • у документа-основания в списке «Является основанием для» отметьте создаваемый документ;
  • либо у создаваемого документа в списке «Вводится на основании» отметьте документ-основание.

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

Опишите процедуру ОбработкаЗаполнения

Откройте модуль объекта создаваемого документа (правый клик по объекту в дереве конфигурации → «Открыть модуль объекта»). Если процедуры «ОбработкаЗаполнения» ещё нет, добавьте её. Платформа вызывает эту процедуру при создании объекта и передаёт в параметр «Основание» ссылку на документ-источник (в параметре «ДанныеЗаполнения» — в зависимости от версии платформы и способа вызова).

Минимальный рабочий пример для документа «РеализацияТоваров», создаваемого на основании «ЗаказПокупателя»:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда

Контрагент = ДанныеЗаполнения.Контрагент;

Договор = ДанныеЗаполнения.Договор;

Организация = ДанныеЗаполнения.Организация;

ДокументОснование = ДанныеЗаполнения.Ссылка;

Для Каждого СтрокаЗаказа Из ДанныеЗаполнения.Товары Цикл

НоваяСтрока = Товары.Добавить();

ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗаказа);

КонецЦикла;

КонецЕсли;

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

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

bsl
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
    Контрагент = ДанныеЗаполнения.Контрагент;
    Для Каждого СтрокаЗаказа Из ДанныеЗаполнения.Товары Цикл
        НоваяСтрока = Товары.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗаказа);
    КонецЦикла;
КонецЕсли;

Добавьте команду в форму и интерфейс

В большинстве случаев после настройки связи объектов ничего дополнительно делать не нужно: платформа автоматически формирует подменю «Создать на основании» на форме документа и в списке документов. Однако если у объекта переопределена форма и командная панель собрана вручную, стандартная команда может не отображаться.

В этом случае откройте форму документа-основания в конфигураторе, перейдите на вкладку «Командный интерфейс» (или откройте командную панель формы) и проверьте видимость группы «Создать на основании». Для списков документов аналогичная настройка находится в командном интерфейсе формы списка. Также проверьте командный интерфейс подсистемы, если документ должен создаваться из разделов меню.

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

Маршрут решения

Как выбрать действие

Конфигурация собственная или снята с поддержкиНастраивайте связь и ОбработкаЗаполнения напрямую в конфигурации
Типовая конфигурация на поддержке, нужно дополнить типовое заполнениеСоздайте расширение и используйте аннотацию &После для ОбработкаЗаполнения
Нужно полностью заменить типовую логику заполненияВ расширении используйте &Вместо, но учтите риск конфликтов при обновлении типовой
Изменение конфигурации запрещено политикой компанииРассмотрите внешнюю обработку с командой заполнения или дополнительную обработку из БСП

Обновите конфигурацию и проверьте результат

После внесения изменений обновите конфигурацию базы данных: меню «Конфигурация → Обновить конфигурацию базы данных» (клавиша F7). В файловом варианте потребуется монопольный доступ — все пользователи должны выйти из программы. В клиент-серверном варианте возможно динамическое обновление, но для изменений структуры объектов лучше выполнять обычное.

Проверка результата выполняется в пользовательском режиме:

  1. Откройте существующий документ-основание (или создайте тестовый).
  2. Нажмите кнопку «Создать на основании» и выберите нужный тип документа.
  3. Убедитесь, что открылся новый документ с заполненными реквизитами: контрагент, организация, табличная часть.
  4. Проверьте, что документ записывается и проводится без ошибок.
  5. Откройте документ-основание повторно и убедитесь, что в структуре подчинённости (если она настроена) отображается созданный документ.
Контрольные точки

Как проверить результат

Пункт в меню «Создать на основании»
Норма

Новый тип документа отображается в подменю

Тревожный признак

Пункт отсутствует — связь объектов не настроена или не обновлена конфигурация БД

Заполнение шапки нового документа
Норма

Контрагент, организация и прочие реквизиты перенесены

Тревожный признак

Поля пустые — ошибка в ОбработкаЗаполнения или неверное имя реквизита

Табличная часть
Норма

Строки скопированы с количеством и ценами

Тревожный признак

Таблица пуста или ошибка при открытии — проверьте цикл копирования и имена колонок

Создание документа обычным способом
Норма

Новый пустой документ открывается без ошибок

Тревожный признак

Ошибка обращения к реквизиту — отсутствует проверка типа ДанныеЗаполнения

Типичные ошибки и их устранение

Самая частая проблема — ошибка «Поле объекта не обнаружено» при открытии нового документа. Причина почти всегда в обращении к реквизиту основания, которого нет у данного типа, либо в отсутствии проверки типа параметра заполнения. Второй типовой сценарий — команда появилась, но создаёт пустой документ: значит, процедура «ОбработкаЗаполнения» либо отсутствует в модуле создаваемого объекта, либо условие по типу не срабатывает (например, проверяется не тот тип документа).

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

Типичные ошибки
01
Нет проверки ТипЗнч(ДанныеЗаполнения) — при обычном создании документа возникает ошибка обращения к реквизитам основания
02
Связь настроена, но забыли обновить конфигурацию базы данных — команда не появляется в интерфейсе
03
Копирование табличной части через прямое присваивание Товары = ДанныеЗаполнения.Товары — табличная часть объекта не заполняется, нужен цикл с Добавить()
04
Изменение типового модуля без расширения — при очередном обновлении конфигурации доработка теряется или блокирует обновление
05
Опечатка в имени реквизита основания — ошибка проявляется только в момент создания на основании и не видна при синтаксической проверке модуля

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

Можно ли добавить «Создать на основании» без изменения конфигурации?

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

Почему команда есть, а документ создаётся пустым?

Связь объектов добавляет только команду и передаёт ссылку на основание. Заполнение выполняет процедура ОбработкаЗаполнения в модуле создаваемого объекта. Проверьте, что она существует, что условие проверки типа соответствует типу основания и что имена реквизитов указаны верно.

Как заполнить табличную часть из документа-основания?

Прямое присваивание табличных частей не работает. Нужен цикл: для каждой строки табличной части основания добавляйте новую строку в табличную часть нового документа и копируйте значения через ЗаполнитьЗначенияСвойств или явным присваиванием каждой колонки.

Что делать, если конфигурация типовая и находится на поддержке?

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

Можно ли создавать на основании один документ из нескольких разных типов?

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

Почему после обновления типовой конфигурации моя доработка пропала?

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

Итог

Что важно запомнить

Команда «Создать на основании» настраивается в два шага: связь объектов в свойствах конфигурации («Является основанием для» / «Вводится на основании») и процедура ОбработкаЗаполнения в модуле создаваемого объекта с обязательной проверкой типа основания. Для типовых конфигураций используйте расширения, перед изменениями делайте резервную копию, а после — обновляйте конфигурацию базы данных и проверяйте результат на тестовом документе.