1с как сделать прогресс бар
Данный материал будет полезен и начинающим программистам 1С, и тем, кто хочет сделать свои разработки удобнее для пользователей. Кроме того, рассмотрим некоторые новшества платформы 8.3.10.
Начнём с того, что условимся о некоторых ограничениях:
- В статье рассматриваются концепции. Поэтому за рамками останутся решения, основанные на библиотеках / внешних компонентах
- Примеры, приведённые в статье, не претендуют на «Единственно-верное-решение».
В статье последовательно будет рассмотрено: как было в обычных формах, что случилось с приходом управляемых форм и какие сюрпризы нам преподнесла платформа 8.3.10.
Итак, давайте приступим.
Думаю, никого не требуется убеждать, что информирование о ходе выполнения длительного процесса в программе очень важно. Каждый пользователь может привести примеры, когда смотришь в экран и думаешь – «перезагружать не надо ждать» (пишите в комментариях – где вы предпочитаете ставить запятую).
И платформа «1С:Предприятие 8» в этом не исключение – в ней для отображения хода процесса имеется специальный элемент обычных форм «Индикатор» (или вид поля управляемой формы «Поле индикатора»). Давайте рассмотрим нюансы его использования.
Обычные формы
Придумать что-то проще, чем вывод индикатора выполнения процесса в обычных формах – сложная задача. А всё это благодаря тому, что в режиме толстого клиента в «1С:Предприятие 8» по умолчанию отсутствуют границы между клиентской частью и серверной частью. То есть выполнение программного кода и интерфейсных методов происходит, как правило, в одном контексте. Поэтому у разработчика не возникает необходимости задумываться о доступности необходимых свойств, процедур и функций.
Схематично работу «1С:Предприятие» в толстом клиенте можно представить следующим образом:
Рисунок 1. Схема работы «1С:Предприятие» в режиме толстого клиентаВ обычном режиме клиентский сеанс открывает постоянное соединение с базой данных, а выполнение программного кода на встроенном языке преимущественно происходит на стороне клиента.
В связи с этим в любой строчке кода, описывающего длительный процесс, можно оценить объем обработанных данных, получить процент его выполнения и поместить полученное значение в реквизит формы, связанный с выведенным на форму элементом «Индикатор». В этот момент пользователь увидит графическое изменение отображения полосы индикатора в интерфейсе – опять же, благодаря тому, что всё действие происходит на клиенте.
Самый простой «длительный процесс» с выводом процента выполнения в обычном режиме может выглядеть следующим образом:
Рисунок 2. Обычные формы – пример длительной операции с выводом процента выполнения в индикаторКак говорится – «проще не придумаешь». Никакого «лишнего» кода, всё максимально прозрачно, понятно и самое главное – работает!
На этом моменте кто-то из читателей ностальгично вздохнёт, так как мы переходим к следующей части статьи – к управляемым формам.
Управляемые формы
С приходом платформы 8.2 и управляемых форм ситуация с индикатором в корне изменилась. Но дело совсем не в версии платформы и не в новых формах, а в появлении новых видов клиентов для «1С:Предприятие» – тонкого и web-клиента. Схематично работу в управляемом режиме можно представить в следующем виде:
Рисунок 3. Схема работы «1С:Предприятие» в управляемом режимеЕсли провести сравнение с обычным режимом, то сразу бросаются следующие отличия:
- Постоянного соединения клиентской части с базой данных нет – их взаимодействие происходит только через сервер 1С (в файловом режиме вместо сервера 1С выступает некоторая эмуляция, но это уже другая история)
- Отсутствует постоянное соединение клиентской части с серверной
- Встроенный язык разделён на клиентский и серверный.
Как всё это повлияло на использование индикатора для отображения информации о ходе выполнения длительного процесса? Давайте подробно в этом разберёмся.
Обычно длительный процесс заключается в сложной обработке данных. Будь то групповое проведение документов, проведение сложных расчётов или выборка данных и заполнение ими отчётной формы.
Получается, что в том или ином виде всегда требуется доступ к базе данных и/или выполнение методов, доступных только на стороне сервера. Для этого на него необходимо передать управление.
Во время выполнения серверного вызова клиентская часть 1С становится неактивной и блокируется для дальнейшей работы до тех пор, пока вызов не завершится и управление не вернётся на сторону клиента. Поэтому, даже если во время выполнения процедуры на сервере производить изменение значения реквизита, отвечающего за данные индикатора, то на клиент вернётся только финальная величина.
Получается, что если взять код из предыдущего примера и просто разбить его на клиентскую и серверную часть, то получим долгое подвисание приложения, после чего индикатор резко установится в значение «100%».
Рисунок 4. Попытка использовать код из обычного режима в управляемомПри таком использовании индикатора от него пользы никакой нет. Поэтому разработчики идут на различные хитрости – выполняют длительные процессы «порционно» с отображением на полосе индикатора значений относительно «порций»; используют динамическое уменьшение скорости движения индикатора в зависимости от времени выполнения процесса; или придумывают другие варианты. Но ни один из них не имеет ничего общего с отображением выполнения конкретного процесса в режиме реального времени.
Именно поэтому при обновлении типовых конфигураций рядом с индикатором мы наблюдаем фразу примерно следующего содержания: «эта операция может занять длительное время – от нескольких минут до нескольких часов». И отчасти поэтому при формировании отчётов крутятся «безликие» круги-индикаторы, которые в виде простой анимации указывают на то, что программа вовсе не зависла.
Кстати, в «1С:Бухгалтерии предприятия, ред. 3.0» разработчики нашли интересное решение (видимо, чтобы бухгалтеры не скучали) – вместо кругов разместили милого котёнка.Не знаю, как на счет настроения, но понимания о планируемом времени окончания выполнения процесса этот котёнок точно не прибавляет.
Один из вариантов вывода индикатора для отображения хода выполнения длительного процесса заключается в следующем:
- Длительная операция запускается в виде фонового задания, в ходе выполнения которого промежуточные результаты помещаются во временное хранилище.
- На стороне клиента запускается обработчик ожидания, который с определённой периодичностью опрашивает временное хранилище и выводит данные из него в полосу индикатора.
Программный код будет состоять из двух частей: из кода интерфейсной части (в нашем случае – обработки) и кода общего модуля. Модуль формы обработки будет выглядеть примерно так:
Рисунок 5. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Модуль формы обработкиА общий модуль будет содержать процедуру для запуска в фоновом режиме:
Рисунок 6. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Общий модульДля тех, кто захочет проверить работоспособность данного примера, дополнительно приведём скриншот формы обработки:
Рисунок 7. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Форма обработкиНесмотря на то, что индикатор будет «живым», сказать, что эффект достигнут и пример рабочий, на сто процентов нельзя. Потому что между реальным состоянием выполнения процесса и интерфейсом пользователя есть аж целых две «прослойки» – временное хранилище и обработчик ожидания. При таком подходе мало того, что отображение идёт не в режиме реального времени, так ещё и возрастает возможность возникновения различного вида сбоев из-за использования промежуточных звеньев.
Подводя итог получаем, что для «правильной» работы индикатора в управляемых формах (то есть, как в обычном режиме – с привязкой к выполнению процесса в реальном времени) не хватает возможности инициировать сервером отправку данных на сторону клиентской части. И тут наступает самое время поговорить про сюрприз, который фирма «1С» преподнесла разработчикам в новой платформе «8.3.10».
Платформа «8.3.10»
На самом деле в платформе «1С:Предприятие 8.3.10» касательно индикатора ровным счётом ничего не изменилось. Там есть много других интересных «фишек». Например, система взаимодействий, инкрементальная выгрузка конфигурации в XML, новые режимы основного окна. Но всё это не относится к теме данной статьи. Поэтому, можно было бы уже закончить писать… Если бы не наши «пытливые умы».
Давайте чуть-чуть пристальнее взглянем на систему взаимодействий. Для этого возьмём описание с одного из сайтов фирмы «1С»:
Теперь посмотрим на определение протокола WebSocket на сайте Википедии:
Обратите внимание на ключевые слова: двухсторонняя связь между клиентом и сервером в режиме реального времени! То, чего так не хватало для нормального функционирования индикатора в управляемых формах! Давайте для лучшего понимания взглянем на схему работы «1С:Предприятие» и системы взаимодействий:
Рисунок 8. Схема работы «1С:Предприятие» с системой взаимодействийОстаётся вопрос: можно ли использовать систему взаимодействий для вывода хода выполнения процесса в индикатора? Ответ – можно конечно, но… Давайте сначала рассмотрим возможность информирования пользователя о ходе выполнения длительного процесса при помощи только системы взаимодействия.
Для этого нам потребуется длительный процесс, выполняемый в фоне:
Рисунок 9. Платформа 8.3.10 – пример длительной операции, выполняющейся в фоновом задании. Модуль формы обработки Рисунок 10. Платформа 8.3.10 – пример длительной операции, выполняющейся в фоновом задании. Общий модульКоторый мы дополним программным кодом работы с системой взаимодействия, достаточным для информирования пользователя о ходе выполнения процедуры в виде оповещений. Для этого нам будет необходимо немного изменить процедуру обработки фонового задания в общем модуле:
Рисунок 11. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в виде оповещения. Общий модуль Рисунок 12. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в виде оповещения. Пример работыТаким образом, у пользователя будет возможность увидеть процент выполнения фонового задания в режиме реального времени. Если он знает, куда смотреть.
Рисунок 13. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в индикатор. Процедуры обработчика ожиданияКонечно, это очередное использование промежуточного звена, неоправданные серверные вызовы и как следствие – запоздание отображения от режима реального времени.
Связано это с тем, что некоторые методы работы с системой взаимодействия не доступны на клиенте. Но это будет меняться, и разработчики платформы «1С:Предприятие» уже анонсировали, что в версии 8.3.11 на основе системы взаимодействий появится возможность инициирования сервером передачи информации на сторону клиента!
Вместо заключения
В настоящее время эргономика инструмента играет большую роль в дальнейшей его судьбе – будет оно активно использоваться/применяться или его отложат/выкинут.
И если раньше достаточно было показать пользователю куда/какие вводить данные в программе и где/какой он от этого будет видеть результат, то сейчас важно – удобно ли эти данные вносить и как быстро можно получить обратную связь.
Скорость реакции программы на действия пользователя тоже выходит на первый план. Даже минимальное ожидание отклика начинает вызывать раздражение, а задержка в обратной связи, длящаяся даже всего несколько секунд, может стать поводом к аварийному завершению работы приложения.
Поэтому при разработке конфигураций необходимо обращать внимание на программный код, выполнение которого может занять продолжительное время. И предусматривать механизмы оповещения пользователя о том, что программа выполняет процесс, а не зависла.
Конечно, не всегда представляется возможным в начале длительной операции предвидеть объем обрабатываемых данных или время выполнения операции. В этих случаях использование индикатора не будет давать пользователю достоверной информации о ходе процесса и его использование становится нецелесообразным. Поэтому порой приходится выкручиваться различными способами, чтобы работа в программе вызывала меньше негативных эмоций – использовать анимированные кольца или милых котят.
Если вас заинтересовала система взаимодействий, и вы хотели бы попробовать с ней поработать, но не знаете, что это такое и с чего начать – читайте следующую статью Система взаимодействий в платформе 8.3.10.
А пока – пишите в комментариях истории из своего опыта по работе с индикаторами!
1. Код модуля формы внешней обработки
//Устанавливаем количество обновлений индикатора на сервере.
&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Обновлений = 10 ;
КонецПроцедуры
//Обнуляем прогресс бар, запускаем фоновую процедуру на сервере, подключаем обработчик ожидания
&НаКлиенте
Процедура НачатьИндикацию ( Команда )
ВыполнитьНаСервере ( УникальныйИдентификатор , Обновлений );
ПодключитьОбработчикОжидания ( "ОбработчикОжидания" , 1 , Ложь);
ПолучитьПрогрессВыполнения ( УникальныйИдентификатор , Прогресс );
Состояние ( НСтр ( "ru = 'Тест прогресс бара'" ), Прогресс , НСтр ( "ru = 'Пустой цикл для тестирования'" ));
Если Прогресс = 100 Тогда
ОтключитьОбработчикОжидания ( "ОбработчикОжидания" );
КонецЕсли;
//Устанавливаем привилегированный режим, если у пользователя нет административных прав. Запускаем фоновое задания из внешней обработки с помощью метода который доступен в УТ 11.
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере ( УникальныйИдентификатор , Обновлений )
ЗаданиеПараметры = Новый Массив ();
ЗаданиеПараметры . Добавить ( Справочники . ДополнительныеОтчетыИОбработки . НайтиПоНаименованию ( "Прогрес-бар [0.0.1]" ));
ЗаданиеПараметры . Добавить (Новый Структура ( "Обновлений" , Обновлений ));
ЗаданиеПараметры . Добавить (Неопределено);
ЗаданиеПараметры . Добавить (Неопределено);
ФоновоеЗадание = ФоновыеЗадания . Выполнить ( "ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно" , ЗаданиеПараметры , УникальныйИдентификатор , "ИндикацияПроцеса" );
&НаСервереБезКонтекста
Процедура ПолучитьПрогрессВыполнения ( УникальныйИдентификатор , Прогресс )
НайденныеЗадания = ФоновыеЗадания . ПолучитьФоновыеЗадания (Новый Структура ( "Ключ" , УникальныйИдентификатор ));
Если НайденныеЗадания . Количество () = 0 Тогда Возврат; КонецЕсли;
2. Код модуля объекта внешней обработки
Функция СведенияОВнешнейОбработке () Экспорт
Версия = "0.0.1" ;
// Объявим переменную, в которой мы сохраним и вернем "наружу" необходимые данные
ПараметрыРегистрации = Новый Структура ;
// Объявим еще одну переменную, которая нам потребуется ниже
МассивНазначений = Новый Массив ;
// Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать.
// Допустимые типы: ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов
ПараметрыРегистрации . Вставить ( "Вид" , "ДополнительнаяОбработка" );
// Теперь нам необходимо передать в виде массива имен, к чему будет подключена наша ВПФ
// Имейте ввиду, что можно задать имя в таком виде: Документ.* - в этом случае обработка будет подключена ко всем документам в системе,
// которые поддерживают механизм ВПФ
//СчитатьДокументыНазначений(МассивНазначений);
ПараметрыРегистрации . Вставить ( "Назначение" , Новый Массив );
// Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим)
ПараметрыРегистрации . Вставить ( "БезопасныйРежим" , Ложь);
// Следующие два параметра играют больше информационную роль, т.е. это то, что будет видеть пользователь в информации к обработке
ПараметрыРегистрации . Вставить ( "Версия" , Версия );
ПараметрыРегистрации . Вставить ( "Информация" , "Прогрес-бар [" + Версия + "]" );
// Создадим таблицу команд (подробнее смотрим ниже)
ТаблицаКоманд = ПолучитьТаблицуКоманд ();
// Добавим команду в таблицу
ДобавитьКоманду ( ТаблицаКоманд , "Прогрес-бар [" + Версия + "]" , "BP" , "ОткрытиеФормы" , Ложь, "BP" );
// Сохраним таблицу команд в параметры регистрации обработки
ПараметрыРегистрации . Вставить ( "Команды" , ТаблицаКоманд );
// Теперь вернем системе наши параметры
Возврат ПараметрыРегистрации ;
// Создадим пустую таблицу команд и колонки в ней
Команды = Новый ТаблицаЗначений ;
// Как будет выглядеть описание печатной формы для пользователя
Команды . Колонки . Добавить ( "Представление" , Новый ОписаниеТипов ( "Строка" ));
// Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
Команды . Колонки . Добавить ( "Идентификатор" , Новый ОписаниеТипов ( "Строка" ));
// Тут задается, как должна вызваться команда обработки
// Возможные варианты:
// - ОткрытиеФормы - в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система
// - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки
// - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки
Команды . Колонки . Добавить ( "Использование" , Новый ОписаниеТипов ( "Строка" ));
// Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
Команды . Колонки . Добавить ( "ПоказыватьОповещение" , Новый ОписаниеТипов ( "Булево" ));
// Для печатной формы должен содержать строку ПечатьMXL
Команды . Колонки . Добавить ( "Модификатор" , Новый ОписаниеТипов ( "Строка" ));
Процедура ДобавитьКоманду ( ТаблицаКоманд , Представление , Идентификатор , Использование , ПоказыватьОповещение = Ложь, Модификатор = "" )
// Добавляем команду в таблицу команд по переданному описанию.
// Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд
НоваяКоманда = ТаблицаКоманд . Добавить ();
НоваяКоманда . Представление = Представление ;
НоваяКоманда . Идентификатор = Идентификатор ;
НоваяКоманда . Использование = Использование ;
НоваяКоманда . ПоказыватьОповещение = ПоказыватьОповещение ;
НоваяКоманда . Модификатор = Модификатор ;
// Пощитаем коэффициенты и сделаем соответствие чтобы знать когда обновлять прогресс.
Процедура ВыполнитьКоманду ( Параметры ) Экспорт
Обновлений = Параметры . Обновлений ;
Итераций = 10000000 ;
Коэф = Цел ( Итераций / Обновлений );
КоэфОбн = 100 / Обновлений ;
ТочкиОбновления = Новый Соответствие ;
Для i = 1 По Обновлений Цикл ТочкиОбновления [ i * Коэф ] = Цел ( i * КоэфОбн ); КонецЦикла;
Для i = 1 По Итераций Цикл
Если ТочкиОбновления [ i ] <> Неопределено Тогда ОбщегоНазначенияКлиентСервер . СообщитьПользователю ( Строка ( ТочкиОбновления [ i ])); КонецЕсли;
Тока запись делай во внешний объект, а не в форму/отчет.
(4) Пусть лучше с сервера шлет на сайт какой-нить. На сайт зашел и глянул скока сделано
(2) я об этом думал, но у меня все на сервере. С клиента не получается. У меня цикл на сервере. Можно конечно еще один на клиенте конечно сделать, но это уже будет грубо.
(3) спасибо за комментарий
(4) овчинка выделки не стоит
можно каждые хх итераций на сервере сохранять прогресс во временное хранилище, возвращаться на клиента, обновлять индикатор, и уходить обратно на сервер. типа так:
(6) Перед стартом на сервер запускай обработку, которая регулярно с регистра сведений будет читать состояние цикла.(7) Спасибо. Обязательно попробую.
(8) это может негативно сказаться на производительности?
(8) так можно делать. естественно, "итерация" - достаточно укрупненная.
для (7) - переход на сервер без контекста - занимает примерно 0.01 секунды, работа со временным хранилищем - в зависимости от объема. соответственно, если мы будем обрабатывать данные в 100 раз дольше, чем (работа со врем. хранилищем + 0.01с), то оверхэд будет 1% на обновление счетчика(13)при использовании НаСервереБезКонтекста - ничего не гоняется
(13) нельзя запустить фоновое задание с нужным кодом без изменения конфы, например из внешней обработки
(16) а из внешней - фоново запустить другую внешнюю? прокатит?
(18) Строго говоря нет. Ибо фоновые/регламентные задания нужно заранее делать в самой конфе.
(18) в теории подсистема ДлительныеОперации из БСП такое позволяет делать, но я не пробовал
(0)Самый оптимальный вариант, как было сказано в (8). А что мешает изменить конфу, добавив один общий модуль, где и будет функция для фоновой загрузки?
(23) судя по справке - есть параметр для этих целей, достаточно в обработчике ожидания брать оттуда прогресс, например.
(27) Эти все временные хранилища доступны только после завершения фонового задания.Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса.
Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание.
Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.
(32) Блин, вот ты делал? Понятно, что не делал, разуй свои глаза и перечитай (30), для тебя выделю:
"Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания."
Не будут доступны понимаешь?
короче, в БСП нужно допилить - для возврата УИДа задания (ну, это просто). В самой форме в параметрах при создании на сервере будет ссылка на внешнюю обработку в ДополнительнаяОбработкаСсылка. через код, скопипащенный из формы выбора внешних обработок можно все запустить как надо
Как известно, в клиент-серверном режиме 1С прогресс бар (или функция "состояние") бесполезны, если процедура выполняется на сервере.
Одним из решением данной задачи является использование фонового задания. Ниже покажу пример , как это использовать.
Идея заключается в следующем:
1. Запускаем фоновое задание
Специальные предложения
1. Это возможно для любых обработок (внешних, встроенных)
2. Сам обработчик (процедура работа с данными) должна находиться в общем модуле - то есть в конфигурации. (7)
Данное решение используется для не типовых разработок (10)Здесь принято отвечать по существу , а не так как Вы.
Например объяснять - чем лучше/хуже альтернативных решений
До свидания (11)Всего доброго!
PS: не красиво говорить что уже поздно. никогда не поздно что-то показать / рассказать.
Просмотры 26141
Загрузки 39
Рейтинг 17
Создание 19.05.17 14:07
Обновление 19.05.17 14:07
№ Публикации 624258
Конфигурация Не имеет значения
Операционная система Windows
Страна Россия
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Да
См. также
Альтернативный способ добавления элементов и реквизитов на формы Промо
Предлагаю альтернативный вариант добавления динамически создаваемых элементов и реквизитов на форму.
1 стартмани
09.09.2019 18020 35 bmk74 7
Выделение текущей строки в отчете (сделать сразу во всех отчетах и ничего не сломать)
Как за 10 минут упростить работу с отчётами программистам и пользователям. Добавить ВО ВСЕ ОТЧЁТЫ механизм автоматического выделения текущей строки отчёта (той, на которой установлен курсор). И ПРИ ЭТОМ НИЧЕГО НЕ СЛОМАТЬ.
1 стартмани
17.10.2021 2835 6 Патриот 48
Самые красивые шахматы для 1С на управляемых формах
Здравствуйте, представляем Вашему вниманию классическую игру – Шахматы! Написана игра средствами 1С, на управляемых формах. Программный код представляет собой с аккуратностью составленную систему, содержащую лаконичные логические приемы и описательные имена переменных, объектов и функций. Программа полностью отлажена и многократно протестирована. Оригинальный авторский дизайн фигур, иконок и кнопок приятен глазу. Игра содержит большое количество функций, настроек и режимов игры, включая сетевую игру, тренировку с ботом или игру на двоих. Не упустите возможность найти ряд технических решений, применимых для реализации различных задач, а также поиграть в вечную игру с отличным оформлением! Желающие научиться программировать на управляемых формах могут многое почерпнуть в этой конфигурации.
5 стартмани
18.02.2021 5754 13 compmir 30
Интерактивная справка по объектам 1С (подключаемое расширение)
База знаний, подключаемая к объектам основной базы. Пополняется интерактивно, формируется в виде статей прямо в 1С (текст, картинки, таблицы, ссылки). Есть возможность прикрепления файлов, привязки к объектам 1С, возможности рейтинга и комментирования пользователями.
3 стартмани
29.09.2020 16008 84 sapervodichka 47
Расширенная настройка динамического списка УФ Промо
Открывая управляемую форму выбора и не увидев там видимых в форме списка элементов, часто хочется узнать причину их отсутствия там, т. е. какой наложен отбор. Но стандартная настройка списка управляемой формы показывает только пользовательские настройки, скрывая от пользователя фиксированный отбор. Предлагаю вам расширение конфигурации с расширенной настройкой динамического списка, отображающей пользователю кроме пользовательских настроек еще фиксированные.
Читайте также: