7.7 Как вывести данные из запроса

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем Vitaly, 22 сен 2014.

  1. TopicStarter Overlay
    Vitaly
    Offline

    Vitaly Опытный в 1С

    Регистрация:
    21 фев 2014
    Сообщения:
    366
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте.
    Есть вот такой запрос:
    Код:
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать);
    |Код = Справочник.Номенклатура.Код;
    |Наименование = Справочник.Номенклатура.Наименование;
    |Группировка Код;
    |Группировка Наименование;
    |Условие(Наименование=пНаименование);
    |"//}}ЗАПРОС; 
    Не могу понять как вывести из него данные.
    Т.е. если есть совпадения мне нужно в окно сообщения программы (через "Сообщить") вывести все коды этих элементов.
    Спасибо.
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Воспользуйтесь конструктором запросов... Все сделает за вас
    Но отчет скорее всего выйдет пустым из-за не корректного условия.
    Vitaly нравится это.
  3. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.433
    Симпатии:
    373
    Баллы:
    104
    вообще не так
    Код:
    Наименование = Справочник.Номенклатура.Наименование;
    а вот так по идее надо
    Код:
    Номенклатура = Справочник.Номенклатура;

    это условие
    Код:
    Условие(Номенклатура=ВыбНоменклатура); // через поле на форме
    позволяет выбрать только одну позицию номенклатуры

    а такое
    Код:
    Условие(Номенклатура В ВыбНоменклатура);
    позволяет обработать всё что входит в выбранную папку номенклатуры (включая подпапки)
    --- Объединение сообщений, 22 сен 2014 ---
    примерно как то так должно выглядеть из конструктора
    Код:
    //*******************************************
    // Процедура генерации запроса Сформировать.
    //
    Процедура Сформировать()
        Перем Запрос, ТекстЗапроса;
        //Создание объекта типа Запрос
        Запрос = СоздатьОбъект("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)
        |Товар = Справочник.Номенклатура.ТекущийЭлемент;
        |Код = Справочник.Номенклатура.Код;
        |Функция ТоварШтрихкодСумма = Сумма(Товар.Штрихкод);
        |Группировка Товар упорядочить по Товар.Наименование;
        |Условие(Товар в ВыбТовар);
        |"//}}ЗАПРОС
        ;
        // Если ошибка в запросе, то выход из процедуры
        Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
            Возврат;
        КонецЕсли;
    
        // Подготовка к заполнению выходных форм данными запроса
        Состояние("Заполнение выходной таблицы...");
        Пока Запрос.Группировка(1) = 1 Цикл
            Сообщить("У товара - "+Запрос.Товар+" код = "+Запрос.Код);
        КонецЦикла;
    
    КонецПроцедуры
    Последнее редактирование: 22 сен 2014
    Vitaly нравится это.
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    А функция то зачем?
  5. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.433
    Симпатии:
    373
    Баллы:
    104
    забыл удалить :)

    хотя тут подумалось, а если у ТС потребность в том чтоб вывести коды номенклатуры, наименование которой содержит определённый текст?
    Vitaly нравится это.
  6. TopicStarter Overlay
    Vitaly
    Offline

    Vitaly Опытный в 1С

    Регистрация:
    21 фев 2014
    Сообщения:
    366
    Симпатии:
    0
    Баллы:
    26
    Все воюю воюю не могу победить.
    Код:
    Если СтрДлина(СокрЛП(Лист.Cells(Элемент,10).Value))>8 Тогда
                        пКод=Прав(СокрЛП(Лист.Cells(Элемент,10).Value),8);
                    Иначе 
                        пКод=СокрЛП(Лист.Cells(Элемент,10).Value);
                    КонецЕсли;
                    пНаименование=СокрЛП(Лист.Cells(Элемент,11).Value);
                    Запрос = СоздатьОбъект("Запрос");
                    ТекстЗапроса =
                    "//{{ЗАПРОС(Сформировать);
                    |Код = Справочник.Номенклатура.Код;
                    |Наименование = Справочник.Номенклатура.Наименование;
                    |Группировка Код;
                    |Группировка Наименование;
                    |Условие(Код в пКод);
                    |Условие(Наименование в пНаименование);
                    |"//}}ЗАПРОС;
                    ;
                    
    Таблица=СоздатьОбъект("Таблица");
             Запрос.Выгрузить(Таблица,0,0);
                    Если Таблица.Количество()=1 Тогда
                        Сообщить(Таблица.Код); 
    Иначе
    Спр=СоздатьОбъект("Справочник.Номенклатура");
               Спр.НоваяГруппа();
               Спр.Код=пКод;
               Спр.Наименование=пНаименование;  
               Спр.Записать();
                    КонецЕсли;
    Что конкретно не верно в запросе? Через конструктор запроса пробовал но что-то не получилось тоже.
    --- Объединение сообщений, 23 сен 2014 ---
    Мне нужно 2 условия: если совпадений нет то создаю новую номенклатуру, если есть - то вывожу код(он единственный). В 7.7. не силен.
    --- Объединение сообщений, 23 сен 2014 ---
    А сравнение должно быть по коду и наименованию.
    Последнее редактирование: 23 сен 2014
  7. TopicStarter Overlay
    Vitaly
    Offline

    Vitaly Опытный в 1С

    Регистрация:
    21 фев 2014
    Сообщения:
    366
    Симпатии:
    0
    Баллы:
    26
    Подправил, но не выводит нужные данные, видимо ошибка в запросе:
    Код:
    Запрос = СоздатьОбъект("Запрос");
                    ТекстЗапроса =
                    "//{{ЗАПРОС(Сформировать); 
                    |Код = Справочник.Номенклатура.Код;
                    |Наименование = Справочник.Номенклатура.Наименование;
                    |Группировка Код; 
                    |Группировка Наименование;
                    |Условие(Код в пКод);
                    //|Условие(Наименование в пНаименование);
                    |"//}}ЗАПРОС; 
                    ;
                    ТЗ=СоздатьОбъект("ТаблицаЗначений");
                    Запрос.Выгрузить(ТЗ,0,0);
                        Сообщить(ТЗ.КоличествоСтрок());
  8. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.433
    Симпатии:
    373
    Баллы:
    104
    и всё это ещё и в цикле наверняка? :D
    не надо вкладывать запросы в цикл


    напомню, что код уникален в справочнике
    а с проверкой по наименованию надо внимательно быть, например в одном месте в строке есть один пробел между словами, а в другом - два пробела на этом месте, и сравнение по наименованию в простом виде не даст совпадения
    тут лучше тогда по иному, через
    Код:
    Выбрать(<?>,)
    Синтаксис:
    Выбрать(<Подсказка>,<ФормаСписка>)
    Назначение:
    Вызов диалога для выбора элемента справочника.
    Возвращает: 1 - если элемент выбран; 0 - если не выбран.
    Параметры:
    <Подсказка> - текст заголовка окна диалога ввода;
    <ФормаСписка> - строка, содержащая идентификатор формы списка справочника, используемой для выбора.
    Замечание:
    Метод  можно использовать только для объектов, созданных функцией СоздатьОбъект.
    одновременно и создавать можете

    Код:
        Тов=СоздатьОбъект("Справочник.Номенклатура");
    
        Для Ном=1 по Текст.КоличествоСтрок() Цикл // тут цикл обхода вашего файла эксель
    
      Если СтрДлина(СокрЛП(Лист.Cells(Элемент,10).Value))>8 Тогда
          пКод=Прав(СокрЛП(Лист.Cells(Элемент,10).Value),8);
      Иначе
          пКод=СокрЛП(Лист.Cells(Элемент,10).Value);
      КонецЕсли;
      пНаименование=СокрЛП(Лист.Cells(Элемент,11).Value);
    
    Если //тут ваша проверка на нужное и вывод если совпадение есть
    //ваш код проверки, проверять надо два элемента
    Иначе //тут создание элемента при отсутствии совпадения
        Тов.НоваяГруппа();
        Тов.Код=пКод;
        Тов.Наименование=пНаименование;
        Тов.Записать();
    КонецЕсли;
    
        КонецЦикла;

    для можно проверки задействовать:
    Код:
    НайтиПоНаименованию(<?>,,);
    Синтаксис:
    НайтиПоНаименованию(<Наименование>,<Режим>,<ФлагПоиска>)
    Назначение:
    Найти элемент справочника по наименованию.
    Возвращает: 1 - если действие выполнено;
    0 - если действие не выполнено (элемент не найден).
    Параметры:
    <Наименование> - строка с наименованием искомого элемента справочника,
    <Режим> - необязательный параметр. Число: 1 - поиск внутри установленного подчинения (родителя); 0 - поиск во всем справочнике вне зависимости от родителя. Значение по умолчанию - 1.
    <ФлагПоиска> - необязательный параметр. Число: 1 - найти точное соответствие наименования; 0 - найти наименование по первым символам. Значение по умолчанию - 0.
    Замечание:
    Метод  можно использовать только для объектов, созданных функцией СоздатьОбъект.
    и
    Код:
    НайтиПоКоду(<?>,);
    Синтаксис:
    НайтиПоКоду(<Код>,<ФлагПоиска>)
    Назначение:
    Найти элемент справочника по коду.
    Возвращает: 1 - если действие выполнено;
    0 - если действие не выполнено (элемент не найден).
    Параметры:
    <Код> - выражение со значением искомого кода,
    <ФлагПоиска> - флаг поиска (необязателен):
      0 - поиск во всем справочнике вне зависимости от родителя;
      1 - поиск внутри установленного подчинения (родителя);
      2 - поиск по полному коду через разделитель.
    Значение по умолчанию:
      0 - если код уникален во всем справочнике;
      2 - если код уникален только в группе.
    Замечание:
    Метод  можно использовать только для объектов, созданных функцией СоздатьОбъект.
    первым логично проверять код
    Vitaly нравится это.
  9. TopicStarter Overlay
    Vitaly
    Offline

    Vitaly Опытный в 1С

    Регистрация:
    21 фев 2014
    Сообщения:
    366
    Симпатии:
    0
    Баллы:
    26
    Еще правленая версия:
    Код:
    Запрос = СоздатьОбъект("Запрос");
                    ТекстЗапроса =
                    "//{{ЗАПРОС(Сформировать);
                    |ОбрабатыватьДокументы все;
                    |Номенклатура = Справочник.Номенклатура.ТекущийЭлемент;
                    |"//}}ЗАПРОС; 
                    ;
                    ТЗ=СоздатьОбъект("ТаблицаЗначений");
                    Запрос.Выгрузить(ТЗ,0,0);
                        Сообщить(ТЗ.КоличествоСтрок());
    Примитивный пример, но все равно выводит нули - хотя элементы (группы) есть.
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Вы озвучьте что вы хотите получить из запроса?
    Vitaly нравится это.
  11. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.433
    Симпатии:
    373
    Баллы:
    104
    судя по кусочкам текста ТС хочет загружать данные в справочник номенклатуры из экселевского файла
    но при этом выборочно, пропуская совпадающие по коду и наименованию (хотя тут не совсем ясно из-за кода) и записывая в справочник по которым нет совпадений (типа новые позиции)
    Vitaly нравится это.
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Про загрузку в тексте/коде нет ни слова... Думаю стоит подождать автора... А то полное непонимание ситуации..
    Vitaly нравится это.
  13. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.433
    Симпатии:
    373
    Баллы:
    104
    мысля навеяна первой пятёркой строчек кода из поста №6
    Vitaly нравится это.
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Vitaly нравится это.
  15. TopicStarter Overlay
    Vitaly
    Offline

    Vitaly Опытный в 1С

    Регистрация:
    21 фев 2014
    Сообщения:
    366
    Симпатии:
    0
    Баллы:
    26
    Я нашел другое решение данной проблемы. Спасибо (запись через попытка).
  16. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не за что. Обращайтесь

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