Разработка и Конфигурация · 11 мин
1С: как прописать ввод на основании
Как настроить ввод на основании в 1С: конструктор, процедура ОбработкаЗаполнения, примеры кода, типовые ошибки и проверка результата.
Механизм «ввод на основании» в 1С позволяет создавать один документ на основе другого: например, счёт на оплату из заказа покупателя или приходную накладную из счёта поставщика. При этом данные шапки и табличных частей переносятся автоматически, что исключает ручной ввод и ошибки перепечатывания.
Прописать ввод на основании можно двумя способами: через конструктор ввода на основании в конфигураторе (доступен без программирования) и через процедуру ОбработкаЗаполнения в модуле объекта, где логика переноса описывается кодом. В типовых конфигурациях часто используется комбинация обоих подходов.
Ниже разобрано, где включается механизм, как работает конструктор, как писать обработчик заполнения, какие ограничения есть у каждого способа и как проверить, что настройка выполнена корректно.
Где включается механизм ввода на основании
Настройка выполняется в конфигураторе. Откройте дерево конфигурации, найдите нужный документ (например, «Реализация товаров и услуг»), вызовите контекстное меню и откройте палитру свойств. В разделе «Ввод на основании» есть два ключевых свойства:
- «Вводится на основании» — список объектов, из которых можно создавать текущий документ. Сюда добавляют документы-основания, например «Заказ покупателя» или «Счёт на оплату покупателю».
- «Является основанием для» — обратный список: какие документы можно создавать из текущего. Заполнять оба списка вручную не обязательно — достаточно настроить одну сторону, платформа учтёт связь.
После добавления основания платформа автоматически предложит запустить конструктор ввода на основании. Если диалог не появился, конструктор вызывается вручную: меню «Конструкторы» → «Конструктор ввода на основании» при открытом окне редактирования объекта.
Для справочников механизм работает аналогично: например, элемент справочника «Договоры контрагентов» можно вводить на основании элемента «Контрагенты», перенося владельца автоматически.
Настройка через конструктор ввода на основании
Конструктор подходит для типовой ситуации: реквизиты шапки и табличные части переносятся «один в один» или по простым формулам. Он сам формирует код процедуры ОбработкаЗаполнения в модуле объекта.
- 1Откройте документ в конфигураторе, в палитре свойств добавьте документ-основание в список «Вводится на основании».
- 2Запустите конструктор ввода на основании через меню «Конструкторы» или кнопку в палитре свойств.
- 3Выберите документ-основание из списка — конструктор покажет реквизиты текущего документа.
- 4Для каждого реквизита задайте способ заполнения: двойной щелчок открывает выбор формулы, реквизита основания или произвольного выражения.
- 5Для табличной части укажите, из какой табличной части основания брать строки и как сопоставлять колонки.
- 6Нажмите «ОК» — конструктор сгенерирует процедуру ОбработкаЗаполнения в модуле объекта.
- 7Обновите конфигурацию базы данных (F7) и проверьте работу в режиме предприятия.
Ключевой момент — поле «Способ заполнения» у каждого реквизита. Вариант «Реквизит объекта основания» копирует значение напрямую, «Формула» позволяет задать выражение (например, Основание.СуммаДокумента * 0.2 для расчёта аванса), а пустое значение оставляет реквизит незаполненным.
Если у табличной части основания и приёмника совпадают имена колонок, конструктор сопоставит их автоматически. При разных именах (например, «Товары» и «Запасы») сопоставление задаётся вручную для каждой колонки.
Ручное программирование: процедура ОбработкаЗаполнения
Когда логика сложнее простого копирования — нужен отбор строк, расчёт значений, заполнение по данным нескольких источников — код пишется вручную в модуле объекта документа. Платформа вызывает процедуру ОбработкаЗаполнения при создании объекта, передавая в неё параметр ДанныеЗаполнения — ссылку на основание.
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
// Заполнение шапки
Контрагент = ДанныеЗаполнения.Контрагент;
Договор = ДанныеЗаполнения.Договор;
Организация = ДанныеЗаполнения.Организация;
ДокументОснование = ДанныеЗаполнения.Ссылка;
// Заполнение табличной части
Для Каждого СтрокаЗаказа Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаЗаказа.Номенклатура;
НоваяСтрока.Количество = СтрокаЗаказа.Количество;
НоваяСтрока.Цена = СтрокаЗаказа.Цена;
НоваяСтрока.Сумма = СтрокаЗаказа.Сумма;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Обязательно проверяйте тип параметра ДанныеЗаполнения через ТипЗнч(): процедура вызывается при любом создании документа, включая интерактивный ввод нового пустого документа, копирование и ввод на основании разных объектов. Без проверки типа код обратится к несуществующим реквизитам и вызовет ошибку.
Если документ может вводиться на основании нескольких типов объектов, для каждого типа пишется отдельная ветка Если ... ИначеЕсли ... со своей логикой переноса.
Вместо прямого обращения к реквизитам основания через точку полезно помнить: если основание — большой документ, обращение ДанныеЗаполнения.Товары загружает всю табличную часть. Для отбора строк по условию эффективнее выполнить запрос к табличной части с отбором по ссылке.
Заполнение через запрос к основанию
Когда переносить нужно не все строки, а только часть (например, нереализованный остаток по заказу), используйте запрос. Это стандартный приём в типовых конфигурациях:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказТовары.Номенклатура КАК Номенклатура,
| ЗаказТовары.Количество КАК Количество
|ИЗ
| Документ.ЗаказПокупателя.Товары КАК ЗаказТовары
|ГДЕ
| ЗаказТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДанныеЗаполнения);
Товары.Загрузить(Запрос.Выполнить().Выгрузить());
Ввод на основании в управляемых формах и БСП
В конфигурациях на Библиотеке стандартных подсистем (БСП) — это «Управление торговлей», «ERP», «Бухгалтерия предприятия» актуальных редакций — механизм расширен подсистемой «Ввод на основании». Команды создания на основании формируются программно через переопределяемые процедуры в модуле менеджера объекта.
В модуле менеджера документа процедура ДобавитьКомандыСозданияНаОсновании определяет, какие документы можно создать из текущего, а ДобавитьКомандуСоздатьНаОсновании — как текущий документ появится в меню других объектов. Кнопка «Создать на основании» в форме списка и форме документа собирается из этих описаний автоматически.
Заполнение данных при этом по-прежнему выполняется в ОбработкаЗаполнения модуля объекта — БСП лишь управляет видимостью команд. Поэтому доработка переноса данных в типовой конфигурации делается через расширение: в расширении создаётся процедура с аннотацией &После("ОбработкаЗаполнения") или &Вместо, что сохраняет конфигурацию на поддержке.
Типовые ошибки и их последствия
Первая частая проблема — отсутствие проверки типа ДанныеЗаполнения. Документ перестаёт создаваться вручную: при открытии формы нового документа возникает ошибка обращения к реквизиту, которого нет у структуры данных заполнения.
Вторая ошибка — незаполненные обязательные реквизиты. Документ создаётся, но не проводится: платформа сообщает о незаполненном поле. Проверьте, что все реквизиты с признаком «Проверка заполнения: выдавать ошибку» либо переносятся из основания, либо заполняются значениями по умолчанию.
Третья группа ошибок связана с доработкой типовых конфигураций: изменение типовой процедуры напрямую приводит к конфликтам при обновлении, а забытое обновление конфигурации БД — к тому, что пользователи просто не видят новую кнопку.
Проверка результата после настройки
Проверка выполняется в режиме «1С:Предприятие». Откройте документ-основание, нажмите кнопку «Создать на основании» — в списке должен появиться настроенный документ. Создайте его и сверьте перенесённые данные: шапку, табличные части, суммы.
Дополнительно проверьте три сценария: создание документа вручную (без основания) — не должно быть ошибок; копирование существующего документа; ввод на основании из формы списка и из формы самого документа-основания. Во всех режимах поведение должно быть корректным.
Как проверить результат
Нужный документ есть в списке и создаётся
Документа нет в списке — проверьте свойство «Вводится на основании» и обновление конфигурации БД
Шапка и табличные части перенесены, суммы совпадают
Пустые поля или неверные суммы — ошибка в ОбработкаЗаполнения
Новый документ открывается без ошибок
Ошибка при создании — нет проверки типа ДанныеЗаполнения
Документ проводится, движения формируются
Сообщения о незаполненных реквизитах
FAQ
Можно ли настроить ввод на основании без программирования?
Да, для простого переноса реквизитов достаточно конструктора ввода на основании: он сам генерирует код процедуры ОбработкаЗаполнения. Писать код вручную потребуется только при нестандартной логике — отборе строк, расчётах, обращении к нескольким источникам данных.
Почему кнопка «Создать на основании» не появляется у пользователя?
Чаще всего не выполнено обновление конфигурации базы данных после изменений (клавиша F7 в конфигураторе). Также проверьте, что документ добавлен в список «Вводится на основании», а у пользователя есть права на создание целевого документа. В конфигурациях на БСП дополнительно проверьте команды создания в модуле менеджера.
Как создать документ на основании нескольких документов сразу?
Штатный механизм работает с одним основанием. Для ввода на основании нескольких документов (например, одна реализация по нескольким заказам) создают отдельную команду или обработку, которая формирует структуру данных заполнения и передаёт её в новый документ. В типовых конфигурациях такой сценарий уже реализован для ряда документов.
Чем ОбработкаЗаполнения отличается от ПриКопировании?
ОбработкаЗаполнения вызывается при создании объекта на основании или с параметрами заполнения, а ПриКопировании — только при копировании существующего объекта. Это разные события: логику переноса из основания нужно размещать именно в ОбработкаЗаполнения.
Как доработать ввод на основании в типовой конфигурации, не теряя поддержку?
Используйте расширение конфигурации: добавьте в него модуль объекта документа и создайте процедуру с аннотацией &После("ОбработкаЗаполнения") для дополнения типовой логики или &Вместо — для полной замены. Типовая конфигурация при этом остаётся на поддержке и обновляется штатно.
Что важно запомнить
Ввод на основании включается в палитре свойств документа, простая логика настраивается конструктором, сложная — кодом в ОбработкаЗаполнения с обязательной проверкой типа ДанныеЗаполнения. После настройки обновите конфигурацию БД и проверьте три сценария: создание на основании, ручной ввод и проведение. Доработки типовых конфигураций выполняйте через расширение.