1с обновить форму программно
Довольно часто встречаются задачи, когда нужно организовать программное заполнение формы какого-то объекта. Скажем, у нас есть форма документа, на форме есть реквизиты, и нам нужно сделать команду, которая заполнит эти реквизиты. Данные для заполнения предполагается получать запросом.
Если конфигурация типовая, то, наверное, самый простой способ решения такой задачи – создать внешнюю обработку вида "Заполнение объекта".
Заполнение формы объекта с помощью внешней обработки
Строка с соответствующим параметром в модуле обработки:
Подключив обработку и указав, для какого документа она назначена, мы получим в форме документа команду. Тип команды задаётся при создании внешней обработки, и от него зависит, где и как будет выполняться обработчик команды. Для наших целей может подойти один из следующих типов команд:
- ВызовСерверногоМетода – обработчик команды располагается в модуле обработки;
- ВызовКлиентскогоМетода – обработчик команды располагается в модуле формы обработки;
- ЗаполнениеФормы – обработчик команды располагается в модуле обработки и позволяет работать с данными формы. Также позволяет вызвать серверную процедуру из модуля формы объекта. При этом можно заполнить форму не записывая объект.
Возможность заполнить форму не записывая объект – это то, что нужно. Ведь пользователь скорее всего ожидает, что по нажатию кнопки форма заполнится, а записываться будет позднее, после проверки результата заполнения. Поэтому выбираем тип команды – ЗаполнениеФормы.
В конечном итоге код в модуле обработки будет выглядеть примерно так:
В общем счёте задача решена. Однако, у такого способа есть небольшой недостаток – команда на форме размещается в определённом месте, а не там, где мы хотим её разместить. К примеру, на форме уже есть группа команд, включающая в себя команды заполнения, и мы хотели бы видеть новую команду в этой группе, но при подключении обработки команда на форме будет расположена отдельно от группы.
В связи с этим можно реализовать другой способ: добавить команду непосредственно в форму объекта – либо в основной конфигурации, либо в расширении – а обработчик команды организовать в модуле формы.
Заполнение формы объекта посредством обработчика команды в модуле формы
Итак, размещаем команду на форме объекта в том месте, которое нам нравится. В модуле формы добавляем клиентскую процедуру обработчика команды, из которой будем вызывать серверную процедуру. Серверную процедуру тоже создадим, она нам понадобится потому, что по условию задачи данные для заполнения получаются запросом.
Над серверной процедурой нужно подумать. В ней у нас будет объект формы с типом "ДанныеФормыСтуктура". Что-либо менять или заполнять в этом объекте не получится, возникнет ошибка "Объект недоступен для изменения".
Можно получить объект документа Объект . Ссылка . ПолучитьОбъект () , и заполнить его данными. Но тогда, чтобы увидеть данные в открытой форме, объект придётся записать, а это не очень хорошо.
Будет лучше, если данные добавятся без записи, и мы можем это сделать с помощью метода РеквизитФормыВЗначение . Этот метод преобразует реквизит формы в объект прикладного типа, и вот этот объект прикладного типа мы можем заполнить, а затем, уже заполненный, преобразовать обратно с помощью метода ЗначениеВРеквизитФормы . Выглядеть это будет примерно так:
Есть документ
После записи меняется документ - который реквизит документа
На форме он есть - но отображается старый пока не закроешь и не откроешь новый
как форму обновить?
тоже не работает
хотела обновить реквизит измененный
Используйте событие ОбработкаОповещения на той форме которую хотите обновить. Этот событие возникает в результате работы метода Оповестить().
Например: Вам нужно ПослеЗаписи изменяемого документа вызвать процедуру Оповестить(). И ловить это оповещение в той форме которую хотите обновить в событии ОбработкаОповещения
Судя по всему, этот реквизит обновляется не через ОбновлениеОтображения(), а где-то в ПриОткрытии() и/или при изменении связанного с ним поля. Смотрите в коде как это происходит и добавляйте в ПослеЗаписи().
(4) ЭтотОбъект.Прочитать().
Вызываете в форме в нужном месте, можно на клиенте, можно на сервере.
А уже потом обновляете форму.
(5) Нет, обновятся только реквизиты. А хотелось бы чтобы на форме пропала * у наименования, что там данные актуальны теперь.
(6)Не факт отсутствия звездочки = актуальность данных. Отсутствие звездочки = документ записан. Если на форме есть данные из другого объекта, которые изменились в другом сеансе, то о них можно узнать только получив оповещение открытым формам. Так как то.
И опять нет!))
Отсутствие "*" означает, что ЭтаФорма.Модифицированность = Ложь
Документ (справочник) может быть и не актуальным и не записанным при этом. Все зависит от рук разработчика.
УправляемаяФорма (ManagedForm)
ОбновитьОтображениеДанных (RefreshDataRepresentation)
Синтаксис:
Тип: ГруппаФормы; ТаблицаФормы; ПолеФормы; Массив.
Если параметр задан, то установка значений (и обновление) будет выполняться только для тех элементов, которые заданы в параметре. Если в качестве значения передан пустой массив, то ни для каких элементов формы установка значений выполнена не будет.
После вызова метода признак необходимости установки значений и обновления для элементов формы сбрасывается: если после вызова метода никакие данные формы не меняются, то ни для никаких элементов, кроме указанных, текст обновлен не будет.
Если параметр имеет значение типа Массив, то элементами массива могут быть только значения типа ГруппаФормы, ТаблицаФормы, ПолеФормы.
Если массив содержит значение другого типа, то будет выдано исключение о неверном типе параметра.
Вызов метода ОбновитьОтображениеДанных с параметром имеет смысл только внутри обработчика ВнешнееСобытие, обработчиков ожидания формы и обработчика ОбработкаОповещения.
В обработчиках других событий вызов этого метода с параметром аналогичен вызову без параметра (при необходимости данные будут установлены всем элементам управления).
Описание:
В принудительном порядке обновляет содержание элементов управления.
Полезен при изменении значений реквизитов формы вне формы, в тот момент, когда форма отображается на экране.
Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).
Примечание:
В веб-клиенте обновление элементов управления происходит не сразу, а после окончания выполнения кода на встроенном языке.
Обновить данные списка (динамического списка) на форме:
Обновить содержание элементов управления:
Комментарии
ни одно не помогло
ни одно не помогло
Полная фигня
Подтверждаю, полная фигня.
Подтверждаю, полная фигня.
Зависит от того, что и откуда
Зависит от того, что и откуда вы хотите обновить.
Спасибо, помогло
"ЭтаФорма.Прочитать()" всё
"ЭтаФорма.Прочитать()" всё отлично работает
ЭтаФорма.Прочитать() :
ЭтаФорма.Прочитать() : Метод объекта не обнаружен (Прочитать)
Спасибо! Очень помогло в
Спасибо! Очень помогло в разработке)\
Работает на 8.3.18.1289, УФ,
Работает на 8.3.18.1289, УФ, ERP
Отлично - коротко и ясно. Все
Отлично - коротко и ясно. Все методы нормально работают в тех ситуациях, для которых они предназначены.
у меня в УНФ только вот так
у меня в УНФ только вот так заработало, видимо слишком много изменений в разных процедурах обновлялось
//Сохраним изменения
ЭтаФорма.Записать();
ПоказатьЗначение(,Объект.Ссылка);
В формах объектов данных часто встречаются элементы, косвенно связанные с объектом. Логику обновления этих элементов при изменении объекта обычно вызывают из обработчиков ПриСозданнииНаСервере и ПриОткрытии, забывая про наличие других способов изменения объекта. В статье предложена методика для обычных и управляемых форм, учитывающая все способы.
Актуально для платформы 1С 8.2-8.3.17 (выше не проверял)
Под формой объекта данных в статье подразумевается форма ссылочного объекта (элемента справочника, документа и т.д.) или форма записи независимого регистра сведений.
Пусть в объекте есть строковый реквизит Наименование, длину значения которого мы хотим отображать на форме этого объекта. Добавляем в форму реквизит ДлинаСтроки типа Число и отображаем его в одноименное нередактируемое поле.
Также пусть в объекте есть реквизит типа ХранилищеЗначения, тип которого мы также хотим отображать в форме. Добавляем в форму реквизит ТипЗначенияВХранилище типа Строка и отображаем его в одноименное нередактируемое поле.
В каких же ситуациях нам потребуется обновлять эти косвенно связанные с объектом реквизиты?
Разумеется это нужно вызывать в событии ПриИзменении поля Наименование. А вот дальше многие ограничиваются только вызовом в ПриСозданииНаСервере[упр] и ПриОткрытии[обыч]. Тем самым они не учитывют
- Возможность выполнения пользователем команды "Перечитать" формы.
В управляемой форме она всегда вызывает событие ПриЧтенииНаСервере.
В обычной форме она вызывает событие ПриИзмененииДанных только в модифицированном состоянии формы. В немодифицированном состоянии команда делает ничего. - Возможность изменения объекта в событии ПередЗаписью объекта.
Форма отправляет на запись одно состояние объекта, а после выполнения записи получает другое.
Примеры использования команды "Перечитать"
Случай 1
Объект данных, отображаемый в форме, мог быть изменен в БД с момента его загрузки в форму. Типичные способы таких изменений
- в другой форме в этом же клиентском приложении
- этим же пользователем в другом клиентском приложении в этой же базе
- другим пользователем
- фоновым процессом
Тогда при попытке начать изменение любого поля формы, напрямую связанного с данными (флаг "Изменяет данные"), пользователь увидит предупреждение "Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!"
Это результат срабатывания так называемой оптимистической объектной блокировки. Она гарантирует, что если пользователь изменяет объект, то его изменения не «затрут» изменения, сделанные другими сеансами или другими программными объектами этого же сеанса. И тогда, чтобы получить возможность редактировать объект, нужно будет его перечитать либо переоткрыть форму.
Случай 2
Пользователь изменил данные в форме и решил отменить сделанные изменения, но продолжить редактировать объект от его текущего состояния в БД.
В каких событиях обновлять форму?
Чтобы учесть все эти тонкости, нужно всю логику обновления косвенно связанных с объектом элементов формы поместить в процедуру ПриСозданииПриЧтенииНаСервере и вызывать ее из следующих обработчиков событий формы:
Управляемая форма
- ПриСозданииНаСервере - вызываем в конце тела обработчика, но имеем доступ только к объекту в реквизите формы
- ПриЧтенииНаСервере - имеем доступ ко всем данным объекта
- ПослеЗаписиНаСервере - имеем доступ ко всем данным объекта и вызываем потому, что объект мог измениться в событии ПередЗаписью объекта
Обычная форма
- ПриИзмененииДанных - событие вызывается и для нового и для существующего объекта
- ПослеЗаписи - вызываем потому, что объект мог измениться в событии ПередЗаписью объекта
Управляемая форма
В управляемой форме при открытии существующего объекта выполняются два обработчика: сначала ПриЧтенииНаСервере и затем ПриСозданииНаСервере. Поэтому процедура ПриСозданииПриЧтенииНаСервере будет вызываться 2 раза подряд и нужно не задублировать выполнение логики обновления формы. Элементы формы могут зависеть как от данных объекта, доступных через реквизит формы, так и от недоступных через него (реквизиты типа ХранилищеЗначений), которые доступны только одном из них (ПриЧтенииНаСервере). Поэтому в процедуре ПриСозданииПриЧтенииНаСервере надо предусмотреть оба вызова таким образом, чтобы при создании формы существующего объекта при ее вызове из ПриЧтенииНаСервере выполнилась только логика работы с хранилищами значений, а при последующем вызове из ПриСозданииНаСервере выполнилась только логика, зависящая от остальных данных объекта. При этом ее вызов из уже открытой формы (из ПриЧтенииНаСервере и ПослеЗаписиНаСервере) должен выполнять все действия. Для этого создадим в общем модуле функцию ЭтоВызовПослеОткрытияФормы, где будем проверять наличие параметра ТолькоПросмотр у формы. Тогда процедура ПриСозданииПриЧтенииНаСервере будет выглядеть так
Из процедуры ПриСозданииПриЧтенииНаСервере можно выделить всю легкую клиентскую логику в процедуру НастроитьЭлементыФормы с директивой НаКлиентеНаСервереБезКонтекста. Такую легкую и доступную во всех контекстах формы процедуру можно звать при большинстве изменений реквизитов, которые должны менять косвенно связанные элементы формы.
Пример модуля управляемой формы
Обычная форма
В обычной форме благодаря наличию события ПриИзмененииДанных логику обновления формы можно помещать прямо в его обработчик. Здесь также стоит вынести всю легкую логику в процедуру НастроитьЭлементыФормы по аналогии с управляемой формой.
Пример модуля обычной формы
Применяю данную методику уже много лет.
Прикладываю выгрузку демонстрационной базы, где на примере справочника и регистра сведений показаны все описанные в статье проблемы и сама методика.
Есть форма со списком элементов справочника. При нажатии на список открывается форма с элементом из списка, но при сохранении элемента первая форма не обновляется.
Как программно обновить форму списка?
В форме элемента необходимо написать код:
а, в форме списка добавить событие:
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора PostgreSQL: установка, настройка, обслуживание 11
PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблиц Посмотреть все результаты поиска похожих
Еще в этой же категории
Читайте также: