Заполнение табличной части документа

1. user1809279 16.10.24 13:55 Сейчас в теме
Для каждого СтрокаТЗ Из ДанныеТФ Цикл
		
		Если не СтрокаТЗ.Пометка Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		Попытка
			
			Если Не ЗначениеЗаполнено(СтрокаТЗ.ДокументСчета) Тогда
				
				
				ДокументСчетНаОплату = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
				
				ДокументСчетНаОплату.Организация = Справочники.Организации.НайтиПоКоду("000000001");
				
				ДокументСчетНаОплату.Контрагент = СтрокаТЗ.Контрагент;
				
				ДокументСчетНаОплату.Услуги = ?
				
				ДокументСчетНаОплату.Дата = ТекущаяДата();     
				 
				
				ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Запись);
				
												
				СтрокаТЗ.ДокументСчета = ДокументСчетНаОплату.Ссылка;
				
			КонецЕсли;
			
		Исключение
			
		    ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Проведение);
			
			Сообщить(ОписаниеОшибки());
			
			Продолжить;
			
		КонецПопытки;
Показать


Делаю обработку в расширении. Как можно обратиться к табличной части справочника и заполнить на основании нее табличную часть документа? Обязательно ли делать запрос и проводить через цикл или можно это сделать в этом кусочке кода?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. LeeAreHim 16.10.24 14:34 Сейчас в теме
Табличная часть любого объекта подразумевает несколько строк(Отсутствие строк в расчет не берем). Как вы хотите обойтись без циклов?
Документ СчетНаОплатуПокупателю содержи табличную часть Услуги?
К какому справочнику Вы хотите обратиться для заполнения чего?
Какая конфигурация?
3. user1809279 16.10.24 14:46 Сейчас в теме
(2) Вот у меня есть справочник Договора контрагентов доработала в форму элемента табличную часть, хочу вот с нее заполнять в документ счет на оплату и в ней есть табличная часть услуги
Прикрепленные файлы:
4. LeeAreHim 16.10.24 15:29 Сейчас в теме
В любом случае циклы.
Первый запрос
Выбрать
СправочникДоговорыКонтрагентов.Ссылка.Контрагент КАК Контрагент,
СправочникДоговорыКонтрагентов.Ссылка.Договор КАК Договор,
СправочникДоговорыКонтрагентов.Услуга КАК Услуга,
...
из Справочники.ДоговорыКонтрагентов.ТабличнаяЧасть КАК СправочникДоговорыКонтрагентов
ГДЕ СправочникДоговорыКонтрагентов.Ссылка.Контрагент В(&МассивКонтрагентов)
И Срок действия договора >= &какаятоДата

Запрос.УстановитьПараметр("МассивКонтрагентов", ДанныеТФ.ВыгрузитьКолонку("Контрагент"));

ТаблицаДоговоров = Запрос.Выполнить().Выгрузить();
Показать

затем в Вашем коде
Если Не ЗначениеЗаполнено(СтрокаТЗ.ДокументСчета) Тогда
                ДокументСчетНаОплату = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
                 ДокументСчетНаОплату.Организация = Справочники.Организации.НайтиПоКоду("000000001");
               ДокументСчетНаОплату.Контрагент = СтрокаТЗ.Контрагент;
отбор = Новый Структура;
Отбор.Добавить("Контрагент", СтрокаТЗ.Контрагент);
{Если в ДанныеТФ есть договор, то Отбор.Добавить("Договор", СтрокаТЗ.Договор);}
НайденыеСтроки = ТаблицаДоговоров.НайтиСтроки(отбор);
Если НайденыеСтроки.Количество() <> 0 тогда
Для Каждого ЭлементМассива Из НайденыеСтроки Цикл
НоваяСтрока = ДокументСчетНаОплату.Услуги.Добавить();
ЗаполнитьЗначениеСвойств(НоваяСтрока, ЭлементМассива);
               // ДокументСчетНаОплату.Услуги = ?
КонецЕсли;
               ДокументСчетНаОплату.Дата = ТекущаяДата();     
                ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Запись);
               СтрокаТЗ.ДокументСчета = ДокументСчетНаОплату.Ссылка;
            КонецЕсли;
Показать


Можно вот так.
5. user1809279 17.10.24 10:24 Сейчас в теме
(4) Спасибо посмотрела, только вот проблема с установкой параметра контрагента, не выгружает колонку, т.к пишет что не метода ВыгрузитьКолонку
6. LeeAreHim 17.10.24 10:47 Сейчас в теме
Это алгоритм, а не рабочий код :)
Я же не знаю Что там за ДанныеТФ. Я только предположил, что это таблица значений.
Да и писал "на коленке"
7. user2033930 17.10.24 10:49 Сейчас в теме
(6) Преступная безответственность и проявление циничного неуважения к авторке!!!
8. LeeAreHim 17.10.24 10:58 Сейчас в теме
(7) Посыпаю голову пеплом. Обещаю разрабатывать и /или активировать телепатический модуль. Как будет готово - обращайтесь.
9. user1809279 17.10.24 11:28 Сейчас в теме
(6) Нет все правильно, это и есть таблица значений, она просто еще на форму выведена
10. LeeAreHim 17.10.24 11:40 Сейчас в теме
Странно. А Синтакс-помощник пишет, что у Таблицы значений есть метод ВыгрузитьКолонку начиная с версии 8.0 и метод доступен на сервере.
11. user1809279 17.10.24 13:51 Сейчас в теме
(10)

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

Если не СтрокаТЗ.Пометка Тогда

Продолжить;

КонецЕсли;

Попытка

Если Не ЗначениеЗаполнено(СтрокаТЗ.ДокументСчета) Тогда


ДокументСчетНаОплату = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();

ДокументСчетНаОплату.Организация = Справочники.Организации.НайтиПоКоду("000000001");

ДокументСчетНаОплату.Контрагент = СтрокаТЗ.Контрагент;

ДокументСчетНаОплату.Договор = СтрокаТЗ.Договор;

Для каждого СтрокаТЗ1 Из ДанныеУслуги Цикл
ЗаполнитьЗначенияСвойств(ДокументСчетНаОплату.Услуги.Добавить(), СтрокаТЗ1)
КонецЦикла;

ДокументСчетНаОплату.Дата = ТекущаяДата();
ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Запись);
СтрокаТЗ.ДокументСчета = ДокументСчетНаОплату.Ссылка;

КонецЕсли;


Исключение


Сообщить(ОписаниеОшибки());

Продолжить;

КонецПопытки;

Я сделала сейчас вот так


ОбъектФормы = РеквизитФормыВЗначение("Объект");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентовУслуги.Номенклатура КАК Номенклатура,
| ДоговорыКонтрагентовУслуги.Цена КАК Цена,
| ДоговорыКонтрагентовУслуги.Сумма КАК Сумма,
| ДоговорыКонтрагентовУслуги.Количество КАК Количество,
| ДоговорыКонтрагентовУслуги.Ссылка.Владелец КАК Контрагент,
| ДоговорыКонтрагентовУслуги.Ссылка.Ссылка КАК Договор
|ИЗ
| Справочник.ДоговорыКонтрагентов.Услуги КАК ДоговорыКонтрагентовУслуги
|ГДЕ
| ДоговорыКонтрагентовУслуги.Ссылка.Владелец В (&МассивКонтрагентов)";


Запрос.УстановитьПараметр("МассивКонтрагентов", МассивКонтрагентов);

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


Но у меня проблема что будто в процессе когда передавать значения должны в таблицу значений не падает ничего, в обработчике только наименование колонок показывает
12. LeeAreHim 21.10.24 08:38 Сейчас в теме
(11) Давайте еще раз. :). Если я Вас правильно понимаю.
п.1 Чтобы не выбирать все договоры контрагентов, а только те, которые есть в ДанныеТФ мы собираем массив из контрагентов
МассивКонтрагентов = ДанныеТФ.ВыгрузитьКолонку("Контрагент");

п.2 Полученный массив устанавливаем параметром в запрос. Это у Вас сделано.
п.3. В результате работы запроса получаем ТаблицуЗначений ДанныеУслуги, в которой содержаться данные справочника ДоговоровКонтрагента.
п.4 Во время проходом в цикле по строкам таблицы ДанныеТФ пользуемся Методом НйтиСтроки(Отбор); Для этого устанавливаем Отбор.
Отбор = Новый Структура;
Отбор.Вставить("Контрагент", СтрокаТЗ.Контрагент);
Отбор.Вставить("Договор", СтрокаТЗ.Договор;
НайденыеСтроки = ДанныеУслуги.НайтиСтроки(Отбор);

Если у нас в таблице ДанныеУслуги будет хотя бы одна строка, удовлетворяющая условию, установленному в Отборе(Контрагент + Договор) НайденыеСтроки будет Массивом с количеством элементов, равным количеству таких совпадений. В противном случае нам метод вернет пустой массив. поэтому
п.5 Проверяем полученный массив на количество
Если НайденыеСтроки.Количество() <> 0 тогда
Для Каждого Элемент из НайденыеСтроки Цикл
ЗаполнитьЗначенияСвойств(ДокументСчетНаОплату.Услуги.Добавить(), Элемент);
КонецЦикла;
КонецЕсли;


Как то так.
ЗЫЖ
Т.к. в таблице ДанныеТФ содержится Ссылка на договор, то можно еще сократить Выборку из справочников договоров усьановив параматр "МассивДоговоров", предварительно выгрузив в массив договоры, аналогично контрагентам.
13. LeeAreHim 21.10.24 08:50 Сейчас в теме
(12) И еще: посмотрите в отладчике какие данные попадают в МассивКотнрагентов/Договоров до установки их в параметры.
И еще одно: у Вас все эти цена, сумма, и пр. Реквизиты чего? Объекта или формы?
14. user1809279 21.10.24 14:00 Сейчас в теме
(13) Реквизиты объекта таблицы Услуги
Оставьте свое сообщение

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