Полезная “фишка” 1С 8.3.10 – вывод произвольных данных в списках без потерь производительности



Сегодня – интересный технический прием для тех, кто занимается разработкой / доработкой конфигураций.

Разберем новую возможность платформы 8.3.10 – новое событие динамического списка ПриПолученииДанныхНаСервере.

Что это Вам даст:

  • Возможность вывода любой информации в список
  • Дополнительная оптимизация – данные извлекаются только для видимых строк

Разве этого не было раньше?

На первый взгляд это не отличается принципиально от того, что делали уже несколько лет – всегда можно добавить колонку и заполнить её запросом!

Да, можно было добавить колонку : ))

Но!

Разница в том, что в запросе нельзя вывести разнородную информацию в одно поле.

Плюс усложнение запроса приводит к тормозам при отображении списков документов.

В общем, посмотрите 10 минут видео, всё станет понятно :)

Видео – событие “ПриПолученииДанныхНаСервере” динамического списка

В видео рассмотрим вывод складских остатков по товарам с разбивкой по складам.

Эту задачу нельзя было решить через корректировку запроса динамического списка (в 8.3.9 и ранее).

Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3

Разработка и доработка интерфейсов – это, пожалуй, одна из самых распространенных задач на проектах. После прохождения курса Вы сможете создавать красивые и удобные формы любого уровня сложности, а также освоите Обычный, Управляемый интерфейс и Такси.

Поддержка тренера – 3 месяца. Объем курса – 49 учебных часов.

Не откладывайте свое обучение!

57 комментариев к “Полезная “фишка” 1С 8.3.10 – вывод произвольных данных в списках без потерь производительности

  1. Наталья Яковлева сказал:

    Огромное спасибо за эту статью и за курс “Профессиональная разработка интерфейсов и форм 1с 8.3”.
    В ERP 2.4 выполнила задачу, которая казалась нерешаемой или затратной.
    Познакомившись с данным способом ПриПолученииДанныхНаСервере, применила его для произвольной формы интерфейса и все получилось.

    Спасибо.

  2. Роман сказал:

    Отличный мастер-класс от команды профессионалов!
    А что если в запросе дин.списка не формировать пустое поле остаток? А вместо этого добавить новое поле в таблицу формы (не связанное с данными), и заполнять его через оформление ячейки… подобно тому как в ОФ методом УстановитьТекст().

    • Сергей Калинкин сказал:

      Добрый день, Роман! К сожалению, в УФ в таблицу формы динамического списка нельзя добавить поле не связанное с данными.

      • Роман сказал:

        Здравствуйте Сергей! Да, такой финт и вправду не получится. А точнее поле можно добавить, но оно не отобразится без указания связи с данными. Тогда получается продемонстрированный Вами способ является единственным аналогом события “ПриВыводеСтроки()” обычного приложения.
        А возможно ли как то передать в эту процедуру инициализированное значение внешней обработки или СОМ-объекта? чтобы каждый раз не инициализировать его при очередном вызове.

        • Сергей Калинкин сказал:

          Добрый день, Роман! Корректного способа нет, но можно попробовать использовать временное хранилище.
          Общий план такой:
          1. При открытии формы инициализируем СОМ-объект, помещаем его в структуру(чтобы ошибок не возникало, так как в хранилище можно помещать только сериализуемые значения, а СОМ-объекты к ним не относятся). Далее структуру помещаем во временное хранилище и полученный адрес помещаем в дополнительные свойства списка.
          2. В событии “ПриПолученииДанныхНаСервере” получаем данные из хранилища, проверяем “живой” ли СОМ-объект, если его нет (такое может случится, если хранилище сбрасывалось на диск), тогда придется создавать новый, ну а если есть, тогда пользуемся.

          Это все в теории, можете самостоятельно попробовать на практике. Других вариантов я не вижу.

  3. Даниленко Тимур сказал:

    Здравствуйте. Столкнулся вот с какой проблемой: Динамический список, основная таблица Регистр сведений (независимый, непериодический с одним измерением и тремя ресурсами). Добавил два поля для расчета в обработчике “ПриПолученииДанныхНаСервере” (Неопределенно и Ложь). Для правильной работы мне нужно поле из списка. Но в структуре “Данные” доступны только неопределенные поля. Для упрощения приведу запрос:

    ВЫБРАТЬ
        ДополнительныеРеквизитыФайлов.Файл КАК Файл,
        ДополнительныеРеквизитыФайлов.ВидФайла КАК ВидФайла,
        ДополнительныеРеквизитыФайлов.ТехническоеОписание КАК ТехническоеОписание,
        ДополнительныеРеквизитыФайлов.Сделка КАК Сделка,
        НЕОПРЕДЕЛЕНО КАК ВладелецФайла,
        ЛОЖЬ КАК ВладелецФайлаОграниченПоПравам
    ИЗ
        РегистрСведений.ДополнительныеРеквизитыФайлов КАК ДополнительныеРеквизитыФайлов

    Чтобы заполнить два последних поля, мне нужно поле “Файл”. Как до него добраться?
    Ожидая Ваш вопрос почему мне напрямую не вытащить “ВладельцаФайла” отвечу: Пользователю с ограниченными правами доступны не все таблицы и возникает ошибка с полем “ВладлецФайла” в справочниках (присоединенные файлы). Конфигурация ERP, платформа 8.3.12.1412, режим совместимости не используется.
    Нюанс: основная таблица не была указана, но после указания стало еще хуже, т.к. теперь ограниченному пользователю не доступно поле “Файл” (ОпределяемыйТип.ПрисоединенныйФайл) :(

    • Даниленко Тимур сказал:

      Решил вопрос: Во-первых не была указана основная таблица (ну бывает), немного расширил права на регистр и на его поля (на всякий случай на все). И все поля стали доступны.
      Всем спасибо.

  4. marivgo сказал:

    Сергей, спасибо большое! Как всегда, материал на высоте. Вы наш проводник в мир управляемого интерфейса!:)

    Всех с наступившим Новым годом!

    • Сергей Калинкин сказал:

      Картинку можно вывести, а вот нумерацию строк в динамическом списке (если я правильно понял вопрос) нет.

  5. Александр Хомяк сказал:

    Хочу указать на маленькую ошибочку в оптимальности. Вы написали в параметрах виртуальной таблицы условие ИЛИ, а это крайне нежелательно делать и тут в какой-то из моментов запрос может себя вести по -разному и оптимизатор не факт, что будет угадывать с индекс сиком.

    Переделайте эту часть.

    • Сергей Калинкин сказал:

      В какой именно момент оптимизатор не будет угадывать, уточните.

      • Александр Хомяк сказал:

        Условие ИЛИ оптимизатор не знает как себя вести, для этого рекомендации использовать объединение запросов но использовать условие И – классика. Ну это же из курсов вашего коллеги Андрея Бурмистрова :)

        Ну да конечно, что если взять к примеру порцию 70 записей это зависит от прокрутки и экрана допустим у меня очень большой экран. То скорее всего будет применятся не индекс сик, а сканирование индекса Будет сканироваться таблица регистра на вхождения склада, да конечно вы накроете по кластерному индексу товарами (хотя и тоже не факт)…

        Я к тому веду, что запрос и в этом случае будет быстрым потому как порция небольшая. Но если регистр будет огромнейший более несколько миллионов то тут уже будут потери производительности.

        Я к чему веду, если вы уж так статью пишите о производительности то и код должен быть 100% максимально идиален.

        А еще у Вас потери производительности на сортировке. Вы применили сортировку склада по имени обращаясь к складу через точку. Ну скорее всего потери получения наименования не должно быть поскольку склад должен быть покрыт кластерным индесом и данные должны лежать уже на уровне В-дерева (но это все надо перепроверить).

        Но вот сортировка сожрет большой процент!

        • Евгений Гилев (Мастер-тренер) сказал:

          Добрый день, Александр!

          Речь шла про оптимизацию платформы – сложный расчет колонок будет вестись только для отображаемых строк.

          А так Вы правы – нужно проанализировать план запрос, выявить проблемы. Если проблемы есть переписать запрос, ещё раз сформировать план запроса и т.д.

          Но в этом видео мы использовали максимально простое решение, чтобы не отвлекать от основной идеи видео – новой возможности платформы :)

          • marivgo сказал:

            Если бы оптимизатор строил план запроса, уже зная фактическое значение параметра &ЕстьСклад, то он мог бы сам либо отбросить условие ИЛИ (если параметр равен Истина) или преобразовать его в И (если параметр равен Ложь). Но я не знаю, возможно ли такое, анализируются ли фактические значения параметров перед построением плана выполнения запроса.

            • Евгений Гилев (Мастер-тренер) сказал:

              Вряд ли будет анализироваться значение параметра.
              Но в любом случае правило железное – вначале нужно проверить на тестовой базе (копии базы с реальными данными).

  6. GriZZZLee сказал:

    Шедеврально! С наступающим!
    ЗЫ: купил 11 курсов, до лета, постараюсь, всем овладеть.

    • Евгений Гилев (Мастер-тренер) сказал:

      Отличный задел для профессионального роста :)
      Желаю все курсы успешно завершить, с наступающим! )

  7. Денис сказал:

    Добрый день.

    Выложите, пожалуйста, конфигурацию с демонстрацией примера из видео.

    • Насипов Фарит сказал:

      Денис, мы конфигурации не выкладываем, кроме специально созданных для учебных курсов. А они публикуются только в Мастер-группах.

  8. Xershi сказал:

    Наконец допили УФ до уровня ОФ.
    Кстати в режиме совместимости этого обработчика еще нет?
    У нас конфигурации на 8.3.7 и 8.3.8 в совместимости сидят.

    • Сергей Калинкин сказал:

      Добрый день! Работает только если в свойствах конфигурации установлен режим совместимости 8.3.8 и выше.

  9. vpetunin сказал:

    На конфигурациях у которых включен режим совместимости с младшими платформами я так понимаю этот метод работать не будет? Источник: ©Курсы-по-1С.рф

    • Сергей Калинкин сказал:

      Добрый день! Работает только если в свойствах конфигурации установлен режим совместимости 8.3.8 и выше.

  10. Александр сказал:

    Замечательно! Пока не пользовался этим обработчиком, но теперь буду.

  11. gosn1ck сказал:

    Наконец-то, кто-то объяснил нормально как с новым обработчиком работать. Спасибо!

      • gosn1ck сказал:

        Единственный вопрос возник о ПолучитьКлючи(). как вы поняли что там номенклатура? можно ли в этом обработчики получить данные других колонок?

        • Сергей Калинкин сказал:

          Добрый день!
          Самый простой вариант это посмотреть в отладке :) . На самом деле у каждой таблицы есть ключ. Например, у справочников, документов и тп – это ссылка. Для регистров сведений – это ключ записи (содержит значения всех измерений).

          Вот пример цикла, чтобы считать данные любой колонки для отображаемых строк:
          мСсылки = Строки.ПолучитьКлючи();
          Для каждого Ссылка Из мСсылки Цикл
          СтрокаСписка = Строки[Ссылка];
          СтрокаСписка.Данные.ИмяКолонки …
          КонецЦикла;

  12. Илья Низамов сказал:

    Такая скидка, а большая часть необходимых курсов уже куплена ) Всех с наступающим!

  13. Дмитрий сказал:

    По факту – получается запрос в цикле? Где цикл инициирует сам пользователь, вертя экраном.

    • Сергей Калинкин сказал:

      Добрый день, Дмитрий! С такой формулировкой любой динамический список — это запрос в цикле, так как при прокрутке списка данные дочитываются из БД.

  14. vkozak сказал:

    Отличное, информативное видео. Спасибо, сам бы до этого не докопался.

  15. bot12345 сказал:

    Все новое – хорошо забытое старое :) Понемногу в 8.3 добавляется то, к чему привыкли в 8.1.

  16. dimap сказал:

    Очень хороший пример. Получается, туда же можно запихнуть пиктограммы ?

    • Сергей Калинкин сказал:

      Добрый день! Из оформления ячеек, к сожалению, доступно совсем немного вариантов: цвет фона, цвет текста, шрифт, горизонтальное положение, формат.
      Если говорить про вывод пиктограмм,то это простая задача, которая легко решается и без этого механизма. Достаточно к списку подключить коллекцию пиктограмм и сформировать колонку, содержащую номер пиктограммы из коллекции.
      Если же речь идет о пиктограммах, которые хранятся в базе, как картинки, тогда да, можно. Нужно получить навигационные ссылки на пиктограммы и прописать в колонку.

  17. Сергей сказал:

    Доброе утро!

    Очень похоже, что видео из курса по разработке интерфейса – но такого видео-урока я там не помню… Или это видео просто как отдельная статья? )

    • Евгений Гилев (Мастер-тренер) сказал:

      Добрый день!

      Это новое видео, которое в ближайшее время войдет в курс :)

        • Евгений Гилев (Мастер-тренер) сказал:

          В курс “Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3”

          • Ketevan сказал:

            Добрый день.
            Если сейчас брать этот курс, новые видео будут доступны в нём?

            • Евгений Гилев (Мастер-тренер) сказал:

              Конечно :)

              Только чуть позже, сейчас пока саппорт загружен работой с акционными заказами.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Мы используем файлы cookies, чтобы сделать сайт удобнее.
Продолжая просмотр сайта, Вы соглашаетесь с их использованием.
Подробнее