Самостоятельное использование формы не предусмотрено 1с
1.1. Для открытия форм следует применять метод глобального контекста ОткрытьФорму (при использовании версии платформы 1С:Предприятие 8.2 и более ранних версий - также ОткрытьФормуМодально). Применение альтернативного способа, с получением формы и ее последующим открытием с помощью метода ПолучитьФорму, не рекомендуется. Исключения из этого правила возможны только в особых случаях (см. раздел ниже «Особые случаи использования форм»).
Рекомендация обусловлена соображениями
- повышения устойчивости кода, работающего с формой, за счет разделения программного интерфейса для работы с формой и деталей ее внутренней реализации,
- а также сохранения единой стилистики кода прикладных решений.
Кроме того, применение глобального метода ОткрытьФорму гарантирует выполнение инициализации формы на сервере в обработчике ПриСозданииНаСервере. Этот подход помогает сосредоточить весь код инициализации формы в одном месте и исключает "случайное" обращение к серверу, связанное с инициализацией формы, между строками кода
См. также: раздел «Открытие управляемой формы» статьи «Минимизация количества серверных вызовов»
1.2. В случаях когда форма требует параметризации при открытии, все ее параметры следует указывать в наборе параметров формы. Таким образом, набор параметров формы декларативно описывает возможности формы по ее параметризации.
Параметры формы из этого набора могут быть указаны в вызывающем коде при получении формы (ПолучитьФорму) или при открытии (ОткрытьФорму).
1.3. Не следует применять другие способы параметризации формы при открытии. Например, нужно избегать обращения к методам и свойствам формы после ее открытия.
Например, вместо
следует по той же причине использовать параметры формы:
1.4 Для получения результата работы формы, вместо непосредственного обращения к элементам и реквизитам формы
следует использовать процедуры-обработчики оповещений, которые будут вызваны при завершении работы пользователя с формой:
При этом возвращаемое значение формы формируется в коде модуля формы с помощью метода формы Закрыть.
См. также: Ограничения на использование экспортных процедур и функций
1.5. Другие ограничения:
- Обработчик события формы ПриОткрытии не должен содержать код по открытию какой-либо другой формы вместо открываемой.
- Не рекомендуется выполнять программное открытие и закрытие формы в одном обработчике. Такие действия должны быть разнесены по времени. Например, закрытие формы можно выполнять в обработчике ожидания.
Открытие форм объектов с помощью команды меню "Все функции"
2.1 Следующие виды форм должны быть всегда доступны пользователю в режиме 1С:Предприятия из меню "Все функции" вне зависимости от того, размещены ли соответствующие объекты в командном интерфейсе приложения или нет:
Открытие параметризированных форм
3.1 В случаях когда форма требует параметризации при открытии, предназначена для открытия только при помощи встроенного языка и, как следствие, не может быть открыта из пункта меню "Все функции", не следует назначать такую форму основной формой объекта.
3.2. Если же у объекта нет других форм, которые могли бы быть назначены основными, то следует сделать основной эту параметризированную форму. В обработчике ПриСозданииНаСервере модуля формы необходимо проверять параметры формы и, если они не заполнены, вызывать исключение. Текст исключения должен указывать пользователю причину, по которой форма не может быть открыта.
3.3. При этом не следует выдавать исключение в тех случаях, когда форма открывается с заданным параметром «АвтоТест». Наличие этого параметра означает, что получение формы выполняется специальным средством автоматизированного тестирования (например, 1С: Автоматизированная проверка конфигураций – для контроля соблюдения стандартов разработки). В этом случае, весь код обработчика ПриСозданииНаСервере должен отработать без ошибок времени выполнения (например, вследствие отсутствующих параметров формы, которые не передаются при таком способе получения формы).
Блокирующее или независимое открытие форм объектов
4.1 По умолчанию , при создании форм некоторых типов объектов (справочников, планов видов характеристик и др.) им устанавливается режим открытия с блокированием окна владельца (свойство РежимОткрытияОкна установлено в значение "Блокировать окно владельца"). Для таких форм предполагается, что работа с ними всегда выполняется "за один заход", без необходимости переключения в другие формы. Тем самым, предотвращается одновременное открытие нескольких форм такого типа, и как следствие, рабочее пространство пользователя не "замусоривается" лишними окнами.
4.2. Это умолчание платформы рекомендуется изменять в тех случаях, когда форма представляет из себя « рабочее место », т.е. с помощью нее осуществляется доступ к большому функциональному блоку. В частности, если при работе с формой в обычных сценариях работы может потребоваться
- открытие других самостоятельных форм (отчетов, справочников и т.д.) из глобального командного интерфейса приложения;
- сравнение двух и более объектов между собой;
а также если в панели навигации формы
- содержится большое количество переходов к связанной информации (например, к подчиненным справочникам);
- есть переходы к параметризируемым отчетам.
Для таких форм необходимо установить свойству РежимОткрытияОкна значение "Независимый".
См. также раздел Формы - выбор: блокирующая или независимая в руководстве по стилю.
Особые случаи использования форм
Действует для конфигураций, разрабатываемых на платформе 1С:Предприятие 8.2 и более ранних версий.
В этих случаях рекомендуется разместить функцию для получения формы в общем модуле с повторным использованием возвращаемых значений на время сеанса .
Например:
и вместо вызова метода ОткрытьФорму использовать конструкцию вида:
Подобное кеширование дает значительное ускорение на медленных каналах связи между клиентским приложением и сервером 1С:Предприятия.
5.2. При необходимости параметризации кешируемых форм предлагается воспользоваться одним из двух вариантов.
а) В случае если число комбинаций значений параметров невелико, например, два-три значения, то следует кешировать два-три готовых экземпляра формы в «разрезе» ее параметров. Например, если у формы имеется параметр ПрименитьДляВсех типа Булево, то в общем модуле с повторным использованием возвращаемых значений на время сеанса размещается код вида:
а для получения такой формы используется конструкция вида:
В остальных случаях целесообразно разместить в модуле формы экспортную процедуру УстановитьПараметрыИспользования, с помощью которой параметризовать форму перед открытием. Например:
При этом не следует применять какие-либо другие методы для кеширования форм и их параметризации перед открытием.
См. также: Ограничения на использование экспортных процедур и функций
5.3. В отдельных обоснованных случаях для снижения объема трафика между клиентским приложением и сервером 1С:Предприятия допускается альтернативный способ инициализации «клиентских» параметров формы при открытии. К таким параметрам относятся реквизиты и свойства элементов формы, которые могут быть гарантированно проинициализированы на клиенте без обращения на сервер.
В таких случаях необходимо разместить в модуле формы экспортную процедуру УстановитьПараметрыИспользования, пример использования которой приведен выше.
Такие случаи должны быть прокомментированы в коде.
См. также: Минимизация количества серверных вызовов
Мы долго шли к тому, чтобы на производстве технологи заводили номенклатуру, а мастера знали как ее собирать, имея под рукой чертеж, чтобы оперативно видеть документы по контрагенту или сканы документов. Но стандартный функционал УПП принуждал хранить данные в базе. Есть способ хранения внешних файлов без изменения стандартного функционала.
Почему просто не использовать библиотеку стандартных подсистем. К ней и инструкция прилагается + функционал развиваться будет?
Потому что подсистемы в БСП пересекается с функционалом УПП (объекты называются одинаково). Для примера ради, попробуйте прикрутить функционал обмена данными из БСП к УПП. Вам придется всю УПП перепахать, вдоль и поперек, к примеру при внедрении 1С:MES.
Зачем же так категорично? :)
УПП пересекается со старыми версиями БСП. а для новых предназначено ERP.2.0
(3) maxkisa, честно сказать не понял я что такого категоричного сказал.
Смотрите, основная задача подсистемы было внедрение функционала без изменения базового (для облегчения обновления). Предложенный вариант (и вами поддерживаемый) подразумевает под собой постоянную головную боль при обновлениях. Мое мнение, что подсистема должна быть полностью изолированной, со своими точками входа и выхода. Ее функционал ни коим образом не должен мешать функционалу других подсистем. К сожалению, подобной модульности в 1С сложно добиться, но в некоторых случаях вполне решаемая задача, было бы желание.
не совсем понял из описания, подскажите, у вас доработки только в виде внешней обработки? или в конфигурации тоже что-то изменено?
(5) pss1985, в самой конфигурации есть новые объекты, подписки, регистры сведений, формы и т.д. Обработка - это только для того, чтобы с этим работать не меняя конфигурацию стандартных форм.
1) в упп это реализовано я так понял для электронного документооборота, и там есть такие полезности как : кто последний менял, кто сейчас редактирует. в вашем решении это также работает?
2) а какие новые объекты появились, раз в УПП уже были объекты, такие как тома хранения файлов, справочник прикреленные файлы и т.д. Или у вас собственные справочники, модули, регистры, не пересекающиеся с типовым функционалом?
(7) sergey-201, все верно, в УПП это все заточено только для хранения во внешнем хранилище информации и файлов по электронному документообороту.
Функционал, который показывает блокировку элемента, кто последний редактировал также присутствует, даже выделение цветом заблокированного для редактирования файла имеется.
Объекты добавляли из Управления Торговли 11, только префиксы им давали свои.
Список добавленных объектов выложил в скриншоты к публикации.
скачал, отлаживаю. наткнулся на
: Метод объекта не обнаружен (ОбновитьПрисоединенныйФайл)
Если ПрисоединенныеФайлыКлиент.ОбновитьПрисоединенныйФайл(
У меня в типовой УПП нет такой процедуры. Зато она есть в вашем модуле plr_ПрисоединенныеФайлыКлиент. Разъясните пожалуйста.
Еще одно замечание, лучше сделать описание на установку правильных типов на реквизиты справочника plr_ПрисоединенныеФайлы. Например, когда объединил, там тип у реквизита Том стал строка. Хорошо, что есть БСП, там посмотрел по аналогии расставил все. Но не все могут догадаться залезть туда и посмотреть как там.
(9) sergey-201, эта ошибка появляется после того, как подсистему отдельно вынес в отдельный cf. Соответственно нет типов в конфигурации, на которые он ссылается. Да косяк. если надо могу скинуть наш cf ник. Там будет работать, корректно.
(12) так я не понял, что делать с ошибкой, которая появляется при записи элемента справочника ПодчиненныеФайлы. Мне надо вместо "Если ПрисоединенныеФайлыКлиент.ОбновитьПрисоединенныйФайл" заменить на "Если plr_ПрисоединенныеФайлыКлиент.ОбновитьПрисоединенныйФайл" ?
(15) sergey-201, Я сейчас смотрел, не могу воспроизвести ошибку. Не подскажешь как на нее выходил? По логике, подменой на модуль plr_ проблема должна уйти. Вопрос только из какого модуля ошибка сыпется. Если из типового - то нужно подумать как лучше сделать. Подскажи, как ошибку воспроизвести. Сергей, ты как бета тестер у меня ) скоро платить надо будет )
(21) У меня ошибка возникает когда: после прикрепления файла открывается форма "ПрисоединенныйФайл". я жму кнопку Записать и Закрыть: Метод объекта не обнаружен (ПолучитьНедопустимыеСимволыВИмениФайла). я нашел через остановку по ошибке, что валица здесь: "Если ПрисоединенныеФайлыКлиент.ОбновитьПрисоединенныйФайл"
при открытии формы Подчиненные справочники 1С валится с текстом "Самостоятельное использование формы не предусмотрено" и кнопки: завершить работу или перезапустить. Думаю такой случай корректнее должен обрабатываться без закрытия программы.
(10) sergey-201, косяки к сожалению тоже унаследованы от УТ 11.1. Исправлю его после того, как проект перейдет на стадию поддержки, уровень не критичен.
К сожалению блок планирования не получиться сделать в виде отдельной подсистемы, там вообще космос получается, разузлование плана производства по участкам из 150-200 штук номенклатуры с количеством переделов 15-17 происходит меньше чем за минуту.
Эта в качестве затравки на следующие статьи.
(14) Ошибка возникала в режиме обычного приложения. это я решил так: убрал в справочнике Основную форму элемента, Основную форму списка и Основную форму выбора.
(19) sergey-201, сорри, этот коммент как-то промелькнул. Давай я тебе свой cf вышлю. скинь мыло свое. У меня там вроде нет ошибок.
я бы реализовал примерно так
если брать на примере спр. договоры контрагента
1) добавил в свойства у контрагента путь к папке
2)добавил внешнюю обработку к спр.договоры, с помощью нее можно было выбрать файл и ложить ее в папку
3)и переписать чуть чуть кнопочку файлы, что бы хранила просто элемент в справочнике
(11) Alik_1c, ни в чем себе не отказывайте ;) Делайте так как вам хочется. Это восхитительное чувство, когда получается сделать то, что Вы задумали. Ставить новые задачи, выполнять их, достигать высот - это истинное счастье для человека. Но никогда не говорите, как бы вы сделали.
(11) по вашему методу сложнее потом обновлять программу:
1) в свойствах нет Бизнес-процессов и Задач. Мне как раз нужно хранить файлы по ним.
2) если в базе есть другие используемые свойства, то придется разграничивать права между пользователями на разные виды свойств. тут думаю, придется вмешаться в типовой функционал. 3 ваш пункт, тоже затрагивает типовой функционал. чем понравилось это решение, так это именно новыми объектами, без изменения имеющихся. У меня старая УПП, в ней нет даже справочника Тома хранения файлов и всего этого функционала с присоединенными файлами, так что мне пришлось к этой публикации добавлять типовые модули и объекты из последней УПП. Попытался из БСП взять, но там потянулись модули и процедуры, которые не нужны.
(22) имеешь ввиду через кнопку "Обновить из файла на диске"? я попробовал через нее, ошибки не возникло, но файл не обновился в каталоге.
(24) sergey-201, косяки выловил, думаю как в отдельную подсистему выгрузить без потери типов у реквизитов справочника Присоединенные файлы. В навике это конечно проще, чем в 1С. Там объекты можно выгружать как есть.
(25) у меня все типы этого справочника расставлены в соответствии с библиотекой стандартных подсистем. тут никак не сделаешь, будут теряться, просто в инструкции надо добавить, что прописать в реквизитах
ВНИМАНИЕ. Для тех кто решил скачать файлы.Реквизит "Том" справочника "plr_ПрисоединенныеФайлы" не правильно указан тип файла измените на СправочникСсылка.ТомаХраненияФайлов. А так обработка рабочая и удобная
В этой статье рассмотрим два вопроса, которые часто задают участники наших курсов по УТ 11:
- Каким образом проводить групповое изменение реквизитов объектов.
- Как, используя настройки СКД, добавить собственное поле в отчет.
Эта статья будет интересна в первую очередь тем, кто только начал изучать УТ 11.
Применимость
Статья написана для редакций 1С:Управление торговлей — 11.0/11.1/11.2 Если вы используете одну из этих редакций, отлично — прочтите статью и внедряйте рассмотренный функционал.
В актуальной версии УТ вопрос с групповым изменением реквизитов объектов решен посредством встроенной обработки. Для настроек СКД наиболее заметным отличием УТ 11.3/11.4 от предыдущих редакций является интерфейс Такси.
Таким образом, чтобы освоить материал статьи — воспроизведите представленный пример на своей базе УТ 11. Так Вы закрепите материал практикой :)
Часто задаваемые вопросы по УТ 11
Вопрос №1:
Существует ли в УТ 11 групповая обработка справочников и документов аналогичная той, что есть в УТ 10.3?
Этот вопрос был, пожалуй, одним из самых часто задаваемых в чате вебинаров по результатам первого и второго дня занятий.
Дело в том, что доступ к этой обработке можно получить, только выделив несколько элементов какого-либо справочника и нажав кнопку «Изменить выделенные»:
К сожалению, подобная возможность для документов не предусмотрена, поэтому придется воспользоваться внешней обработкой «Универсальные подбор и обработка объектов». Файл обработки УниверсальныеПодборИОбработкаОбъектов.epf находится на диске ИТС в папке: \1CITS\EXE\ExtReps\Unireps82\UniversalSelection\
Данная обработка предназначена для запуска в режиме обычного приложения, поэтому нужно открыть УТ 11 в конфигураторе, зайти в главном меню в «Сервис \ Параметры…» и на закладке «Общие» переключить радиокнопку в положение «Управляемое приложение и обычное приложение», после чего выполнить запуск по кнопке «Толстый клиент (обычное приложение)»:
(Нажмите для увеличения)
Далее открываем обработку с диска и приступаем к работе с ней:
(Нажмите для увеличения)
Вопрос №2:
В материалах третьего дня упоминается, что отчет «Анализ финансовых результатов (по направлениям деятельности)» можно использовать для оценки рентабельности бизнеса по каждому из направлений.
Почему разработчики отчета не предусмотрели колонку с рассчитанными значениями рентабельности для облегчения данного процесса, как это сделано в отчете «Выручка и себестоимость продаж»?
Если сравнить перечень колонок с ресурсами обоих отчетов, то можно заметить, что он в них практически идентичный, но в отчете «Выручка и себестоимость продаж»дополнительно выводятся сведения по рентабельности, а в отчете «Анализ финансовых результатов (по направлениям деятельности)» почему-то нет:
(нажмите для увеличения)
Нажимаем «ОК», переходим на закладку «Поля» и из папки «Пользовательские поля» выбираем ресурс «Рентабельность, %»:
Теперь переходим на закладку «Условное оформление» и нажимаем кнопку «Добавить». На закладке «Оформление» заполняем значение для параметра «Формат», потом переключаемся на закладку «Оформляемые поля» и из папки «Пользовательские поля» выбираем ресурс «Рентабельность, %»:
Последовательно нажимаем кнопки «ОК» и «Завершить редактирование». Теперь заходим во «Все действия \ Сохранить вариант…». В поле «Наименование» вводим: «Анализ финансовых результатов (с рентабельностью по направлениям деятельности)» и нажимаем кнопку сохранить. Вариант отчета при этом будет сохранен как новый:
Обязательно выполняем команду «Все действия \ Установить стандартные настройки», чтобы отобразились наши изменения. Заново заполняем значения параметров «Период» и «Организация» и формируем отчет:
(нажмите для увеличения)
Таким образом, теперь мы можем быстро оценить рентабельность по каждому из направлений деятельности и принять взвешенное решение относительно необходимости их реорганизации. Что касается ответа на первоначальный вопрос, то он для нас больше не актуален. :)
Автор статьи:
Товмасян Альберт, разработчик 1С
г. Москва
При разработке прикладного решения большую роль играет функциональность. Но для достижения коммерческого успеха не менее важна дружелюбность интерфейса или эргономичность. И в этой статье мы осветим важный момент эргономики – информирование пользователя о ходе длительного процесса.
Данный материал будет полезен и начинающим программистам 1С, и тем, кто хочет сделать свои разработки удобнее для пользователей. Кроме того, рассмотрим некоторые новшества платформы 8.3.10.
Начнём с того, что условимся о некоторых ограничениях:
- В статье рассматриваются концепции. Поэтому за рамками останутся решения, основанные на библиотеках / внешних компонентах
- Примеры, приведённые в статье, не претендуют на «Единственно-верное-решение».
В статье последовательно будет рассмотрено: как было в обычных формах, что случилось с приходом управляемых форм и какие сюрпризы нам преподнесла платформа 8.3.10.
Итак, давайте приступим.
Думаю, никого не требуется убеждать, что информирование о ходе выполнения длительного процесса в программе очень важно. Каждый пользователь может привести примеры, когда смотришь в экран и думаешь – «перезагружать не надо ждать» (пишите в комментариях – где вы предпочитаете ставить запятую).
И платформа «1С:Предприятие 8» в этом не исключение – в ней для отображения хода процесса имеется специальный элемент обычных форм «Индикатор» (или вид поля управляемой формы «Поле индикатора»). Давайте рассмотрим нюансы его использования.
Обычные формы
Придумать что-то проще, чем вывод индикатора выполнения процесса в обычных формах – сложная задача. А всё это благодаря тому, что в режиме толстого клиента в «1С:Предприятие 8» по умолчанию отсутствуют границы между клиентской частью и серверной частью. То есть выполнение программного кода и интерфейсных методов происходит, как правило, в одном контексте. Поэтому у разработчика не возникает необходимости задумываться о доступности необходимых свойств, процедур и функций.
Схематично работу «1С:Предприятие» в толстом клиенте можно представить следующим образом:
В обычном режиме клиентский сеанс открывает постоянное соединение с базой данных, а выполнение программного кода на встроенном языке преимущественно происходит на стороне клиента.
В связи с этим в любой строчке кода, описывающего длительный процесс, можно оценить объем обработанных данных, получить процент его выполнения и поместить полученное значение в реквизит формы, связанный с выведенным на форму элементом «Индикатор». В этот момент пользователь увидит графическое изменение отображения полосы индикатора в интерфейсе – опять же, благодаря тому, что всё действие происходит на клиенте.
Самый простой «длительный процесс» с выводом процента выполнения в обычном режиме может выглядеть следующим образом:
Как говорится – «проще не придумаешь». Никакого «лишнего» кода, всё максимально прозрачно, понятно и самое главное – работает!
На этом моменте кто-то из читателей ностальгично вздохнёт, так как мы переходим к следующей части статьи – к управляемым формам.
Управляемые формы
С приходом платформы 8.2 и управляемых форм ситуация с индикатором в корне изменилась. Но дело совсем не в версии платформы и не в новых формах, а в появлении новых видов клиентов для «1С:Предприятие» – тонкого и web-клиента. Схематично работу в управляемом режиме можно представить в следующем виде:
Если провести сравнение с обычным режимом, то сразу бросаются следующие отличия:
- Постоянного соединения клиентской части с базой данных нет – их взаимодействие происходит только через сервер 1С (в файловом режиме вместо сервера 1С выступает некоторая эмуляция, но это уже другая история)
- Отсутствует постоянное соединение клиентской части с серверной
- Встроенный язык разделён на клиентский и серверный.
Как всё это повлияло на использование индикатора для отображения информации о ходе выполнения длительного процесса? Давайте подробно в этом разберёмся.
Обычно длительный процесс заключается в сложной обработке данных. Будь то групповое проведение документов, проведение сложных расчётов или выборка данных и заполнение ими отчётной формы.
Получается, что в том или ином виде всегда требуется доступ к базе данных и/или выполнение методов, доступных только на стороне сервера. Для этого на него необходимо передать управление.
Во время выполнения серверного вызова клиентская часть 1С становится неактивной и блокируется для дальнейшей работы до тех пор, пока вызов не завершится и управление не вернётся на сторону клиента. Поэтому, даже если во время выполнения процедуры на сервере производить изменение значения реквизита, отвечающего за данные индикатора, то на клиент вернётся только финальная величина.
Получается, что если взять код из предыдущего примера и просто разбить его на клиентскую и серверную часть, то получим долгое подвисание приложения, после чего индикатор резко установится в значение «100%».
При таком использовании индикатора от него пользы никакой нет. Поэтому разработчики идут на различные хитрости – выполняют длительные процессы «порционно» с отображением на полосе индикатора значений относительно «порций»; используют динамическое уменьшение скорости движения индикатора в зависимости от времени выполнения процесса; или придумывают другие варианты. Но ни один из них не имеет ничего общего с отображением выполнения конкретного процесса в режиме реального времени.
Именно поэтому при обновлении типовых конфигураций рядом с индикатором мы наблюдаем фразу примерно следующего содержания: «эта операция может занять длительное время – от нескольких минут до нескольких часов». И отчасти поэтому при формировании отчётов крутятся «безликие» круги-индикаторы, которые в виде простой анимации указывают на то, что программа вовсе не зависла.
Кстати, в «1С:Бухгалтерии предприятия, ред. 3.0» разработчики нашли интересное решение (видимо, чтобы бухгалтеры не скучали) – вместо кругов разместили милого котёнка.
Не знаю, как на счет настроения, но понимания о планируемом времени окончания выполнения процесса этот котёнок точно не прибавляет.
Один из вариантов вывода индикатора для отображения хода выполнения длительного процесса заключается в следующем:
- Длительная операция запускается в виде фонового задания, в ходе выполнения которого промежуточные результаты помещаются во временное хранилище.
- На стороне клиента запускается обработчик ожидания, который с определённой периодичностью опрашивает временное хранилище и выводит данные из него в полосу индикатора.
Программный код будет состоять из двух частей: из кода интерфейсной части (в нашем случае – обработки) и кода общего модуля. Модуль формы обработки будет выглядеть примерно так:
Рисунок 5. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Модуль формы обработки
А общий модуль будет содержать процедуру для запуска в фоновом режиме:
Рисунок 6. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Общий модуль
Для тех, кто захочет проверить работоспособность данного примера, дополнительно приведём скриншот формы обработки:
Рисунок 7. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Форма обработки
Несмотря на то, что индикатор будет «живым», сказать, что эффект достигнут и пример рабочий, на сто процентов нельзя. Потому что между реальным состоянием выполнения процесса и интерфейсом пользователя есть аж целых две «прослойки» – временное хранилище и обработчик ожидания. При таком подходе мало того, что отображение идёт не в режиме реального времени, так ещё и возрастает возможность возникновения различного вида сбоев из-за использования промежуточных звеньев.
Подводя итог получаем, что для «правильной» работы индикатора в управляемых формах (то есть, как в обычном режиме – с привязкой к выполнению процесса в реальном времени) не хватает возможности инициировать сервером отправку данных на сторону клиентской части. И тут наступает самое время поговорить про сюрприз, который фирма «1С» преподнесла разработчикам в новой платформе «8.3.10».
Платформа «8.3.10»
На самом деле в платформе «1С:Предприятие 8.3.10» касательно индикатора ровным счётом ничего не изменилось. Там есть много других интересных «фишек». Например, система взаимодействий, инкрементальная выгрузка конфигурации в XML, новые режимы основного окна. Но всё это не относится к теме данной статьи. Поэтому, можно было бы уже закончить писать… Если бы не наши «пытливые умы».
Давайте чуть-чуть пристальнее взглянем на систему взаимодействий. Для этого возьмём описание с одного из сайтов фирмы «1С»:
Теперь посмотрим на определение протокола WebSocket на сайте Википедии:
Обратите внимание на ключевые слова: двухсторонняя связь между клиентом и сервером в режиме реального времени! То, чего так не хватало для нормального функционирования индикатора в управляемых формах! Давайте для лучшего понимания взглянем на схему работы «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С на управляемых формах.
В состав БСП входит и подсистема «Дополнительные отчеты и обработки»», которая определяет правила создания и подключения к конфигурациям дополнительных ВНЕШНИХ отчетов и обработок различного назначения.
С обычными дополнительными отчетами и обработками более-менее все ясно, Они работают так же, как и при их вызове через главное меню «Файл/Открыть», поэтому с их разработкой и отладкой особых проблем нет.
А вот обработки других типов (внешние печатные формы и заполнение объектов и др.) дело сложнее.
В БСП для дополнительных внешних отчетов и обработок (далее ДВОО) предусмотрен справочник "ДополнительныеОтчетыИОбработки". Кроме того, для каждой ДВОО предусмотрено три способа вызова:
- вызов серверного метода;
- вызов клиентского метода;
Вызов обработок из справочника сильно затрудняет отладку в управляемом приложении, да еще разные способы вызова.
Наверное, эти три способа сложились у разработчиков БСП исторически. Можно предположить, что сначала появился вызов серверного метода, чтобы не связываться самим и не связывать разработчиков ДВОО требованиями к формам их отчетов и обработок. Вызвал серверный метод из модуля обработки и все, никаких тебе форм: с сервера нельзя открыть никакую форму.
Потом все-таки формы понадобились, и появился вызов клиентского метода, чтобы из обработки можно было открывать другие формы.
Ну а потом видимо решили вызов упростить, и появился метод просто открытия формы обработки.
Но если над всем этим подумать, то при открытии формы сначала на сервере вызывается обработчик события "ПриСозданииНаСервере. В нем можно вызвать любую серверную процедуру, и если форма не нужна, то "Отказ=Истина;" и все. Получаем тот же вызов серверного метода.
Затем при создании формы вызывается обработчик "ПриОткрытии", уже на клиенте. В нем можно вызвать клиентский метод формы, и если сама форма не нудна, то "Отказ=Истина;" и все. Получаем вызов клиентского метода.
Ну и наконец, если мы не отказываемся создать и открыть форму, то форма и откроется. Получаем вызов ДВОО способом "Открытие формы".
То есть я хочу сказать, что все ДВОО надо делать со способом вызова "Открытие формы". Это первый вывод.
Рассуждаем дальше. Открытие формы есть открытие формы. То есть, делается это в конфигурации БСП или просто через главное меню "Файл / Открыть", управление попадает в метод формы "ПриСозданииНаСервере". То есть такую обработку очень легко отлаживать. Запускаем через "Файл / Открыть" и отлаживаем. А потом подключаем в конфигурацию и она должна работать так же.
Рассуждаем дальше. БСП при вызове разных типов обработок (печатные формы, обработки заполнения объекта и т.д.) передает им дополнительные параметры. Эти параметры можно отобразить на открываемой форме, чтобы задавать их в режиме отладки. Тем более, что не трудно определить, открывается форма через "Файл / Открыть" или штатным для БСП способом через справочник "ДополнительныеОтчетыИОбработки" и скрывать эти реквизиты при штатной работе и показывать при отладке.
Сделаем обработку, которая подключается ко всем возможным объектам конфигурации и заполняет поле комментарий. Сделаем для нее две разные команда: одну без открытия формы, другую с открытием формы, в которой можно будет задать произвольный комментарий.
Обработка можно будет подключить к любой конфигурации с БСП. В тех объектах, для которых предусмотрено подключение обработок заполнения, должна появится кнопка "Заполнить", заодно сразу будет видно, для каких объектов заполнение с помощь ДВОО не предусмотрено.
Файл обработки - АЦРК_ДополнительнаяВнешняяОбработкаЗаполненияОбъекта_ЗаполнениеКомментария. epf
2.1 Модуль обработки
Согласно БСП в модуле должна быть экспортная функция СведенияОВнешнейОбработке(), которая должна возвращать структуру с параметрами регистрации.
Как заполняется эта структура понятно из текста функции. Отметим следующие моменты:
- в качестве массива назначений указаны все ссылочные типы конфигурации;
- режим небезопасный, потому что меняет содержимое базы данных. Вообще можно дать такую рекомендацию: сначала ставим небезопасный режим, отлаживаем, потом ставим безопасный режим. Если будет работать, значит, оставляем безопасный режим, если нет - возвращаем небезопасный;
- обработка имеет две команды: по одной добавляется фиксированный комментарий, по другой команде открывается дополнительная форма для добавления произвольного комментария. Для формирования таблицы команд используются еще вспомогательные функция и процедура, знакомые всем, кто делал дополнительные отчеты и обработки по стандартам БСП;
- вариант использования для всех команд - "ОткрытиеФормы"
Замечение: в справочнике "ДополнительныеОтчетыИОбработки" есть еще два флажка "ИспользоватьДляФормыОбъекта" и "ИспользоватьДляФормыСписка". Почему их нет в структуре параметров регистрации - загадка. Уж разработчик внешней обработки знает, как она будет использоваться и сможет ли работать со списком объектов, и мог бы так же установить это в параметрах регистрации. По умолчанию они оба устанавливаются, поэтому их надо проверять и устанавливать вручную.
2.2 Форма обработки.
Раз уж мы стоим за вариант использования "ОткрытиеФормы" и ТОЛЬКО за него, то у обработки обязательно должна быть хотя бы одна форма. Рассмотрим ее.
При вызове формы БСП передает ей 4 параметра:
- "ДополнительнаяОбработкаСсылка" типа "СправочникСсылка.ДополнительныеОтчетыИОбработки";
- "ИдентификаторКоманды" типа "Строка";
- "ИмяФормы типа" типа "Строка";
- "ОбъектыНазначения" типа "Массив".
Поэтому добавляем в параметры формы соответствующие параметры. Параметр "ОбъектыНазначения" имеет тип "Произвольный", потому что типа "Массив" на клиенте нет.
Создаем реквизиты формы, соответствующие параметрам формы, и помещаем их на форму, объединив в группу "ГруппаРеквизитовДляОтладки".
В процедуре ПриСозданииНаСервере перенесем параметры формы в соответствующие реквизиты, и в дальнейшем будем работать с этими реквизитами (сами-то параметры будут уже недоступны).
Добавим реквизит формы рф_РежимОтладки типа булево. Он будет установлен в процедуре ПрисозданииНаСервере. Признак отладки - пустое значение параметра "ДополнительнаяОбработкаСсылка", потому что пи штатном запуске БСП всегда передает в этом параметре ссылка на элемент справочника "ДополнительныеОтчетыИОбработки", в котором хранится наша обработка.
Еще добавим для информации таблицу команд, которые есть в нашей обработке, и заполним ее при создании формы на сервере из команд, заданных при регистрации обработки.
А при открытии заполним этими командами список выбора для реквизита "ИдентификаторКоманды".
Сама таблица при открытии скрыта, потому что список команд можно посмотреть в списке выбора идентификатора команды, но, закомментировав соответствующую строку, таблицу команд можно увидеть.
Теперь добавляем реквизит для ввода нашего комментария и помещаем его на формы.
И еще добавляем команду формы "ДобавитьВКомментарий" и выносим ее на форму в соответствующую кнопку.
Еще добавляем в форму реквизит рф_ИмяЭтойОбработки, которую можно использовать для открытия других форм этой обработки с помощью команды:
ОткрытьФорму("ВнешняяОбработка."+рф_ИмяЭтойОбработки+".Форма.ИмяФормы",л_СтруктураПараметров,ЭтаФорма.ВладелецФормы);
Вот собственно и все.
Можно отлаживать обработку через "Файл / открыть", и потом подключить ее в Дополнительные отчеты и обработки.
Конечно, не все так просто, есть нюансы.
Один нюанс связан с отсутствием формы-владельца при отладке через Файл / Открыть. Заключаем такие строки в Попытку.
Другой нюанс заключается в том, что объекты назначения передаются в параметры как массив, но показать массив на форме нельзя, зато для отображения на форме можно использовать список значений. Значит возможно придется выполнять преобразование массива в список и обратно. Для этого есть методы рф_ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения) и рф_ОбъектыНазначения.ВыгрузитьЗначения(), которые работают на сервере.
Обратите внимание на последнюю строку в процедуре ПриОткрытии. Закомментируйте ее, подключите обработку в справочник Дополнительные отчеты и обработки и вызовите обработку в штатном режиме через кнопку Заполнить. Когда форма откроется, вы увидите параметры, которые ей переданы.
Читайте также: