Имя: Пароль:
1C
1С v8
СКД при выгрузке таблицу значений, не суммирует ресурсы по группировке
0 skyadmin
 
21.04.20
12:40
В схеме такой запрос

ВЫБРАТЬ
    РабочийКалендарь.Дата КАК Период
ПОМЕСТИТЬ Периоды
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК РабочийКалендарь
ГДЕ
    РабочийКалендарь.Дата МЕЖДУ &НачалоПериода И &КонецПериода
ИНДЕКСИРОВАТЬ ПО
    Период
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОстаткиПоДням.Период КАК Период,
    ОстаткиПоДням.Номенклатура КАК Номенклатура,
    ОстаткиПоДням.Характеристика КАК Характеристика,
    ВЫБОР
        КОГДА ОстаткиПоДням.ВНаличии > 0
            ТОГДА 1
        ИНАЧЕ 0
    КОНЕЦ КАК ВНаличииДень
ПОМЕСТИТЬ НаличиеПоДням
ИЗ
    ОстаткиПоДням КАК ОстаткиПоДням
ИНДЕКСИРОВАТЬ ПО
    Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НаличиеПоДням.Номенклатура КАК Номенклатура,
    НаличиеПоДням.Характеристика КАК Характеристика,
    СУММА(НаличиеПоДням.ВНаличииДень) КАК ВНаличииДней
ИЗ
    НаличиеПоДням КАК НаличиеПоДням
СГРУППИРОВАТЬ ПО
    НаличиеПоДням.Номенклатура,
    НаличиеПоДням.Характеристика


Непонятная проблема, если эту схему использую в отчете или консоли запросов,
то за месяц получается нормальный отчет, ВНаличииДней = 30

Номенклатура    Характеристика    ВНаличииДней
Бутылка    <Пустая ссылка: Справочник.Характеристика номенклатуры>    30

а если эту схему использую в обработке и вывожу результат в таблицу значений,
то за месяц получается не нормальный отчет, ВНаличииДней = 1 по всем строкам

Номенклатура    Характеристика    ВНаличииДней
Бутылка    <Пустая ссылка: Справочник.Характеристика номенклатуры>    1

Хотя дополнительно указано в ресурсах поле СУММА(НаличиеПоДням)
в структуре всего одна группировка с двумя полями Номенклатура, Характеристика

Пробовал отключать автозаполнение и указывать поля вручную, не помогло
В последнем пакете убирал сумму (чтобы оставались только поля) но ресурс все равно не суммируется
Прокол в том, что даже если добавить еще один пакет, и выбрать все только полями, в которых уже все должно быть просуммировано
и вывести ВНаличииДней как измерение в группировке, то там все равно получаются 1
Обновил платформу до 8.3.17.1386 тоже не помогло

Что это может быть за глюк такой?
1 toypaul
 
гуру
21.04.20
13:16
нет смысла искать проблему в запросе или в настройках ресурсов. надо искать проблему в настройках
2 skyadmin
 
21.04.20
13:41
(1) В настройках все убрал, оставил только группировку <Детальные записи>
все поля, включая ресурс сделал программно

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

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

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

    // Компоновка макета компоновки данных.
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Компоновщик.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    ////////////////////////////////////////////////////////////////////////////////
    // ВЫПОЛНЕНИЕ ЗАПРОСА
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    
    Таблица = Новый ТаблицаЗначений();
    ПроцессорВывода.УстановитьОбъект(Таблица);
    ДанныеОтчета = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    Возврат Таблица;
    
КонецФункции

тоже не помогло
3 toypaul
 
гуру
21.04.20
13:45
хз для чего всю эту фигню программно делать, но вот это нельзя делать перед тем как ресурсы (и вообще меняешь схему) создаешь

Компоновщик.Инициализировать
4 skyadmin
 
21.04.20
13:53
(3) Процедуру взял из типовой обработки УТ 11 ВыгрузкаБазыТоваровВТСД

// Функция подготавливает структуру данных, необходимую для печати ценников и этикеток.
//
// Возвращаемое значение:
//  Стрруктура - данные, необходимые для печати этикеток и ценников.
//
Функция ПодготовитьСтруктуруДанных(СтруктураНастроек) Экспорт
    
    ////////////////////////////////////////////////////////////////////////////////
    // ПОДГОТОВКА СХЕМЫ КОМПОНОВКИ ДАННЫХ И КОМПОНОВЩИКА НАСТРОЕК СКД
    
    // Схема компоновки.
    СхемаКомпоновкиДанных = Обработки.ВыгрузкаБазыТоваровВТСД.ПолучитьМакет(СтруктураНастроек.ИмяМакетаСхемыКомпоновкиДанных);
    
    // Подготовка компоновщика макета компоновки данных.
    Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
    Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    Компоновщик.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    Компоновщик.Настройки.Отбор.Элементы.Очистить();
    
    // Отбор компоновщика настроек.
    Если СтруктураНастроек.КомпоновщикНастроек <> Неопределено Тогда
        КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы(Компоновщик.Настройки.Отбор, СтруктураНастроек.КомпоновщикНастроек.Настройки.Отбор);
    КонецЕсли;
    
    // Выбранные поля компоновщика настроек.
    Для Каждого ОбязательноеПоле Из СтруктураНастроек.ОбязательныеПоля Цикл
        ПолеСКД = КомпоновкаДанныхСервер.НайтиПолеСКДПоПолномуИмени(Компоновщик.Настройки.Выбор.ДоступныеПоляВыбора.Элементы, ОбязательноеПоле);
        Если ПолеСКД <> Неопределено Тогда
            ВыбранноеПоле = Компоновщик.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
            ВыбранноеПоле.Поле = ПолеСКД.Поле;
        КонецЕсли;
    КонецЦикла;
......

там так сделано и вроде работает
а программно для того, чтобы можно было исключать группировку (с итогами) по характеристикам, если они не актуальны (например МРЦ)
5 skyadmin
 
21.04.20
22:32
Если тоже самое делаю с двумя наборами данных, один с периодами, второй с остатками и делаю их соединение то все выгружается нормально.
А в одном наборе нет, в общем дичь какая-то..
6 toypaul
 
гуру
22.04.20
07:54
СКД имеет привычку выбрасывать из запроса на ее взгляд "лишние" поля и даже таблицы. Но обычно это работает и при выводе в таб документ и при выводе в ТЗ. Зависеть такое поведение может только (при одном и том же запросе) при разных настройках. Так что нужно разбираться в чем разница.

Предлагаю тут почитать http://catalog.mista.ru/public/1219807/
7 skyadmin
 
22.04.20
16:27
(6) Спасибо почитал)
Однако проблема решена доработкой запроса,
Заменил строку
ВЫБОР КОГДА ОстаткиПоДням.ВНаличии > 0 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК ВНаличииДень
на
СУММА(ВЫБОР КОГДА ОстаткиПоДням.ВНаличии > 0 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК ВНаличииДней
и чудесным образом заработало
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.