Имя: Пароль:
1C
1С v8
Как обойти результат СКД?
0 al_zzz
 
05.06.12
08:05
Сделал отчет на СКД, который считает сезонность по месяцам и выводит всё в виде таблицы.
Теперь хочу занести полученные данные в регистр сведений. Как мне получить и обойти результат выполнения СКД?
1 badboychik
 
05.06.12
08:13
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений
Описание:

Объект для вывода результата компоновки в таблицу или дерево значений.
2 al_zzz
 
05.06.12
08:17
(1)Пробовал уже в тз. Код такой:
НастройкиКомпоновкиДанных = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
   
   //2.1 определяем структуру
   //2.1.1 добавляем группировку "Номенклатура"
   НастройкиКомпоновкиДанных.Структура.Удалить(0);
   ГруппировкаНоменклатуры = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
   ПолеГруппировки = ГруппировкаНоменклатуры.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));    
   ПолеГруппировки.Использование = Истина;
   ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
   
   //2.2 определим выбранные поля
   ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
   ВыбранноеПоле.Использование = Истина;
   
   ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
   ВыбранноеПоле.Заголовок = "Номенклатура";
   ВыбранноеПоле.Использование = Истина;
   ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
   
   ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
   ВыбранноеПоле.Заголовок = "Месяц";
   ВыбранноеПоле.Использование = Истина;
   ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Месяц");
   
   ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
   ВыбранноеПоле.Заголовок = "Вид";
   ВыбранноеПоле.Использование = Истина;
   ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Вид");
   
   ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
   ВыбранноеПоле.Заголовок = "Сезонность";
   ВыбранноеПоле.Использование = Истина;
   ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Сезонность");

   НачалоПериода = НастройкиКомпоновкиДанных.ПараметрыДанных.Элементы.Найти("НачалоПериода");
   Если НЕ НачалоПериода = Неопределено Тогда
       НачалоПериода.Значение = НачалоМесяца(ТекущаяДата())-60*60*24*366;
   КонецЕсли;
   
   КонецПериода = НастройкиКомпоновкиДанных.ПараметрыДанных.Элементы.Найти("КонецПериода");
   Если НЕ КонецПериода = Неопределено Тогда
       КонецПериода.Значение = НачалоМесяца(ТекущаяДата()) - 1;
   КонецЕсли;
   
   //3. компонуем
   КомпНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
   КомпНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
   КомпНастроек.ЗагрузитьНастройки(НастройкиКомпоновкиДанных);
   НастройкиКомпоновкиДанных = КомпНастроек.ПолучитьНастройки();
   
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
   Получил:
{ВнешнийОтчет.Прогнозирование(100)}: Ошибка при вызове метода контекста (Инициализировать): Ошибка компоновки данных
   ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,,Истина);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Не найдено поле замены "Сезонность"
Не пойму, что не так с полем "Сезонность".
3 Пеппи
 
05.06.12
08:24
А что у тебя в МакетКомпоновки ?
4 al_zzz
 
05.06.12
08:33
(3) В МакетКомпановке у меня после выполнения
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
МакетКомпановкиДанных.
5 al_zzz
 
05.06.12
08:34
(3) Или где-то в узлах МакетКомпановки посмотреть нужно?
6 Пеппи
 
05.06.12
08:35
Смотри СхемаКомпоновкиДанных. скорее всего там твое поле сезонность.
7 badboychik
 
05.06.12
08:36
у меня было про поле замены. Не помню как исправил ((
8 Нуф-Нуф
 
05.06.12
08:38
9 al_zzz
 
05.06.12
08:42
(6) Непонятно... :( Можно поподробнее
10 al_zzz
 
05.06.12
08:47
(8) в 1 ссылке указано, цитирую дословно:
"Разобрался, нужно было исключить эти поля временных таблиц из необязательных. Тогда они в любом случае будут потом в макете компоновки и не будет никакой ругани."
"... эти поля временных таблиц из необязательных..." я так понимаю, это значит поставить моему полю "Сезонность" галочку в ролях "Обязательное". Но это не помогло.
В остальных полнейшие танцы с бубном или стёб. Гуглом пользоваться ещё умею, но если бы был ответ, который решает проблему, не создавал бы темы.
11 Пеппи
 
05.06.12
08:50
(10) права полные?
12 al_zzz
 
05.06.12
08:51
(10) Да.
13 al_zzz
 
05.06.12
08:51
(11) Да.
14 Garkin
 
05.06.12
08:52
(10) Что таткое "сезонность"? Выражение представления задано?
15 al_zzz
 
05.06.12
08:52
Вот сам запрос:
ВЫБРАТЬ
   Склады.Ссылка КАК Склад,
   Склады.ВидСклада
ПОМЕСТИТЬ _0_Склады
ИЗ
   Справочник.Склады КАК Склады
ГДЕ
   Склады.ЭтоГруппа = ЛОЖЬ
   И (НЕ Склады.Ссылка В ИЕРАРХИИ (&ЗакрытыеСклады))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПродажиОбороты.Номенклатура,
   ПродажиОбороты.Период,
   ПродажиОбороты.КоличествоОборот
ПОМЕСТИТЬ _1_ПродажиРозница
ИЗ
   РегистрНакопления.Продажи.Обороты(
           &НачалоПериода,
           &КонецПериода,
           Месяц,
           (НЕ Контрагент В ИЕРАРХИИ (&СобственныеКонтрагенты))
               И Номенклатура <> &ПустаяСсылка
               И ДокументПродажи.Склад В
                   (ВЫБРАТЬ
                       _0_Склады.Склад
                   ИЗ
                       _0_Склады КАК _0_Склады
                   ГДЕ
                       _0_Склады.ВидСклада = &Розница)) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПродажиОбороты.Номенклатура,
   ПродажиОбороты.Период,
   ПродажиОбороты.КоличествоОборот
ПОМЕСТИТЬ _1_ПродажиОПТ
ИЗ
   РегистрНакопления.Продажи.Обороты(
           &НачалоПериода,
           &КонецПериода,
           Месяц,
           (НЕ Контрагент В ИЕРАРХИИ (&СобственныеКонтрагенты))
               И Номенклатура <> &ПустаяСсылка
               И ДокументПродажи.Склад В
                   (ВЫБРАТЬ
                       _0_Склады.Склад
                   ИЗ
                       _0_Склады КАК _0_Склады
                   ГДЕ
                       _0_Склады.ВидСклада = &ОПТ)) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПродажиОбороты.Номенклатура,
   ПродажиОбороты.КоличествоОборот / 12 КАК СредняяПродажа
ПОМЕСТИТЬ _2_СредняяПродажаРозница
ИЗ
   РегистрНакопления.Продажи.Обороты(
           &НачалоПериода,
           &КонецПериода,
           ,
           (НЕ Контрагент В ИЕРАРХИИ (&СобственныеКонтрагенты))
               И Номенклатура <> &ПустаяСсылка
               И ДокументПродажи.Склад В
                   (ВЫБРАТЬ
                       _0_Склады.Склад
                   ИЗ
                       _0_Склады КАК _0_Склады
                   ГДЕ
                       _0_Склады.ВидСклада = &Розница)) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПродажиОбороты.Номенклатура,
   ПродажиОбороты.КоличествоОборот / 12 КАК СредняяПродажа
ПОМЕСТИТЬ _2_СредняяПродажаОпт
ИЗ
   РегистрНакопления.Продажи.Обороты(
           &НачалоПериода,
           &КонецПериода,
           ,
           (НЕ Контрагент В ИЕРАРХИИ (&СобственныеКонтрагенты))
               И Номенклатура <> &ПустаяСсылка
               И ДокументПродажи.Склад В
                   (ВЫБРАТЬ
                       _0_Склады.Склад
                   ИЗ
                       _0_Склады КАК _0_Склады
                   ГДЕ
                       _0_Склады.ВидСклада = &Опт)) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   "ОПТ" КАК Вид,
   _1_ПродажиОПТ.Номенклатура КАК Номенклатура,
   _1_ПродажиОПТ.Период КАК Месяц,
   _1_ПродажиОПТ.КоличествоОборот КАК Продано
ПОМЕСТИТЬ _3_ПродажиПомесячноОР
{ВЫБРАТЬ
   Вид,
   Номенклатура.*,
   Месяц,
   Продано}
ИЗ
   _1_ПродажиОПТ КАК _1_ПродажиОПТ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Розница",
   _1_ПродажиРозница.Номенклатура,
   _1_ПродажиРозница.Период,
   _1_ПродажиРозница.КоличествоОборот
ИЗ
   _1_ПродажиРозница КАК _1_ПродажиРозница
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   _3_ПродажиПомесячноОР.Вид,
   _3_ПродажиПомесячноОР.Номенклатура,
   _3_ПродажиПомесячноОР.Месяц,
   _3_ПродажиПомесячноОР.Продано,
   ВЫБОР
       КОГДА _3_ПродажиПомесячноОР.Вид = "Опт"
           ТОГДА ВЫБОР
                   КОГДА ЕСТЬNULL(_3_ПродажиПомесячноОР.Продано, 0) = 0
                       ТОГДА 0
                   ИНАЧЕ _3_ПродажиПомесячноОР.Продано / _2_СредняяПродажаОпт.СредняяПродажа
               КОНЕЦ
       КОГДА _3_ПродажиПомесячноОР.Вид = "Розница"
           ТОГДА ВЫБОР
                   КОГДА ЕСТЬNULL(_3_ПродажиПомесячноОР.Продано, 0) = 0
                       ТОГДА 0
                   ИНАЧЕ _3_ПродажиПомесячноОР.Продано / _2_СредняяПродажаРозница.СредняяПродажа
               КОНЕЦ
       ИНАЧЕ 0
   КОНЕЦ КАК Сезонность,
   ВЫБОР
       КОГДА _3_ПродажиПомесячноОР.Вид = "Опт"
           ТОГДА _2_СредняяПродажаОпт.СредняяПродажа
       КОГДА _3_ПродажиПомесячноОР.Вид = "Розница"
           ТОГДА _2_СредняяПродажаРозница.СредняяПродажа
   КОНЕЦ КАК СредняяПродажа
ИЗ
   _3_ПродажиПомесячноОР КАК _3_ПродажиПомесячноОР
       ЛЕВОЕ СОЕДИНЕНИЕ _2_СредняяПродажаОпт КАК _2_СредняяПродажаОпт
       ПО (_3_ПродажиПомесячноОР.Номенклатура = _2_СредняяПродажаОпт.Номенклатура
               И _3_ПродажиПомесячноОР.Вид = "Опт")
       ЛЕВОЕ СОЕДИНЕНИЕ _2_СредняяПродажаРозница КАК _2_СредняяПродажаРозница
       ПО (_3_ПродажиПомесячноОР.Номенклатура = _2_СредняяПродажаРозница.Номенклатура
               И _3_ПродажиПомесячноОР.Вид = "Розница")
16 al_zzz
 
05.06.12
08:54
(14) "Сезонность" - ресурс. Рассчитывается в последнем запросе пакета.
17 al_zzz
 
05.06.12
08:55
(14) Задано.
18 Garkin
 
05.06.12
08:56
(17) Убери
19 al_zzz
 
05.06.12
09:01
(17) Не правильно понял, что такое выражение представления. Не задано.
20 al_zzz
 
05.06.12
09:09
Ап! Какие ещё соображения есть, как это победить?
21 Garkin
 
05.06.12
09:09
(19) Замени в запросе "Как Сезонность" на "Как Сезонность1". Формулу ресурса покажи.
22 Нуф-Нуф
 
05.06.12
09:10
посмотри в отладчике, что у тебя в доступных полях выбора
23 al_zzz
 
05.06.12
09:15
(21) На Сезонность1 исправил - заработало. Правда, в тз всего две колонки появились:
"Номенклатура" и "Продано". Почему остальные не вывелись?
24 Garkin
 
05.06.12
09:19
(23) Потому что Группировка только по "номенклатуре". Выводятся только поля группировки и ресурсы.
25 al_zzz
 
05.06.12
09:21
(24)В так ресурсы "Сезонность" и "Средняя продажа" тоже не вывелись.
А как вывести группировку "ДетальныеЗаписи"?
26 Garkin
 
05.06.12
09:33
(25) Ресурс "Сезонность" мы убили переименовав Сезонность в Сезонность1,
"Средней продажи" нет в выбранных полях.
"А как вывести группировку "ДетальныеЗаписи"? "  - в группировке не задавать поля группировки.
27 al_zzz
 
05.06.12
10:05
Спасибо! Всё получилось!
Попробую немного подвести итог по "Не найдено поле замены":
Причина возникновения так и осталась неизвестна для меня, а методы лечения:
1) Попробовать сделать колонку обязательной в ролях;
2) Убрать выражение представления;
3) Переименовать колонку в самом тексте запроса.
Независимо от того, куда вы едете — это в гору и против ветра!