Очень часто бывают ситуации, когда необходимо сделать отчет СКД на сложном запросе, который используюет в себе вложенные запросы и объединения внутренние и полные и т.д. – в результате в консоли этот запрос формируется верно, а в скд половина полей пустые! Связано это с особенностью СКД в объединении внутренних данных, а так же не стоит забывать что в СКД наборы данных связываются как левое соединение…

Решения возможны следующие:

  • Изменить запрос в СКД
  • Сформировать запрос обычным способом и подставить эти данные в СКД как внешние

Рассмотрим последний вариант:

Внешний источник данных, грузим из ТЗ

Для вывода отчета я использую шаблон в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах.

В модуле объекта уже есть функция

Код 1C v 8.2 УП
 Функция ПолучитьТаблицуВнешнегоНабораДанных()
	Возврат Новый ТаблицаЗначений;
КонецФункции // ПолучитьТаблицуВнешнегоНабораДанных()   

установим в ней наш запрос, получается примерно так:

Код 1C v 8.2 УП
 // В данной функции можно сформировать таблицу внешнего набора данных для СКД
//
// Функция должна возвращать таблицу данных (например таблицу значений)
//
Функция ПолучитьТаблицуВнешнегоНабораДанных()
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ВложенныйЗапрос.Регистратор КАК ДокРеал,
	|	ВложенныйЗапрос.Регистратор.Доставка КАК ДокДоставка
	|ПОМЕСТИТЬ ОплаченнаяРеализация
	|ИЗ
	|	(ВЫБРАТЬ
	|		ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОбороты.Регистратор КАК Регистратор
	/////// Огромный запрос .......
	|		СГРУППИРОВАТЬ ПО
	|			ДоставкаПромежуточнаяНакладная.Ссылка,
	|			ДоставкаПромежуточнаяНакладная.Ссылка.Счет,
	|			ДоставкаПромежуточнаяНакладная.Ссылка.ВыставленоКлиенту,
	|			ИздержкиРаспределенныеНеНаОП.РаспределеннаяИздержка,
	|			ДоставкаПромежуточнаяНакладная.Ссылка.СтоимостьПрайс + ДоставкаПромежуточнаяНакладная.Ссылка.ЗатратыПриДоставке) КАК ДанныеПоДоставкам
	|		ПО ДанныеПоРеализации.ДокументПродажи.Доставка = ДанныеПоДоставкам.ДокДоставка";
	Запрос.УстановитьПараметр("КонецПериода", НастройкаПериода.ДатаОкончания);
	Запрос.УстановитьПараметр("НачалоПериода", НастройкаПериода.ДатаНачала);
	Запрос.УстановитьПараметр("НачалоПериодаМинусГод", НастройкаПериода.ДатаНачала-(86400*365)); 	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выгрузить();
	Возврат Выборка;	
КонецФункции // ПолучитьТаблицуВнешнегоНабораДанных()   

Ниже в коде происходит установка внешних данных из нашей ТЗ с именем ТаблицаВнешнегоНабораДанных

Код 1C v 8.2 УП
 // при необходимости вставим внешние наборы данных в СКД
	ВнешниеНаборыДанных = Новый Структура;
	
	ТаблицаВнешнегоНабораДанных = ПолучитьТаблицуВнешнегоНабораДанных();
	ВнешниеНаборыДанных.Вставить("ТаблицаВнешнегоНабораДанных",ТаблицаВнешнегоНабораДанных);
	
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборыДанных,ДанныеРасшифровки);
	
	ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(ТабличныйДокумент, ПроцессорКомпоновкиДанных, ДанныеРасшифровки.Элементы,,,КоличествоФиксируемыхСтолбцов);   

В самой компоновке добавляем набор Объект с именем ТаблицаВнешнегоНабораДанных и перечисляем поля, которые будут использоваться в отчете:

Как я уже говорил выше, далее нам необходимо получить остатки взаиморасчетов на дату документа:

Получение остатков на документ в СКД

Набор данных Запрос – назвали его Остатки:

Теперь установим связи Запроса и Объекта

Остатки нужно получать на дату документа и по контрагенту

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru