Очень часто бывают ситуации, когда необходимо сделать отчет СКД на сложном запросе, который используюет в себе вложенные запросы и объединения внутренние и полные и т.д. - в результате в консоли этот запрос формируется верно, а в скд половина полей пустые! Связано это с особенностью СКД в объединении внутренних данных, а так же не стоит забывать что в СКД наборы данных связываются как левое соединение...
Решения возможны следующие:
Изменить запрос в СКД Сформировать запрос обычным способом и подставить эти данные в СКД как внешние Рассмотрим последний вариант:
Внешний источник данных, грузим из ТЗ Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1 в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах.
В модуле объекта уже есть функция
Код 1C v 8.2 УП Функция ПолучитьТаблицуВнешнегоНабораДанных()
Возврат Новый ТаблицаЗначений;
КонецФункции // ПолучитьТаблицуВнешнегоНабораДанных()
установим в ней наш запрос, получается примерно так:
Код 1C v 8.2 УП // В данной функции можно сформировать таблицу внешнего набора данных для СКД
//
// Функция должна возвращать таблицу данных (например таблицу значений)
//
Функция ПолучитьТаблицуВнешнегоНабораДанных()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| ВложенныйЗапрос.Регистратор КАК ДокРеал,
| ВложенныйЗапрос.Регистратор.Доставка КАК ДокДоставка
|ПОМЕСТИТЬ ОплаченнаяРеализация
|ИЗ
| (ВЫБРАТЬ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОбороты.Регистратор КАК Регистратор
/////// Огромный запрос .......
| СГРУППИРОВАТЬ ПО
| ДоставкаПромежуточнаяНакладная.Ссылка,
| ДоставкаПромежуточнаяНакладная.Ссылка.Счет,
| ДоставкаПромежуточнаяНакладная.Ссылка.ВыставленоКлиенту,
| ИздержкиРаспределенныеНеНаОП.РаспределеннаяИздержка,
| ДоставкаПромежуточнаяНакладная.Ссылка.СтоимостьПрайс + ДоставкаПромежуточнаяНакладная.Ссылка.ЗатратыПриДоставке) КАК ДанныеПоДоставкам
| ПО ДанныеПоРеализации.ДокументПродажи.Доставка = ДанныеПоДоставкам.ДокДоставка";
Запрос.УстановитьПараметр("КонецПериода", НастройкаПериода.ДатаОкончания);
Запрос.УстановитьПараметр("НачалоПериода", НастройкаПериода.ДатаНачала);
Запрос.УстановитьПараметр("НачалоПериодаМинусГод", НастройкаПериода.ДатаНачала-(86400*365));
Результат = Запрос.Выполнить();
Выборка = Результат.Выгрузить();
Возврат Выборка;
КонецФункции // ПолучитьТаблицуВнешнегоНабораДанных()
Ниже в коде происходит установка внешних данных из нашей ТЗ с именем ТаблицаВнешнегоНабораДанных
Код 1C v 8.2 УП // при необходимости вставим внешние наборы данных в СКД
ВнешниеНаборыДанных = Новый Структура;
ТаблицаВнешнегоНабораДанных = ПолучитьТаблицуВнешнегоНабораДанных();
ВнешниеНаборыДанных.Вставить("ТаблицаВнешнегоНабораДанных",ТаблицаВнешнегоНабораДанных);
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборыДанных,ДанныеРасшифровки);
ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(ТабличныйДокумент, ПроцессорКомпоновкиДанных, ДанныеРасшифровки.Элементы,,,КоличествоФиксируемыхСтолбцов);
В самой компоновке добавляем набор Объект с именем ТаблицаВнешнегоНабораДанных и перечисляем поля, которые будут использоваться в отчете:
Как я уже говорил выше, далее нам необходимо получить остатки взаиморасчетов на дату документа:
Получение остатков на документ в СКД Набор данных Запрос - назвали его Остатки:
Теперь установим связи Запроса и Объекта
Остатки нужно получать на дату документа и по контрагенту
Далее, если нужно, задайте вычисляемые поля, ресурсы, параметры и Настройте Список вывода...
Пример результата отчета:
Для УП:
Код 1C v 8.3
// Отбор на форме
&НаКлиенте
....
ФМ=Новый ФиксированнаяСтруктура("КлючСвязи",Элементы.ДанныеБезКоррекции.ТекущиеДанные.КлючСвязи);
Элементы.СписокПодразделений.ОтборСтрок=ФМ;
Код 1C v 8.3 //Функция получает записи табличной части согласно установленному отбору
Функция ПолучитьЗаписиСогласноОтбору(ТабличноеПолеИсточник)
ОтборСтрок = ТабличноеПолеИсточник.ОтборСтрок;
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличноеПолеИсточник.Значение);
Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
Если ЭлементОтбора.Использование Тогда
НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(ЭлементОтбора.Имя);
НовыйОтбор.Использование = Истина;
НовыйОтбор.ВидСравнения = ЭлементОтбора.ВидСравнения;
НовыйОтбор.ЗначениеС = ЭлементОтбора.ЗначениеС;
НовыйОтбор.ЗначениеПо = ЭлементОтбора.ЗначениеПо;
НовыйОтбор.Значение = ЭлементОтбора.Значение;
КонецЕсли;
КонецЦикла;
Таблица = ПостроительЗапроса.Результат.Выгрузить();
МассивСтрок = Новый Массив;
Для Каждого Стр ИЗ Таблица Цикл
СтруктураПоиска = Новый Структура;
Для Каждого Колонка Из Таблица.Колонки Цикл
СтруктураПоиска.Вставить(Колонка.Имя, Стр[Колонка.Имя]);
КонецЦикла;
НайденыеСтроки = ТабличноеПолеИсточник.Значение.НайтиСтроки(СтруктураПоиска);
Если НайденыеСтроки.Количество() > 0 Тогда
МассивСтрок.Добавить(НайденыеСтроки[0]);
КонецЕсли;
КонецЦикла;
Возврат МассивСтрок;
КонецФункции
Для Обычных форм:
Код 1C v 8.х ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ДокСсылка", ДанныеПоШК.Объект);
НайденныеСтроки = ПакетДокументов.НайтиСтроки(ПараметрыОтбора);
// Подробнее
СтруктураОтбора = Новый Структура("ВидДокумента, Контрагент", ПФ, ?(Контр = Неопределено, Справочники.Контрагенты.ПустаяСсылка(), Контр));
ПакетДокументов = ЗадачаОбъект.ПакетДокументов;
МассивСтрок = ПакетДокументов.НайтиСтроки(СтруктураОтбора);
Если МассивСтрок.Количество() Тогда
Для Каждого СтрокаМассива Из МассивСтрок Цикл
СтрокаМассива.ДобавленоПользователем = Истина;
СтрокаМассива.Пользователь = ПараметрыСеанса.ТекущийПользователь;
СтрокаМассива.ДатаВремя = ТекущаяДата();
КонецЦикла;
КонецЕсли;
//или
ТЧ = ПромежуточнаяНакладная.Выгрузить();
ТЧ.Свернуть("СхемаПродажи");
СтрокаСПустойСП = ТЧ.НайтиСтроки(Новый Структура("СхемаПродажи", Справочники.СхемыПродаж.ПустаяСсылка()));
Если ТЧ.Количество() - СтрокаСПустойСП.Количество() > 1 Тогда
Если Вопрос("Сбросить все схемы в строках?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
НесколькоСхем = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Для каждого СтрокаПН из ПромежуточнаяНакладная Цикл
Если СтрокаПН.Номенклатура.ВидНоменклатуры.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга Тогда
СтрокаПН.СхемаПродажи = СхемаПродажи;
КонецЕсли;
КонецЦикла;