Как из модуля объекта обратиться к форме 1с
Добрый день. Недавно решил научиться работать с управляемыми формами. Подскажи те, как можно вызвать клиентскую функцию из модуля объекта на управляемой форме? Есть обычная форма и управляемая. С обычной все работает, а вот как приделать ту же функцию к управляемой пока понять не могу.
Если ДилогЗагрузкиФайла.Выбрать() Тогда
Возврат ДилогЗагрузкиФайла.Каталог;
КонецЕсли;
Возврат "";
КонецФункции // ВыбратьПапку()
Возврат Папка;
КонецФункции // ВыбратьПапку()
(1) Получилось только на Толстом клиенте управляемого приложения. То есть для тонкого клиента мне все необходимые функции модуля объекта придётся отдельно дублировать для тонкого клиента? Нельзя как-то написать одну функцию в модуле и дергать её для обычного и управляемого приложения?
(13) а я могу в модуле серверной процедуры прописать кусок, который будет выполняться на клиенте? или всё в модуле объекта выполняется на сервере?
(13) Вот такое к примеру извращение:
(14) Все диалоги выполняются в тонком клиенте исключительно на Клиентской части и их со стороны сервера ты не вызовешь, это тебе еще в (1) ответили. Если надо что-то спросить или выбрать, то делай это в форме, а не в модуле объекта.
(16) То есть все клиентские процедуры пихать только в модуль формы? А если у меня одна и та же функция в 10-ти управляемых формах вызывается, 10 раз продублировать в модулях? Вот этот момент не пойму.
(17) Да все клиентские процедуры пихаются в формы. Если они одинаковые для многих форм, то можешь вынести ее в общий модуль
(0) Сам еще не запутался в показаниях?
(23) Судя по всему у Его Величества 100500 форм в одной обработке.
Подождем, пожалуй, темы, где Его Велоколепие начнет задавать вопросы - как же передавать данные объекта между формами?
(23) А что тут не понятно то? Есть одна функция которую можно вызывать из любой формы обращаясь к модулю объекта и вызываю её в обычных формах. В управляемых же, из модуля объекта её не вызвать, так как она должна выполняться на клиенте, то бишь нужно её прописать в модуль формы, а если у меня таких форм 10 штук, то скопировать в каждую форму. Что не понятно?
(24) Просто пытаюсь узнать у здешних разработчиков, из-за своего незнания работы с управляемыми формами, как сделать 1 процедуру и вызывать её на обычных и управляемых формах не дублируя. 1 функция = много точек вызова.
- и всё?
- и всё.
(26) Зачем ты вообще лезешь туда, если уже заранее уверен в том, что это "костыли by 1C"? Ты мазохист, что-ли?
Узнать он пытается.
(0) Теоретически можно например через обработчик ожидания и фоновое но это будет изврат
И еще надо временное хранилище или нечто вроде юзать
(26) А зачем Вам вызывать процедуру и на обычных формах и на УФ? К чему такая универсализация, если ОФ и УФ сильно отличаются?
(29)+ Короче синхронно не выйдет никак, только асинхронно
Хотя и синхронно можно но это уже ВК на клиенте нужна, которую будет сервер вызывать
P.S.
Можно вот так, но за такие вещи обычно бьют ногой в живот.
(33) > за такие вещи обычно бьют ногой в живот.
А советующего вещи, за которое бъют - чем и куда бить надо? =)
(26) "1 функция = много точек вызова." Также легко как и просто. Передавай в "1 функция" путь к нужному каталогу и не нужно будет тот вопрос задавать на сервере (ГЫ. Сервер может быть в датацентра в Германии. Тогда к кому там будет обращен вопрос?)
(37) общий модуль это хорошо, но если это будет внешняя обработка подключаемая к разным конфигурациям?
(33) Вообще-то, это один из способов вынести общие клиентские методы в отдельный модуль во внешней обработке. Ничего тут критичного нет.
Подскажите пож-та, как из модуля объекта (скажем, отчет) получить доступ (чтение, обновление) к какому либо из элементов формы(форм) этого объекта.
Элемент формы - это просто поле ввода\вывода и один из реквизитов.
Это Имя формы. Например, в справочниках форма обычно называется ФормаЭлемента, в документах это ФормаДокумента и т.д. и т.п.
Поскольку в модуле объекта нет прямого доступа к элементам формы, необходимо передавать форму (или ее элемент) в качестве параметра. Например, если в модуле объекта есть процедура СформироватьОтчет, необходимо добавить в его спецификацию параметр ФормаОтчета и далее использовать любые ее свойства:
Процедура ОбновитьОтчет(ФормаОтчета)
ФормаОтчета.ЭлементыФормы["ИмяЭлемента"] = ЗначениеЭлемента;
КонецПроцедуры
То есть любые процедуры (например, обработчик кнопки Сформировать) должен будет передать в процедуру СформироватьОтчет ссылку на форму:
Процедура КоманднаяПанельФормыСформировать(Элемент)
СформироватьОтчет(ЭтаФорма);
КонецПроцедуры
Другим "плохим" вариантом является объявление в модуле объекта экспортной переменной ФормаОтчета, которую можно заполнить в обработчике ПередОткрытием самой формы отчета:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ФормаОтчета = ЭтаФорма; // Форма отчета должна быть объявлена в модуле объекта со словом Экспорт! Не в модуле формы.
КонецПроцедуры
Спасибо, помогло . Работает в таком виде.
Форма=ЭтотОбъект.ПолучитьФорму("ОсновнаяФормаОтчета");
// Форма=ЭтотОбъект.ПолучитьФорму(); // Поскольку форма одна-то работает и так..
Сообщить(Форма.ЭлементыФормы.ТекущиеДО.значение); // ТекущиеДО - название реквизита и имя этого поля
Форма.ЭлементыФормы.ТекущиеДО.значение = "йцукен";
Предупреждение ("2");
2Harver :
Спасибо, попробую обе возвожности.
Учитывайте, что код
Форма=ЭтотОбъект.ПолучитьФорму("ОсновнаяФормаОтчета");
получит ИМЕННО ВАШУ форму отчета только в случае, если у формы не установлен владелец формы или ключ уникальности.
С отчетами обычно так и бывает, поэтому работать будет, но например, для форм выбора справочников, документов эта конструкция может привести к логическим ошибкам.
Возможно не стоит заниматься такими задачами.
На мой взгляд необходимо изменить местонахождение процедур или добавить реквизит в отчет и подключить реквизит к элементу формы.
Соглашусь с (11) - обращение к форме из модуля объекта чаще всего указывает на некорректность решения в целом.
По поводу реквизита - просто делаете реквизит, выставляете его в нужном элементе формы в свойство "Данные" и обращаетесь из модуля объекта просто по имени реквизита. Как в каком-нить документе или справочнике.
romansun пишет:
Соглашусь с (11) - обращение к форме из модуля объекта чаще всего указывает на некорректность решения в целом.
Возможно, что и так, но это не ко мне - стандартный отчет так написан.
romansun пишет:
По поводу реквизита - просто делаете реквизит, выставляете его в нужном элементе формы в свойство "Данные" и обращаетесь из модуля объекта просто по имени реквизита. Как в каком-нить документе или справочнике.
Да вот не работет оно так, не видит реквизит формы из модуля объекта.
Вверху уже написали в разных видах, что прежде нужно получить ссылку на форму, ну и так далее.
собственно Вы немножко не поняли romansun.
я (и думаю он) имели в виду реквизит объекта а не формы, реквизит формы видимо уже существует.
1. Добавить реквизит необходимого типа в объект.
2. Установить свойство "Данные" у реквизита формы на созданный реквизит объекта.
3. Использовать добавленный реквизит объекта в запросах или изменять его значение любым доступным способом. )
под объектом имеется в виду отчет или обработка в модуле которого и выполняется запрос.
IvanSusanin пишет:
Возможно не стоит заниматься такими задачами.
На мой взгляд необходимо изменить местонахождение процедур или добавить реквизит в отчет и подключить реквизит к элементу формы.
Вопрос не идет о разработке с нуля, а о модификации уже имеющегося отчета(скажем). Основная функция вынесена в модуль объекта, а нужно, по мере выполнения задачи, кое что изменять на форме, откуда она вызвана. ( это по поводу изменения местонахождения процедур). А вот по второй возможности - поподробней,если можно, что то не понимаю как это ?
А если форма открыта, можно и так получить её.
Форма = ссылка.ПолучитьФорму("НазваниеФормы");
Если Форма.Открыта() Тогда
.
Иначе
Форма.Открыть();
КонецЕсли;
//Не обязательно её передавать через параметр, просто получить реквизит
Форма.ЭлементыФормы.Реквизит
В модуле объекта:
Форма=ЭтотОбъект.ПолучитьФорму("Форма");
Форма.ЭлементыФормы.Реквизит.
Выдает ошибку: Интерактивные операции недоступны
Сделал так:
В модуле объекта создал экспортную переменную:
Перем РеквБулево Экспорт;
И, из модуля формы в серверной процедуре перекидывал в переменную Рекв значение флажка:
Обж = РеквизитФормыВЗначение("Объект");
Обж.Рекв = Реквизит;
В модуле объекта, в управляемой форме, есть процедура, которую мне необходимо использовать в модуле форме. Но вызвать ее никак не получается. Можно, конечно, скопировать ее в модуль формы, но . зачем . если она есть в модуле объекта. При вызове пишет что "..нет такой процедуры или функции".
Сначала надо получить объект.
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ДокументОбъект.ПроцедураМодуляОбъектаЭкспортная();
houpl; kolibrik; tol_l; Obvious; user755340; syergio; anuar_medeup; Михаська; dimisa; user841691; G_112708749323588293243; temdj; Terabaytus; provost_ua; khiliy; SeerRM; maksimus753; IgorArhangel; EVKash; shalupov61; lars-net; Coollerok; 627870; Yan_Malyakov; It-developer; METAL; KolBbl4; denmon88; adison; vakham; machneff; user895546; el-le; userzak; user590106_efimenkovladimir; Merkalov; Aggressorak; creatermc; makarovy; Katty_K; Светлый ум; user701220_andy4spam; jane_de_rio; tekit; echo77; MaximStav; Fruktoved; Jeka44; user996563; zhenianik; artspeed; Prad2002; mailrum2004; Gadzhalik; Alligator84; Spirit11; vladir; toofatalex; SurovcevD; Land1966; Mahon83; mikit; iott; ecos; nauriz_11; ekomova; rpgshnik; softgarant; kaps22; ustinov_greendale; bird21; bad_boys; freeek; Nimfetamin; user596222_dr.ti; Enziger; GH0STexe; Xershi; poyson; Serge_ASB; Gavrik; Slava282; soulsteps; cleaner_it; alk; Andrsan; Alien_job; Патриот; jkcea; OksDallas; MsDjuice; cheiser1982; DigitalMan; VNEDRON; 1108; lDenisZl; Gendelf; wolfsoft; gaglo; OStepanych; SotNick; elizarovs; Bukaska; NittenRenegade; + 104 – Ответить
Сначала надо получить объект.
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ДокументОбъект.ПроцедураМодуляОбъектаЭкспортная();
houpl; kolibrik; tol_l; Obvious; user755340; syergio; anuar_medeup; Михаська; dimisa; user841691; G_112708749323588293243; temdj; Terabaytus; provost_ua; khiliy; SeerRM; maksimus753; IgorArhangel; EVKash; shalupov61; lars-net; Coollerok; 627870; Yan_Malyakov; It-developer; METAL; KolBbl4; denmon88; adison; vakham; machneff; user895546; el-le; userzak; user590106_efimenkovladimir; Merkalov; Aggressorak; creatermc; makarovy; Katty_K; Светлый ум; user701220_andy4spam; jane_de_rio; tekit; echo77; MaximStav; Fruktoved; Jeka44; user996563; zhenianik; artspeed; Prad2002; mailrum2004; Gadzhalik; Alligator84; Spirit11; vladir; toofatalex; SurovcevD; Land1966; Mahon83; mikit; iott; ecos; nauriz_11; ekomova; rpgshnik; softgarant; kaps22; ustinov_greendale; bird21; bad_boys; freeek; Nimfetamin; user596222_dr.ti; Enziger; GH0STexe; Xershi; poyson; Serge_ASB; Gavrik; Slava282; soulsteps; cleaner_it; alk; Andrsan; Alien_job; Патриот; jkcea; OksDallas; MsDjuice; cheiser1982; DigitalMan; VNEDRON; 1108; lDenisZl; Gendelf; wolfsoft; gaglo; OStepanych; SotNick; elizarovs; Bukaska; NittenRenegade; + 104 – Ответить
(10) Дело в том, что в контексте модуля формы реквизит Объект является типом ДанныеФормыСтруктура, такой себе облегчённый вариант для работы с объектом формы. Платформа выполняет имитацию исходных объектов с помощью ДанныхФормы, которые имитируют только структуру исходных объектов.
При этом методы исходных объектов недоступны, как и модуль объекта, так как Объект тоже имитируется через ДанныеФормы. Для того чтобы обратиться к модулю объекта или к методам исходных объектов, необходимо выполнить преобразование объекта из данных формы в исходный объект. Поэтому и нужно сделать, то что написано выше.
Данная операция может быть выполнена только на сервере. После чего с помощью метода формы РеквизитФормыВЗначение(), как показано выше или с помощью глобальной команды ДанныеФормыВЗначение() можно преобразовать ДанныеФормы в исходный объект.
(7) Ответ неверный. Модуль объекта и так исполняется на сервере, а директивы компиляции там не действуют.
(6) Сама Процедура в модуле объекта Экспорт 'ная?
(9)Да, экспортная.
Все с вариантом DevilOTS получилось. Спасибо ему за это!
А то звонил франчам, по этой проблеме, но они сами не знают как решить эту проблему. Просили если найду выход позвонить им. );
Спасибо всем за участие!
Если у Вас разные объект например два документа и надо в форму одного документы вызвать процедуру из другого, то в этом случаи надо процедуру помещать в модуль менеджера и вызывать ее как документы.названиедокумента.названиепроцедура. Соответственно все вызовы на сервере.
Такой же вопрос возник по Отчету (а не по документу). Выяснил что нужно параметром указывать "Отчет".
да, а как быть если это внешняя обработка?там нет такого "поставьте компиляцию процедуры модуля объекта НаСервере." как быть?
Модуль объекта (внешняя обработка):
Процедура ЗаполнитьТЧ() Экспорт
// твой код
КонецПроцедуры
vfvava; HetLink; CratosX; METAL; tani6e4ka; vakham; divSvid; nad0_hto; wolder; iott; continental; BlackCors; jkcea; + 13 – Ответить
Сколько читаю все советуют так а вот у меня че то не выходит. В чем ошибка помогите.
(24) Геннадьевич, думаю что нет. И ещё раз нет.
У вас обращение к БД исполняются на сервере.
Соответственно Клиент делает запрос на Сервер и возвращает данные на клиента.
для такого дела ставят флажки в серверных модулях, где они компилируются: Сервер и ВызовСервера(Для обращения с клиентского компа)
Обратите внимание, что нет в свойствах модулей такого флага, как вызов клиента.
Поучите лекции Евгения Гилёва, даже там вам скажут что на клиенте можно использовать методы обращения на сервер, а вот с сервера вызывать метод обращения на клиент - ну никак))))
(59)Уверены! На какой клиент должен уйти вызов с сервера? Возможен только возврат после вызова сервера с клиента.
А теперь вопрос посложнее, господа эксперты: как вызвать процедуру модуля обработки из формы этой обработки из безконтекстной процедуры (чтобы не таскать на сервер всю форму)? Уверен - никак. И модуля менеджера у внешней обработки не существует. Остается только располагать процедуру в форме? Тоже некрасиво. Подскажите, как сделать красиво?
(27) оказалось, что и из процедуры НаСервере в модуле формы не всегда возможно вызвать функции модуля объекта - начинает сбоить РеквизитФормыВЗначение, ошибка
Т.е., например, при переходе от ПриСозданииНаСервере, где все процедуры модуля объекта видятся, к следующей процедуре НаСервере - процедура перестает "видеть" главный свой реквизит формы Объект, и уже не находит его (ссылка есть, а найти по ней - не может).
В общем, полный мрак и внешние обработки )
Для вызова такой процедуры необходимо прежде всего иметь сам объект документа, но прикладные объекты существуют только на сервере. На клиенте их нет. Поэтому поступим следующим образом.
Выполним контекстный серверный вызов. На сервере преобразуем основной реквизит формы в прикладной объект, выполним экспортируемую функцию этого объекта и преобразуем объект обратно в основной реквизит формы.
Для внешней обработки делаю так:
1. завожу реквизит обработки "Модуль"
2. в модуле объекта определяю экспортную процедуру/функцию "Процедура ПроцЭкспорт Экспорт . "
3. в теле модуля объекта делаю присваивание: "Модуль = Объект;"
4. в модуле формы делаю вызов "Объект.Модуль.ПроцЭкспорт();"
все работает
(29) slawa, А для внешнего отчета это не работает?
В 29 написано, что делал для внеш обработки. Но у меня не получилось. Не понятно реквизит обработки "Модуль" какого типа? и п.3 не совсем понял.
Может у кого-то получилось?
Что-то с отчетом совсем печально получается. Даже если его в конфигурацию засунуть, то всё равно не работает.
С документом все прошло удачно.
Как же в отчете сделать так, что бы заработало?
Когда речь идти о ссылках (любых) - в УФ 1С всегда используется тип "Произвольный".
Либо - ставить конкретный тип документов/справочников/объектов, что неприемлемо для внешних обработок.
А я вам объясню сейчас, если в 1С опять не наделали вместе с явными "перебросками" РеквизитФормыВЗначение - еще и неявное обновление/чтение объекта на форме с/через помощью обращения к этому самому объекту через реквизит (а все может быть :) ).
Ведь зачем весь этот огород городить - вызывать из модуля формы функции/процедуры модуля объекта (МО)? А так мы, с помощью МО, и за отсутствием модуля менеджера (ММ) - имитируем вызов аналогичных функций из ММ.
А зачем вообще делать функции в модуле менеджера? Они позволяют работать/обращаться к с объекту из Формы, и менять данные.
Так вот, все вот эти бесконечные "РеквизитФормыВЗначение" и "ЗначениеВРеквизитФормы" - они ж не зря используются тут. Происходит чтение актуальных данных объекта, изменение через процедуру МО, а потом - загрузка измененного объекта на форму (при конвертации в реквизит формы), т.е. актуализация для формы данных объекта.
А это как раз именно, то, что и нужно - выполняется имитация функции модуля менеджера.
А вот ваш вариант - лишь получает и выполняет функции, меняя объект, а данные объекта "на форме" - не меняются в соответствии с вашими актуальными изменениями объекта, которые, вроде бы, должны последовать после вызовов и обработки объекта из модуля формы (а иначе зачем все это) - что происходит при обратном вызове "ЗначениеВРеквизитФормы".
Вы ж только один раз читаете Объект и актуализируете данные - в самом начале. И все.
Но это все верно лишь при условии - что при обращении к реквизиту, содержащему ссылку на объект, данные объекта не "обновляются" на форме.
Присвоение делается не в теле модуля объекта, а в модуле формы, в области автовыполнения кода (это в самом конце модуля).
Или тогда надо делать это присвоение в каждой функции, использующей реквизит "Модуль".
А для УФ в МО реквизит "Объект" формы вы не увидите никак, и, соответственно, не сможете его присвоить реквизиту обработки "Модуль" )
Здравствуйте! По этому пункту непонятно, пишу в модуле объекта, в самом низу, ругается "Переменная не определена (Объект)"
(29)
Slypower; Stivens; zhivoglot; adhocprog; nnn123; Gendelf; Gang031; egorcheg1; COMPER; mad375; uri1978; ---Oleg---; softgarant; An-Aleksey; pavlo; alk; + 16 – Ответить
Модули служат непосредственно для хранения исполняемого кода на языке 1С предприятия. Модули как правило состоят из:
Причем разделы идут именно в таком порядке, наличие всех разделов в модуле не обязательно. При указании процедур, функций и переменных следует указывать, где они будут скомпилированы, если не указана директива компиляции, то компиляция произойдет на сервере(необязательно для толстого клиента). Некоторые модули могут компилироваться и на клиенте и на сервере, некоторые только на сервере.(здесь следует добавить примеров). При указании процедур, функций и переменных можно указать их как экспортные. Тогда эти процедуры и переменные будут доступны из вне этого модуля. Делается это с помощью ключевого слова Экспорт
Модуль приложения
Модуль приложения используется для отслеживания запуска\завершения программы. Отрабатывает только в случае если 1С запускается интерактивно, то есть показывается на экране. В 1С есть два модуля приложения один для запуска обычного приложения, второй для запуска управляемого приложения. Модуль приложения управляемого приложения компилируется на стороне клиента. То есть недоступны обращения к базе данных и прочие объекты доступные только на сервере. В модуле обычного приложения, понятно таких проблем нет. В модуле приложения могут как обычно размещаться объявления переменных, процедуры и функции, а также предопределенные обработчики событий. В модуле доступны следующие события:
ПередНачаломРаботыСистемы событие срабатывает в момент запуска системы, одним из первых, когда запуск еще не произошел. У этого события есть параметр Отказ и если его выставить в Истина , то запуск не произойдет. В этот момент окна еще нет, и взаимодействовать с пользователем, не получится.
ПриНачалеРаботыСистемы событие срабатывает когда запуск уже случился и нужно сделать какие то действия после запуска. Уже есть окно программы и можно что то спросить или сказать. Отказаться от запуска уже невозможно.
ПередЗавершениемРаботыСистемы событие по аналогии с предыдущим срабатывает когда завершение работы еще не произошло, есть параметр отказ и можно спросить пользователя, не ошибся ли он, нажав на крестик.
ПриЗавершенииРаботыСистемы событие срабатывает когда все уже произошло и надо отработать действия которые должны происходить после завершения работы системы.
ОбработкаВнешнегоСобытия вызывается когда происходит какое то событие передаваемое в систему, например вызов ридера магнитных карт или сканера штрихокда.
Если в модуле приложения объявить экспортную процедуру или функцию, то можно будет обращаться к ней напрямую без указания имени модуля, из любого другого модуля(если экспортная процедура объявлена в модуле управляемого приложения то очевидно, что она будет доступна только из клиентских модулей). По существу мы получим процедуру глобального контекста. При этом нужно понимать, что этот модуль компилируется при старте системы всегда, поэтому при наличии большого числа процедур в этом модуле будет падать скорость запуска приложения.
Модуль внешнего соединения
Модуль срабатывает в момент запуска приложения в режиме ком соединения, в этом модуле так же есть события ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы в этом модуле не создается окно и нет возможности взаимодействовать с пользователем . Компилируется на сервере.
Модуль сеанса
Запускается и при запуске пользователем и в случае ком соединения, его предназначение – установка параметров сеанса, в модуле сеанса есть только один обработчик УстановкаПараметровСеанса , этот обработчик вызывается первым при запуске приложения. Модуль сеанса компилируется на сервере и запускается в привилегированном режиме - без контроля прав конкретного пользователя. Так же в модуле сеанса запрещены экспортные процедуры и функции.
Внимание. Этот модуль запускается не только при старте системы, но еще и при обращении к параметрам сеанса которые не были определены. В этом случае в первом параметре процедуры УстановкаПараметровСеанса будет массив с параметрами к которым произошло обращение.
Общие модули
Общие модули служат для хранения процедур и функций, которые должны быть доступны из любого места конфигурации. Как правило в них описывают какие то общие механизмы. Количество общих модулей неограниченно. Обычно общие модули разбивают по функционалу. В отличии от предопределенных модулей, у общих модулей есть возможность указать, в каком контексте они будут скомпилированы. В общих модулях доступны только описания процедур и функций, недоступно описание переменных и раздел основной программы. При написании процедур в общих модулях необходимо учитывать место компиляции этого модуля. Есть возможность установить свойство глобальный в этом случае экспортные процедуры будут доступны без указания названий модуля. Глобальные модули компилируются при старте системы и также замедляют старт системы(особенно это плохо, когда там содержатся такие функции которые могут никогда не понадобиться или используются очень редко). Использование процедур из этих модулей может ухудшить читаемость кода. То есть строчка
Читается гораздо лучше чем просто
Галочка Привилегированный указывает на то что при обработке процедур из этого модуля система не будет обращать внимания на права пользователя, это бывает удобно при больших объемах обработки данных когда обработка должна отработать как можно быстрее и нет смысла уменьшать ее быстродействие проверкой прав или когда на время работы процедуры, необходимо дать пользователю недостающие права. Место компиляции модуля определяется с помощью установки свойств модуля. Доступные значения:
В случае если стоят все галочки, то при компиляции процедура скомпилируется и будет доступна только там где указано директивой препроцессору. Если такая директива не указана, то процедура будет скомпилирована и на сервере и на клиенте. В таком случае, необходимо придерживаться ограничений, накладываемых как на серверный контекст так и на клиентский, то есть не будут работать функции обращения к базе данных(сервер) и не будут работать функции взаимодействия с пользователем(клиент). Обращение к экспортным методам общего модуля скомпилированного на сервере, возможно в том случае если установлено свойство Вызов сервера .
Модуль формы
Формы делятся на управляемые и на обычные. В управляемых формах код делится на клиентский и серверный. В обычных формах весь код выполняется на клиенте. Модуль предназначен для обработки действий пользователя и событий формы. (Подробно о событиях выполняемых в модуле формы можно будет почитать либо по ссылке, которая будет здесь, либо события будут добавлены сюда).
Модуль объекта
В модуле объекта записывают такие обработчики как ПриЗаписи , ОбработкаПроведения . ()Суть модуля заключается в том, что события могут срабатывать, даже при программной записи объекта, открытие формы в данном случае необязательно. Также есть возможность, определить дополнительные методы для объекта, если определить их в модуле объекта с ключевым словом Экспорт .
Модуль менеджера
Модуль позволяет добавить функционал расширяющий возможности менеджера, например: В модуле менеджера справочника номенклатура можно указать:
Формы используются для удобного отображения данных базы пользователю. С формами можно работать как пользователь интерактивно, так и программист управляя поведением и внешним видом формы с помощью кода.
Типы форм
Формы делятся на два типа: обычные и управляемые, обычные формы это формы которые были в линейке 8 с самого начала и по текущий момент. Смысл этих форм заключается в том что форма в прямом смысле рисуется разработчиком, он указывает на то место (вплоть до пикселя)где будут располагаться элементы формы. Обычные формы работают только в толстом клиенте, в то время когда управляемые формы работают и в толстом и в тонком клиенте. Управляемые формы доступны в версии 1С начиная с 8.2 и выше и только когда конфигурация настроена как "Управляемое приложение". В тонком клиенте возможно использование только управляемых форм. Управляемую форму нельзя нарисовать мышкой. Элементы в ней не рисуются, а декларируются или объявляются, что накладывает некоторые ограничения. Вы можете указать что реквизиты будут группироваться горизонтально а не вертикально к примеру, но нельзя указать системе: "вон то поле ввода на 2пикселя выше пусть будет". В управляемых формах код делится строго на клиентский и серверный. В обычных формах можно встретить некоторые серверные ограничения только в режиме клиент-сервер и только для функций которые не расположены в модулях форм.
Программное открытие формы
Программно открыть форму можно с помощью метода "Открыть форму". Этот метод доступен в различных контекстах(форма может существовать и быть открыта только на клиенте) и отличается при использовании обычного и управляемого приложения(в толстом клиенте нельзя передать параметру в форму) но в целом имеет следующие основные параметры: ОткрытьФорму(, , , )
Имя формы: имя открываемой формы, так как для объекта метаданных могут быть не определены никакие формы, возможно указать просто тип формы который надо открыть, например "ФормаСписка" или "ФормаЭлемента".
Параметры - параметры передаваемые в форму, с их помощью можно управлять отборами, устанавливать строку в нужном месте, или просто передавать в форму нужные параметры.
Владелец – используется для организации подбора, обработкой результата выбора если форма открыта для подбора, будет заниматься форма или элемент указанные в этом параметре, так же есть возможность закрывать форму, если закрыта форма-владелец.
Уникальность – этот определенный ключ отвечающий за уникальность формы, если этот параметр указан, то при открытии формы будет произведен поиск формы открытой с этим ключом и если такая будет найдена, то будет активирована уже открытая форма.
Принадлежность форм
Формы могут общими(принадлежать к общим формам) или принадлежать определенному виду объектов, например справочнику номенклатура. Если формы принадлежат какому то виду объекта то они могут быть специального типа: например форма списка, эту форму можно использовать для того, что бы просмотреть список документов или форма документа, эту форму можно использовать для редактирования документа. Здесь мы говорим, «можно использовать» так как когда мы щелкаем по документу в списке или когда мы открываем список документов, будет открываться та форма, которая назначена основной. Если основная форма не назначена, при открытии форма будет сгенерирована, вне зависимости от того есть ли в списке форм, форма нужного вида. По сути форма это просто набор полей и кнопок, Форма выбора , форма списка и форма элемента могут отличаться друг от друга только основным реквизитом, который и служит идентификатором для платформы. Основными реквизитами у форм документа и у элемента справочника являются СправочникОбъект и ДокументОбъект . Для форм выбора и форм списка обычного приложения это СправочникСписок.ВидСправочника и ДокументСписок.ВидДокумента . У управляемого приложения у форм выбора и форм списка основной реквизит ДинамическийСписок . Форма выбора отличается от формы списка установленным свойством Режим выбора у основного реквизита. Если форма принадлежит справочнику\документу то для них доступны следующие типы:
Разница между элементами формы, и реквизитами объекта.
Для корректной работы с элементами формы, следует для себя четко разделить где нужно пользоваться элементами формы, а где реквизитами объекта. К примеру, Элементы.Организация Отвечает за поведение реквизита на форме, начиная от видимости, заканчивая цветом заголовка. В то время как Объект.Организация Предоставляет доступ непосредственно к данным.
Обращение к данным формы из модуля объекта.
Обратиться к реквизиту формы(не путайте с реквизитом документа\справочника) из модуля документа или справочника невозможно, потому, что модуль не может знать какая форма сейчас открыта(а их ведь может много) да и не факт, что при выполнении процедуры или функции модуля формы, какая то форма будет вообще открыта. Реквизиты формы существуют, только до тех пор, пока форма открыта.
"Толстые" объекты на управляемой форме.
Так как на тонком клиенте недостуны, данные базы данных, серверные объекты(например таблица значений) то на форме их как таковые разместить нельзя в то время, когда они как типы для реквизитов доступны. Здесь дело в том что, при добавлении на форму, добавляется не табличное поле, и не сам список элементов справочника номенклатура к примеру, а коллекция например типа ДанныеФормыКоллекция или ДанныеФормыСтруктура с урезанным функционалом, суть которой заключается в том, чтобы отображать данные таблицы значений которая является реквизитом формы или документа. Список методов, доступных для этих типов, позволяет вести комфортную работу, с данными тех объектов которые они отображают.
Преобразование Реквизит – Данные формы и обратно.
Несмотря на то, что типы ДанныеФормыКоллекция , имеют достаточно широкий функционал, иногда возникает необходимость на сервере получить, "оригинал" - тот объект который отображает форма. Особенно это актуально для реквизитов формы, ведь данные реквизитов объекта, можно получить из самого объекта. Для таких случаев существует метод РеквизитФормыВЗначение() , например:
Второй параметр необязательный.(и не совсем понятно зачем он нужен). Возможно и обратное преобразование, бывает необходимо когда полученный извне или сгенерированный объект "засунуть" в уже существующий реквизит формы, соответствующего типа для этого существует
Перезаполнение реквизитов формы в случае изменения объекта.
Бывают случаи когда объект изменяется не из формы а с помощью какой то процедуры, которая находится в модуле объекта или в любом другом месте. Если действие было инициализировано с помощью кнопки на форме, то после, например таких действий:
Вы не увидите изменений на форме, все дело в том, что форма не делает лишних вызовов к серверу без необходимости и как следствие не в курсе, что с объектом, что-то происходило. В этом случае надо перечитать данные объекта, следующим образом:
Читайте также: