Сегодня – интересный технический прием для тех, кто занимается разработкой / доработкой конфигураций.
Начиная с версии платформы 8.3.10 работает новое событие динамического списка ПриПолученииДанныхНаСервере.
Что это Вам даст:
- Возможность вывода любой информации в список
- Дополнительная оптимизация – данные извлекаются только для видимых строк
Разве этого не было раньше?
На первый взгляд это не отличается принципиально от того, что делали уже несколько лет – всегда можно добавить колонку и заполнить её запросом!
Да, можно было добавить колонку : ))
Но!
Разница в том, что в запросе нельзя вывести разнородную информацию в одно поле.
Плюс усложнение запроса приводит к тормозам при отображении списков документов.
В общем, посмотрите 10 минут видео, всё станет понятно :)
Видео – событие “ПриПолученииДанныхНаСервере” динамического списка
В видео рассмотрим вывод складских остатков по товарам с разбивкой по складам.
Эту задачу нельзя было решить через корректировку запроса динамического списка (в 8.3.9 и ранее).
Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3
Разработка и доработка интерфейсов – это, пожалуй, одна из самых распространенных задач на проектах. После прохождения курса Вы сможете создавать красивые и удобные формы любого уровня сложности, а также освоите Обычный, Управляемый интерфейс и Такси.
Поддержка тренера – 3 месяца. Объем курса – 49 учебных часов.
Не откладывайте свое обучение!
Добрый день!
Подскажите, пожалуйста, можно ли каким либо образом программно изменить свойство динамического списка “ДинамическоеСчитываниеДанных” по событию получения дополнительной выборки данных.
Так, чтобы при начальном формировании динамического списка свойство ДинамическоеСчитываниеДанных было истина, а при получении первой дополнительной порции данных с сервере (при прокрутке) свойство менялось на ложь и запрашивались все доступные данные.
Свойство ДинамическоеСчитываниеДанных вроде программно доступно на запись. Но как получить событие считывание данных при скроле?
Событие “ПриПолученииДанныхНаСервере” выполняется на сервере без контекста. Есть ли известные варианты решения данной задачи?
Спасибо!
Добрый день!
Нет, не могу предложить решения задачи.
Событие без сомнения удобное. А если список строк большой, то как повторно вызывать это событие, если пользователь, к примеру скроллингом мыши ушел вниз. При скроллинге ведь никакое событие не формируется в 1С. Остается только нажатие на строку в списке чтобы вызвать ПриАктивизацииСтроки. Или есть еще какой-то вариант?
Добрый день!
Данное событие вызывается, когда при прокрутке динамического списка платформа считывает данные из базы данных. Если пользователь перемещается по уже считанным из базы данных строкам или прокручивает их, то считывания очередной порции данных не происходит, это событие не вызывается.
В видео было предложено обновлять данные при изменении склада, тогда происходит считывание данных, вызывается нужное событие. Поэтому можно предложить периодически обновлять данные списка (по кнопке или каждые Х секунд).
В табличном часть заполнено динамически колонки.
Как в цикле увидеть колонки?
Добрый день
Переформулируйте, пожалуйста, вопрос.
Не очень понятно что Вы хотите сделать
Добрый день
Подскажите, как можно делать сортировку по дополнительному полю Остаток. Сортировку кликом по заголовку поля в форме.
Если речь про пример из статьи/видео, то слава богу – никак.
Это динамический список, где данные получаются порциями. Данные колонки Остаток получаются отдельным запросом только по той порции строк, которые были получены динамическим списком в последнем запросе к базе (SELECT TOP 45 …. WHERE …). На момент получения порции данных еще нет данных по остаткам.
Да и вообще сортировка динамического списка по неиндексированным реквизитам да еще и из неосновной таблицы – плохая идея. Это одна из основных причин тормозов в динамических списках
Добрый день.
Пытаюсь использовать данный метод в расширении. Не получается. Выходит ошибка
Поле объекта не обнаружено (КомпановщикНастроек)
{ОстаткиПоставщика Справочник.Номенклатура.Форма.Форм
Дайте совет как исправить
Здравствуйте, Павел.
Наверное КомпоновщикНастроек, а не КомпановщикНастроек.
Отладчиком посмотрите
А вот тут не понятно
&НаКлиенте
Процедура Расш2_СкладПриИзменении(Элемент)
Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить(“Склад”, Склад);
Элементы.Список.Обновить();
КонецПроцедуры
у меня Динамическая таблица СписокНоменклатуры я ее соответственно и ставлю вместо Список
но валится на строке Элементы.СписокНоменклатуры.Обновить();
нет в элементах СписокНоменклатуры, как быть
еще раз уточняю у меня расширение
А что есть в элементах ?
Вы же откуда-то взяли название элемента СписокНоменклатуры.
Это Ваш код, я его не вижу
Проблема явно не в том, что у Вас расширение. Посмотрите внимательно на форму, как что называется, пройдитесь по коду с отладчиком.
Разобрался с предыдущим вопросом
Возник еще один
в запросе динамического списка строковое поле Остаток добавил, добавил его в ТЗ на форме
смотрю в отладчике у Строк в данных нет Остаток(добавленное поле)
Смешались в кучу кони-люди…
Динамический список, ТЗ (таблица значений ?), Строки в данных…
1) Павел, то что Вы делаете на своем компьютере, я не вижу.
2) Каким образом связаны Динамический список, запрос в нем и ТЗ ? Подозреваю, что то, что Вы пишете, не соответствует тем объектам и реквизитам, которые Вы имеете ввиду. Пользуйтесь официальной терминологией 1с, тогда Вас легче будет понять
3) В каком обработчике формы и у какого объекта Вы смотрите отладчиком Строки?
4) Формулируйте вопросы подробнее, со скриншотами, примерами кода, который не работает.
все сделано ровно так, как вы показываете в видео, но колонки Остаток нет
в этом куске стоят точки останова
СтрокаСписка = Строки[ВыборкаНоменклатура.Номенклатура];
СтрокаСписка.Данные.Остаток = Остатки;
как добавить скриншот?
Вышлите скриншоты, а лучше выгрузку базы на support@kursy-po-1c.ru. Поддержка мне передаст
Оказывается в комментариях к бесплатным статьям отключена возможность прикреплять файлы.
отправил скрины
базу не могу увы
Посмотрел, Вы пытаетесь дорабатывать УТ11, а не демо-конфигурацию, как на видео.
Вам нужно учесть, что в УТ 11 есть 2 таблицы с динамическим списком, проверьте, в какую Вы добавили колонку.
Кроме того, там много кода, скрывающего/добавляющего колонки, в зависимости от настроек.
Помимо запроса в свойствах ДС запрос в УТ может формироваться и в самих модулях, например, в УТ 11.5 в форме списка Номенклатуры, в процедуре ПриСозданииНаСервере, запрос формируется тут: РаботаСНоменклатуройУТ.ПолучитьДополненныйЗапросДинамическогоСписка(СвойстваСписка.ТекстЗапроса).
То есть сюда тоже надо добавлять поле Остаток
Спасибо за дополнение, Andrey.
А вообще в видео дан принцип как можно сделать. На простом примере.
В типовых часто приходится повозиться в поисках всех мест, где нужно внести изменения.
Здравствуйте! В платформе 8.3.16 СтрокаСписка.Оформление “Поле объекта не обнаружено”. Зато работает “СтрокаСписка.Значение.Оформление” (тип ОформлениеЯчеекДинамическогоСписка). Почему так? Или видео старое? В новом потоке по “Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3” будет обновленное?
Здравствуйте
Пересмотрите видео внимательно. В видео СтрокаСписка получается кодом
Строки имеют тип СтрокиДинамическогоСписка, который представляет собой коллекцию вида Ключ/Значение.
Собственно, Строки[Выборка.Товар] и есть Значение, так как в квадратных скобках указан ключ.
Если вы будете бежать по коллекции в цикле, то да, будете обращаться к оформлению через Значение
[cc]
Для каждого СтрокаСписка ИЗ Строки Цикл
СтрокаСписка.Значение.Оформление[“Остаток”].УстановитьЗначениеПараметра(< тут параметры>);
КонецЦикла;
Так что ошибки тут нет.
В планах есть обновление данного курса, точные сроки пока назвать не можем.
Спасибо. Статья очень пригодилась. Но, столкнулся с ситуацией.
СчетчикКонтейнеров = СчетчикКонтейнеров +1;
Если НЕ ПерваяСтрока Тогда
Контейнер=Контейнер+" : ";
КонецЕсли;
Контейнер = Контейнер + СокрЛП(ВыборкаДетальныеЗаписи.НомКон);
ПерваяСтрока=Ложь;
КонецЦикла;
СтрокаСписка = Строки[ВыборкаДвижениеПоСкладу.ДвижениеПоСкладу];
СтрокаСписка.Данные.Контейнер = Контейнер;
Если СчетчикКонтейнеров=2 Тогда
СтрокаСписка.Оформление["Контейнер"].УстановитьЗначениеПараметра("ЦветТекста", Webцвета.Зеленый);
ИначеЕсли СчетчикКонтейнеров=3 Тогда
СтрокаСписка.Оформление["Контейнер"].УстановитьЗначениеПараметра("ЦветТекста", Webцвета.СинеСерый);
ИначеЕсли СчетчикКонтейнеров=4 Тогда
СтрокаСписка.Оформление["Контейнер"].УстановитьЗначениеПараметра("ЦветТекста", Webцвета.СинеФиолетовый);
ИначеЕсли СчетчикКонтейнеров>4 Тогда
СтрокаСписка.Оформление["Контейнер"].УстановитьЗначениеПараметра("ЦветТекста", Webцвета.РыжеватоКоричневый);
КонецЕсли;
Для поля контейнер в списке установил галку “Использовать всегда” на случай скрытия поля пользователем.
Но при скрытии пользователем поля “Контейнер” в списке все равно не работает строка
СтрокаСписка.Оформление[“Контейнер”].УстановитьЗначениеПараметра(“ЦветТекста”, Webцвета.Зеленый);
Ругается на отсутствие поля Контейнер. Обошел через конструкцию “Попытка”.
Мне кажется, вариант не красивый. Есть какие-то другие способы на будущее?
Использовать всегда работает только для данных строки (СтрокаСписка.Значение.Данные.Контейнер).
Оформление же работает только для отображаемых колонок.
Как вариант, можно написать что-то типа
[cc]
Оформление = СтрокаСписка.Значение.Оформление.Получить(“Контейнер”);
Если Оформление <> Неопределено Тогда
Если СчетчикКонтейнеров=2 Тогда
Оформление.УстановитьЗначениеПараметра(“ЦветТекста”, Webцвета.Зеленый);
КонецЕсли;
КонецЕсли;
Платформа 1С:Предприятие 8.3 (8.3.13.1513).
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки).
Процедура — не вызывается.
Можете пояснить причину?
Добрый день, Дмитрий!
Вот текст из справки “Обработчик вызывается в режиме совместимости конфигурации Версия8_3_8 и выше”
Судя по всему у Вас в свойствах конфигурации установлен режим совместимости более ранней версии.
Жалко, что узнал об этом только сейчас. Спасибо!
Пожалуйста!
А не подскажите как вызвать событие ПриПолученииДанныхНаСервере без Элементы.ДинамическийСписок.Обновить()?
Дело в том что на мобильном устройстве, это событие отрабатывает достаточно долго, и обновляет весь список, а мне нужно обновить только одну строку (ну или хотя бы видимую область). Вот и получается что бы обновить 40 строк, я заново инициирую построение запроса
Добрый день! К сожалению, по поводу мобильной платформы ничего сказать не могу. Если говорить в общем, то событие ПриПолученииДанныхНаСервере связано именно с получением данных, а соответственно и с выполнением запроса. Не думаю, что получится обновить список без повторного выполнения запроса.
Форма подбора. Слева располагается ДеревоИерархии, справа от него ДинамическийСписок в который выводится номенклатура которая в Иерархии конкретно указанной ветки Дерева. В строка ДС (динамического списка) есть количество Номенклатуры выбранного в Корзину. Корзина – РегистрСведений. Когда пользователь нажимает в строке ДС в область колонки Выбранно в обработке Выбора идет внеконтекстная запись в РС Корзина, а потом Элементы.ДС.Обновить();
Проблема в том, что Чем больше содержание ветки дерева, тем дольше идет обновление. При этом, если бы эту же информацию получить в событии ПриПолученииДанныхНаСервере, то там всегда 42 строки, оходятся циклом. Но это событие вызвать просто можно только скролированием, которое к сожалению, не совсем адекватно в данном контексте. Метод УстановитьДействие(), работает только на сервере, но форма для контекстного вызова тяжеловата
Это было очень интересно! Спасибо
Пожалуйста!
Интересного обучения!
Огромное спасибо за эту статью и за курс “Профессиональная разработка интерфейсов и форм 1с 8.3”.
В ERP 2.4 выполнила задачу, которая казалась нерешаемой или затратной.
Познакомившись с данным способом ПриПолученииДанныхНаСервере, применила его для произвольной формы интерфейса и все получилось.
Спасибо.
Добрый день, а поиск по этой колонке получается не будет работать?
Добрый день!
Да, все верно.
Отличный мастер-класс от команды профессионалов!
А что если в запросе дин.списка не формировать пустое поле остаток? А вместо этого добавить новое поле в таблицу формы (не связанное с данными), и заполнять его через оформление ячейки… подобно тому как в ОФ методом УстановитьТекст().
Добрый день, Роман! К сожалению, в УФ в таблицу формы динамического списка нельзя добавить поле не связанное с данными.
Здравствуйте Сергей! Да, такой финт и вправду не получится. А точнее поле можно добавить, но оно не отобразится без указания связи с данными. Тогда получается продемонстрированный Вами способ является единственным аналогом события “ПриВыводеСтроки()” обычного приложения.
А возможно ли как то передать в эту процедуру инициализированное значение внешней обработки или СОМ-объекта? чтобы каждый раз не инициализировать его при очередном вызове.
Добрый день, Роман! Корректного способа нет, но можно попробовать использовать временное хранилище.
Общий план такой:
1. При открытии формы инициализируем СОМ-объект, помещаем его в структуру(чтобы ошибок не возникало, так как в хранилище можно помещать только сериализуемые значения, а СОМ-объекты к ним не относятся). Далее структуру помещаем во временное хранилище и полученный адрес помещаем в дополнительные свойства списка.
2. В событии “ПриПолученииДанныхНаСервере” получаем данные из хранилища, проверяем “живой” ли СОМ-объект, если его нет (такое может случится, если хранилище сбрасывалось на диск), тогда придется создавать новый, ну а если есть, тогда пользуемся.
Это все в теории, можете самостоятельно попробовать на практике. Других вариантов я не вижу.
Здравствуйте. Столкнулся вот с какой проблемой: Динамический список, основная таблица Регистр сведений (независимый, непериодический с одним измерением и тремя ресурсами). Добавил два поля для расчета в обработчике “ПриПолученииДанныхНаСервере” (Неопределенно и Ложь). Для правильной работы мне нужно поле из списка. Но в структуре “Данные” доступны только неопределенные поля. Для упрощения приведу запрос:
ДополнительныеРеквизитыФайлов.Файл КАК Файл,
ДополнительныеРеквизитыФайлов.ВидФайла КАК ВидФайла,
ДополнительныеРеквизитыФайлов.ТехническоеОписание КАК ТехническоеОписание,
ДополнительныеРеквизитыФайлов.Сделка КАК Сделка,
НЕОПРЕДЕЛЕНО КАК ВладелецФайла,
ЛОЖЬ КАК ВладелецФайлаОграниченПоПравам
ИЗ
РегистрСведений.ДополнительныеРеквизитыФайлов КАК ДополнительныеРеквизитыФайлов
Чтобы заполнить два последних поля, мне нужно поле “Файл”. Как до него добраться?
Ожидая Ваш вопрос почему мне напрямую не вытащить “ВладельцаФайла” отвечу: Пользователю с ограниченными правами доступны не все таблицы и возникает ошибка с полем “ВладлецФайла” в справочниках (присоединенные файлы). Конфигурация ERP, платформа 8.3.12.1412, режим совместимости не используется.
Нюанс: основная таблица не была указана, но после указания стало еще хуже, т.к. теперь ограниченному пользователю не доступно поле “Файл” (ОпределяемыйТип.ПрисоединенныйФайл) :(
Решил вопрос: Во-первых не была указана основная таблица (ну бывает), немного расширил права на регистр и на его поля (на всякий случай на все). И все поля стали доступны.
Всем спасибо.
Сергей, спасибо большое! Как всегда, материал на высоте. Вы наш проводник в мир управляемого интерфейса!:)
Всех с наступившим Новым годом!
А можно вывести цифры (строки) и картинку?
Картинку можно вывести, а вот нумерацию строк в динамическом списке (если я правильно понял вопрос) нет.
Хочу указать на маленькую ошибочку в оптимальности. Вы написали в параметрах виртуальной таблицы условие ИЛИ, а это крайне нежелательно делать и тут в какой-то из моментов запрос может себя вести по -разному и оптимизатор не факт, что будет угадывать с индекс сиком.
Переделайте эту часть.
В какой именно момент оптимизатор не будет угадывать, уточните.
Условие ИЛИ оптимизатор не знает как себя вести, для этого рекомендации использовать объединение запросов но использовать условие И – классика. Ну это же из курсов вашего коллеги Андрея Бурмистрова :)
Ну да конечно, что если взять к примеру порцию 70 записей это зависит от прокрутки и экрана допустим у меня очень большой экран. То скорее всего будет применятся не индекс сик, а сканирование индекса Будет сканироваться таблица регистра на вхождения склада, да конечно вы накроете по кластерному индексу товарами (хотя и тоже не факт)…
Я к тому веду, что запрос и в этом случае будет быстрым потому как порция небольшая. Но если регистр будет огромнейший более несколько миллионов то тут уже будут потери производительности.
Я к чему веду, если вы уж так статью пишите о производительности то и код должен быть 100% максимально идиален.
А еще у Вас потери производительности на сортировке. Вы применили сортировку склада по имени обращаясь к складу через точку. Ну скорее всего потери получения наименования не должно быть поскольку склад должен быть покрыт кластерным индесом и данные должны лежать уже на уровне В-дерева (но это все надо перепроверить).
Но вот сортировка сожрет большой процент!
Добрый день, Александр!
Речь шла про оптимизацию платформы – сложный расчет колонок будет вестись только для отображаемых строк.
А так Вы правы – нужно проанализировать план запрос, выявить проблемы. Если проблемы есть переписать запрос, ещё раз сформировать план запроса и т.д.
Но в этом видео мы использовали максимально простое решение, чтобы не отвлекать от основной идеи видео – новой возможности платформы :)
Если бы оптимизатор строил план запроса, уже зная фактическое значение параметра &ЕстьСклад, то он мог бы сам либо отбросить условие ИЛИ (если параметр равен Истина) или преобразовать его в И (если параметр равен Ложь). Но я не знаю, возможно ли такое, анализируются ли фактические значения параметров перед построением плана выполнения запроса.
Вряд ли будет анализироваться значение параметра.
Но в любом случае правило железное – вначале нужно проверить на тестовой базе (копии базы с реальными данными).
Данное условие хотя и содержит ИЛИ не мешает использовать индекс.
Ну раз уж Вы воскресили обсуждение по этому вопросу, то не могли бы приложить план запроса (если есть развернутая база под рукой) и его анализ ?
Шедеврально! С наступающим!
ЗЫ: купил 11 курсов, до лета, постараюсь, всем овладеть.
Отличный задел для профессионального роста :)
Желаю все курсы успешно завершить, с наступающим! )
Добрый день.
Выложите, пожалуйста, конфигурацию с демонстрацией примера из видео.
Денис, мы конфигурации не выкладываем, кроме специально созданных для учебных курсов. А они публикуются только в Мастер-группах.
Здравствуйте, из какого курса это видео?
Добрый день!
Это видео из курса Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3 (http://курсы-по-1с.рф/1c-v8/interfaces-forms/)
Добрый день, не нашел обновление в курсе профессиональная разработка интерфейсов, последнее видео по платформе 8.3.8 не подскажите где на http://xn—-1-bedvffifm4g.xn--p1ai/1c-v8/interfaces-forms/startpage/ ссылка на данные материалы
Добрый день, Сергей! Это новое видео, оно будет добавлено в курс до конца текущей недели.
Наконец допили УФ до уровня ОФ.
Кстати в режиме совместимости этого обработчика еще нет?
У нас конфигурации на 8.3.7 и 8.3.8 в совместимости сидят.
Добрый день! Работает только если в свойствах конфигурации установлен режим совместимости 8.3.8 и выше.
На конфигурациях у которых включен режим совместимости с младшими платформами я так понимаю этот метод работать не будет? Источник: ©Курсы-по-1С.рф
Добрый день! Работает только если в свойствах конфигурации установлен режим совместимости 8.3.8 и выше.
Замечательно! Пока не пользовался этим обработчиком, но теперь буду.
Наконец-то, кто-то объяснил нормально как с новым обработчиком работать. Спасибо!
:)
Единственный вопрос возник о ПолучитьКлючи(). как вы поняли что там номенклатура? можно ли в этом обработчики получить данные других колонок?
Добрый день!
Самый простой вариант это посмотреть в отладке :) . На самом деле у каждой таблицы есть ключ. Например, у справочников, документов и тп – это ссылка. Для регистров сведений – это ключ записи (содержит значения всех измерений).
Вот пример цикла, чтобы считать данные любой колонки для отображаемых строк:
мСсылки = Строки.ПолучитьКлючи();
Для каждого Ссылка Из мСсылки Цикл
СтрокаСписка = Строки[Ссылка];
СтрокаСписка.Данные.ИмяКолонки …
КонецЦикла;
понял, спасибо
Поля ключа можно посмотреть и изменить в конструкторе запроса динамического списка.
Такая скидка, а большая часть необходимых курсов уже куплена ) Всех с наступающим!
Берите оставшиеся :))
С наступающим!
Спасибо за видео. С наступающим
С Наступающим :))
По факту – получается запрос в цикле? Где цикл инициирует сам пользователь, вертя экраном.
Добрый день, Дмитрий! С такой формулировкой любой динамический список — это запрос в цикле, так как при прокрутке списка данные дочитываются из БД.
Отличное, информативное видео. Спасибо, сам бы до этого не докопался.
Все новое – хорошо забытое старое :) Понемногу в 8.3 добавляется то, к чему привыкли в 8.1.
Да, такое бывает :))
Очень хороший пример. Получается, туда же можно запихнуть пиктограммы ?
Добрый день! Из оформления ячеек, к сожалению, доступно совсем немного вариантов: цвет фона, цвет текста, шрифт, горизонтальное положение, формат.
Если говорить про вывод пиктограмм,то это простая задача, которая легко решается и без этого механизма. Достаточно к списку подключить коллекцию пиктограмм и сформировать колонку, содержащую номер пиктограммы из коллекции.
Если же речь идет о пиктограммах, которые хранятся в базе, как картинки, тогда да, можно. Нужно получить навигационные ссылки на пиктограммы и прописать в колонку.
Неплохой материал. Стоит взять на заметку)
Коллеги, с наступающим)
С Наступающим! :)
Доброе утро!
Очень похоже, что видео из курса по разработке интерфейса – но такого видео-урока я там не помню… Или это видео просто как отдельная статья? )
Добрый день!
Это новое видео, которое в ближайшее время войдет в курс :)
в какой курс?)
В курс “Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3”
Добрый день.
Если сейчас брать этот курс, новые видео будут доступны в нём?
Да, дополнительные видео добавляются независимо.
обновление курса ждать обладателю старого варианта?
Конечно :)
Только чуть позже, сейчас пока саппорт загружен работой с акционными заказами.