8.х Необязательная связь

Тема в разделе "Система компоновки данных (СКД)", создана пользователем Speaker1982, 15 апр 2015.

  1. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Ну я так понимаю Вы суть первого варианта поняли. В СКД создаете просто набор данных описываете его.
    В самом модуле делает расчет выгружаете го допустим в ТЗ и передаете эту ТЗ в набор данных.
    Только там потом где поля проставьте правильно роли и т.д что бы итоги правильно считались
    --- Объединение сообщений, 16 апр 2015 ---
    Можете это сделать как бы СКд сама сделал если бы тупо свой запрос туда засунули
  2. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Код:
    Функция ПолучитьОборот(Период, СчетДт, СчетКт, Подразделение, СубконтоДт1, СубконтоДт2, СубконтоКт1, СубконтоКт2) ЭКСПОРТ
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    СУММА(ХозрасчетныйОборотыДтКт.СуммаОборот) КАК СуммаОборот
            |ИЗ
            |    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, Авто, , , , , ) КАК ХозрасчетныйОборотыДтКт
            |ГДЕ
            |    ХозрасчетныйОборотыДтКт.СчетДт = &СчетДт
            |    И ХозрасчетныйОборотыДтКт.СчетКт = &СчетКт
            |    И ХозрасчетныйОборотыДтКт.ПодразделениеДт = &ПодразделениеДт
            |
            |ОБЪЕДИНИТЬ ВСЕ
            |
            |ВЫБРАТЬ
            |    ХозрасчетныйОборотыДтКт.СуммаОборот
            |ИЗ
            |    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, Авто, , , , , ) КАК ХозрасчетныйОборотыДтКт
            |ГДЕ
            |    ХозрасчетныйОборотыДтКт.СчетДт = &СчетДт
            |    И ХозрасчетныйОборотыДтКт.СчетКт = &СчетКт
            |    И ХозрасчетныйОборотыДтКт.ПодразделениеКт = &ПодразделениеКт";
    
        Запрос.УстановитьПараметр("НачалоПериода", Период.ДатаНачала);
        Запрос.УстановитьПараметр("КонецПериода", Период.ДатаОкончания);
        Запрос.УстановитьПараметр("ПодразделениеДт", Подразделение);
        Запрос.УстановитьПараметр("ПодразделениеКт", Подразделение);
        Запрос.УстановитьПараметр("СчетДт", СчетДт);
        Запрос.УстановитьПараметр("СчетКт", СчетКт);
    
        // условия по субконто
        Если (СубконтоДт1 <> Неопределено) и (ПустаяСтрока(СубконтоДт1) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоДт1 = &СубконтоДт1";
                Запрос.УстановитьПараметр("СубконтоДт1", СубконтоДт1);
            КонецЕсли;   
           
            Если (СубконтоДт2 <> Неопределено) и (ПустаяСтрока(СубконтоДт2) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоДт2 = &СубконтоДт2";
                Запрос.УстановитьПараметр("СубконтоДт2", СубконтоДт2);
            КонецЕсли;
           
            //Если (Список[6] <> Неопределено) и (ПустаяСтрока(Список[6]) = ЛОЖЬ) Тогда
            //    Запрос.Текст = Запрос.Текст +
            //        " И ХозрасчетныйОборотыДтКт.СубконтоДт3 = &СубконтоДт3";
            //    Запрос.УстановитьПараметр("СубконтоДт3", Список[6]);
            //КонецЕсли;
           
            Если (СубконтоКт1 <> Неопределено) и (ПустаяСтрока(СубконтоКт1) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоКт1 = &СубконтоКт1";
                Запрос.УстановитьПараметр("СубконтоКт1", СубконтоКт1);
            КонецЕсли;
    
            Если (СубконтоКт2 <> Неопределено) и (ПустаяСтрока(СубконтоКт2) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоКт2 = &СубконтоКт2";
                Запрос.УстановитьПараметр("СубконтоКт2", СубконтоКт2);
            КонецЕсли;
           
            //Если (Список[10] <> Неопределено) и (ПустаяСтрока(Список[10]) = ЛОЖЬ) Тогда
            //    Запрос.Текст = Запрос.Текст +
            //        " И ХозрасчетныйОборотыДтКт.СубконтоКт3 = &СубконтоКт3";
            //    Запрос.УстановитьПараметр("СубконтоКт3", Список[10]);
            //КонецЕсли;
    
       
        Результат = Запрос.Выполнить();
    
        Выборка = Результат.Выбрать();
    
        Пока Выборка.Следующий() Цикл
            Возврат Выборка.СуммаОборот;
        КонецЦикла;
    
    КонецФункции // ПолучитьОборот()
    
    Функция ТЗдляСКД (Период, Подразделение) ЭКСПОРТ
        ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("ПодразделениеУПР");
        ТЗ.Колонки.Добавить("СтатьяУПР");
        ТО.Колонки.Добавить ("Сумма");
       
        ЗапросФильтр = Новый Запрос;
        ЗапросФильтр.Текст =
            "ВЫБРАТЬ
            |    ПодразделенияУПРСписокПодразделений.Ссылка,
            |    ПодразделенияУПРСписокПодразделений.Подразделение,
            |    ПодразделенияУПРСписокСчетов.Статья,
            |    ПодразделенияУПРСписокСчетов.СчетДТ,
            |    ПодразделенияУПРСписокСчетов.СчетКТ,
            |    ПодразделенияУПРСписокСчетов.СубконтоДт1,
            |    ПодразделенияУПРСписокСчетов.СубконтоДт2,
            |    ПодразделенияУПРСписокСчетов.СубконтоКт1,
            |    ПодразделенияУПРСписокСчетов.СубконтоКт2
            |ИЗ
            |    Справочник.ПодразделенияУПР.СписокПодразделений КАК ПодразделенияУПРСписокПодразделений
            |        ПОЛНОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияУПР.СписокСчетов КАК ПодразделенияУПРСписокСчетов
            |        ПО ПодразделенияУПРСписокПодразделений.Ссылка = ПодразделенияУПРСписокСчетов.Ссылка
            |ГДЕ
            |    ПодразделенияУПРСписокПодразделений.Ссылка В ИЕРАРХИИ(&Подразделение)";
    
        ЗапросФильтр.УстановитьПараметр("Подразделение", Подразделение);
    
        РезультатФильтр = ЗапросФильтр.Выполнить();
    
        ВыборкаФильтр = РезультатФильтр.Выбрать();
    
        Пока ВыборкаФильтр.Следующий() Цикл
            Строка = ТЗ.Добавить();
            Строка.ПодразделениеУПР = ВыборкаФильтр.Ссылка;
            Строка.СтатьяУПР = Выборка.Статья;
            Строка.Сумма = ПолучитьОборот(Период, ВыборкаФильтр.СчетДт, ВыборкаФильтр.СчетКт, ВыборкаФильтр.Подразделение, ВыборкаФильтр.СубконтоДт1, ВыборкаФильтр.СубконтоДт2, ВыборкаФильтр.СубконтоКт1, ВыборкаФильтр.СубконтоКт2);
        КонецЦикла;
    
    КонецФункции    
    Запрос вроде бы одинаковый, но СКД делает его практически моментально, а этот только одно подразделение из 200 считает 2-3 минуты
  3. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Ну я бы не сказал что одинаковый. Тот запрос что вы в скд написали - это просто шаблон. какой окончательны запрос будет - все будет зависеть от того какие вы поля вытаскиваете, каке отборы настроили и т.д. СКД уже само запрос передает и вставит нужныые параметры в отборы ит.д
    --- Объединение сообщений, 16 апр 2015 ---
    Ну вы еще с Субконто определитесь - я так понимаю у Вас же там конкретные значения будут - сделайте через Выразить, что бы не все таблицы тянул, а то он тянет все таблицы, а если на них еще и РЛС то и пото еще подзапросы РЛС ципляет
  4. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Вот такой отчет очень долго считает((

    Вложения:

  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Долго почему
    1. Ну самое явное - запрос в цикле. пока не обсуждаем я так понял им проверяете добавлять ограничние или нет. Хотя если уж так то может имело смысл одним запросом получить все данные поместить их либо в Во временную таблицу или в ТЗ, а потом уже делать запрос на выборку с условием из ВТ или на поиск стро из ТЗ - быстрее будет. если конечно памяти хватает
    2. Почему условия прописываете в ГДЕ, а не в виртуальной таблице.
    3. Сказал уже что если у Вас для все изветсно что субконто1Дт будет например Номенклатура то сделать Выразить()
  6. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Спасибо, так считает правильно, но долго...можешь чуть помочь - можно ли оптимизировать еще для ускорения

    функция в общем модуле:
    Код:
    Функция ПолучитьОборот(Период, СчетДт, СчетКт, Подразделение, СубконтоДт1, СубконтоДт2, СубконтоКт1, СубконтоКт2) ЭКСПОРТ
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаОборот
            |ИЗ
            |    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, Запись, СчетДт В (&СчетДт), , СчетКт В (&СчетКт), , ) КАК ХозрасчетныйОборотыДтКт
            |ГДЕ
            |    ХозрасчетныйОборотыДтКт.ПодразделениеДт = &Подразделение";
           
        // условия по субконто
        Если (СубконтоДт1 <> Неопределено) и (ПустаяСтрока(СубконтоДт1) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоДт1 = &СубконтоДт1";
                Запрос.УстановитьПараметр("СубконтоДт1", СубконтоДт1);
            КонецЕсли;   
           
            Если (СубконтоДт2 <> Неопределено) и (ПустаяСтрока(СубконтоДт2) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоДт2 = &СубконтоДт2";
                Запрос.УстановитьПараметр("СубконтоДт2", СубконтоДт2);
            КонецЕсли;
           
            //Если (Список[6] <> Неопределено) и (ПустаяСтрока(Список[6]) = ЛОЖЬ) Тогда
            //    Запрос.Текст = Запрос.Текст +
            //        " И ХозрасчетныйОборотыДтКт.СубконтоДт3 = &СубконтоДт3";
            //    Запрос.УстановитьПараметр("СубконтоДт3", Список[6]);
            //КонецЕсли;
           
            Если (СубконтоКт1 <> Неопределено) и (ПустаяСтрока(СубконтоКт1) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоКт1 = &СубконтоКт1";
                Запрос.УстановитьПараметр("СубконтоКт1", СубконтоКт1);
            КонецЕсли;
    
            Если (СубконтоКт2 <> Неопределено) и (ПустаяСтрока(СубконтоКт2) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоКт2 = &СубконтоКт2";
                Запрос.УстановитьПараметр("СубконтоКт2", СубконтоКт2);
            КонецЕсли;
           
            //Если (Список[10] <> Неопределено) и (ПустаяСтрока(Список[10]) = ЛОЖЬ) Тогда
            //    Запрос.Текст = Запрос.Текст +
            //        " И ХозрасчетныйОборотыДтКт.СубконтоКт3 = &СубконтоКт3";
            //    Запрос.УстановитьПараметр("СубконтоКт3", Список[10]);
            //КонецЕсли;
       
            Запрос.Текст = Запрос.Текст +
            " ОБЪЕДИНИТЬ ВСЕ
            |
            |ВЫБРАТЬ
            |    ХозрасчетныйОборотыДтКт.СуммаОборот
            |ИЗ
            |    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, Авто, СчетДт В (&СчетДт), , СчетКт В (&СчетКт), , ) КАК ХозрасчетныйОборотыДтКт
            |ГДЕ
            |    ХозрасчетныйОборотыДтКт.ПодразделениеКт = &Подразделение";
    
       
        // условия по субконто
        Если (СубконтоДт1 <> Неопределено) и (ПустаяСтрока(СубконтоДт1) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоДт1 = &СубконтоДт1";
                Запрос.УстановитьПараметр("СубконтоДт1", СубконтоДт1);
            КонецЕсли;   
           
            Если (СубконтоДт2 <> Неопределено) и (ПустаяСтрока(СубконтоДт2) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоДт2 = &СубконтоДт2";
                Запрос.УстановитьПараметр("СубконтоДт2", СубконтоДт2);
            КонецЕсли;
           
            //Если (Список[6] <> Неопределено) и (ПустаяСтрока(Список[6]) = ЛОЖЬ) Тогда
            //    Запрос.Текст = Запрос.Текст +
            //        " И ХозрасчетныйОборотыДтКт.СубконтоДт3 = &СубконтоДт3";
            //    Запрос.УстановитьПараметр("СубконтоДт3", Список[6]);
            //КонецЕсли;
           
            Если (СубконтоКт1 <> Неопределено) и (ПустаяСтрока(СубконтоКт1) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоКт1 = &СубконтоКт1";
                Запрос.УстановитьПараметр("СубконтоКт1", СубконтоКт1);
            КонецЕсли;
    
            Если (СубконтоКт2 <> Неопределено) и (ПустаяСтрока(СубконтоКт2) = ЛОЖЬ) Тогда
                Запрос.Текст = Запрос.Текст +
                    " И ХозрасчетныйОборотыДтКт.СубконтоКт2 = &СубконтоКт2";
                Запрос.УстановитьПараметр("СубконтоКт2", СубконтоКт2);
            КонецЕсли;
           
            //Если (Список[10] <> Неопределено) и (ПустаяСтрока(Список[10]) = ЛОЖЬ) Тогда
            //    Запрос.Текст = Запрос.Текст +
            //        " И ХозрасчетныйОборотыДтКт.СубконтоКт3 = &СубконтоКт3";
            //    Запрос.УстановитьПараметр("СубконтоКт3", Список[10]);
            //КонецЕсли;
    
        Запрос.УстановитьПараметр("НачалоПериода", Период.ДатаНачала);
        Запрос.УстановитьПараметр("КонецПериода", Период.ДатаОкончания);
        Запрос.УстановитьПараметр("Подразделение", Подразделение);
        Запрос.УстановитьПараметр("СчетДт", СчетДт);
        Запрос.УстановитьПараметр("СчетКт", СчетКт);
    
        Результат = Запрос.Выполнить();
    
        Выборка = Результат.Выбрать();
        Сумма = 0;
        Если Выборка.Количество() > 0 Тогда
            Пока Выборка.Следующий() Цикл
                Сумма = Сумма + Выборка.СуммаОборот;
            КонецЦикла;
            Возврат Сумма;
        Иначе
            Возврат 0;
        КонецЕсли;   
    
    
    КонецФункции // ПолучитьОборот()
    

    Вложения:

  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Можно.
    Условия по подразделению и субконто также указывать в параметрах виртуальной таблицы.
  8. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Но условия по подразделению и субконто находятся в самих справочниках..и их много - больше 100, по иерархии
  9. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Какаяя разница где они находятся. Вы когда получаете это условие вы его добавляете в конструкцию ГДЕ, а не в отбор виртуальной таблицы
    по этому у Вас сначало получаются все данные из ВИРТ таблицы. а потом наних отбор накладывается, а если сразу условие в вирт таблицу то данных на выборку меньше будет
    так что добавляйте в условие вирт таблицы
    У Вас СубконтоДт или СубконтоКт в спрвочниках тип кокой могут иметь? всегда один и тот же Например субконто 1.ДТ у всез элементов справоников - склад только для каждого подразделения свой или нет у одного подразделения Субконто Дт это склад у другого физ лицо у третьего контрагент и т.д как у Вас
  10. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
        // условия по субконто
           УсловиеПоСубконто = "";
            Если (ЗначениеЗаполнено(СубконтоДт1) Тогда
                УсловиеПоСубконто  =  УсловиеПоСубконто  + " И СубконтоДт1 = &СубконтоДт1";
                Запрос.УстановитьПараметр("СубконтоДт1", СубконтоДт1);
            КонецЕсли; 
         
            Если (ЗначениеЗаполнено(СубконтоДт2) Тогда
                УсловиеПоСубконто  =  УсловиеПоСубконто  + " И СубконтоДт2= &СубконтоДт2";
                Запрос.УстановитьПараметр("СубконтоДт2", СубконтоДт2);
            КонецЕсли;
         
            Если (ЗначениеЗаполнено(СубконтоКт1) Тогда
                УсловиеПоСубконто  =  УсловиеПоСубконто  + " И СубконтоКт1 = &СубконтоКт1";
                Запрос.УстановитьПараметр("СубконтоКт1", СубконтоКт1);
            КонецЕсли;
    
            Если (ЗначениеЗаполнено(СубконтоКт2) Тогда
                УсловиеПоСубконто  =  УсловиеПоСубконто  + " И СубконтоКт2 = &СубконтоКт2";
                Запрос.УстановитьПараметр("СубконтоКт2", СубконтоКт2);
            КонецЕсли;
    
    Запрос.Текст =
            "ВЫБРАТЬ
            |    ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаОборот
            |ИЗ
            |    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, Запись, СчетДт В (&СчетДт), , СчетКт В (&СчетКт), , ПодразделениеДт = &Подразделение" + УсловиеПоСубконто  + ") КАК ХозрасчетныйОборотыДтКт";
    
    .........
    
    Как-то так я имел ввиду.
  11. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Вы посмотрели СКД в приложенном файле?...в справочнике иерархия 3 уровней, в каждой папке примерно по 20 элементов, в каждом из них содержаться фильтры, т.е. по каждому элементу надо сумму посчитать по статьям затрат еще и все выдать в иерархии групп, ведь я в отчете как параметр не всегда буду выбирать одно подразделение, а надо группу еще или вообще по всем групппам иэементам справочника...так вот, до этого СКД (без субконто) весь справочник с иерархией просчитывала меньше 1 минуты, а сейчас 1 только элемент 2 минуты, одна папка - 30 минут(((
    Нет, у каждого счета свой видсубконто1, номенклатурная группа, склад и.т.п.
    --- Объединение сообщений, 17 апр 2015 ---
    а, счас попробую
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ниче не понял из последней фразы, я писал исключительно про функцию Функция ПолучитьОборот(Период, СчетДт, СчетКт, Подразделение, СубконтоДт1, СубконтоДт2, СубконтоКт1, СубконтоКт2), и о том как заставить ее работать немного быстрее.
    --- Объединение сообщений, 17 апр 2015 ---
    А, и периодичность "Запись" в виртуальной таблице там тоже вероятно не нужна, убрать ее.
  13. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Я посмотрел, мое мнение лучше может сделать все расчеты отдельно а в СКд передать как набор и пусть выводит.
    просто вы это поле засунули же в вычисляемые поля. скажу так что СКд надо взять расшифровать это выражение на языке СКД отправить на выполнение и вернуть обратно видет как бы 3 операции
    а вы вычислили и все
    Затем я уже не совсем помню но вот в ресурсах у Вас написанно и Сумма(Сумма) и ВычислитьВыражение, я уже так досканально не помню, но вроде это скрока как и Вам и мне известно - это посутите дела строка языка выражений СКД
    так вот Когда Вы туда ставите Сумма(Сумма), то я предполагаю что насамом деле при построении всех выражений трансляций запросво в скуль будт что то вроде
    Сумма(Баланс.ПолучитьОборот (&ПериодОтчета, СчетДт, СчетКт, ПодразделениеБУХ, СубконтоДт1, СубконтоДт2, СубконтоКт1, СубконтоКт2))
    Понимаете к чему я виду. т.е один раз он вам вычисляет поле т.к это поле не из запроса. а второй раз он его то же будет вычислять при получении итогов т.к данных из запроса у него не будет.
    Ну можете проэксперементировать убрать Сумму из ресурсов и просто сделать его полем и запустить - сколько будет считать - меньше?
    --- Объединение сообщений, 17 апр 2015 ---
    Может конечно я и ошибаюсь. Это надо смотреть в описании. самой СКД, а достать ее где фиг знает в литературе такго нет.
    Последнее редактирование: 17 апр 2015
  14. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Очень бы хотелось решить эту проблему, помимо того, что надо как то оптимизировать запрос, потому как счас считает - это нереально долго, если точек больше 1000 нужно будет выводить в отчет....+не могу по этим полям получить расшифровку, как не пытался, не могу по клику на ячейку вытянуть ее пересечение( не могу даже цифру вытянуть по которой кликнул (в предыдущем СКД я все это получал без проблем)...спрошу так - у вас есть время заняться этим вопросом? если да, напишите мне в личку - мы обо всем договоримся!
  15. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    т.е. вычислять всю таблицу в функции придется, которая передаст ТЗ в СКД, иначе фильтры не настроить, +нужны вычисляемые поля "по итогам" где из первой группировки вычитается вторая и эта разность встает в поле итого по колонке, расшифровка нужна...это все сделано было в СКД, но без учета заполненности субконтодт1-3 и субконтокт1-3 , если бы СКД делала эи связки по условию - было бы очень замечательно, но почему то она совсем не реагирует на суловие связи(
  16. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Если подготовить для СКД таблицу полностью по всему справочнику подразделений с суммами готовыми, то как быть с периодом, если я его не укажу - то там миллионы записей в регистре бухгалтерии
  17. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Ну мне не совсем при такой постановке задачи понятно какие там проблы с итогами и расшифровками, если все вычислить и передать в СКД ТЗ для вывода.
    И про периоды то же зачем все выбирать. указали нужный период за него отобрали сделали ТЗ передали ее в СКД. изменились параметры очистили ТЗ - и все заново
  18. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Так это фактический последние мои посты, в функцию, которая готовит ТЗ для СКД передаются параметры (а если нужен отбор?) подразделение и период, она из справочника выбирает то подразделение, которое нужно и по каждой строчке другая функция вычисляет сумму оборота - это очень долго!
    Мне кажется можно средствами скд добиться работы поля "Условие связи", видимо как то надо правильно ее настроить, что бы было не внутреннее соединение, а левое, но как...
  19. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Добрый день!

    Смотрите как я у себя решил похожую задачу

    Есть два регистра

    Партии товаров на складах и Товары на складах и там и там есть измерения Номенклатура и Серия, но если у номенклатуры не стоит вести партионный учет по сериям то в регистр партии товаров серия не пишется, а в товары пишется

    если делаем обычный запрос
    таблица партии товаров и товары на складах и левое соединение по номенклатура и Серии

    Код:
    ВЫБРАТЬ
        ПартииТоваровНаСкладахБухгалтерскийУчетОстатки.Номенклатура,
        ПартииТоваровНаСкладахБухгалтерскийУчетОстатки.СерияНоменклатуры,
        ТоварыНаСкладахОстатки.КоличествоОстаток
    ИЗ
        РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет.Остатки КАК ПартииТоваровНаСкладахБухгалтерскийУчетОстатки
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
            ПО ПартииТоваровНаСкладахБухгалтерскийУчетОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
                И ПартииТоваровНаСкладахБухгалтерскийУчетОстатки.СерияНоменклатуры = ТоварыНаСкладахОстатки.СерияНоменклатуры

    Рис 1

    То хоть и по РН Товары на складах есть остатки в разрезе серий но т.к у партий нет то результат отчета по сути дела без остатков т.к серии не совпадают
    Рис 222

    По этому переделываем условие связи.
    Убираем вторую связь по сериям и делаем в одной

    ВЫБОР
    КОГДА ПартииТоваровНаСкладахБухгалтерскийУчетОстатки.СерияНоменклатуры = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
    ТОГДА ПартииТоваровНаСкладахБухгалтерскийУчетОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
    ИНАЧЕ ПартииТоваровНаСкладахБухгалтерскийУчетОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
    И ПартииТоваровНаСкладахБухгалтерскийУчетОстатки.СерияНоменклатуры = ТоварыНаСкладахОстатки.СерияНоменклатуры
    КОНЕЦ

    Рис 3333

    т.е у нас если серия не заполнена то свзяь только по номенклатуре иначе и по номенклатуре и серии

    и тогда все ок
    Рис 4444

    т.е условие свзяи должно быть одной строкой а там вы уже у себя должны прописать по чем соединять в зависимости от того что у вас заполнено что нет.

    Вложения:

    • 1111.jpg
      1111.jpg
      Размер файла:
      78,8 КБ
      Просмотров:
      1
    • 22222.jpg
      22222.jpg
      Размер файла:
      48,6 КБ
      Просмотров:
      1
    • 333333.jpg
      333333.jpg
      Размер файла:
      96,8 КБ
      Просмотров:
      0
    • 4444.jpg
      4444.jpg
      Размер файла:
      54,3 КБ
      Просмотров:
      0
  20. TopicStarter Overlay
    Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    А если условий 6? на незаполненность субконтодт1-3 и субконтоКт1-3
    Код:
    ВЫБРАТЬ
        ПодразделенияУПРСписокПодразделений.Ссылка КАК ПодразделениеУПР,
        ПодразделенияУПРСписокПодразделений.Подразделение КАК ПодразделениеБУХ,
        ПодразделенияУПРСписокСчетов.Статья КАК СтатьяУПР,
        ПодразделенияУПРСписокСчетов.СчетДТ,
        ПодразделенияУПРСписокСчетов.СчетКТ,
        ПодразделенияУПРСписокСчетов.СубконтоДт1,
        ПодразделенияУПРСписокСчетов.СубконтоДт2,
        ПодразделенияУПРСписокСчетов.СубконтоКт1,
        ПодразделенияУПРСписокСчетов.СубконтоКт2
    ПОМЕСТИТЬ Фильтр
    ИЗ
        Справочник.ПодразделенияУПР.СписокПодразделений КАК ПодразделенияУПРСписокПодразделений
            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияУПР.СписокСчетов КАК ПодразделенияУПРСписокСчетов
            ПО ПодразделенияУПРСписокПодразделений.Ссылка = ПодразделенияУПРСписокСчетов.Ссылка
    ГДЕ
        ПодразделенияУПРСписокПодразделений.Ссылка В ИЕРАРХИИ(&ПодразделениеУПР)
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Фильтр.ПодразделениеУПР,
        Фильтр.СтатьяУПР,
        ХозрасчетныйОборотыДтКт.СуммаОборот
    ИЗ
        Фильтр КАК Фильтр
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &КонецПериода, Авто, , , , , ) КАК ХозрасчетныйОборотыДтКт
            ПО (ВЫБОР
                    КОГДА Фильтр.СубконтоДт1 <> НЕОПРЕДЕЛЕНО
                        ТОГДА Фильтр.СубконтоДт1 = ХозрасчетныйОборотыДтКт.СубконтоДт1
                КОНЕЦ)
                И (ВЫБОР
                    КОГДА Фильтр.СубконтоДт2 <> НЕОПРЕДЕЛЕНО
                        ТОГДА Фильтр.СубконтоДт2 = ХозрасчетныйОборотыДтКт.СубконтоДт2
                КОНЕЦ)
                И (ВЫБОР
                    КОГДА Фильтр.СубконтоКт1 <> НЕОПРЕДЕЛЕНО
                        ТОГДА Фильтр.СубконтоКт1 = ХозрасчетныйОборотыДтКт.СубконтоКт1
                КОНЕЦ)
                И (ВЫБОР
                    КОГДА Фильтр.СубконтоКт2 <> НЕОПРЕДЕЛЕНО
                        ТОГДА Фильтр.СубконтоКт2 = ХозрасчетныйОборотыДтКт.СубконтоКт2
                КОНЕЦ)
                И Фильтр.СчетДТ = ХозрасчетныйОборотыДтКт.СчетДт
                И Фильтр.СчетКТ = ХозрасчетныйОборотыДтКт.СчетКт
                И Фильтр.ПодразделениеБУХ = ХозрасчетныйОборотыДтКт.ПодразделениеДт
    из за того что я уже миллион вариантов перепробовал уже не получается мыслить

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

Поделиться этой страницей