Обработка заполнения самописная конфигурация

1. ru_spaiky 08.11.20 19:51 Сейчас в теме
Добрый день, уважаемые читатели форума и эксперты.

Помогите разобраться в ситуации.

1. как показано в изображении имеем документ прихода с табличной частью.
2. имеем другой документ вк как показано в изображении без табличной части
3. То что куда должно вставлятся если создаем вк на основании приходного документа.

Так вот суть вопроса как при создании на основе сделать так чтобы документ ВК создался и заполнился столько раз сколько строк в документе приходная накладная. со всеми реквизитами.

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПриходДокументов") Тогда
		// Заполнение шапки
		НомерФасонины = ДанныеЗаполнения.Комментарий;
		Коментарий = ДанныеЗаполнения.Комментарий;
		Обьект = ДанныеЗаполнения.ОбьектСтроительство;
		Составил = ДанныеЗаполнения.Ответственный;
		Дата = ДанныеЗаполнения.Дата;
		
		 	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
		
	КонецЕсли;
	//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
	
КонецПроцедуры

Показать
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
15. oleg-x 27 12.11.20 10:25 Сейчас в теме
(14) Чтобы обойти таблицу из формы документа:
Для каждого стр из Объект.ИмяТаблицы Цикл
    //стр - конкретная строка табличной части
КонецЦикла
17. oleg-x 27 12.11.20 11:13 Сейчас в теме
(16) ЗаполнитьЗначенияСвойств(Приемник,Источник) вам в помощь, если имена реквизитов одинаковые. Остальные реквизиты заполняются непосредственным указанием значений или реквизита.
НовыйДокумент.Договор = Объект.ДоговорКонтрагента;
НовыйДокумент.Сумма = стр.Сумма;;
19. ru_spaiky 12.11.20 13:29 Сейчас в теме
Вот конечный результат
Вдруг кому пригодится

&НаСервере
Процедура Команда1НаСервере()

		
Для каждого стр из Объект.Таблица Цикл
     				Попытка
	НовыйДокумент = Документы.Входной.СоздатьДокумент(); // Создает новый ВК
	НовыйДокумент.Дата = Объект.Дата;
	НовыйДокумент.Номенклатура = стр.Номенклатура;
	НовыйДокумент.Количество = стр.Количество;
	НовыйДокумент.Обьект = Объект.ОбьектСтроительство;
	НовыйДокумент.Составил = Объект.Ответственный;
	НовыйДокумент.СостояниеАкта = Перечисления.Состояние.Новый;
	НовыйДокумент.Записать();
	
					Сообщить("Документ по Входному контролю "+Объект.ВходящийДокумент+" успешно создан");
					Исключение
					Сообщить("Не удалось создать документ по Входному контролю"+Объект.ВходящийДокумент);
					КонецПопытки;

КонецЦикла

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

&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1464234 08.11.20 20:05 Сейчас в теме
К сожалению режим ввода на основании не поддерживает отношение один ко многим.
Возможно, вам подойдет открытие обработки и создание необходимого вам количества объектов по кнопке.
3. ru_spaiky 08.11.20 20:08 Сейчас в теме
(2)
зможно, вам подойдет открытие обработки и создание необходимого вам количества объектов


Возможно конечно, может быть подскажите пример какой недь?
4. user1464234 08.11.20 20:12 Сейчас в теме
(3) например, клиент банк создает платежные поручения на основании одной таблицы платежей. Обработка клиент банк есть практически в любой типовой конфигурации.
5. ru_spaiky 08.11.20 20:14 Сейчас в теме
(4)
например, клиент банк создает платежные поручения на основании одной таблицы платежей. Обработка клиент банк есть практически в любой типовой конфигурации.

Спасибо буду смотреть клиент-банк.
6. ru_spaiky 08.11.20 20:28 Сейчас в теме
Открыл, конфигурации Бухгалтерия, и если честно потерялся.(((
в модуле обьекта платежное поручение обработка заполнения вот сюда же смотреть?

// Процедура - обработчик события "ОбработкаЗаполнения".
//
Процедура ОбработкаЗаполнения(Основание)

Если (Основание = Неопределено) ИЛИ Не ЭтотОбъект.Метаданные().Реквизиты.ДокументОснование.Тип.СодержитТип(ТипЗнч(Основание)) Тогда
Возврат;
КонецЕсли;

ВалютаДокумента = мВалютаРегламентированногоУчета;
ПараметрыДокументаОснования = ОбщегоНазначения.СформироватьСтруктуруШапкиДокумента(Основание);
ВидДокументаОснования = Основание.Метаданные().Имя;
ДокументОснование = ПараметрыДокументаОснования.Ссылка;

Если ВидДокументаОснования = "ПоступлениеТоваровУслуг"
или ВидДокументаОснования = "ПоступлениеДопРасходов"
или ВидДокументаОснования = "ПоступлениеНМА"
или ВидДокументаОснования = "ОтчетКомиссионераОПродажах"
или ВидДокументаОснования = "ОтчетКомитентуОПродажах"
или ВидДокументаОснования = "ВозвратТоваровОтПокупателя" тогда

/// Заполним реквизиты из стандартного набора по документу основанию.
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЭтотОбъект, Основание, Ложь);

Контрагент = ПараметрыДокументаОснования.Контрагент;
ИННПолучателя = Контрагент.ИНН;
ДоговорКонтрагента = ПараметрыДокументаОснования.ДоговорКонтрагента;
ВидРасчетовПоДоговору = БухгалтерскийУчетРасчетовСКонтрагентами.ОпределениеВидаРасчетовПоПараметрамДоговора(ДоговорКонтрагента,мВалютаРегламентированногоУчета);
Если ВидРасчетовПоДоговору=Перечисления.ВидыРасчетовПоДоговорам.РасчетыВИностраннойВалюте тогда
ВалютаДокумента = ПараметрыДокументаОснования.ВалютаВзаиморасчетов;
КонецЕсли;
СтруктураКурсаДокумента = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаДокумента, Дата);
КурсДокумента = СтруктураКурсаДокумента.Курс;
КратностьДокумента = СтруктураКурсаДокумента.Кратность;

СтруктураКурсаВзаиморасчетов = МодульВалютногоУчета.ПолучитьКурсВалюты(ДоговорКонтрагента.ВалютаВзаиморасчетов, Дата);

ТаблицаПлатежей = Новый ТаблицаЗначений();
ТаблицаПлатежей.Колонки.Добавить("СуммаПлатежа", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15,2));
ТаблицаПлатежей.Колонки.Добавить("СтавкаНДС", Новый ОписаниеТипов("ПеречислениеСсылка.СтавкиНДС"));
ТаблицаПлатежей.Колонки.Добавить("СуммаНДС", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15,2));

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

СтрокаТаблицыСумм.СтавкаНДС = ПараметрыДокументаОснования.СтавкаНДСВознаграждения;
СтрокаТаблицыСумм.СуммаНДС = Основание.Товары.Итог("СуммаНДСВознаграждения");
СтрокаТаблицыСумм.СуммаПлатежа = ?(ПараметрыДокументаОснования.СуммаВключаетНДС, ПараметрыДокументаОснования.СуммаВознаграждения, ПараметрыДокументаОснования.СуммаВознаграждения+СтрокаТаблицыСумм.СуммаНДС);
Иначе
СуммаДокументаОснования = УчетНДС.ПолучитьСуммуДокументаСНДСВРазрезеСтавокНДС(Основание);
СуммаДокументаОснования.Колонки.Сумма.Имя = "СуммаПлатежа";
Если ВидДокументаОснования = "ОтчетКомитентуОПродажах" Тогда
СуммаДокументаОснования.ЗаполнитьЗначения(0, "СуммаНДС");
Если ПараметрыДокументаОснования.УдержатьВознаграждение Тогда
СуммаКоррПлатежа= СуммаДокументаОснования.Итог("СуммаПлатежа") - ПараметрыДокументаОснования.СуммаВознаграждения;
НоваяКолонкаСумм = ОбщегоНазначения.РаспределитьПропорционально(СуммаКоррПлатежа,СуммаДокументаОснования.ВыгрузитьКолонку("СуммаПлатежа"));
Если не НоваяКолонкаСумм = Неопределено Тогда
СуммаДокументаОснования.ЗагрузитьКолонку(НоваяКолонкаСумм,"СуммаПлатежа");
КонецЕсли;

Если Не ПараметрыДокументаОснования.СуммаВключаетНДС Тогда
СуммаКоррНДС = СуммаДокументаОснования.Итог("СуммаПлатежа") - Основание.Товары.Итог("СуммаНДСВознаграждения");
НоваяКолонкаНДС = ОбщегоНазначения.РаспределитьПропорционально(СуммаКоррНДС,СуммаДокументаОснования.ВыгрузитьКолонку("СуммаПлатежа"));
Если не НоваяКолонкаНДС = Неопределено Тогда
СуммаДокументаОснования.ЗагрузитьКолонку(НоваяКолонкаНДС,"СуммаПлатежа");
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ПараметрыДокументаОснования.ДоговорКонтрагента.УчетАгентскогоНДС И Основание.Дата >= '20060101000000' Тогда
СуммаКоррНДС = СуммаДокументаОснования.Итог("СуммаПлатежа") - Основание.Товары.Итог("СуммаНДС");
НоваяКолонкаНДС = ОбщегоНазначения.РаспределитьПропорционально(СуммаКоррНДС,СуммаДокументаОснования.ВыгрузитьКолонку("СуммаПлатежа"));
Если не НоваяКолонкаНДС = Неопределено Тогда
СуммаДокументаОснования.ЗагрузитьКолонку(НоваяКолонкаНДС,"СуммаПлатежа");
КонецЕсли;
КонецЕсли;
ИначеЕсли ВидДокументаОснования = "ПоступлениеДопРасходов" тогда
Если Не(ПараметрыДокументаОснования.Сумма=0 и ПараметрыДокументаОснования.СуммаНДС=0) тогда
Если СуммаДокументаОснования.Количество()=0 тогда
СтрокаТаблицыСумм = СуммаДокументаОснования.Добавить();
Иначе
СтрокаТаблицыСумм = СуммаДокументаОснования[0];
КонецЕсли;
СтрокаТаблицыСумм.СуммаПлатежа = СтрокаТаблицыСумм.СуммаПлатежа + ПараметрыДокументаОснования.Сумма;
СтрокаТаблицыСумм.СуммаНДС = СтрокаТаблицыСумм.СуммаНДС + ПараметрыДокументаОснования.СуммаНДС;
Если не ПараметрыДокументаОснования.СуммаВключаетНДС Тогда
СтрокаТаблицыСумм.СуммаПлатежа = СтрокаТаблицыСумм.СуммаПлатежа+ПараметрыДокументаОснования.СуммаНДС;
КонецЕсли;
КонецЕсли;
СуммаДокументаОснования.ЗаполнитьЗначения(ПараметрыДокументаОснования.СтавкаНДС,"СтавкаНДС");
КонецЕсли;
КонецЕсли;

ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(СуммаДокументаОснования, ТаблицаПлатежей);
Если ТаблицаПлатежей.Количество() = 0 тогда
ТаблицаПлатежей.Добавить();
КонецЕсли;

Для каждого СтрокаПлатеж Из ТаблицаПлатежей Цикл
Если ДоговорКонтрагента.УчетАгентскогоНДС Тогда
СтрокаПлатеж.СуммаПлатежа = СтрокаПлатеж.СуммаПлатежа - СтрокаПлатеж.СуммаНДС;
СтрокаПлатеж.СуммаНДС = 0;
СтрокаПлатеж.СтавкаНДС = Перечисления.СтавкиНДС.ПустаяСсылка();
КонецЕсли;
КонецЦикла;

ТаблицаПлатежей.Свернуть(, "СуммаПлатежа, СтавкаНДС, СуммаНДС");

СуммаДокумента = ТаблицаПлатежей.Итог("СуммаПлатежа");
СуммаНДС = ТаблицаПлатежей.Итог("СуммаПлатежа");
СтавкаНДС = ?(ТаблицаПлатежей.Количество() = 1, ТаблицаПлатежей[0].СтавкаНДС, "");

ИначеЕсли ТипЗнч(Основание) = Тип("ДокументСсылка.ЗарплатаКВыплатеОрганизаций") Тогда

Если Основание.СпособВыплаты = Перечисления.СпособыВыплатыЗарплаты.ЧерезКассу Тогда
Сообщить("Платежная ведомость оформлена на выплату через кассу.");
Возврат;
КонецЕсли;

/// Заполним реквизиты из стандартного набора по документу основанию.
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЭтотОбъект, Основание, Ложь);

ЗаполнитьДокументПоОснованиюРегл(Основание);

КонецЕсли;

Ответственный = глЗначениеПеременной("глТекущийПользователь");

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


Показать
7. ru_spaiky 08.11.20 20:32 Сейчас в теме
прикрепил файл конфигурации для примера.
Если делать ввод на основании прихода то увы дальше у меня потеря потерь
Прикрепленные файлы:
1Cv8.cf
8. user1464234 08.11.20 20:39 Сейчас в теме
В БСП тоже есть примеры обработки, которая подключается к внешним отчетам и обработкам и содержит модуль заполнение на основании.
Принцип такой:
1 Обработка подключается как дополнительная и выглядит как кнопка в журнале или в документе основании.
2. Пользователь нажимает на эту кнопку вместо стандартного ввода на основании.
3. По вашему выбору либо открывается окно для ввода дополнительной информации либо сразу создаются программно пакет нужных вам документов.
9. ru_spaiky 09.11.20 03:17 Сейчас в теме
эхх ничего не получается(
10. oleg-x 27 09.11.20 10:12 Сейчас в теме
(9) Что не получается?
Не нужна ни какая процедура заполнения (типовая).
Просто создаешь на форме кнопку (или как команду, если хочешь в списке видеть). И пишешь код, что то вроде этого:
Для каждого стр из ТабличнойЧасти Цикл
    Об = Документы.НужныйДокумент.Создать();
    //Здесь заполняешь документ
    Об.Записать();
    ОткрытьФорму("ПутьКФормеДокумента",Новый Структура("Ключ",Об.Ссылка)); //Открываем документ
КонецЦикла;

Единственный недостаток, это все созданные документы будут записаны в базу сразу, но по другому ни как не создать не записывая множество документов в базе.
11. ru_spaiky 11.11.20 17:52 Сейчас в теме
(10) Спасибо за пример.

вот что получилось.

&НаСервере
Процедура Команда1НаСервере()

	      Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
	|	ПриходДокументов.ОбьектСтроительство КАК ОбьектСтроительство
	 |ИЗ
	 |	Документ.ПриходДокументов КАК ПриходДокументов";
              
              

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

Для Каждого ЭлементРезультата из Результат Цикл
    Попытка
		        НовыйДокумент = Документы.Входной.СоздатьДокумент(); // Создает новый ВК
						        НовыйДокумент.Обьект         = ЭлементРезультата.ОбьектСтроительство; 	//Заполняем данными
							    НовыйДокумент.Дата               = ТекущаяДата();

        НовыйДокумент.Записать();
							        Сообщить("Документ по договору "+ЭлементРезультата.ОбьектСтроительство+" успешно создан");
							    Исключение
							        Сообщить("НЕ УДАЛОСЬ создать окумент по договору "+ЭлементРезультата.ОбьектСтроительство);
							    КонецПопытки;
	
КонецЦикла;
	
	
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры
Показать


При этом ошибку не выдал а создал 1800 документов которые не нужны мне***(((
12. oleg-x 27 12.11.20 09:21 Сейчас в теме
Правильно, потому что так написали, этот код бы создал и больше документов, но у Вас там их всего 1800.
В данном случае запрос не нужен, вы уже находитесь в документе.
Можно и запросом сделать, но:
1) В запрос добавьте условие, а то выборка получилась всех документов.
2) Запрос делайте сразу к табличной части, с выборкой всех данных, иначе смысла в запросе нет.
2) Проверяйте перед заполнением, что документ записан в базу, так как документ могут поменять, но еще не записать в базу. И заполнение произойдет по старым данным.
13. oleg-x 27 12.11.20 09:24 Сейчас в теме
(11) да и заполнились документы криво
НовыйДокумент.Обьект         = ЭлементРезультата.ОбьектСтроительство;     //Заполняем данными

Это что за заполнение данных?
И вам надо заполнять построчно, а заполняете по объекту, если вообще такое работает.
Если уж хотите заполнить однотипные реквизиты, то делается это так:
ЗаполнитьЗначенияСвойств(НовыйДокумент,ЭлементРезультата.ОбьектСтроительство);
14. ru_spaiky 12.11.20 10:13 Сейчас в теме
(13) Спасибо за совет. ну что буду дальше изучать как сделать это.
согласен запросом можно и не пользоватся.
перебрать данные таблицы тупо у меня не получается.
Пишет то ошибка то нет данных переменой
я только учусь так что не нужно меня ругать.
15. oleg-x 27 12.11.20 10:25 Сейчас в теме
(14) Чтобы обойти таблицу из формы документа:
Для каждого стр из Объект.ИмяТаблицы Цикл
    //стр - конкретная строка табличной части
КонецЦикла
16. ru_spaiky 12.11.20 11:00 Сейчас в теме
Все создает столько документов сколько строк в документе.
Наверное это уже будет наглость. но не могли бы подсказать с заполнением еще
		
Для каждого стр из Объект.Таблица Цикл
     				Попытка
	НовыйДокумент						= Документы.Входной.СоздатьДокумент(); // Создает новый ВК
	НовыйДокумент.Дата		         	= Элементы.Дата();	
	//НовыйДокумент.Составил				= Элементы.Ответственный;
	НовыйДокумент.Записать();
	
	Сообщить("Документ по входному контролю "+Объект.ВходящийДокумент+" успешно создан");
					Исключение
					Сообщить("НЕ УДАЛОСЬ создать документ по Входному "+Объект.ВходящийДокумент);
					КонецПопытки;

КонецЦикла
Показать
17. oleg-x 27 12.11.20 11:13 Сейчас в теме
(16) ЗаполнитьЗначенияСвойств(Приемник,Источник) вам в помощь, если имена реквизитов одинаковые. Остальные реквизиты заполняются непосредственным указанием значений или реквизита.
НовыйДокумент.Договор = Объект.ДоговорКонтрагента;
НовыйДокумент.Сумма = стр.Сумма;;
18. ru_spaiky 12.11.20 11:16 Сейчас в теме
Спасибо большое очень помогли решить задачу))
(17)
19. ru_spaiky 12.11.20 13:29 Сейчас в теме
Вот конечный результат
Вдруг кому пригодится

&НаСервере
Процедура Команда1НаСервере()

		
Для каждого стр из Объект.Таблица Цикл
     				Попытка
	НовыйДокумент = Документы.Входной.СоздатьДокумент(); // Создает новый ВК
	НовыйДокумент.Дата = Объект.Дата;
	НовыйДокумент.Номенклатура = стр.Номенклатура;
	НовыйДокумент.Количество = стр.Количество;
	НовыйДокумент.Обьект = Объект.ОбьектСтроительство;
	НовыйДокумент.Составил = Объект.Ответственный;
	НовыйДокумент.СостояниеАкта = Перечисления.Состояние.Новый;
	НовыйДокумент.Записать();
	
					Сообщить("Документ по Входному контролю "+Объект.ВходящийДокумент+" успешно создан");
					Исключение
					Сообщить("Не удалось создать документ по Входному контролю"+Объект.ВходящийДокумент);
					КонецПопытки;

КонецЦикла

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

&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры
Показать
Оставьте свое сообщение

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