Конфигурации 1cv8
Платформа 1С v8.3
Внешний отчет (ert,erf)
Внешняя обработка (ert,epf)
Расширение (cfe)
Для каждого СтрокаТЗ Из ДанныеТФ Цикл
Если не СтрокаТЗ.Пометка Тогда
Продолжить;
КонецЕсли;
Попытка
Если Не ЗначениеЗаполнено(СтрокаТЗ.ДокументСчета) Тогда
ДокументСчетНаОплату = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
ДокументСчетНаОплату.Организация = Справочники.Организации.НайтиПоКоду("000000001");
ДокументСчетНаОплату.Контрагент = СтрокаТЗ.Контрагент;
ДокументСчетНаОплату.Услуги = ?
ДокументСчетНаОплату.Дата = ТекущаяДата();
ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Запись);
СтрокаТЗ.ДокументСчета = ДокументСчетНаОплату.Ссылка;
КонецЕсли;
Исключение
ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Проведение);
Сообщить(ОписаниеОшибки());
Продолжить;
КонецПопытки;
ПоказатьДелаю обработку в расширении. Как можно обратиться к табличной части справочника и заполнить на основании нее табличную часть документа? Обязательно ли делать запрос и проводить через цикл или можно это сделать в этом кусочке кода?
По теме из базы знаний
- Заполнение табличной части документа "Установка цен номенклатуры контрагентов" на основании документа "Установка цен номенклатуры"
- Заполнение табличной части документов из файла Excel (для 1С 7.7 бухгалтерский учет, ред. 4.5)
- Заполнение табличной части документа данными из внешнего файла. УТ 11
- Заполнение табличных частей документов одного вида из табличных частей списка документов другого вида (альтернатива ввода на основании)
- Заполнение табличной части документа "Реализация товаров и услуг" по документу "Приобретение товаров и услуг" для ERP 2.4, ERP 2.5, КА 2.4, КА 2.5, УТ 11.4, УТ 11.5
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Табличная часть любого объекта подразумевает несколько строк(Отсутствие строк в расчет не берем). Как вы хотите обойтись без циклов?
Документ СчетНаОплатуПокупателю содержи табличную часть Услуги?
К какому справочнику Вы хотите обратиться для заполнения чего?
Какая конфигурация?
Документ СчетНаОплатуПокупателю содержи табличную часть Услуги?
К какому справочнику Вы хотите обратиться для заполнения чего?
Какая конфигурация?
В любом случае циклы.
Первый запрос
затем в Вашем коде
Можно вот так.
Первый запрос
Выбрать
СправочникДоговорыКонтрагентов.Ссылка.Контрагент КАК Контрагент,
СправочникДоговорыКонтрагентов.Ссылка.Договор КАК Договор,
СправочникДоговорыКонтрагентов.Услуга КАК Услуга,
...
из Справочники.ДоговорыКонтрагентов.ТабличнаяЧасть КАК СправочникДоговорыКонтрагентов
ГДЕ СправочникДоговорыКонтрагентов.Ссылка.Контрагент В(&МассивКонтрагентов)
И Срок действия договора >= &какаятоДата
Запрос.УстановитьПараметр("МассивКонтрагентов", ДанныеТФ.ВыгрузитьКолонку("Контрагент"));
ТаблицаДоговоров = Запрос.Выполнить().Выгрузить();
Показатьзатем в Вашем коде
Если Не ЗначениеЗаполнено(СтрокаТЗ.ДокументСчета) Тогда
ДокументСчетНаОплату = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
ДокументСчетНаОплату.Организация = Справочники.Организации.НайтиПоКоду("000000001");
ДокументСчетНаОплату.Контрагент = СтрокаТЗ.Контрагент;
отбор = Новый Структура;
Отбор.Добавить("Контрагент", СтрокаТЗ.Контрагент);
{Если в ДанныеТФ есть договор, то Отбор.Добавить("Договор", СтрокаТЗ.Договор);}
НайденыеСтроки = ТаблицаДоговоров.НайтиСтроки(отбор);
Если НайденыеСтроки.Количество() <> 0 тогда
Для Каждого ЭлементМассива Из НайденыеСтроки Цикл
НоваяСтрока = ДокументСчетНаОплату.Услуги.Добавить();
ЗаполнитьЗначениеСвойств(НоваяСтрока, ЭлементМассива);
// ДокументСчетНаОплату.Услуги = ?
КонецЕсли;
ДокументСчетНаОплату.Дата = ТекущаяДата();
ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Запись);
СтрокаТЗ.ДокументСчета = ДокументСчетНаОплату.Ссылка;
КонецЕсли;
ПоказатьМожно вот так.
(10)
Для каждого СтрокаТЗ Из ДанныеТФ Цикл
Если не СтрокаТЗ.Пометка Тогда
Продолжить;
КонецЕсли;
Попытка
Если Не ЗначениеЗаполнено(СтрокаТЗ.ДокументСчета) Тогда
ДокументСчетНаОплату = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
ДокументСчетНаОплату.Организация = Справочники.Организации.НайтиПоКоду("000000001");
ДокументСчетНаОплату.Контрагент = СтрокаТЗ.Контрагент;
ДокументСчетНаОплату.Договор = СтрокаТЗ.Договор;
Для каждого СтрокаТЗ1 Из ДанныеУслуги Цикл
ЗаполнитьЗначенияСвойств(ДокументСчетНаОплату.Услуги.Добавить(), СтрокаТЗ1)
КонецЦикла;
ДокументСчетНаОплату.Дата = ТекущаяДата();
ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Запись);
СтрокаТЗ.ДокументСчета = ДокументСчетНаОплату.Ссылка;
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
Продолжить;
КонецПопытки;
Я сделала сейчас вот так
ОбъектФормы = РеквизитФормыВЗначение("Объект");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентовУслуги.Номенклатура КАК Номенклатура,
| ДоговорыКонтрагентовУслуги.Цена КАК Цена,
| ДоговорыКонтрагентовУслуги.Сумма КАК Сумма,
| ДоговорыКонтрагентовУслуги.Количество КАК Количество,
| ДоговорыКонтрагентовУслуги.Ссылка.Владелец КАК Контрагент,
| ДоговорыКонтрагентовУслуги.Ссылка.Ссылка КАК Договор
|ИЗ
| Справочник.ДоговорыКонтрагентов.Услуги КАК ДоговорыКонтрагентовУслуги
|ГДЕ
| ДоговорыКонтрагентовУслуги.Ссылка.Владелец В (&МассивКонтрагентов)";
Запрос.УстановитьПараметр("МассивКонтрагентов", МассивКонтрагентов);
Результат=Запрос.Выполнить();
ДанныеУслуги = Результат.Выгрузить();
Но у меня проблема что будто в процессе когда передавать значения должны в таблицу значений не падает ничего, в обработчике только наименование колонок показывает
Для каждого СтрокаТЗ Из ДанныеТФ Цикл
Если не СтрокаТЗ.Пометка Тогда
Продолжить;
КонецЕсли;
Попытка
Если Не ЗначениеЗаполнено(СтрокаТЗ.ДокументСчета) Тогда
ДокументСчетНаОплату = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
ДокументСчетНаОплату.Организация = Справочники.Организации.НайтиПоКоду("000000001");
ДокументСчетНаОплату.Контрагент = СтрокаТЗ.Контрагент;
ДокументСчетНаОплату.Договор = СтрокаТЗ.Договор;
Для каждого СтрокаТЗ1 Из ДанныеУслуги Цикл
ЗаполнитьЗначенияСвойств(ДокументСчетНаОплату.Услуги.Добавить(), СтрокаТЗ1)
КонецЦикла;
ДокументСчетНаОплату.Дата = ТекущаяДата();
ДокументСчетНаОплату.Записать(РежимЗаписиДокумента.Запись);
СтрокаТЗ.ДокументСчета = ДокументСчетНаОплату.Ссылка;
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
Продолжить;
КонецПопытки;
Я сделала сейчас вот так
ОбъектФормы = РеквизитФормыВЗначение("Объект");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентовУслуги.Номенклатура КАК Номенклатура,
| ДоговорыКонтрагентовУслуги.Цена КАК Цена,
| ДоговорыКонтрагентовУслуги.Сумма КАК Сумма,
| ДоговорыКонтрагентовУслуги.Количество КАК Количество,
| ДоговорыКонтрагентовУслуги.Ссылка.Владелец КАК Контрагент,
| ДоговорыКонтрагентовУслуги.Ссылка.Ссылка КАК Договор
|ИЗ
| Справочник.ДоговорыКонтрагентов.Услуги КАК ДоговорыКонтрагентовУслуги
|ГДЕ
| ДоговорыКонтрагентовУслуги.Ссылка.Владелец В (&МассивКонтрагентов)";
Запрос.УстановитьПараметр("МассивКонтрагентов", МассивКонтрагентов);
Результат=Запрос.Выполнить();
ДанныеУслуги = Результат.Выгрузить();
Но у меня проблема что будто в процессе когда передавать значения должны в таблицу значений не падает ничего, в обработчике только наименование колонок показывает
(11) Давайте еще раз. :). Если я Вас правильно понимаю.
п.1 Чтобы не выбирать все договоры контрагентов, а только те, которые есть в ДанныеТФ мы собираем массив из контрагентов
п.2 Полученный массив устанавливаем параметром в запрос. Это у Вас сделано.
п.3. В результате работы запроса получаем ТаблицуЗначений ДанныеУслуги, в которой содержаться данные справочника ДоговоровКонтрагента.
п.4 Во время проходом в цикле по строкам таблицы ДанныеТФ пользуемся Методом НйтиСтроки(Отбор); Для этого устанавливаем Отбор.
Если у нас в таблице ДанныеУслуги будет хотя бы одна строка, удовлетворяющая условию, установленному в Отборе(Контрагент + Договор) НайденыеСтроки будет Массивом с количеством элементов, равным количеству таких совпадений. В противном случае нам метод вернет пустой массив. поэтому
п.5 Проверяем полученный массив на количество
Как то так.
ЗЫЖ
Т.к. в таблице ДанныеТФ содержится Ссылка на договор, то можно еще сократить Выборку из справочников договоров усьановив параматр "МассивДоговоров", предварительно выгрузив в массив договоры, аналогично контрагентам.
п.1 Чтобы не выбирать все договоры контрагентов, а только те, которые есть в ДанныеТФ мы собираем массив из контрагентов
МассивКонтрагентов = ДанныеТФ.ВыгрузитьКолонку("Контрагент");
п.2 Полученный массив устанавливаем параметром в запрос. Это у Вас сделано.
п.3. В результате работы запроса получаем ТаблицуЗначений ДанныеУслуги, в которой содержаться данные справочника ДоговоровКонтрагента.
п.4 Во время проходом в цикле по строкам таблицы ДанныеТФ пользуемся Методом НйтиСтроки(Отбор); Для этого устанавливаем Отбор.
Отбор = Новый Структура;
Отбор.Вставить("Контрагент", СтрокаТЗ.Контрагент);
Отбор.Вставить("Договор", СтрокаТЗ.Договор;
НайденыеСтроки = ДанныеУслуги.НайтиСтроки(Отбор);
Если у нас в таблице ДанныеУслуги будет хотя бы одна строка, удовлетворяющая условию, установленному в Отборе(Контрагент + Договор) НайденыеСтроки будет Массивом с количеством элементов, равным количеству таких совпадений. В противном случае нам метод вернет пустой массив. поэтому
п.5 Проверяем полученный массив на количество
Если НайденыеСтроки.Количество() <> 0 тогда
Для Каждого Элемент из НайденыеСтроки Цикл
ЗаполнитьЗначенияСвойств(ДокументСчетНаОплату.Услуги.Добавить(), Элемент);
КонецЦикла;
КонецЕсли;
Как то так.
ЗЫЖ
Т.к. в таблице ДанныеТФ содержится Ссылка на договор, то можно еще сократить Выборку из справочников договоров усьановив параматр "МассивДоговоров", предварительно выгрузив в массив договоры, аналогично контрагентам.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот