Зачем в запросах 1С перечислять поля, если есть * для получения всех полей из таблицы-параметра?

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

Поэтому требуется явное перечисление всех полей. Видимо по этому же конструктор запросов 1С разворачивает все получаемые через * поля если понимает что это источник из состава конфигурации (например, РН или РС или справочник и т.п.)

Есть несколько способов добавить параметр-таблицу значений в схему компоновки данных:

  1. добавить через параметры компоновщика КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы
Процедура УстановитьПараметрСКД(НастройкиСКД,Имя,Значение)
    
    Параметры = НастройкиСКД.ПараметрыДанных;
    Если Параметры.Элементы.Найти(Имя) <> Неопределено Тогда
		Параметры.УстановитьЗначениеПараметра(Имя,Значение);
    КонецЕсли; 
    
КонецПроцедуры

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

2. Добавить в менеджер временных таблиц, а затем вызвать компоновку СКД в режиме работы с менеджером временных таблиц.

Запрос = Новый Запрос("ВЫБРАТЬ т.* ПОМЕСТИТЬ " + ИмяВТ + " ИЗ &" + ИмяВТ + "КАК т);
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр(ИмяВТ,ТЗ);
Запрос.Выполнить();

//затем присвоить через процессор выполняемому отчету СКД этот менеджер временных таблиц
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,ДанныеРасшифровки,Истина,, Запрос.МенеджерВременныхТаблиц);

+ There are no comments

Add yours