1с недопустимая операция для реквизита формы показать
Открытие форм
Область применения: управляемое приложение, мобильное приложение.
1. Для открытия форм следует применять метод глобального контекста ОткрытьФорму (при использовании версии платформы 1С:Предприятие 8.2 и более ранних версий - также ОткрытьФормуМодально ). Применение альтернативного способа, с получением формы и ее последующим открытием с помощью метода ПолучитьФорму , не рекомендуется.
Рекомендация обусловлена соображениями
- повышения устойчивости кода, работающего с формой, за счет разделения программного интерфейса для работы с формой и деталей ее внутренней реализации,
- а также сохранения единой стилистики кода прикладных решений.
Кроме того, применение глобального метода ОткрытьФорму гарантирует выполнение инициализации формы на сервере в обработчике ПриСозданииНаСервере . Этот подход помогает сосредоточить весь код инициализации формы в одном месте и исключает "случайное" обращение к серверу, связанное с инициализацией формы, между строками кода
2. В случаях когда форма требует параметризации при открытии, все ее параметры следует указывать в наборе параметров формы. Таким образом, набор параметров формы декларативно описывает возможности формы по ее параметризации.
Параметры формы из этого набора могут быть указаны в вызывающем коде при открытии формы ( ОткрытьФорму ).
3. Не следует применять другие способы параметризации формы при открытии. Например, нужно избегать обращения к методам и свойствам формы после ее открытия.
Например, вместо
следует по той же причине использовать параметры формы:
ОткрытьФорму("ОбщаяФорма.ПутеводительПоСистеме", Новый Структура("РежимОткрытия", "Приветствие"));
4. Для получения результата работы формы, вместо непосредственного обращения к элементам и реквизитам формы
ФормаВопроса = ПолучитьФорму("ОбщаяФорма.ФормаВопроса");
ФормаВопроса.ОткрытьМодально();
Если ФормаВопроса.БольшеНеПоказыватьНапоминание Тогда
// …
следует использовать процедуры-обработчики оповещений, которые будут вызваны при завершении работы пользователя с формой:
Оповещение = Новый ОписаниеОповещения("БольшеНеПоказыватьНапоминаниеЗавершение", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.ФормаВопроса". Оповещение, РежимОткрытияОкнаФормы.БлокироватьВеcьИнтерфейс);
.
&НаКлиенте
Процедура БольшеНеПоказыватьНапоминаниеЗавершение(БольшеНеПоказыватьНапоминание, Параметры) Экспорт
Если БольшеНеПоказыватьНапоминание = Неопределено Тогда
Возврат;
КонецЕсли;
Если БольшеНеПоказыватьНапоминание Тогда
// …
При этом возвращаемое значение формы формируется в коде модуля формы с помощью метода формы Закрыть .
5. Другие ограничения:
- Обработчик события формы ПриОткрытии не должен содержать код по открытию какой-либо другой формы, так как это может привести к нарушению порядка отображения окон. В этом случае рекомендуется использовать обработчик ожидания на короткий интервал или открывать другие формы интерактивно, например, по нажатию на кнопку.
- Не рекомендуется выполнять программное открытие и закрытие формы в одном обработчике. Такие действия должны быть разнесены по времени. Например, закрытие формы можно выполнять в обработчике ожидания.
- При использовании в конфигурации Библиотека стандартных подсистем и разработке форм (рабочих мест), предназначенных только для внешних пользователей, следует явно блокировать открытие таких форм в сеансах "обычных" пользователей. Для этого следует устанавливать параметр Отказ при создании формы на сервере с помощью функции ЭтоСеансВнешнегоПользователя общего модуля Пользователи или ПользователиКлиент :
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
…
КонецПроцедуры
6. Следующие виды форм должны быть всегда доступны пользователю в режиме 1С:Предприятия из меню "Все функции" вне зависимости от того, размещены ли соответствующие объекты в командном интерфейсе приложения или нет:
Я хочу, чтобы после нажатия кнопки "Открыть1" открывалась ФормаЭлемента, в которой я заполняю значение реквизита "Строка", нажимаю кнопку "Закрыть1" и в ФормеДокумента создается строка табличной части и заполняется значением, введенным на форме "ФормаЭлемента".
Написал такой код:
В обычном режиме вся эта история работает, но вот в Управляемом пишет "Недопустимая операция для неоткрытой формы" при нажатии кнопки "Закрыть1".
Как мне правильно переделать все это, чтобы работало в Управляемом приложении?
Зачем столько телодвижений? Для данной конкретной задачи подойдет ВвестиСтроку. А вообще это делается так: в форме2 при закрытии вызывается процедура Оповестить (подробнее в синтакс-помощнике), а в модуле формы1 создается процедура ОбработкаОповещения (подробнее в синтакс-помощнике). ПолучитьФорму возвращает абстрактную форму документа, к конкретной открытой уже форме никакого отношения не имеющую, о чем тебе 1С и сообщает. (2) antz, Спасибо, попробую с помощью "Оповестить" - "ОбработкаОповещения", чуть позже отпишусь о результатах Передайте владельца формы и всего деловДля формы документа
(6) tusv, Никогда такие извращенства не любил :). и что не есть гуд владельца тут не заблокируешь. а если в это же время на владельце поменять что то. (8) На то и УФ, когда юзер может работать в форме выбора, параллельно имея возможность еще что-то делать на владельце. И разумеется, юзер должен понимать, что он делает Все еще проще если разрешена модальность что правда не комильфо в Управляемых формах то
метод
По хорошему надо делать вот так для УФ
В форме которая открывает форму ввода
В самой форме Ввода
По поводу этой части - если реквизитов формы несколько, прописывать команду "Закрыть" для каждого?
(10) user591603_neterpenie, можно в структуру запихать. Но модальности и в самом деле лучше избегать.К сожалению, по прежнему:
: Ошибка при вызове метода контекста (Закрыть)
Закрыть(Менеджер);
по причине:
Недопустимая операция для неоткрытой формы
Текущий код для формы документа (ФормаДокумента с табличной частью "Продукция"):
Для формы ввода позиции (ФормаНовогоЭлементаЗаказа)
Ты закрываешь элемент? Бугага
Ты должен писать Этаформа.ВладелецФормы.ТипПродукции = ТипПродукции. И зачем структура? либо возвращай структуру. а то что ты написал это бред. Сам вдумайся Закрыть ТипПродукции что такое тип продукции? это элемент или объеки формы как ты его собираешся закрыть. (13) user591603_neterpenie, Учите матчасть ..
Для формы ввода позиции (ФормаНовогоЭлементаЗаказа)
Текущий код для формы документа (ФормаДокумента с табличной частью "Продукция"):
(16) bmk74, Этим и занимаюсь.)
Спасибо, попробую так.
Вот этот код назначен на кнопку на форму документа (ФормаДокумента)
Этот на кнопку в ФормеЭлемента:
а этот кусок на что назначить?)
Текущий код для формы документа (ФормаДокумента с табличной частью "Продукция"):
Там же располагаешь где и
Вот этот код назначен на кнопку на форму документа (ФормаДокумента) назначать никуда
А вот сокращать вызов функции Открыть форму не нужно.
Я же привел конкретный пример открытия формы
При закрытии формы происходит оповещение владельца
этот код вставлен в функцию открыть форму и здесь "ПолучитьДанныеИзФормы" Будет вызван при закрытии открытой формы прочитай встроенную справку по функции открытьФорму(), там все написано.
Итог - все работает.
Всем большое спасибо.
Но есть несколько Но.(
Если закрывать форму ввода элемента стандартной командой (крестиком), выдает вот такую ошибку: "Недопустимое значение параметра (параметр номер '2')".
При этом в табличной части формы документа создается пустая новая строка :)
Как быть с этим?
И один из последних моментов, которые я хотел-бы организовать.)
Представляю примерно так - добавить кнопку в форме документа "РедактироватьПозициюЗаказа" по нажатии на которую открывается ФормаВводаЭлемента выбранной строки ТЧ формы доку мента с уже заполненными данными, которые я сохранил ранее.
Как организовать что-то подобное?)
И еще один момент тут пришел мне в голову.) можно-ли как-то сделать, чтобы, например, в форме элемента я мог указывать, сколько конкретно строк мне создавать?) т.е. в форме элемента я заполняю данные, указываю, к примеру, 6 строк, и при нажатии кнопки "Сохранить" в ТЧ формы документа генерится 6 одинаковых строк с информацией, заполненной в форме элемента.
(24) user591603_neterpenie, Можно и первое и второенаводящие данные по первому
Получить данные строки можно через таблицаФормы.текущиеданные. так получишь текущую строку
На открываемой Форме
Все остальное остается как есть
По Второму вопросу
Сами подумайте немного. подсказака в структуре возврата передать количество
и в функции получения пройти циклом от 0 до количества
Немного запутался, т.е. вот этотим кодом:
мне нужно заменить код, назначенный на кнопку "Добавить" на Форме док-та:?
Сделал новую кнопку "ИзменитьПозициюЗаказа" на форме "ФормаДокумента" с ТЧ "Продукция", пробую пока с одним реквизитом, команду для кнопки назначил:
для формы "ФормаНовогоЭлементаЗаказа:
в итоге по нажатию кнопки ФормаНовогоЭлементаЗаказа открывается, но поле "ТипПродукции" остается незаполненным.(
(40) user591603_neterpenie, потому что сначала ты установил параметр при открытии, а затем его затер оповещением!Оповещение у тебя пустое!
Отладкой что влом пройти?
(41) Xershi, я еще не вполне понимаю, как правильно искать ошибки.)
Но, в любом случае, спасибо за пищу для размышлений.
(42) user591603_neterpenie, как пользоваться отладкой?В интернете поищу инфу. Это основной механизм при тестировании кода. Сразу скил подымешь на порядок!
Если будет что не понятно спрашивай.
Ок, буду пробовать, спасибо.)
Я так понимаю, мне нужно установить точку останова в начале кода, потом последовательно выполнять его строчка за строчкой и смотреть значения в Табло вычислений?
Сами подумайте немного. подсказака в структуре возврата передать количествои в функции получения пройти циклом от 0 до количества
Относительно этого момента - все понятно, но, продолжая развивать тему,
а если я хочу, чтобы помимо этого для каждой из этих строк в поле "СерийныйНомер" создавался новый серийный номер по определенным правилам?
Т.е. Я сохраняю в ФормеНовогоЭлемента, в ТЧ, форме документа в ТЧ у меня 6 одинаковых строк, для которых фоном заполнились разные серийные номера по логике (максимальный существующий+1)?)
ДанныеЗакрытия = Неопределено, если форма была просто закрыта.
P.S.:
Читай встроенный хелп, там же всё понятно написано.
Например, в дополнительной форме создаем реквизит "СсылкаНаТЧОсновнойФормы" произвольного типа.
На кнопке основной формы пишем код
затем в дополнительной форме обрабатываем. Примерный код:
И никаких модальных форм, оповещений (и никаких бесконечных "колбас", т.е. строк кода, убегающих вправо за край экрана в бесконечность, что потом фиг разберешься) не нужно
(29) Onwardv, не учите людей плохому. ниче что ваш код не будет работать, вы бы хоть проверили сначала. и что это такое ссылкаНаТЧ есть такое понятие . и при чем здесь строки кода убегающие ?никто не мешает перенос сделать.Что не так? Классика объектно-ориентированного программирования: в свойстве первого объекта храним ссылку на второй объект и в методах первого объекта работаем со вторым через эту ссылку.
В толстом клиенте часто пользуюсь этим приемом. Всё работает отлично.
М.б. в управляемых формах так нельзя? Хотя сильно сомневаюсь.
Практика показывает, что многие не разбивают, и когда правишь такой креатив (говнокод) всегда спотыкаешься при попытке понять всю гениальность задумки разработчика. Одно дело, когда скользишь взглядом сверху вниз, и совсем другое, когда, помимо этого, приходиться ещё и экран вправо-влево гонять. Очень неудобно.
В любом курсе скорочтения указано, что информацию мозг гораздо быстрее воспринимает через узкие колонки типа газетных, а не широкий текст типа альбома. Классика объектно-ориентированного программирования
А ниче что 1С не относиться к ООП. Ну нету ту ни наследования ни перезагрузки функции( хотя счас типа пытаются расширениями это сделать). да много чего нет
И просто понятия ссылкинаТЧ в 1С тоже нету есть как таковая табличнаячасть как объект но вот ссылки на этот объект просто нету потому как где он в памяти расположен знает только сама 1С и адрес ее она вам не предоставит что бы передать его в функции.а объект между формами такой не передать..и уж на то пошло в вашем коде вы не ссылку передаете а сам объект(наверное)..так как эти механизмы скрыты от программиста 1С Еще раз повторяю, что в обычном приложение всё прекрасно передается.
Даже ссылки на формы, на элементыФорм и т.д. Пользуюсь постоянно.
В форме добавляете реквизит произвольного типа, туда и пишите нужные ссылки из вызывающего кода.
Например:
И т.д. в том же духе.
В данном случае мы в главной форме храним ссылку на дополнительную, а в дополнительной: ссылку на главную.
Вы меня прямо заинтересовали, постараюсь на выходные попробовать реализовать на УФ. По результатам отпишусь.
(33) Onwardv, На оф у вас все происходит в одном контексте, на УФ увы контексты разные..видимость совершенно другая.Кстати проведите эксперимент насчет ссылок, передайте "ссылку" на открываемую форму. потом закройте основную. и попробуйте изменить что то в переданных ссылках. дает спокойно изменять . обрадую вас это не ссылки это новые экземпляры. и формы и строкиТЧ. иначе при закрытии основной формы у вас должен мусор быть. так как по канонам ООП при удалении основного объекта память должна освободиться. Где-то во встроенной помощи по 1С читал, что у них объект выгружается из памяти, если не осталось ссылок на него, как я понял, любой. Не знаю, как другие, но обработки и формы висят.
В нашем случае, Форма закрывается, но в памяти остается, т.к. есть ссылка на неё. Т.е. Форма.Открыта() вернет ложь. Эту форму можно заново открыть. Это всё тот же объект, а не другой экземпляр.
Как можно проверить:
1) Получить Допформу, в ОсновнойФорме запомнить ссылку на неё, далее ДопФорма.Открыть()
2) В открывшейся ДопФорме нажать кнопку, которая поменяет заголовок.
3)Потом ДопФорму закрыть.
4) Если в Основной форме теперь выполнить команду ссылкаНаДопФорму.Открыть(), то откроется форма, у которой заголовок изменен.
Если бы это был новый экземпляр, то заголовок был бы первоначальный. (35) Onwardv, Ладно соглашусь, скорее всего таки да пока на экземпляр созданного объект есть хоть одна ссылка он его не выгрузит.из памяти, это типа что то com объекта, принцип тот же. На выходные проверил на УФ. Есть своя специфика.
1с не дает в реквизите управляемой формы хранить ссылку на объекты, ругается.
Следует действовать через объявление экспортных переменных в модуле формы.
В нашем примере реквизит произвольного типа в дополнительную форму добавлять не нужно, а нужно в модуле дополнительной формы добавить:
В этом случае код из основной формы:
Всем снова добрый день, возвращаюсь к вопросу редактирования строки ТЧ Формы док-та через произвольную форму Элемента.
Буду пробовать для всех реквизитов формы ТЧ убирать возможность редактирования в форме док-та (только просмотр), и отдельной кнопкой вызывать ФормуЭлемента для редактирования введенной ранее инфы.
В этой теме осталось только добавить немного синтакс-помошника:
Глобальный контекст (Global context)
ОткрытьФорму (OpenForm)
Вариант синтаксиса: По названию
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)
Подробнее уже в самом можно посмотреть. Все очень подробно и хорошо написано.
Когда впервые столкнулся примерно с такой же проблемой, довольно быстро разобрался.
В <Параметры> передаешь всю необходимую информацию на открываемую форму
В <ОписаниеОповещенияОЗакрытии> описываешь экспортную процедуру, которая вызывается при закрытии формы. В этой процедуре 2 параметра:
Первый параметр - это то, что находится в скобках
Второй параметр - а вот тут я и сам не знаю. У меня он всегда "Неопределено".
Тут еще писали, что нельзя заблокировать окно владельца. Но, насколько я помню, последний параметр <РежимОткрытияОкна> как раз за это и отвечает и имеет следующие значения:
БлокироватьВеcьИнтерфейс (LockWholeInterface)
БлокироватьОкноВладельца (LockOwnerWindow)
Независимый (Independent)
Значение по умолчанию: Неопределено
в итоге, как я сделал для кнопки "ИзменитьПозициюЗаказа" формы "ФормаДокумента" (пробую пока с одним реквизитом):
Для формы "ФормаНовогоЭлементаЗаказа":
В итоге значение реквизита "ТипПродукции" из формы "ФормаДокумента" переносится в форму "ФормаНовогоЭлементаЗаказа",
но, при сохранении, в форму "ФормаДокумента" добавляется новая строка, а не изменяется выбранная.(
текущий код для параметров закрытия формы "ФормаДокумента"
Как мне его изменить, чтобы именно при изменении строки ТЧ "Продукция" формы "ФормаДокумента" в форме "ФормаНовогоЭлементаЗаказа" не добавлялась новая строка, а изменялись данные выбранной текущей, если я вызвал форму "ФормаНовогоЭлементаЗаказа" кнопкой "Изменить" и добавлялась при вызове кнопкой "Добавить"?))
gvk2009 подробно и доходчиво описал разницу методов, за что ему огромное спасибо:
В Синтаксис-Помощнике очень скупо написано о процедуре ДанныеФормыВЗначение(), чуть побольше - о РеквизитФормыВЗначение(). И совсем нет примеров использования. Попробуем с этим разобраться.
РеквизитФормыВЗначение()
Является методом управляемой формы, компилируется только &НаСервере, контекст формы является для него необходимым, поэтому компиляция &НаСервереБезКонтекста недоступна. На клиенте не работает, поскольку в результате получаем прикладной объект.
Где и когда его нужно использовать?
Метод РеквизитФормыВЗначение() необходим, если требуется из модуля формы вызвать стандартный метод объекта или метод (процедуру, функцию) из модуля объекта, из общего модуля.
Этот метод будет отрабатывать с данными, взятыми из формы, т.е. еще не записанными в базу.
Для того, чтобы измененные данные вернуть на форму, используется метод ЗначениеВРеквизитФормы().
Вторым параметром метода РеквизитФормыВЗначение является тип значения. Это необязательный параметр. Если обрабатываемый реквизит не является составным типом, то тип будет автоматически получен из реквизита формы. Иначе генерируется исключение времени выполнения.
В указанных выше случаях метод РеквизитФормыВЗначение() похож на метод ПолучитьОбъект(). Разница в том, что первый получает объект, заполненный данными формы, а второй - объект с данными из базы.
ДанныеФормыВзначение()
В отличие от метода управляемой формы РеквизитФормыВЗначение(), процедура глобального контекста ДанныеФормыВЗначение() может работать без контекста формы, но именно поэтому, в частности, ей необходимо указывать тип конвертируемых данных.
Обратной процедурой является ЗначениеВДанныеФормы().
В этом примере на форме отображен набор записей регистра бухгалтерии. При отработке процедуры, активность набора меняется только на форме, в базе при этом ничего не происходит. Активность у набора записей регистра в базе поменяется только после выполнения операции Записать.
В этом примере на клиент возвращается ОснРеквизит, содержащий измененные данные. Но его еще нужно "запихать" в отображаемую форму. Для этого используем процедуру глобального контекста КопироватьДанныеФормы().
В большинстве случаев процедуры ДанныеФормыВзначение() и РеквизитФормыВЗначение() взаимозаменяемы. При этом РеквизитФормыВЗначение проще в использовании. Но если требуется использование &НаСервереБезКонтекста - тогда только ДанныеФормыВЗначение.
Программное открытие формы элемента справочника с заполнением параметров
Здравствуйте. в собственной конфигурации есть справочник "ЖурналРегистрацииОбъектныхГрафиков".
Перенос данных из справочника в табличную часть формы документа
Здравствуйте. Создаю документ в конфигурации Бухгалтерия предприятия, редакция 2.0 (2.0.43.6) на.
Выбор данных для формы документа из табличной части справочника
Всем доброго времени суток! Ситуация. Есть справочник клиентов, в котором есть табличная часть с.
Проблема с заполнением документа из формы
Доброго времени суток! Столкнулся с проблемой следующего содержания: есть документ, на нем.
Alwarus, почему не передается?
Добавлено через 1 минуту
Alwarus, ты его туда передал вот так
ПараметрыФормы = Новый Структура("Наименование", ПараметрКоманды); ОткрытьФорму("Документ.ПерсональныеДанные.Форма.ФормаДокумен та", ПараметрыФормы,
Но такой параметр ты должен обработать вручную в процедуре ПриСозданииНаСервере
Добавлено через 2 минуты
По второму варианту выдает ошибку:
: Ошибка при вызове метода контекста (ОткрытьФорму)
ОткрытьФорму("Документ.ПерсональныеДанные.Форма.ФормаДокумен та", ПараметрыФормы);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'val':
форма: Элемент
имя: val
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы'
Наверно и при этом надо создать процедуру ПриСозданииНаСервере. Или ПриОткрытии?
Alwarus, что стоит в Тип параметр команды - в свойствах команды?
Добавлено через 3 минуты
Alwarus, и почему нельзя использовать команды формы?
Тип команды СправочникСсылка.Пациент
Команды формы наверно можно использовать, создал кнопку на форме с командой в модуле объекта:
Решение
Добавлено через 48 секунд
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы'
Ошибка о чем говорит?
Что ты передаешь на сервере Хрень, сервер не знает таких типов как "ПолеФормы"
Забудь навсегда слово ЭЛЕМЕНТЫ. к данным так обращаться НЕЛЬЗЯ!
2
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", Новый Структура("Пациент", Объект.Ссылка));
ОткрытьФорму("Документ.ПерсональныеДанные.Форма.ФормаДокумен та", ПараметрыФормы); Заработало, спасибо! И за совет про Элемент тоже. )) Интересно получается, мы создаем структуру с ключом "ЗначенияЗаполнения" и значением, которое получаем созданием еще одной структуры с ключом по справочнику "Пациент" и значением-ссылкой на него, правильно?
А почему выдает такую же ошибку при работе с командой справочника? Там же не было ссылки на элементы формы.
Добавлено через 1 минуту
Открытие формы на добавление записи с автоматическим заполнением связанного поля
Приветствую всех! Помогите разобраться! В БД имеются две таблицы, связанные через поле "код.
Вызов значения из справочника в коде формы документа
Имеется процедура, которая вызывается при изменении параметра в табличной части. Суть такова, что.
Открытие формы на добавления на основе данных из другой формы
Помогите решить две проблемы: 1. Есть "форма 1" со свободным полем "Код предприятия", нужно чтобы.
Очистка данных формы, открытие другой формы
И снова здравствуйте, дорогие жители форума. Столкнулся с простой на первый взгляд проблемой, но.
Автоматическое открытие формы справочника при переходе в Подсистему.
Как можно реализовать, чтобы когда я нажимаю на подсистему, при переходе сразу открывалсь форма.
Открытие формы\документа во фрейме
Всем привет. Столкнулся с проблемой, пока не знаю как её разрулить (все в web) 1. Есть.
Читайте также: