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

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

  1. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Запись в регистр сведений делаю так.
    Можно ли как-то повысить быстродействие этого кода?
    Условие регистр не должен блокироваться для записи другими пользователями, в момент выполнения этого кода.
    Структура регистра
    СтрРегистра.png
    Код:
    Для Каждого ТекШина Из ВеткаДанных Цикл
            ДанныеПоCAE = ТаблицаНоменклатураПоставщика.Найти(ТекШина.CAE, "Артикул");
            Если ДанныеПоCAE = Неопределено Тогда
                ЕстьОшибка = Истина;
                Продолжить;
            КонецЕсли;
           
            ЗаписьОстаткиТоваровУПоставщиков.НоменклатураПоставщика     = ДанныеПоCAE.НоменклатураПоставщика;      // сделать по коду
            ЗаписьОстаткиТоваровУПоставщиков.Номенклатура                = ДанныеПоCAE.Номенклатура;
            ЗаписьОстаткиТоваровУПоставщиков.Поставщик                   = Поставщик;
           
            Для Каждого ТекСкладПоставщика Из СоответствиеСкладов Цикл
                ЗаписьОстаткиТоваровУПоставщиков.СкладПоставщика         = ТекСкладПоставщика.Значение;
                ЗаписьОстаткиТоваровУПоставщиков.Прочитать();
                Попытка
                    НовоеЗначение        = Число(СокрЛП(СтрЗаменить(ТекШина[ТекСкладПоставщика.Ключ], "более","")));
                Исключение
                    ЕстьОшибка = Истина;   
                КонецПопытки;
               
                ЗаписьОстаткиТоваровУПоставщиков.НоменклатураПоставщика    = ДанныеПоCAE.НоменклатураПоставщика;
                ЗаписьОстаткиТоваровУПоставщиков.Номенклатура             = ДанныеПоCAE.Номенклатура;
                ЗаписьОстаткиТоваровУПоставщиков.Поставщик                = Поставщик;
                ЗаписьОстаткиТоваровУПоставщиков.СкладПоставщика        = ТекСкладПоставщика.Значение;
                Если ЗаписьОстаткиТоваровУПоставщиков.ВНаличии <> НовоеЗначение Тогда
                    ЗаписьОстаткиТоваровУПоставщиков.ВНаличии = НовоеЗначение;
                    Если НовоеЗначение = 0 Тогда
                        // Необходимо убрать поставщика из рекомендованных, если остаток 0
                        ЗаписьРекомендованныйПоставщик = РегистрыСведений.РекомендованныйПоставщикПриПродажиПодЗаказ.СоздатьМенеджерЗаписи();
                        ЗаписьРекомендованныйПоставщик.Номенклатура     = ДанныеПоCAE.Номенклатура;
                        ЗаписьРекомендованныйПоставщик.Характеристика     = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
                        ЗаписьРекомендованныйПоставщик.Прочитать();
                        Если ЗаписьРекомендованныйПоставщик.Выбран()
                            И ЗаписьРекомендованныйПоставщик.СкладПоставщика = ТекСкладПоставщика.Значение
                            И ЗаписьРекомендованныйПоставщик.НоменклатураПоставщика = ДанныеПоCAE.НоменклатураПоставщика Тогда
                           
                            ЗаписьРекомендованныйПоставщик.Удалить();
                        КонецЕсли;
                        // --
                    КонецЕсли;
                    ЗаписьОстаткиТоваровУПоставщиков.Записать();
                КонецЕсли;
               
            КонецЦикла;
           
        КонецЦикла;
    
    --- Объединение сообщений, 12 сен 2016 ---
    Дополню:
    ТаблицаНоменклатураПоставщика проиндексирвоана.
  2. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Код:
       Попытка
                    НовоеЗначение        = Число(СокрЛП(СтрЗаменить(ТекШина[ТекСкладПоставщика.Ключ], "более","")));
                Исключение
                    ЕстьОшибка = Истина;  
                КонецПопытки;
    За такой код в нормальных конторах руки отрывают...
    И вот за это....
  3. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Обоснуй, пожалуйста
    --- Объединение сообщений, 12 сен 2016 ---
    По второму, прдположу, строку
    Код:
    ЗаписьРекомендованныйПоставщик = РегистрыСведений.РекомендованныйПоставщикПриПродажиПодЗаказ.СоздатьМенеджерЗаписи();
    вынести перед циклом?
  4. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Вова это всё написано в стандартах разработки на ИТС. Читать надо бы их....
    Нельзя в попытке делать приведение типов.
    Нельзя перехватывать исключение без записи подробной ошибки в тех журнал.

    То же и по созданию МенеджераЗаписи. Он очень медленный и предназначен для записи одного значения. При работе менеджера записи запись в базу выполнятся 2 раза, первый раз записывается пустой набор, а второй раз твои значения(хотя это не точно... могу ошибаться).
    Но косяк тут в том что ты обрабатываешь это в цикле. И в цикле ты очень много раз создаёшь объект "МенеджерЗаписи". За множественное создание объектов то же по рукам дают. Это то же ошибка.
    Тебе по правильному надо использовать НаборЗаписей регистра. Который ты инициализирушь до своих циклов, в цикле по условию заполняешь, после цикла записываешь.
  5. 1с-ник
    Offline

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

    Регистрация:
    5 окт 2014
    Сообщения:
    303
    Симпатии:
    49
    Баллы:
    54
    Что за бред? Т.е. ты всегда набором пользуешься, даже когда он не нужен?)
    По теме: Отладка->Замеры производительности.
  6. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Вова по приведению типов выдержка из ИТС:

    --- Объединение сообщений, 12 сен 2016 ---
    Внимательно прочитай что я написал.
    Svb нравится это.
  7. TopicStarter Overlay
    Svb
    Offline

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

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

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Уверен что по одной?
    Почему именно по одной?
  9. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    За "привести значение" - спасибо. Интересно, корабль то быстрее поплывет? ))
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Если ты начнешь записывать данные в регистр наборами - ты снесешь все, что не вошло в набор.
  11. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    а почему по одной записи то?
    --- Объединение сообщений, 12 сен 2016 ---
    Ну у набора записей при записи там есть параметр или перезаписывать или добавлять
  12. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Правильно отбор надо накладывать....
    Тут от задачи зависит. Но рекомендация 1С если пишется что то в цикле и этом можно вынести в Набор то нужно выносить в набор... у него по сравнению с Менеджером производительность выше.
  13. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Потому что другие в этот регистр тоже должны иметь возможность писать / читать.
  14. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    на счёт быстрее поплывёт не факт. Но так правильнее с точки зрения методологии.
  15. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    ПривестиЗначение не подходит.
    Если пришло на вход значение "х323", то метод вернет мне 0. А это не правильно. Я должен знать об ошибке.
  16. TODD22
    Offline

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

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

    Yurifm Новичок в 1С

    Регистрация:
    29 май 2015
    Сообщения:
    15
    Симпатии:
    3
    Баллы:
    4
    цикл в цикле)) вы серьезно? тут нужно постараться выборку делать запросом, т.к. постоянное идет обращение к БД да и еще цикл в цикле
    + Боря явно указал что, идет создание объекта менеджер записи.
    + попытка. такое лучше конечно не писать. хотя на производительность сильно не повлияет.

    и набором записей нужно записывать
  18. TopicStarter Overlay
    Svb
    Offline

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

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    А если я их пишу свои данные 4 минуты. Остальные в это время ловят конфликт блокировок?
    --- Объединение сообщений, 12 сен 2016 ---
    Есть вариант обойти цикл в цикле?
  19. TODD22
    Offline

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

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Управляемые блокировки....
    --- Объединение сообщений, 12 сен 2016 ---
    Вова вообще оптимизацию производительности нужно начинать с замера этой самой производительности... А то может у тебя вообще не в этом участке кода тормоза....
  20. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    ну а почему ты думаешь что у остальных будут болкировки прям уж - ты наблюдал.? мы же тебе не говорим прям весь регистр блокировать.
    Пользователь не сможет записать если ты ему заблокируешь все записи с таким же измерением.
    Что тебе мешает делать отборы не по одной записи, а набором по 2,3 измерениям , и уж если учитывать вариант что с отбором там будет много записей, в чем я вильно сомневаюсь - пиши их в потки (многопоточность)

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