8.х Запись в регистр сведений

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

  1. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Запрос не предлагать?
  2. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Есть две обработки, которые пишут в этот регистр. Первая, она вообще его очищает целиком и записывает данные в него. Вторая, как раз та про которую идет речь, данные перезаписывает выборочно: но общий объем перезаписанных данных составляет от 10 до 25% всех записей регистра, а в сезон может и до 50% доходить. Так вот нельзя первую обработку заставлять ждать.
    --- Объединение сообщений, 12 сен 2016 ---
    Запрос, хорошая тема. Но в запрос надо передать данные на вход (код САЕ, остаток (уже приведенный к числу), склад поставщика). Эти данные надо прочитать из XML и подготовить для передачи в запрос. Эти же цикл в цикле и останутся.
  3. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Сделай их последовательное выполнение.
    --- Объединение сообщений, 12 сен 2016 ---
    То есть включи обе обработки в один общий процесс.
    Первая стартует и записывает данные, вторая после обрабатывает.
    --- Объединение сообщений, 12 сен 2016 ---
    Вова какой вообще смысл выполнять одновременно обе обработки если первая перезапишет регистр полностью пока вторая выполняется?
  4. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Нельзя, Борь. Так построен процесс, так работают люди. Менять бизнесс-процесс в компапнии это уже совсем другая история.
    --- Объединение сообщений, 12 сен 2016 ---
    Вобщем, как итог, вынес создание менеджера записи перед циклом. Метод "ПривестиЗначение()" не подошел ((
    В остальных предложениях, явного выигрыша не вижу.
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Так если случится так, что запись уже есть, то вылезет ошибка.
  6. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Вова так как он устроен?
    Если с твоих слов первая обработка очищает регистр и записывает туда новые значения. А вторая эти значения обрабатывает. Что будет когда они одновременно запустятся?
    Первая будет очищать и переписывать весь регистр. Тогда что будет делать вторая обработка в этот момент? Дальше спокойно обрабатывать записи ? В чём смысл тогда?
  7. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Вторая обработка в этот момент не отработает. Отработает значит, через 10 минут. Главное чтобы не было проблем у первой. ))
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Володя, выполняй запись транзакциями по 500-1000 элементов, используя управляемые блокировки.
    Но мне пока тоже не совсем понятно если есть одна обработка, полностью обнуляющая регистр и она чего-то там периодически делает, то какой смысл во второй обработке?
  9. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Вторая обработка должна более-менее оперативно обновлять сведения об остатках поставщиков в нашей 1С.
    Первая, она помимо остатков, еще и цены считает и рекомендованного поставщика выбирает. Она очень долгая (40 мин) и очень важная.
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Ну разбивай тогда по поставщикам, по складам поставщиков и пиши набором записей, но с наборами нужно вообще осторожно быть....
  11. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Код:
        ЕстьОшибка = Ложь;
       
        ТипАдрес = ФабрикаXDTO.Тип("ЧтениеОстатковПоставщиков", "ххх");
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.ОткрытьФайл(Параметры.ФайлНаДиске);
    
        Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
       
        ТаблицаИзФайла = Новый ТаблицаЗначений;
        ТаблицаИзФайла.Колонки.Добавить("CAE", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20)));
        ТаблицаИзФайла.Колонки.Добавить("ИдентификаторСклада", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(10)));
        ТаблицаИзФайла.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
       
        ПИШ_ОбработатьВеткуДанных(Данные.tires,            ТаблицаИзФайла);   
        ПИШ_ОбработатьВеткуДанных(Данные.rims,             ТаблицаИзФайла);   
        ПИШ_ОбработатьВеткуДанных(Данные.spare_parts,     ТаблицаИзФайла);
    
       
        Запрос = Новый Запрос();
        Запрос.УстановитьПараметр("ТаблицаИзФайла", ТаблицаИзФайла);
        Запрос.УстановитьПараметр("Поставщик", Параметры.Поставщик);
        Запрос.Текст = "ВЫБРАТЬ
                       |    ТаблицаИзФайла.cae КАК cae,
                       |    ТаблицаИзФайла.ИдентификаторСклада КАК ИдентификаторСклада,
                       |    ТаблицаИзФайла.Остаток
                       |ПОМЕСТИТЬ втТаблицаИзФайла
                       |ИЗ
                       |    &ТаблицаИзФайла КАК ТаблицаИзФайла
                       |
                       |ИНДЕКСИРОВАТЬ ПО
                       |    cae,
                       |    ИдентификаторСклада
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    СкладыПоставщиков.Ссылка КАК СкладПоставщика,
                       |    ВЫБОР
                       |        КОГДА СкладыПоставщиков.ИдентификаторСкладаДляЗагрузкиИзXML = """"
                       |            ТОГДА ЛОЖЬ
                       |        ИНАЧЕ ИСТИНА
                       |    КОНЕЦ КАК ВключенаЗагрузкаПоСкладу,
                       |    СкладыПоставщиков.ИдентификаторСкладаДляЗагрузкиИзXML КАК ИдентификаторСклада
                       |ПОМЕСТИТЬ втСкладыПоставщика
                       |ИЗ
                       |    Справочник.СкладыПоставщиков КАК СкладыПоставщиков
                       |ГДЕ
                       |    СкладыПоставщиков.Владелец = &Поставщик
                       |    И СкладыПоставщиков.ИдентификаторСкладаДляЗагрузкиИзXML <> """"
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    втТаблицаИзФайла.cae,
                       |    НоменклатураПоставщиков.Ссылка КАК НоменклатураПоставщика,
                       |    НоменклатураПоставщиков.Номенклатура,
                       |    НоменклатураПоставщиков.Характеристика,
                       |    втТаблицаИзФайла.ИдентификаторСклада,
                       |    втТаблицаИзФайла.Остаток
                       |ПОМЕСТИТЬ втТаблицаОстатков
                       |ИЗ
                       |    втТаблицаИзФайла КАК втТаблицаИзФайла
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.НоменклатураПоставщиков КАК НоменклатураПоставщиков
                       |        ПО втТаблицаИзФайла.cae = НоменклатураПоставщиков.Артикул
                       |ГДЕ
                       |    НоменклатураПоставщиков.Владелец = &Поставщик
                       |    И НоменклатураПоставщиков.ПометкаУдаления = ЛОЖЬ
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    втТаблицаОстатков.cae,
                       |    &Поставщик КАК Поставщик,
                       |    втТаблицаОстатков.НоменклатураПоставщика КАК НоменклатураПоставщика,
                       |    втТаблицаОстатков.Номенклатура КАК Номенклатура,
                       |    втТаблицаОстатков.Характеристика,
                       |    втТаблицаОстатков.ИдентификаторСклада,
                       |    втТаблицаОстатков.Остаток,
                       |    втСкладыПоставщика.СкладПоставщика КАК СкладПоставщика,
                       |    втСкладыПоставщика.ВключенаЗагрузкаПоСкладу
                       |ПОМЕСТИТЬ втТаблицаПоСкладам
                       |ИЗ
                       |    втТаблицаОстатков КАК втТаблицаОстатков
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втСкладыПоставщика КАК втСкладыПоставщика
                       |        ПО втТаблицаОстатков.ИдентификаторСклада = втСкладыПоставщика.ИдентификаторСклада
                       |            И (втСкладыПоставщика.ВключенаЗагрузкаПоСкладу = ИСТИНА)
                       |
                       |ИНДЕКСИРОВАТЬ ПО
                       |    НоменклатураПоставщика,
                       |    Номенклатура,
                       |    СкладПоставщика,
                       |    Поставщик
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ОстаткиТоваровУПоставщиков.НоменклатураПоставщика КАК НоменклатураПоставщика,
                       |    ОстаткиТоваровУПоставщиков.Номенклатура КАК Номенклатура,
                       |    ОстаткиТоваровУПоставщиков.Поставщик КАК Поставщик,
                       |    ОстаткиТоваровУПоставщиков.СкладПоставщика КАК СкладПоставщика,
                       |    ОстаткиТоваровУПоставщиков.ВНаличии,
                       |    ОстаткиТоваровУПоставщиков.Цена
                       |ПОМЕСТИТЬ втТекущиеОстаткиПоВключеннымСкладам
                       |ИЗ
                       |    РегистрСведений.ОстаткиТоваровУПоставщиков КАК ОстаткиТоваровУПоставщиков
                       |ГДЕ
                       |    ОстаткиТоваровУПоставщиков.Поставщик = &Поставщик
                       |
                       |ИНДЕКСИРОВАТЬ ПО
                       |    НоменклатураПоставщика,
                       |    Номенклатура,
                       |    Поставщик,
                       |    СкладПоставщика
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ЕСТЬNULL(втТекущиеОстаткиПоВключеннымСкладам.НоменклатураПоставщика, втТаблицаПоСкладам.НоменклатураПоставщика) КАК НоменклатураПоставщика,
                       |    ЕСТЬNULL(втТекущиеОстаткиПоВключеннымСкладам.Номенклатура, втТаблицаПоСкладам.Номенклатура) КАК Номенклатура,
                       |    ЕСТЬNULL(втТекущиеОстаткиПоВключеннымСкладам.Поставщик, втТаблицаПоСкладам.Поставщик) КАК Поставщик,
                       |    ЕСТЬNULL(втТекущиеОстаткиПоВключеннымСкладам.СкладПоставщика, втТаблицаПоСкладам.СкладПоставщика) КАК СкладПоставщика,
                       |    ВЫБОР
                       |        КОГДА втТаблицаПоСкладам.ВключенаЗагрузкаПоСкладу
                       |            ТОГДА ЕСТЬNULL(втТаблицаПоСкладам.Остаток, 0)
                       |        ИНАЧЕ втТекущиеОстаткиПоВключеннымСкладам.ВНаличии
                       |    КОНЕЦ КАК ВНаличии,
                       |    ЕСТЬNULL(втТекущиеОстаткиПоВключеннымСкладам.Цена, 0) КАК Цена
                       |ИЗ
                       |    втТекущиеОстаткиПоВключеннымСкладам КАК втТекущиеОстаткиПоВключеннымСкладам
                       |        ПОЛНОЕ СОЕДИНЕНИЕ втТаблицаПоСкладам КАК втТаблицаПоСкладам
                       |        ПО втТекущиеОстаткиПоВключеннымСкладам.НоменклатураПоставщика = втТаблицаПоСкладам.НоменклатураПоставщика
                       |            И втТекущиеОстаткиПоВключеннымСкладам.Номенклатура = втТаблицаПоСкладам.Номенклатура
                       |            И втТекущиеОстаткиПоВключеннымСкладам.Поставщик = втТаблицаПоСкладам.Поставщик
                       |            И втТекущиеОстаткиПоВключеннымСкладам.СкладПоставщика = втТаблицаПоСкладам.СкладПоставщика
                       |";
                  
        // Блокировка данных                  
                      
        НаборЗаписей = РегистрыСведений.ОстаткиТоваровУПоставщиков.СоздатьНаборЗаписей();
       
        Результат = Запрос.Выполнить();
        НаборЗаписей.Отбор.Поставщик.Установить(Параметры.Поставщик);
        ТаблицаНабораЗаписей = Результат.Выгрузить();
        НаборЗаписей.Загрузить(ТаблицаНабораЗаписей);
        НаборЗаписей.Записать(ИСТИНА);
               
        Возврат Новый Структура();
    
  12. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Убери полное соединение и сделай объединение.

    Какой смысл возвращать пустую структуру?

    Еще мне не понятно:
    Код:
    ВЫБРАТЬ
                       |    СкладыПоставщиков.Ссылка КАК СкладПоставщика,
                       |    ВЫБОР
                       |        КОГДА СкладыПоставщиков.ИдентификаторСкладаДляЗагрузкиИзXML = """"
                       |            ТОГДА ЛОЖЬ
                       |        ИНАЧЕ ИСТИНА
                       |    КОНЕЦ КАК ВключенаЗагрузкаПоСкладу,
                       |    СкладыПоставщиков.ИдентификаторСкладаДляЗагрузкиИзXML КАК ИдентификаторСклада
                       |ПОМЕСТИТЬ втСкладыПоставщика
                       |ИЗ
                       |    Справочник.СкладыПоставщиков КАК СкладыПоставщиков
                       |ГДЕ
                       |    СкладыПоставщиков.Владелец = &Поставщик
                       |    И СкладыПоставщиков.ИдентификаторСкладаДляЗагрузкиИзXML <> """"
    Ты выбираешь все, что <> "", но проверяешь при этом поле = "" - убери проверку.
  13. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Пустая структура, это зачатие возвращаемой информации об ошибке.
    Объединение? А что это даст?
  14. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Объединение даст ускорение выполнения запроса.
  15. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Не, я думаю "Объединение" тут не получится
    --- Объединение сообщений, 14 сен 2016 ---
    Чистое объединение не получится, все равно надо в одном из запросов объединения делать соединение внутреннее
  16. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Очень даже получится :)
    ты ж в итоге получаешь то, что у тебя уже есть + то, что изменилось в файле
    --- Объединение сообщений, 14 сен 2016 ---
    Одно соединение всяко быстрее двух :)
  17. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Можно сократить количество запросов: в первом запросе сразу соединяй с номенклатурой и складами.
  18. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А в чем вообще проблема, оно долго работает или вообще не работает или что?
  19. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    да у Володи задача максимально быстро струячить в РС кучу записей.
  20. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Ну я понимаю, а сейчас проблема то в чем? :)

    Надо выяснить какое место занимает больше всего времени.
    Для начала разбираемся с запросом. Комментарии выше были. Это и убрать поле ВключенаЗагрузкаПоСкладу, и убрать лишние таблицы, там двумя-тремя на первый взгляд сделать можно, ну и тип соединения обоснованный выбрать.
    Далее для начала я бы вообще убрал все индексации.
    Далее необходимо замерить время выполнения запроса. Там внешняя таблица, если консоль запросов позволяет как-то эти данные вставить, то ок через консоль запросов производительность тестируем, если нет, то тупо ставим цикл (только на выполнение этого запроса, без всяких последующих записей куда либо) скажем 100 раз, смотрим время (тупо можно ТекущаяДата()). Далее берем, добавляем поля для индексирования, замер, в итоге смотрим увеличилось или уменьшилось время выполнения. Оптимизируем таким образом запрос.

    Запрос отладили, разбираемся с записью.
    Смотрим через набор или через менеджер писать (я кстати не понял почему вынос менеджера за цикл не получился, где-то выше здесь было) (опять в цикле скажем 10 раз прогоняем набор для записи замеряя время).

    Ну как-то так.
    Svb нравится это.

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