Как програмно создать и заполнить документ на основании?
Задача: при проведении поступления товаров и услуг на основании программно вводить документ установка цен номенклатуры.
Делаю так:
НовыйДокУстановкаЦен = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДокУстановкаЦен.Заполнить(ЭтотОбъект.Ссылка);
// Заполним реквизиты из стандартного набора по документу основанию.
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(НовыйДокУстановкаЦен, ЭтотОбъект.Ссылка);
НовыйДокУстановкаЦен.Записать(РежимЗаписиДокумента.Проведение);
В итоге документ создаётся пустой. Направте на путь истинный, пожалуйста.
(5) Дело в том, что на днях писал обработку, где программно создавал один док на основании другого и он открывался уже с заполненной табличной частью. Вот пример:
НовыйДокПереоценка = Документы.ПереоценкаТоваровВРознице.СоздатьДокумент();
НовыйДокПереоценка.Заполнить(НовыйДок.Ссылка);
НовыйДокПереоценка.Комментарий = "Записан программно";
НовыйДокПереоценка.Записать(РежимЗаписиДокумента.Проведение);
В чем прикол с установкой цен?
Читаю и думаю: а какие именно цены устанавливать по поступления собирается ТС? Цены поставщика? 🙂 Так ведь поставщик их уже установил :)) Тут разумно только зарегистрировать эти цены на основании поступления. Но это уже другой документ и другая тема.
"Бойтесь исполнения своих желаний"(с)
(22) посмотрел ЗаполнитьТабличнуюЧастьПоПоступлениюНаОсновании(ПараметрОснование); — не все так просто там, наверное надо или повторять фукционал или делать ее экспортной и вызывать
а если не хо, можно обойтись быдлокодом типа:
НовыйДокУстановкаЦен = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДокУстановкаЦен.Заполнить(ПоступлениеТоваровУслуг);
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(НовыйДокУстановкаЦен, ПоступлениеТоваровУслуг);
НовыйДокУстановкаЦен.Дата = ТекущаяДата();
НоваяСтрока = НовыйДокУстановкаЦен.ТипыЦен.Добавить();
НоваяСтрока.ТипЦен = ПоступлениеТоваровУслуг.ТипЦен.ТипЦеныНоменклатуры;
Для КАЖДОГО СтрокаТовары ИЗ ПоступлениеТоваровУслуг.Товары Цикл
НоваяСтрокаТов = НовыйДокУстановкаЦен.Товары.Добавить();
НоваяСтрокаТов.Номенклатура = СтрокаТовары.Номенклатура;
НоваяСтрокаТов.ЕдиницаИзмерения = СтрокаТовары.ЕдиницаИзмерения;
НоваяСтрокаТов.Цена = СтрокаТовары.Цена;
НоваяСтрокаТов.ТипЦен = ПоступлениеТоваровУслуг.ТипЦен.ТипЦеныНоменклатуры;
НоваяСтрокаТов.Валюта = ПоступлениеТоваровУслуг.ТипЦен.ВалютаЦены;
КонецЦикла;
Попытка
НовыйДокУстановкаЦен.Записать();
Исключение КонецПопытки;
(25) Это всё что есть у меня:
Процедура ОбработкаЗаполнения(Основание)
Если ТипЗнч(Основание) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
// Заполним реквизиты из стандартного набора по документу основанию.
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЭтотОбъект, Основание);
КонецЕсли;
Как выполнить ввод на основании программно?
Обычно, в большинстве случаев когда объект вводится на основании, нужно открыть пользователю форму нового объекта, который введен на основании какого-то объекта.
В этом случае достаточно просто передать параметр Основание в процедуру открытия формы:
При этом отработает процедура ОбработкаЗаполнения в модуле объекта и, соответственно, те алгоритмы заполнения, которые в ней описаны.
Если же объект, который вводится на основании, нужно сразу записать в базу данных не показывая его форму пользователю, то тогда можно использовать метод объекта Заполнить().
Создать новый объект, и вызвать у него метод Заполнить(), в который передать значение, на основании которого должен быть создан этот объект.
В результате этих действий будет выполнен обработчик события ОбработкаЗаполнения, расположенный в модуле нового объекта.
Следует заметить, что событие ОбработкаЗаполнения есть не только у объектных данных (документов, справочников и т.п.), но и у регистра сведений, в модуле объекта РегистрСведенийНаборЗаписей.<имя>.
Подробнее о заполнении новых объектов данными можно посмотреть в вопросе Как при открытии формы определить, что создается новый элемент? .
В 1С начинающие программисты зачастую создают механизмы, которые уже заложены в платформе 1С Предприятие. Примером этого может являться механизм ввода документа на основании другого документа (или объекта).
Механизм «Ввод на основании» предполагает:
- Создание на основании нового документа и открытие его формы
- Заполнение реквизитов документа-приёмника из документа-источника (или другого объекта системы)
- Другие программные операции с документом-приёмником.
Теперь, чтобы воспользоваться этим великолепным механизмом и не изобретать велосипед, нужно сделать следующее:
1. Открываем в конфигураторе документ-источник, переходим на вкладку «Ввод на основании» и добавляем необходимый документ-приёмник (или другой объект) в разделе «Является основанием для».

2. Затем в модуле документа-приёмника в процедуре «ОбработкаЗаполнения» программно заполняем те поля документа из документа-основания, которые хотим.

3. Обновляем конфигурацию, запускаем режим «1С Предприятия» и наслаждаемся результатом.
Если вам понравилась эта статья, поставите лайк. Все вопросы пишите в комментариях ниже. Удачного вам изучения всех тонкостей 1С!
Ввод на основании в расширении конфигурации 1С
Приветствую уважаемый читатель, в данной статье я хочу поделиться своим опытом реализации механизма «Ввод на основании» в 1С при помощи расширения конфигурации.
Для примера разработки возьмем типовую конфигурацию «Управление торговлей 11.4».
Задача: Реализовать возможность ввода документа «Реализация товаров и услуг» на основании документа «Счет на оплату клиенту«.
Добавление расширения в конфигурацию
В конфигураторе, в главном меню переходим в раздел «Конфигурация» — «Расширения конфигурации».
Откроется список всех расширений данной системы. Выбираем необходимое расширение или создаем новое. Для примера создадим новое расширение «Пример ввода на основании в расширении» в назначении расширения укажем «Дополнение».
Работа с расширением
Мы добавили новое расширение и теперь можно приступать к работе с ним.
Для этого в списке расширение двойным кликом или с помощью контекстного меню откроем конфигурацию нашего расширения

Мы будем работать с двумя документами «Счет на оплату клиенту» и «Реализация товаров и услуг», поэтому добавим эти два объекта в наше расширение

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

Для типа параметра команды указываем «СчетНаОплатуКлиенту«, который мы ранее добавили в наше расширение

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

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


На этом разработка реализации ввода на основании в 1С при помощи расширения конфигурации завершено, можем запустить конфигурацию и проверить, что проделали данную работу не зря.