Имя: Пароль:
1C
1С v8
Две СКД схемы в одном отчете. Просьба помочь с исправлением кода
0 batman1978
 
26.01.15
18:01
На форме 2 переключателя - первый вариант и второй вариант, Суть проблемы - при формировании по первому варианту - все хорошо отчет формируеться все как надо при выборе на форме второго варианта
выдает ошибку "{Форма.ФормаОтчета(395)}: Ошибка при вызове метода контекста (Выполнить): Ошибка компоновки макета
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
по причине:
Ошибка компоновки макета
по причине:
Не установлено значение параметра "КонПериода""
если установить снова на первый пункт флаг то снова формирует все красиво
привожу код:

Перем предупр;

Процедура ВыбПериодНажатие(Элемент)
НастройкаПериода = Новый НастройкаПериода;
НастройкаПериода.УстановитьПериод(НачПер, ?(КонПер='0001-01-01', КонПер, КонецДня(КонПер)));
НастройкаПериода.РедактироватьКакИнтервал = Истина;
НастройкаПериода.РедактироватьКакПериод = Истина;
НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
Если НастройкаПериода.Редактировать() Тогда
НачПер = НастройкаПериода.ПолучитьДатуНачала();
КонПер = НастройкаПериода.ПолучитьДатуОкончания();
КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()

НачПер = НачалоДня(ТекущаяДата()-60*60*24);
КонПер = КонецДня(ТекущаяДата()-60*60*24);

КонецПроцедуры

процедура КнопкаСформироватьНажатие (Кнопка)
Если ФлагВыбораВидаОтчета = 1 Тогда
СреднееЗаПериод();
ИначеЕсли ФлагВыбораВидаОтчета = 2 Тогда
РучноеЗаПериод();
КонецЕсли;



конецпроцедуры

Процедура ВыложитьНаСайтСреднееЗаПериод(Подразд,ДокументРезультат,НачПериода,КонПериода) //Подразд,ДокументРезультат

вырезал дабы не хламить

КонецПроцедуры

Процедура ВыложитьНаСайтРучнаяЗаПериод(Подразд,ДокументРезультат,НачПериода,КонПериода)

вырезал дабы не хламить

КонецПроцедуры

Процедура СреднееЗаПериод()
НачПериода = НачалоДня(НачПер);
КонПериода = КонецДня(КонПер);

если СписокПодразделений.Количество() = 0 тогда

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФлагЗакрытия",Истина);
Запрос.Текст = "ВЫБРАТЬ
|здесь он был просто сокращаю (работает 100%)

Запрос.УстановитьПараметр("IS NULL", );
Запрос.УстановитьПараметр("истина", истина );
Результат = Запрос.Выполнить();

ТЗ = Результат.Выгрузить();

Список = Новый СписокЗначений;

Список.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Ссылка";)); // ТЗ.ВыгрузитьКолонку("Ссылка";) - это массив значений из колонки "Ссылка", а "ЗагрузитьЗначения" - загружает массив в список

СписокПодразделений = Список; // ограничим интерактивный выбор содержимым списка "Список"
конецесли;


ВхНачДатаТек = НачалоДня(НачПер);
ВхКонДатаТек = КонецДня(КонПер);


стрСписок = "";
Для Каждого Значен из СписокПодразделений Цикл
СтрСписок= стрСписок + Число(Значен.Значение.Код)+ "," ;
КонецЦикла;
СтрСписок=лев(стрСписок,СтрДлина(стрСписок)-1);


ТекстЗапроса="
|здесь он был просто сокращаю (работает 100%)


ТЗСчетчикиСКЛЧас=SQL.SQLВыполнитьИнструкцию(Connection,ТекстЗапроса);
ТЗСчетчикиСКЛЧас.Колонки.Добавить("Подразделение";);

Для каждого стр Из ТЗСчетчикиСКЛЧас Цикл

стр.Подразделение=Справочники.Подразделения.НайтиПоКоду(Прав("0000000000"+стр.НомерМагаза,9));

КонецЦикла;


Connection=0;

Для к = 0 по СписокПодразделений.Количество()-1 цикл
ЭлементСписка = СписокПодразделений.Получить(к);
Подразд = ЭлементСписка.Значение;

ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачПериода";).Значение = НачПериода;
ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачПериода";).Использование = Истина;


ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонПериода";).Значение = КонПериода;
ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонПериода";).Использование = Истина;


ОтчетОбъект.КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();
элементотбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных";));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Подразделение";);

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; //это вариант для цикла - выше строку тогда комментриуем
ЭлементОтбора.Использование = Истина;

ЭлементОтбора.ПравоеЗначение = Подразд; //это вариант для цикла - выше строку тогда комментриуем

СхемаКомпоновкиДанных = ОтчетОбъект.получитьмакет("СреднееЗаПериодСКД";);
Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

////////////////////////////////////////////////////////////­/////////////////////////
ВнешниеНаборыДанных = Новый Структура; // инициализация внешних наборов данных
ВнешниеНаборыДанных.Вставить("ТЗСчетчикиЧас",ТЗСчетчикиСКЛЧас);

////////////////////////////////////////////////////////////­//////////////////////////


МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных, ДанныеРасшифровки);


ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ДокументРезультат = Новый ТабличныйДокумент; // задаем название для определения нового окна

ДокументРезультат.Очистить();

ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);



Для каждого Рисунок из ДокументРезультат.Рисунки Цикл
Рисунок.Ширина =300;
КонецЦикла;

ДокументРезультат.ОтображатьСетку = Ложь;

ДокументРезультат.Показать();



КонецЦикла;

КонецПроцедуры

Процедура РучноеЗаПериод()
НачПериода = НачалоДня(НачПер);
КонПериода = КонецДня(КонПер);

если СписокПодразделений.Количество() = 0 тогда

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ФлагЗакрытия",Истина);
Запрос.Текст = "ВЫБРАТЬ
|здесь он был просто сокращаю (работает 100%)

Запрос.УстановитьПараметр("IS NULL", );
Запрос.УстановитьПараметр("истина", истина );
Результат = Запрос.Выполнить();

ТЗ = Результат.Выгрузить();

Список = Новый СписокЗначений;

Список.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("Ссылка";)); // ТЗ.ВыгрузитьКолонку("Ссылка";) - это массив значений из колонки "Ссылка", а "ЗагрузитьЗначения" - загружает массив в список

СписокПодразделений = Список; // ограничим интерактивный выбор содержимым списка "Список"
конецесли;

ВхНачДатаТек = НачалоДня(НачПер);
ВхКонДатаТек = КонецДня(КонПер);


ТекстЗапроса="
|здесь он был просто сокращаю (работает 100%)


ТЗСчетчикиСКЛТек=SQL.SQLВыполнитьИнструкцию(Connection,ТекстЗапроса);
ТЗСчетчикиСКЛТек.Колонки.Добавить("МагазКакСправочникТек";);

Для каждого стр Из ТЗСчетчикиСКЛТек Цикл

стр.МагазКакСправочникТек=Справочники.Подразделения.НайтиПоКоду("0000000"+стр.НомерМагаза);

КонецЦикла;
ТЗСчетчикиСКЛТек.Свернуть("МагазКакСправочникТек,День","ФактТрафикТек";);

Connection=0;

Для к = 0 по СписокПодразделений.Количество()-1 цикл
ЭлементСписка = СписокПодразделений.Получить(к);
Подразд = ЭлементСписка.Значение;

СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("РучнаяЗаПериодСКД";);


Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;


ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачПериода";).Значение = НачПериода;
ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачПериода";).Использование = Истина;


ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонПериода";).Значение = КонПериода;
ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонПериода";).Использование = Истина;


ОтчетОбъект.КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();
элементотбора = ОтчетОбъект.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных";));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Подразделение";);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; //это вариант для цикла - выше строку тогда комментриуем
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Подразд; //это вариант для цикла - выше строку тогда комментриуем



КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

////////////////////////////////////////////////////////////­/////////////////////////
ВнешниеНаборыДанных = Новый Структура; // инициализация внешних наборов данных
ВнешниеНаборыДанных.Вставить("ТЗСчетчикиТек",ТЗСчетчикиСКЛТек);

////////////////////////////////////////////////////////////­//////////////////////////

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);


ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных, ДанныеРасшифровки);


ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ДокументРезультат = Новый ТабличныйДокумент; // задаем название для определения нового окна

ДокументРезультат.Очистить();

ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

Для каждого Рисунок из ДокументРезультат.Рисунки Цикл
Рисунок.Ширина =300;
КонецЦикла;

ДокументРезультат.ОтображатьСетку = Ложь;


ДокументРезультат.Показать();



КонецЦикла;




КонецПроцедуры
1 spacehelp
 
26.01.15
18:57
Возможно - КомпоновщикНастроек.ЗагрузитьНастройки(Выбранный_Вариант_Настройки);
Есть пример http://www.mykib.org/article/vybor-varianta-nastroek-v-neupravlyaemoy-forme-otcheta-postroennogo-na-osnove-sistemy-kompon
2 batman1978
 
26.01.15
23:21
Увы это не для 8.1 - я уже который день бьюсь - мне надо програмно в зависимости от флага поменять основную скд на другую основную скд и тогда все будет стандартно - но вот как не могу не где найти. переключатель на форме ткнул на 1 вариант - он стал основным - поставил на второй - вторая скд стала основной - но под 8.1 не один пример не работает
3 ssh2QQ6
 
27.01.15
01:10
(2) установка нужной схемы:

        СхемаКомпоновкиДанных = ПолучитьМакет("СКД_1");
        КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
        КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

Выполнение отчета:

ЭлементыФормы.Результат.Очистить();

СкомпоноватьРезультат(ЭлементыФормы.Результат, ДанныеРасшифровки);
4 batman1978
 
27.01.15
10:45
СПАСИБО ОГРОМНОЕ вы ВОЛШЕБНИК
5 batman1978
 
27.01.15
10:45
СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет("СреднееЗаПериодСКД");
        ОтчетОбъект.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
        ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
        Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;

вот так заработало переключает на ура !
6 batman1978
 
27.01.15
10:46
тему можно закрывать - так получено лекарство
7 batman1978
 
28.01.15
22:25
а можно продолжить?
с запросом по детализации за день по часам (групировку дополнением за день)
получаеться трабла
sql запрос выдает нулевой час

Sel ect shopNum as НомерМагаза,sum(Вошло) КолВоПосетителей, Sum(Вышло)
Вышло, cast (Час as int) Час, ct.TIMERECORD

fr om

(

Sel ect

se.TIMERECORD,

SUMIN Вошло,

SUMOUT Вышло,substring(convert(varchar(30),
dateadd(mi,-1,TIMERECORD), 108),1,2) Час,

E.shopNum shopNum

FR OM

[countmax].[dbo].[CM_StorageEnter] as SE,

[general].[dbo].[CM_EnterCopy] as E

where

SE.ID_ENTER=E.IDENTER

and TIMERECORD between '20150127' and '20150128' and
e.shopnum in (1)



uni on all



Sel ect

se.TIMERECORD,

SUMIN Вошло,

SUMOUT Вышло,substring(convert(varchar(30),
dateadd(mi,-1,TIMERECORD), 108),1,2) Час,

E.shopNum shopNum

FR OM

[general].[dbo].[CM_StorageEnter_Hand] as SE,

[general].[dbo].[CM_EnterCopy] as E

wh ere

SE.ID_ENTER=E.IDENTER

and TIMERECORD between '20150127' and '20150128' and
e.shopnum in (1)

) CT

group by Час,shopNum,ct.TIMERECORD

из-за него когда в самом скд делаю связи по полю час без дня - выкатывает пустой отчет с указанием дата такая-то и время 0:00:00 с пустыми данными
и следом нормальный отчет за дату - и если указать период более одного дня он будет на каждый день выдавать отчет пустой и потом нормальный
а если поставить по всем полям связи в скд - тогда отчет даные только из sql запроса показывает за 1 день
получаеться что нулевой час все портит как от него избавиться ?