8.х Соединение двух запросов

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем deman_ru, 26 мар 2014.

  1. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Есть два запроса к регистру накопления, один с видом приход а другой с видом расход:
    Код:
    Приход:
    ВЫБРАТЬ
        ОстаткиМатериаловПриход.Склад КАК СкладПриход,
        ОстаткиМатериаловПриход.Наименование КАК НаименованиеПриход,
        ОстаткиМатериаловПриход.ЕдиницаИзмерения КАК ЕдиницаИзмеренияПриход,
        СУММА (ОстаткиМатериаловПриход.Количество) КАК КоличествоПриход
    ИЗ
        РегистрНакопления.ОстаткиМатериалов КАК ОстаткиМатериаловПриход
    ГДЕ
        ОстаткиМатериаловПриход.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    СГРУППИРОВАТЬ ПО
        ОстаткиМатериаловПриход.Склад,
        ОстаткиМатериаловПриход.Наименование,
        ОстаткиМатериаловПриход.ЕдиницаИзмерения
    
    Расход:
    
    ВЫБРАТЬ
        ОстаткиМатериаловРасход.Склад КАК СкладРасход,
        ОстаткиМатериаловРасход.Наименование КАК НаименованиеРасход,
        ОстаткиМатериаловРасход.ЕдиницаИзмерения КАК ЕдиницаИзмеренияРасход,
        СУММА (ОстаткиМатериаловРасход.Количество) КАК КоличествоРасход
    ИЗ
        РегистрНакопления.ОстаткиМатериалов КАК ОстаткиМатериаловРасход
    ГДЕ
        ОстаткиМатериаловРасход.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    СГРУППИРОВАТЬ ПО
        ОстаткиМатериаловРасход.Склад,
        ОстаткиМатериаловРасход.Наименование,
        ОстаткиМатериаловРасход.ЕдиницаИзмерения
     
    Итоговая таблица должна быть:
    
    Склад;
    Наименование;
    ЕдиницаИзмерения;
    КоличествоПриход;
    КоличествоРасход.
    
    Делаю вот такой запрос с левым соединение, получается белеберда.
    
    ВЫБРАТЬ
        ОстаткиМатериаловПриход.Склад КАК Склад,
        ОстаткиМатериаловПриход.Наименование КАК Наименование,
        ОстаткиМатериаловПриход.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
        СУММА (ОстаткиМатериаловПриход.Количество) КАК КоличествоПриход,
        СУММА (ОстаткиМатериаловРасход.Количество) КАК КоличествоРасход
    ИЗ
        РегистрНакопления.ОстаткиМатериалов КАК ОстаткиМатериаловПриход
    ЛЕВОЕ СОЕДИНЕНИЕ
        РегистрНакопления.ОстаткиМатериалов КАК ОстаткиМатериаловРасход
    ПО
        ОстаткиМатериаловПриход.Склад=ОстаткиМатериаловРасход.Склад И
        ОстаткиМатериаловПриход.Наименование=ОстаткиМатериаловРасход.Наименование И
        ОстаткиМатериаловПриход.ЕдиницаИзмерения=ОстаткиМатериаловРасход.ЕдиницаИзмерения
    ГДЕ
        ОстаткиМатериаловПриход.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) И
        ОстаткиМатериаловРасход.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    СГРУППИРОВАТЬ ПО
        ОстаткиМатериаловПриход.Склад,
        ОстаткиМатериаловПриход.Наименование,
        ОстаткиМатериаловПриход.ЕдиницаИзмерения
    
    Последнее редактирование модератором: 26 мар 2014
  2. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а что мешать использовать виртуальную таблицу оборотов и получить и приход и расход сразу в одном запросе?
  3. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Видимо мешает опыт :)
  4. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Код:
    ВЫБРАТЬ
          ОстаткиМатериалов.Склад,
            ОстаткиМатериалов.Наименование,  
        СУММА(ОстаткиМатериалов.КоличествоПриход) КАК КоличествоПриход,
        СУММА(ОстаткиМатериалов.КоличествоРасход) КАК КоличествоРасход
    ИЗ
        РегистрНакопления.ОстаткиМатериалов.Обороты(&НачДата, &КонДата, , ) КАК ОстаткиМатериалов
    
    СГРУППИРОВАТЬ ПО
        ОстаткиМатериалов .Склад
      ОстаткиМатериалов.Наименование
    ну примерно как то так...
  5. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Спасибо огромное!:oops:
  6. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Так как надо было соеденить? Что мешало Левым соединением по складу или Объеденить запросы - смотря какя задача
  7. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Не хотелось бы создавать новой темы, вопрос как мне кажется пустяковый, но я не могу разобраться.
    Решил сделать обработочку для загрузки информации из Excel в 1с. Нашел простенький пример в сети, разобрался в принципе, но никак не могу побороть следующую проблему:
    Код:
    ИмяКолонки = Excel.Cells(1, Сч).Text;
    ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ","");
    НоваяКолонка = ЭлементыФормы.ТабличноеПоле.Колонки.Добавить(ИмяБезПробелов, ИмяКолонки);
    При создании колонок при помощи этого кода выдает ошибку: "Ошибка при вызове метода контекста (Добавить): Недопустимое значение параметра (параметр номер '1')"

    Я посмотрел в синтаксис помощнике, этот параметр должен быть строка. Потом посмотрел в отладчике какой тип значения у ИмяБезПробелов, тоже строка. Что ему надо не пойму. Вот застопорился и из за этого не могу записать значения строк, так как не знаю имени столбца.
    В принципе как написано он по умолчанию генерирует имена колонок типа КолонкаN. Но как получить это имя по номеру колонки?
    Данный код:
    Код:
    ИмяКолонки = ТабличноеПоле.Колонки[НомерКолонки].Имя;
    
    не работает, не присваивает никакого значения.
  8. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    что конкретно попадает в вашу переменную
  9. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    ИмяБезПробелов? строка, название столбцов (первая строка) из файла Excel
  10. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Попробуйте
    ИмяБезПробелов =СокрЛП( СтрЗаменить(Строка(ИмяКолонки)," ",""));
  11. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    К сожалению та же самая ошибка
    --- Объединение сообщений, 23 июл 2014 ---
    Ладно уже бог с ним с этим именем без пробела, я сделал переменную для именования колонок по порядку. Все имена колонок записал в массив, чтобы потом вытащить их для последующей записи значения в колонку, а не использовать функцию поиска имени колонки по ее номеру, вот:
    Код:
    //Cчитываем первую строку и генерируем колонки
        НомерКолонки = 1;
       
        МассивИменКолонок = Новый Массив();
        Сч = 1;
        Пока ЗначениеЗаполнено(Excel.Cells(1, Сч).Text) Цикл
            ИмяКолонки = Excel.Cells(1, Сч).Text;
            НэймКолонка = "Колонка"+НомерКолонки;
            НоваяКолонка = ЭлементыФормы.ТабличноеПоле.Колонки.Добавить(НэймКолонка, НэймКолонка);
            Сч = Сч + 1;
            НомерКолонки = НомерКолонки+1;
            МассивИменКолонок.Добавить(НэймКолонка);
        КонецЦикла;
       
        //После формирования колонок, считываем тело файла эксель и построчно заносим данные в табличное поле
    
        Для НС = 2 по ФайлСтрок Цикл // НС указываем с какой строки начинать обработку
    
            Состояние("Файл "+Строка(ИмяФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %");
            ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break
            НоваяСтрока = ТабличноеПоле.Добавить();
            КоличествоКолонок = ЭлементыФормы.ТабличноеПоле.Колонки.Количество();
            НомерКолонкиТабличногоПоля = 0;       
            Для НумКолонки=1 по КоличествоКолонок Цикл
                ТекущееЗначение = Excel.Cells(НС, НумКолонки).Text;
                ЗначениеИмениКолонки = МассивИменКолонок[НомерКолонкиТабличногоПоля];
                НоваяСтрока[ЗначениеИмениКолонки] = ТекущееЗначение;
                НомерКолонкиТабличногоПоля=НомерКолонкиТабличногоПоля+1;
            КонецЦикла;
        КонецЦикла;
    
    Что в итоге, имя колонок и заголовков этих колонок одинаковое. Он создает их, присваивает имена... но почему то потом не находит их в табличной части.
    Последнее редактирование: 23 июл 2014
  12. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    потому что вы с элементами формы работаете. Он у вас соединен с табчастью? и как вы у табчасти планируете создавать колонки - это же объект метаданных
  13. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Я чуть неправильно выразился, не находит он их в табличном поле. Табличное поле просто находится на форме и не связано с табличной частью
  14. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    я бы сделала так:
    1. Все данные считала в ТЗ
    2. Использовав конструкцию ЭлементыФормы.ТАбПоле.Значение = ТЗ; ЭлементыФормы.ТабПоле.СоздатьКолонки();

    В вашем коде есть нерациональное. Зачем каждый проход цикла получать количество колонок? оно же не меняется
  15. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Сделал все как Вы написали, на форуме нашел примерный код, написанный так же Вами:
    Код:
        ТЗ = Новый ТаблицаЗначений;
        Для Счетчик = 1 По ФайлКолонок Цикл
             ТЗ.Колонки.Добавить("Колонка"+Счетчик);
        КонецЦикла;
       
        Для Счетчик = 1 По ФайлСтрок Цикл
            НоваяСтрока = ТЗ.Добавить();
            //тут заполняете эту строку данными из екселя по типу
            Для сч = 1 по ФайлКолонок Цикл
                НоваяСтрока["Колонка"+сч] = Excel.Cells(Счетчик, Сч).Text;
            Конеццикла;
        Конеццикла;
        ЭлементыФормы.ТабличноеПоле.Значение = ТЗ;
        ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
    
    Но в табличное поле ничего не выгружает, появляется только одна колонка с заголовком "N"
  16. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а вы строки и колонки екселя посчитали? это ФайлСтрок и ФайлКолонок
  17. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    все получилось, были проблемы с типом значения табличного поля)
    --- Объединение сообщений, 23 июл 2014 ---
    Подскажите, а как быть с объединенными ячейками, как их считывать их Excel?
    Последнее редактирование: 23 июл 2014
  18. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    было дело, заморачивалась с этим, если найду у себя пример - опубликую
  19. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Буду очень признателен!:)
Похожие темы
  1. Swl68
    Ответов:
    2
    Просмотров:
    656
Загрузка...

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