Программное создание документа (УФ)

1. AndrewUs 11 23.06.22 16:39 Сейчас в теме
Здравствуйте.
Создаю обработку в конфигурации 1С ERP 2.5, с помощью которой можно будет создать документ Движение продукции и материалов, с видом операции "Передача материалов в кладовую".
Сделал известным способом:
Если ЗначениеЗаполнено(Объект.Получатель) Тогда
		НовыйДок = Документы.ДвижениеПродукцииИМатериалов.СоздатьДокумент();
		НовыйДок.Статус = Перечисления.СтатусыДвиженияПродукцииИМатериалов.Принято;
		НовыйДок.Дата = ТекущаяДата();
		НовыйДок.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПередачаМатериаловВКладовую;
		НовыйДок.Ответственный = Пользователи.ТекущийПользователь();
		НовыйДок.Отправитель = Объект.Отправитель;
		НовыйДок.Получатель = Объект.Получатель;
		НовыйДок.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
		НовыйДок.Валюта = Справочники.Валюты.НайтиПоКоду("643");
		НовыйДок.ВариантПриемкиТоваров = Перечисления.ВариантыПриемкиТоваров.РазделенаТолькоПоНакладным;
		НовыйДок.ВидЦены = Объект.Отправитель.УчетныйВидЦены;
		
		Для каждого ТекущаяСтрока Из Объект.Список Цикл
		
			Если ЗначениеЗаполнено(ТекущаяСтрока.Переместить) Тогда
			
				СтрТаб = НовыйДок.Товары.Добавить();
				ЗаполнитьЗначенияСвойств(СтрТаб,ТекущаяСтрока);
				СтрТаб.Количество = ТекущаяСтрока.Переместить;
				СтрТаб.КоличествоУпаковок = ТекущаяСтрока.Переместить;
	
			КонецЕсли;	
		
		КонецЦикла;	
	
		НовыйДок.Записать();
		СсылкаНаДок = НовыйДок.Ссылка;
		Возврат СсылкаНаДок;

	Иначе
		Сообщить("Заполните склад получатель");
	КонецЕсли;
Показать

Однако, нужно создавать документ через "Структура", якобы при таком варианте минимизируется появление ошибок при заполнении невидимых реквизитов документа.
Подскажите, пожалуйста, каким образом нужно создавать?
Спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. MazhutkoAV 23.06.22 17:14 Сейчас в теме
Ну типа вот так при загрузке выписки через клиент-банк:

ОбъектДокумента = МенеджерДокумента.СоздатьДокумент();
// тут данные заполняются функцией, у Вас Ваш код будет
ДанныеЗаполнения = НовыйДанныеЗаполнения(
Операция,
РаспознаннаяОперация.ПлатежноеПоручение,
ХозяйственнаяОперация,
РаспознаннаяВыписка.ВладелецСчета);
ОбъектДокумента.Заполнить(ДанныеЗаполнения);


В модуле документа должна быть стандартная процедура, которая и заполняет по данным заполнения то, что может заполнить, а Вы забыли

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
2. Westonline82 23.06.22 17:05 Сейчас в теме
(1) как то так...
ДокументОбъект = Документы[ПолноеИмяДокумента].СоздатьДокумент();
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("Организация", Выборка.Организация);
ДанныеЗаполнения.Вставить("Контрагент", Выборка.Контрагент);
ДанныеЗаполнения.Вставить("Дата", Выборка.Дата);
ДанныеЗаполнения.Вставить("НомерСФ", Выборка.НомерСФ);
ДанныеЗаполнения.Вставить("ДатаСоставления", Выборка.ДатаСФ);
ДанныеЗаполнения.Вставить("ДокументОснование", Выборка.ДокументОснование);
ДанныеЗаполнения.Вставить("НаименованиеДокумента", Выборка.НаименованиеДокумента);
ДокументОбъект.Заполнить(ДанныеЗаполнения);
ДокументОбъект.Записать();
MazhutkoAV; +1 Ответить
4. AndrewUs 11 24.06.22 08:35 Сейчас в теме
(2)А чем отличается этот вариант от моего, я так же буду перечислять все реквизиты, которые необходимы для заполнения через конструкцию
"ДанныеЗаполнения.Вставить("Отправитель", Объект.Отправитель)"

Или я ошибаюсь?
5. spacecraft 24.06.22 08:57 Сейчас в теме
(4) вся магия в этой команде: ДокументОбъект.Заполнить(ДанныеЗаполнения);
Если попытаетесь присвоить значение реквизиту документа напрямую, а его нет, то получите ошибку.
Методом Заполнить произойдет заполнение доступных реквизитов документа из данные в структуре. И не важно, сколько там еще дополнительно данных в структуре. Ошибки заполнения не произойдет.
7. AndrewUs 11 24.06.22 10:16 Сейчас в теме
Действительно метод работает, данные заполняются, правда при попытке заполнить составной тип реквизита, через структуру не заполняется, приходится выносить его за рамки заполнения и вводить принудительно. Но это уже не все подряд заполнять.
10. spacecraft 24.06.22 10:33 Сейчас в теме
(7)
данные заполняются, правда при попытке заполнить составной тип реквизита, через структуру не заполняется, приходится выносить его за рамки заполнения и вводить принудительно.

Деле не в этом. Он прекрасно заполняет реквизит и составного типа. Только для заполняемого реквизита должно быть выставлено свойство реквизита "Заполнять из данных заполнения".
11. AndrewUs 11 24.06.22 10:34 Сейчас в теме
(10)Точно, в данном реквизите эта отметка и не установлена.
6. RustamZz 24.06.22 09:39 Сейчас в теме
(4) Добавлю к (5) и тех реквизитов, что вы не укажете, но которые программа знает как заполнить. Лично я в процессе разработки стараюсь как можно меньше указывать реквизитов, при тестировании смотрю что не заполнилось и только потом добавляю.
8. AndrewUs 11 24.06.22 10:20 Сейчас в теме
Спасибо всем огромное за помощь и подсказки.
9. PLAstic 295 24.06.22 10:32 Сейчас в теме
Я бы не стал использовать какую-то странную структуру и надеяться, что из неё произойдёт заполнение реквизитов, у которых стоит галка "Заполнять из данных заполнения", а в первую очередь посмотрел бы обработчик заполнения целевого документа, чтобы понять, из чего он может заполниться. Иногда там бывает заполнение и из структур, но тогда у них д.б. определены конкретные ключи.
В целом же надо проанализировать всю процедуру обработчика, чтобы понимать, что после заполнения такого-то реквизита можно вызвать такой-то обработчик изменения реквизита и он заполнит ещё десяток других реквизитов.
Заполнение из данных заполнения не выполнит за тебя все эти обработчики изменения. Универсальное решение - смотри в обработчик заполнения документа и не майся со структурами.
FatPanzer; +1 Ответить
12. FatPanzer 24.06.22 10:43 Сейчас в теме
(9) Обработчик заполнения как раз и заточен под структуру. То есть там сначала происходит заполнение на платформенном уровне (ДанныеЗаполнения), а потом идет куча дополнительных обработчиков.
Но проконтролировать исполнение все равно надо. Иногда после работы обработчика заполнения - некоторые реквизиты очищаются, даже не смотря на то, что они есть в структуре ДанныеЗаполнения.
13. PLAstic 295 24.06.22 11:23 Сейчас в теме
(12) Посмотри в типовых конфах, у многих реквизитов видишь заполнение из данных заполнения? Лучше не полагаться на какое-то частичное заполнение каких-то реквизитов, а заполнять гарантированно и последовательно, с вызовом доп.процедур после установки значений конкретных реквизитов. Ну и возможно, обнаружится заполнение из структуры в обработчике заполнения.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот