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

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

1С: как прописать ввод на основании

Как настроить ввод на основании в 1С: конструктор, процедура ОбработкаЗаполнения, примеры кода, типовые ошибки и проверка результата.

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

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

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

Где включается механизм ввода на основании

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

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

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

Для справочников механизм работает аналогично: например, элемент справочника «Договоры контрагентов» можно вводить на основании элемента «Контрагенты», перенося владельца автоматически.

Настройка через конструктор ввода на основании

Конструктор подходит для типовой ситуации: реквизиты шапки и табличные части переносятся «один в один» или по простым формулам. Он сам формирует код процедуры ОбработкаЗаполнения в модуле объекта.

Порядок действий в конструкторе
  1. 1
    Откройте документ в конфигураторе, в палитре свойств добавьте документ-основание в список «Вводится на основании».
  2. 2
    Запустите конструктор ввода на основании через меню «Конструкторы» или кнопку в палитре свойств.
  3. 3
    Выберите документ-основание из списка — конструктор покажет реквизиты текущего документа.
  4. 4
    Для каждого реквизита задайте способ заполнения: двойной щелчок открывает выбор формулы, реквизита основания или произвольного выражения.
  5. 5
    Для табличной части укажите, из какой табличной части основания брать строки и как сопоставлять колонки.
  6. 6
    Нажмите «ОК» — конструктор сгенерирует процедуру ОбработкаЗаполнения в модуле объекта.
  7. 7
    Обновите конфигурацию базы данных (F7) и проверьте работу в режиме предприятия.

Ключевой момент — поле «Способ заполнения» у каждого реквизита. Вариант «Реквизит объекта основания» копирует значение напрямую, «Формула» позволяет задать выражение (например, Основание.СуммаДокумента * 0.2 для расчёта аванса), а пустое значение оставляет реквизит незаполненным.

Если у табличной части основания и приёмника совпадают имена колонок, конструктор сопоставит их автоматически. При разных именах (например, «Товары» и «Запасы») сопоставление задаётся вручную для каждой колонки.

Ручное программирование: процедура ОбработкаЗаполнения

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

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

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

// Заполнение шапки

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

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

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

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

// Заполнение табличной части

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

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

НоваяСтрока.Номенклатура = СтрокаЗаказа.Номенклатура;

НоваяСтрока.Количество = СтрокаЗаказа.Количество;

НоваяСтрока.Цена = СтрокаЗаказа.Цена;

НоваяСтрока.Сумма = СтрокаЗаказа.Сумма;

КонецЦикла;

КонецЕсли;

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

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

Если документ может вводиться на основании нескольких типов объектов, для каждого типа пишется отдельная ветка Если ... ИначеЕсли ... со своей логикой переноса.

Вместо прямого обращения к реквизитам основания через точку полезно помнить: если основание — большой документ, обращение ДанныеЗаполнения.Товары загружает всю табличную часть. Для отбора строк по условию эффективнее выполнить запрос к табличной части с отбором по ссылке.
ПЗ
Практическое замечание

Заполнение через запрос к основанию

Когда переносить нужно не все строки, а только часть (например, нереализованный остаток по заказу), используйте запрос. Это стандартный приём в типовых конфигурациях:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЗаказТовары.Номенклатура КАК Номенклатура,

| ЗаказТовары.Количество КАК Количество

|ИЗ

| Документ.ЗаказПокупателя.Товары КАК ЗаказТовары

|ГДЕ

| ЗаказТовары.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ДанныеЗаполнения);

Товары.Загрузить(Запрос.Выполнить().Выгрузить());

Ввод на основании в управляемых формах и БСП

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

В модуле менеджера документа процедура ДобавитьКомандыСозданияНаОсновании определяет, какие документы можно создать из текущего, а ДобавитьКомандуСоздатьНаОсновании — как текущий документ появится в меню других объектов. Кнопка «Создать на основании» в форме списка и форме документа собирается из этих описаний автоматически.

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

Типовые ошибки и их последствия

Первая частая проблема — отсутствие проверки типа ДанныеЗаполнения. Документ перестаёт создаваться вручную: при открытии формы нового документа возникает ошибка обращения к реквизиту, которого нет у структуры данных заполнения.

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

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

Типичные ошибки
01
Нет проверки ТипЗнч(ДанныеЗаполнения) — ошибка при ручном создании документа.
02
Конструктор сгенерировал код, но конфигурация БД не обновлена (F7) — кнопка не появляется у пользователей.
03
Не перенесены обязательные реквизиты — документ не проводится после создания.
04
Правка типового модуля вместо расширения — конфликты при обновлении конфигурации.
05
Ссылка на основание не записана в реквизит «ДокументОснование» — теряется связь для отчётов и печатных форм.

Проверка результата после настройки

Проверка выполняется в режиме «1С:Предприятие». Откройте документ-основание, нажмите кнопку «Создать на основании» — в списке должен появиться настроенный документ. Создайте его и сверьте перенесённые данные: шапку, табличные части, суммы.

Дополнительно проверьте три сценария: создание документа вручную (без основания) — не должно быть ошибок; копирование существующего документа; ввод на основании из формы списка и из формы самого документа-основания. Во всех режимах поведение должно быть корректным.

Контрольные точки

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

Кнопка «Создать на основании» в документе-основании
Норма

Нужный документ есть в списке и создаётся

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

Документа нет в списке — проверьте свойство «Вводится на основании» и обновление конфигурации БД

Заполнение реквизитов
Норма

Шапка и табличные части перенесены, суммы совпадают

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

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

Ручное создание документа
Норма

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

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

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

Проведение созданного документа
Норма

Документ проводится, движения формируются

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

Сообщения о незаполненных реквизитах

FAQ

Можно ли настроить ввод на основании без программирования?

Да, для простого переноса реквизитов достаточно конструктора ввода на основании: он сам генерирует код процедуры ОбработкаЗаполнения. Писать код вручную потребуется только при нестандартной логике — отборе строк, расчётах, обращении к нескольким источникам данных.

Почему кнопка «Создать на основании» не появляется у пользователя?

Чаще всего не выполнено обновление конфигурации базы данных после изменений (клавиша F7 в конфигураторе). Также проверьте, что документ добавлен в список «Вводится на основании», а у пользователя есть права на создание целевого документа. В конфигурациях на БСП дополнительно проверьте команды создания в модуле менеджера.

Как создать документ на основании нескольких документов сразу?

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

Чем ОбработкаЗаполнения отличается от ПриКопировании?

ОбработкаЗаполнения вызывается при создании объекта на основании или с параметрами заполнения, а ПриКопировании — только при копировании существующего объекта. Это разные события: логику переноса из основания нужно размещать именно в ОбработкаЗаполнения.

Как доработать ввод на основании в типовой конфигурации, не теряя поддержку?

Используйте расширение конфигурации: добавьте в него модуль объекта документа и создайте процедуру с аннотацией &После("ОбработкаЗаполнения") для дополнения типовой логики или &Вместо — для полной замены. Типовая конфигурация при этом остаётся на поддержке и обновляется штатно.

Итог

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

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