8.х В запросе реализовать запись значения

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

  1. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Добрый день! Такая ситуация, пишу обработку, которая из файла Excel сравнивает значение со значением артикула в номенклатуре и при совпадении устанавливает свойство номенклатуры в значение из того же файла Excel.

    Например файл Excel : Артикул 1С Группа цен
    1а ААА
    1б БББ
    и тд.
    Обработка берет артикул из Excel "1а" если он равен артикулы в номенклатуре в 1с "1а", то в 1с в номенкалатуре обработка устанавливает свойство "Группа цен" в значение "ААА". Я обработку написал, вот код который выполняется при нажатии на кнопку "Выполнить".

    Код:
    Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ""Legrand""
        |    И Номенклатура.ЭтоГруппа = ЛОЖЬ";
       
        Выборка = Запрос.Выполнить().Выбрать();
       
        ДанныеТаблицы = ЭтаФорма.Таблица;
       
        Пока Выборка.Следующий() Цикл
            Для Каждого ТаблицаЗначений Из ДанныеТаблицы Цикл
                Если ТаблицаЗначений.Референс1С = Выборка.Ссылка.Артикул Тогда
                     ГКБИС.ЗаписьГруппыЦен(Выборка.Ссылка,ТаблицаЗначений.ТоварнаяГруппа1С);
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
    
    Из начально я выбирал всю номенклатуру из 1с (более 35 тыс. наименований), а в фале Excel 14,5 тыс. Обработка работала более 3 часов, затем я решил ограничить в запросе выборку и сделал, только для одного каталога, который содержит такое же количество товара как и в фале Excel. И тоже работает очень долго. Подскажете пожалуйста можно ли как-то оптимизировать работу обработки.
  2. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Можно и нужно. Я так понял данные из таблицы Excel у Вас хранятся на форме, следовательно в запросе выбирайте всю номенклатуру (без групп), далее передавайте таблицу из формы в запрос, в запросе сравнивайте по полям Вам нужным и оставляйте только те записи, которые совпали (связями настраивается) и после этого уже обрабатывайте результат. Там будет цикл по результату (будь то выборка или ТЗ), ну и соответственно запись необходимых свойств. Это отработает гораздо быстрее. 14,5 тыщ позиций - в целом для ИС не так уж и много.
    --- Объединение сообщений, 16 май 2014 ---
    Да, кстати, по поводу сабжа, в запросах 1С запись в БД невозможна.
  3. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    А как передать таблицу из формы в Запрос?
  4. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    МояТаблицаСФормы.Номенклатура,
        |    МояТаблицаСФормы.Артикул,
        |    МояТаблицаСФормы.ЕщеКакоеТоПоле
        |ПОМЕСТИТЬ ВТТаблицаСФормы
        |ИЗ
        |    &МояТаблицаСФормы КАК МояТаблицаСФормы";
    
    // Если на форме табличная часть то
    Запрос.УстановитьПараметр("МояТаблицаСФормы", ТаблицаСФормы.Выгрузить());
    
    // Если на форме таблица значений то
    Запрос.УстановитьПараметр("МояТаблицаСФормы", ТаблицаСФормы);
    
  5. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Это нужно новый запрос создавать или в тот же, где я выбираю номенклатуру?
    --- Объединение сообщений, 16 май 2014 ---
    Все понял! Спасибо большое!
    Последнее редактирование: 16 май 2014
  6. olegsemenov2005
    Offline

    olegsemenov2005 Новичок в 1С

    Регистрация:
    5 май 2014
    Сообщения:
    48
    Симпатии:
    3
    Баллы:
    4
    Код:
    "ВЫБРАТЬ
    |    МояТаблицаСФормы.Номенклатура,
    |    МояТаблицаСФормы.Референс1С,
    |    МояТаблицаСФормы.ТоварнаяГруппа1С
    |ПОМЕСТИТЬ ВТТаблицаСФормы
    |ИЗ
    |    &МояТаблицаСФормы КАК МояТаблицаСФормы
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    СпрНоменклатура.Ссылка,
    |    ВТТаблицаСФормы.ТоварнаяГруппа1С
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТТаблицаСФормы КАК ВТТаблицаСФормы
    |        ПО СпрНоменклатура.Артикул = ВТТаблицаСФормы.Референс1С
    |ГДЕ
    |    СпрНоменклатура.ЭтоГруппа = ЛОЖЬ"
    
    Последнее редактирование: 16 май 2014
  7. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Выдает вот такую ошибку:

    Код:
    {Форма.Форма.Форма(17)}: Ошибка при вызове метода контекста (Выполнить)
        Выборка = Запрос.Выполнить().Выбрать();
    по причине:
    {(5, 20)}: Таблица не найдена "МояТаблицаСФормы"
    ЛЕВОЕ СОЕДИНЕНИЕ <<?>>МояТаблицаСФормы КАК МояТаблицаСФормы
    
  8. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Вы кодить вообще умеете ??? Вам привели код как пример!
  9. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Я вообще-то понимаю, и не копировал его тупа!!! Возникла такая ошибка, вот я и решил спросить у ребят, может они знают в чем проблема.
    Здесь по моему задают вопросы об ошибках, а не о том, кто на каком уровне КОДИТ!
  10. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Прочитайте текст ошибки:
    У вас нет таблицы МояТаблицаСФормы
  11. olegsemenov2005
    Offline

    olegsemenov2005 Новичок в 1С

    Регистрация:
    5 май 2014
    Сообщения:
    48
    Симпатии:
    3
    Баллы:
    4
    Проверьте еще раз имена - созданной временной таблицы и той, с которой происходит соединение. (точно ли временная называется "МояТаблицаСФормы"? ибо в примере у нее имя "ВТТаблицаСФормы")
    Поправьте ЛЕВОЕ на ВНУТРЕННЕЕ соединение.
    Большинство ошибок от невнимательности и копирования, это не желание обидеть, а факт.

    Или вы переделали запрос и соединяетесь с таблицей параметром, а не временной ?
  12. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    С той ошибкой вроде разобрался спасибо большое! Возникает новая, когда во временной таблицы я у полей указываю "Тип", нажимаю ОК, выхожу из конструктора запросов
    и тип у полей временной таблицы пропадает, он просто не сохраняет его.
  13. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Это нормально. Там фактически тип нужен только для возможности обращения через точку. Чтобы конструктор знал реквизиты какого объекта предоставлять для выбора.
  14. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    для начала надо все из ексель файла прочитать в 1с. затем закончить работу с екселем и работать с данными уже в 1С. что-то типа такого:

    Процедура КнопкаВыполнитьНажатие(Кнопка)

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Если не Диалог.Выбрать() Тогда возврат; КонецЕсли;

    // начинаем работу с ексель
    Эксель = Новый COMОбъект("Excel.Application");
    Книга = Эксель.WorkBooks.Open(Диалог.ПолноеИмяФайла);
    Лист = Книга.WorkSheets(1);

    ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
    ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

    Область = Эксель.Range(Лист.Cells(1,1), Лист.Cells(ВсегоСтрок,ВсегоКолонок));
    МассивДанныхEXEL = Область.Value.Выгрузить();

    НомерДоговора = Лист.Cells(4,4).Text;

    // заканчиваем работу с ексель
    Эксель.Application.Quit();

    // грузим текстовые массивы в табличную часть
    Для Сч=9 По МассивДанныхEXEL[0].Количество()-2 Цикл

    СтрокаТабличнойЧасти1 = ТабличнаяЧасть1.Добавить();
    СтрокаТабличнойЧасти1.АртикулМагазина = МассивДанныхEXEL[1][Сч];
    СтрокаТабличнойЧасти1.АртикулПоставщика = МассивДанныхEXEL[2][Сч];
    СтрокаТабличнойЧасти1.Наименование = МассивДанныхEXEL[3][Сч];
    СтрокаТабличнойЧасти1.Количество = МассивДанныхEXEL[4][Сч];
    СтрокаТабличнойЧасти1.ЦенаПродаж = МассивДанныхEXEL[5][Сч];
    СтрокаТабличнойЧасти1.СуммаПродаж = МассивДанныхEXEL[6][Сч];
    СтрокаТабличнойЧасти1.ОтпускнаяСуммаКомитента = МассивДанныхEXEL[7][Сч];
    СтрокаТабличнойЧасти1.СуммаКОплатеКомитенту = МассивДанныхEXEL[8][Сч];
    СтрокаТабличнойЧасти1.НДС = МассивДанныхEXEL[9][Сч];
    СтрокаТабличнойЧасти1.СуммаСкидкиПоДисконтнойКарте = МассивДанныхEXEL[10][Сч];
    СтрокаТабличнойЧасти1.СуммаКомисионногоВознагрождения = МассивДанныхEXEL[11][Сч];

    КонецЦикла;

    КонецПроцедуры
    --- Объединение сообщений, 16 май 2014 ---
    дальше кидаете таблицу значений в запрос..
  15. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Просто вылетает вот такая ошибка
    Код:
    {Форма.Форма.Форма(31)}: Ошибка при вызове метода контекста (Выполнить)
        Выборка = Запрос.Выполнить().Выбрать();
    по причине:
    {(2, 2)}: Тип не может быть выбран в запросе
    <<?>>МояТаблицаСФормы.Референс1С,
    
    Я предположил, что это из-за этого.
  16. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    И еще, по Excel, заметил такое дело, что иногда при выходе из него процесс остается в памяти, но если переменной присвоить "Неопределено", тогда из памяти ОС точно уйдет (просто в примере нет этого) ;)
  17. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Возникает следующая ошибка
    Код:
    {Форма.Форма.Форма(31)}: Ошибка при вызове метода контекста (Выполнить)
        Выборка = Запрос.Выполнить().Выбрать();
    по причине:
    {(2, 2)}: Тип не может быть выбран в запросе
    <<?>>МояТаблицаСФормы.Референс1С,
    Она возникает из-за того, что тип колонок таблицы значение = КолонкаТаблицыЗначений, а нужна строка.
    Для этого я прочитал, нужно явно типизировать колонки ТЗ при ее создании, а получается, что я ее явн не создаю, она формируется при загрузки данных из excel в 1с.
    Как быть в этой ситуации??
  18. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Так. Поставьте точку останова когда начинается процедура обработки таблицы на форме. Т.е. Вы сначала загружаете из экселя в таблицу, а потом уже с этой таблицей работаете. Так вот, ставите точку останова, и смотрите что лежит в текущих данных, а конкретно, какое значение и какого типа в нужно колонке. Не должно быть там "КолонкаТаблицыЗначений".

    Если ничего не получится, тогда создаете промежуточную ТЗ, явно типизируете колонки и переносите данные из таблицы формы в эту таблицу, а потом уже ее подставляйте в запрос.

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