Позаконтекстний виклик методів об'єкта обробки (звіту) у керованій формі. Позаконтекстний виклик методів об'єкта обробки (звіту) в керованій формі 1с виклик процедури форми з модуля об'єкта

У нових версіях конфігурацій системи 1С:Підприємство багато функцій і процедур перемістилися з модулів об'єктів (документів, довідників і т.д.) в модулі менеджера. Розглянемо різницю між цими двома модулями.

Відповідно до теорії об'єктно-орієнтованого програмування, методи об'єктів поділяються на дві групи: статичні та прості. Прості методи мають доступ лише до конкретного екземпляра класу. Статичні методи немає доступу до даних об'єктів, а працюють із класом загалом.

Якщо перевести все це в терміни системи 1С:Підприємство, то Модуль об'єктамістить найпростіші методи. Для їхнього використання необхідно спочатку одержати конкретний об'єкт: елемент довідника, документа тощо. Модуль менеджераМістить статичні методи. Для його використання немає необхідності окремо отримувати кожен конкретний об'єкт, він дозволяє працювати з усією колекцією одразу.

Модуль об'єктаможе мати процедури та функції, які можна використовувати ззовні. Для цього така процедура чи функція позначається словом Експорт.

Функція НоваФункція () Експорт

Для того щоб використовувати таку функцію з модуля об'єкта, потрібно спочатку, маючи посилання на необхідний об'єкт, отримати його за допомогою функції ОтриматиОб'єкт().



Пер = Об'єкт. Нова Функція ();

Аналогічно можна створювати нові змінні, які можна використовувати з різних об'єктів конфігурації.

Перем НоваЗмінна Експорт

ЕлементДовідника = Довідники. Номенклатура. ЗнайтиПоКоду("000000001");
Об'єкт = Елемент Довідника. Отримати Об'єкт () ;
Об'єкт. Нова Змінна =);

Таким чином можна доповнювати стандартні процедури, функції та властивості (змінні) об'єктів. Такі змінні є динамічними, вони не зберігаються в інформаційній базі та існують лише під час роботи з отриманим об'єктом.

Модуль менеджерамає все ті ж можливості, різниця лише в тому, що для його використання не потрібно отримувати конкретний об'єкт, модуль менеджера дозволяє працювати з колекцією об'єктів певного типу.

Процедура НоваПроцедура () Експорт

ЕлементДовідника = Довідники. Номенклатура. Нова Процедура ();

Або для змінної:

Перем НоваЗмінна Експорт

ЕлементДовідника = Довідники. Номенклатура. Нова Змінна;

Розглянемо відмінності у застосуванні модуля об'єкта та модуля менеджера на прикладі процедури створення друкованої форми документа.

При використанні модуля об'єкта код буде виглядати так:

Функція ДрукДокумента (Посилання) Експорт
//У цю функцію необхідно передати посилання на конкретний документ
Повернення ТабДок;
КінецьФункції

На формі документа необхідно створити процедуру, яка передавала б у функцію друку посилання на документ.

&На Клієнті
Процедура Друк(Команда)
ТабДок = ДрукНа Сервері() ;
ТабДок. Показати ();
КінецьПроцедури
&На Сервері
Функція ДрукНа Сервері()
Док = РеквізитФормиЗначення("Об'єкт") ;
Повернення Док. ДрукДокумента (Об'єкт. Посилання);
КінецьФункції

Недолік цього методу полягає в тому, що він дозволяє надрукувати лише один об'єкт. Якщо потрібно надрукувати кілька документів відразу, потрібно отримувати кожен із новачків, та був викликати функцію з модуля об'єкта. Це потребує значних системних ресурсів, оскільки при отриманні об'єкта він повністю поміщається в оперативну пам'ять.

З точки зору продуктивності краще використовувати модуль менеджера, коли це можливо. У нашому прикладі розв'язання задачі буде виглядати так.
Функція ДрукНа Сервері()
Документи. Нашдокумент. ДрукДокумента (МасивПосилань);
КінецьФункції

У разі використання модуля менеджера процедуру друку можна викликати як з форми документа, так і форми списку, передаючи в масиві посилання на кілька документів. При цьому системі не потрібно одержувати кожен документ із масиву, що значно заощаджує системні ресурси.

То коли ж використовувати модуль об'єкта, а коли модуль менеджера?

Все залежить від завдання. Якщо для виконання достатньо посилання на об'єкт (наприклад завдання друку), то краще використовувати модуль менеджера. Якщо ж стоїть завдання зміни даних, наприклад заповнення документа, необхідно його отримати і використовувати модуль об'єкта.

Стаття продовжує цикл «Перші кроки у розробці на 1С», у ній детально розглянуто такі питання:

  • Що таке програмний модуль та з яких розділів він складається?
  • Навіщо потрібен модуль докладання? Чому їх два? Коли якийсь запускається? Які тонкощі роботи?
  • Які події пов'язані з початком роботи системи, як і де їх обробляти?
  • Навіщо потрібен модуль зовнішнього з'єднання? Коли та як його використовувати?
  • Коли використовується модуль сеансу?
  • Що таке спільні модулі? Які в нього властивості та правила роботи? Для чого потрібно використовувати властивість "Повторне використання значень, що повертаються"?
  • Коли використовується модуль форми та які події в ньому можуть бути оброблені?
  • Навіщо призначений модуль об'єкта? З яких розділів він складається? Як переглянути доступні події модуля?
  • Які тонкощі роботи існують із модулями менеджера значення (для констант) та модулями набору записів (для регістрів)?
  • У чому різниця між модулем об'єкта та модулем менеджера? Коли потрібно використати останній?

Застосовність

У статті розглядається платформа "1C:Підприємство" 8.3.4.496. Матеріал є актуальним і для поточних релізів платформи.

Модулі в «1С:Підприємство 8.3»

Модулі – це об'єкти, де міститься програмний код.

У Платформі існує досить велика кількість видів модулів, кожен з яких має своє призначення та особливості.

Будь-який рядок коду повинен перебувати в будь-якому модулі. Розрізняють модулі загального призначення та модулі об'єкта. Деякі модулі можуть бути скомпільовані як на Клієнті, так і на Сервері, а деякі лише на Сервері.

Модуль може складатися з кількох розділів. У розділі опису змінних описуються локальні змінні даного модуля, які можуть бути використані в будь-якій процедурі.

Всередині кожної процедури можна звертатись до змінної модуля. Крім того, всередині самої процедури може бути ще одне оголошення змінної з таким самим ім'ям. Це буде локальна змінна цієї процедури.

Незважаючи на однакову назву, це дві різні змінні: одна використовується всередині конкретної процедури, а інша – поза нею.

У деяких модулях для змінних може бути зазначено місце компіляції (доступність) на Сервері або на Клієнті. Наприклад:

За розділом опису змінних слід розділ процедур і функцій, де вказуються локальні методи даного модуля. У деяких модулях слід вказувати, де буде скомпільовано процедуру або функцію.

У принципі директиву компіляції можна не вказувати. І тут директивою компіляції за умовчанням є Сервер. Тим не менш, для зручності аналізу програмного коду рекомендується явно вказувати, де буде скомпільовано цю процедуру. Порядок опису процедур не має ніякого значення.

Наприкінці модуля, після опису всіх процедур та функцій, розташовується розділ основної програми, де можуть утримуватися деякі оператори, ініціалізуватися локальні змінні модуля форми. Цей розділ виконується під час звернення до модуля.

Приміром, при відкритті форми елемента передусім виконується розділ основний програми модуля форми.

Слід зазначити, що розділ оголошення змінних та розділ основної програми існують не для всіх модулів (тобто в деяких модулях ці розділи неприпустимі). Розділ опису процедур та функцій може існувати абсолютно у будь-якому модулі.

Модуль програми

Цей модуль призначений для того, щоб обробити події запуску програми та завершення його роботи. Наприклад, під час запуску програми можна завантажувати курси валют з Інтернету. Після завершення програми можна переконатися у користувача про його наміри закінчити роботу.

Також у модулі програми існують спеціальні обробники, які дозволяють перехопити зовнішні події від обладнання.

Це можуть бути події від рідера магнітних карток, фіскального реєстратора. І ці події можна якимось чином теж опрацювати.

Слід звернути увагу, що у модулі програми відстежується саме інтерактивний запуск системи.

Модуль програми не працюватиме, якщо запуск програми 1С здійснюється, наприклад, в режимі com-з'єднання. У цьому випадку вікно програми не створюється.

Слід зазначити, що в Платформі 8.3 існує два різних модулі програми: модуль керованого додатка і модуль звичайного додатка. Події модуля керованого додатка відпрацьовуються при запуску Тонкого та Толстого клієнта Керованого додатка та Веб-клієнта.

Модуль Звичайної програмипрацює при запуску Толстого клієнта в режимі Звичайної програми, в якому є звичайний командний інтерфейс у вигляді Головне меню.

Якщо програма працює і в режимі Керованого, і в режимі Звичайної програми, то необхідно описувати процедури-обробники як для модуля Керованого додатка, так і для модуля Звичайної програми.

Модуль Керованого додаткаВи можете вибрати з контекстного меню кореневого вузла конфігурації.

Також цей модуль можна відкрити з палітри властивостей кореневого конфігураційного елемента.

Щоб відкрити модуль Звичайної програми, слід звернутися до налаштувань конфігурації (команда Параметриу меню Сервіс).

Відкриється форма Параметри. На закладці Загальнімає бути вказано режим редагування конфігурації Керований додатокі Звичайний додаток.

У цьому випадку модуль Звичайної програмитакож можна буде відкрити властивості кореневого вузла.

Список подій, які можна обробляти, для Керованогоі Звичайної програмиоднаковий.

У цьому модулі можна розміщувати розділ оголошення змінних, розділ опису довільних процедур та функцій та розділ основної програми. Але крім довільних процедур та функцій у модулі можуть бути розташовані спеціальні обробники подій.

Список доступних обробників можна переглянути, якщо при відкритому модулі викликати список процедур та функцій поточного модуля.

У вікні Процедури та функції відображаються всі процедури та функції цього модуля, а також події, для яких обробники ще не створені.

Є дві події, пов'язані з початком роботи системи (“перед” та “прі”). Дві події, пов'язані із завершенням роботи системи (“перед” та “при”). А також опрацювання зовнішньої події (наприклад, події торговельного обладнання).

Коли виконується обробник події “перед”, вважається, що дія ще скоєно. Коли виконується обробник події “при” – дія вже вчинена.

Подія ПередПочаткомРоботиСистемивиникає в той момент, коли проводиться запуск Підприємства 8.3, але сама програма ще не з'явилася на екрані. Ця подія має такий параметр, як Відмова.

Якщо цей параметр набуде значення Істина, то програма не запуститься. Подія ПриПочаткуРоботиСистемиприпускає, що дія вже здійснена, вікно вже створено, і в цьому випадку ми можемо, наприклад, відобразити якусь спеціальну форму. Від запуску відмовитись уже не можна.

Аналогічно перед завершенням роботи системи програма ще відкрита і можна відмовитися від її завершення. Після завершення роботи системи вікно програми вже закрилося. Можливо виконати лише додаткові дії, наприклад, видалення якихось файлів або відправлення електронного листа.

У модулі Керованого додаткане вказуються директиви компіляції процедур та функцій, оскільки модуль повністю компілюється на стороні Клієнта. Це означає, що у процедурах та функціях модуля ми не зможемо безпосередньо звернутися, наприклад, до довідників.

Якщо з модуля Керованого додатканеобхідно зробити Серверний виклик, то для цього потрібно буде створювати спеціальні з виставленим прапором .

У модулі Звичайної програмиподібних обмежень немає, оскільки даний модуль компілюватиметься під час завантаження Толстого клієнта. У товстому клієнті доступні практично всі типи даних.

Процедури, функції та змінні модулі програми можуть бути описані як експортні.

Оскільки модуль скомпільований повністю на Клієнті, це означає, що в клієнтських процедурах ми можемо звертатися до даного методу та даної властивості.

Наприклад, з модуля форми якогось об'єкта можна викликати процедуру або функцію модуля програми. Однак для опису загальних алгоритмів рекомендується використовувати Загальні модулі. Основне призначення модуля програми – обробити точку старту та точку завершення.

За аналогією з модулем програми даний модуль призначений для того, щоб обробити подію відкриття програми та подію завершення роботи.

На відміну від модуля програми, який ініціюється у момент інтерактивного запуску програми, модуль зовнішнього з'єднання працює як com-соединения, тобто. коли створюється об'єкт 1С:Підприємство 8 і здійснюється підключення до певної бази.

У цьому модулі є події: ПриПочаткуРоботиСистемиі ПриЗавершенніРоботиСистеми.

Модуль зовнішнього з'єднання можна відкривати, використовуючи або контекстне меню на рівні кореневого об'єкта конфігурації, або палітру властивостей кореневого вузла.

Сам процес зовнішнього з'єднання – це процес програмної роботи з інформаційною базою, а чи не інтерактивний. Відповідно, в цей момент не можна використовувати діалогові форми, виводити попереджувальні повідомлення, так як немає інтерфейсу користувача.

У Модулі зовнішнього з'єднання можна описувати експортні змінні та експортні методи, які будуть доступні на тій стороні, де відбувається зовнішній виклик 1С:Підприємство 8.3.

Оскільки у зовнішньому з'єднанні немає інтерфейсу користувача, Модуль зовнішнього з'єднання компілюється повністю на Сервері.

Модуль сеансу

Цей модуль потрібний для того, щоб ініціалізувати параметри сеансу. Параметри сеансу – це швидкі глобальні змінні, значення яких доступні будь-де конфігурації.

Відкрити Модуль сеансу можна через контекстне меню, або через палітру властивостей кореневого вузла.

У Модулі сеансу передбачено подію УстановкаПараметрівСеансу.

При старті програми дана процедура викликається найпершою. Параметри сеансу потрібні при будь-якій роботі програми: як під час інтерактивного запуску, так і при запуску в режимі зовнішнього з'єднання.

Модуля сеансу описує різні дії з ініціалізації параметрів сеансу в залежності від різних умов.

В даному модулі, як правило, описуються кілька процедур, що викликаються з процедури УстановкаПараметрівСеансу. Тому всі ці процедури виділено в окремий модуль.

Модуль сеансу завжди виконується у привілейованому режимі. Це означає, що не буде перевірено права доступу при зверненні до бази даних. Модуль сеансу компілюється на сервері, тобто. можливе звернення до будь-яких серверних методів (зокрема і читання значень із бази).

У Модулі сеансу можна визначати лише процедури та функції, тобто. немає розділу опису змінних і немає розділу основної програми. Модуль сеансу не може описувати експортні методи.

Якщо при запуску системи необхідно виконати деякі дії на Сервері, наприклад створити елемент будь-якого довідника, то, як варіант, можливо використовувати Модуль сеансу, т.к. він компілюється на сервері і завжди достовірно виконується при старті системи. Однак при цьому необхідно враховувати такі моменти:

  • процедура УстановкаПараметрівСеансувиконується не тільки під час старту системи, а також при зверненні до неініціалізованих параметрів сеансу. Тобто. обробник УстановкаПараметрівСеансу може викликатися неодноразово в процесі роботи програми;
  • якщо кількість елементів у масиві параметрів сеансу дорівнює нулю (у масиву необхідних параметрів тип даних невизначено), це момент запуску програми;
  • оскільки Модуль сеансу працює у привілейованому режимі та перевірки прав доступу не буде, слід дуже акуратно працювати з об'єктами бази даних, тому що користувач може отримати доступ до тих даних, які йому не повинні бути надані;
  • під час запуску системи достовірно ще відомо: чи буде запущено додаток. При цьому в обробнику події Встановлення параметрів Сеансу можуть бути зайві дії.

Дані модулі є опис деяких загальних алгоритмів, тобто. процедур та функцій, які можуть викликатися з різних місць.

Логічно пов'язані методи можна групувати у різні Загальні модулі. Ці модулі створюються всередині гілки Загальні.

Можна додати будь-яку кількість спільних модулів. Щоб використовувати методи Загальних модулів в інших місцях конфігурації, необхідно їх визначати з ключовим словом Експорт. Клієнтські процедури загальних модулів будуть доступні на Клієнті, а серверні – на Сервері.

У Загальних модулях доступний лише розділ опису процедур та функцій. Тобто. у Загальному модулі не можна описувати змінні та не можна описувати розділ основної програми.

Якщо потрібна глобальна змінна, можна використовувати або параметри сеансу, або експортні змінні модуля програми.

Для Загальних модулів можна встановити певні параметри, які впливатимуть на поведінку цього модуля. Якщо для Загального модуля виставлено властивість Глобальний, то оголошені в даному модулі експортні методи будуть доступні безпосередньо, без будь-яких додаткових вказівок.

Тобто. даний Загальний модульбратиме участь у формуванні глобального контексту конфігурації.

Властивість Глобальнийдля загальних модулів може бути корисним. Однак не варто використовувати його повсюдно для всіх загальних модулів.

Ті , які позначені ознакою Глобальний, компілюватимуться при старті системи. Чим більше таких модулів, тим повільніше програма стартуватиме.

Якщо прапор Глобальнийдля Загального модуляне вказано, то компіляція даного модуля буде виконуватися в момент першого звернення до нього (тобто вже після старту системи).

З іншого боку, використання глобальних загальних модулів впливає розуміння коду. Виклик методів не глобального загального модуля здійснюється через ім'я Загального модулята ім'я методу, наприклад:
Модуль Розрахунки Собівартості.

При цьому імена Загальних модулів повинні відображати зміст процедур, які в них описуються. Вказівка ​​імені Загального модуля під час виклику процедури сприяє кращому розумінню коду.

Для Загального модуляв Палітрі властивостейможна встановити властивість Привілейований.

У привілейованому модулі не контролюються права доступу. Це необхідно в тому випадку, якщо у Загальний модульпотрібно виконувати масову обробку даних, отримання даних із бази.

Контроль прав доступу збільшує час звернення до бази даних, а масові алгоритми, як правило, повинні працювати якнайшвидше.

Наприклад, ресурсомісткою операцією є розрахунок заробітної плати. Необхідно, щоб вона виконувалася якнайшвидше. Для цього алгоритми, які розраховують заробітну плату, поміщають у привілейовані .

При цьому всі процедури, які забезпечують заповнення документів щодо нарахування заробітної плати, знаходяться поза цими Загальних модулів. Саме у цих процедурах і виконується контроль за правами доступу.

Таким чином, можна досягти значного підвищення швидкодії. Особливо це стосується випадку застосування механізму рядкового розмежування доступу до записів таблиці.

Якщо Загальний модуль є привілейованим, процедури цього модуля можуть бути скомпільовані тільки на Сервері.

Бувають ситуації, коли користувачеві якийсь об'єкт має бути недоступним, наприклад, певний довідник. Але при проведенні якогось одного документа звернення до цього довідника необхідне.

Тобто. виникає потреба тимчасово розширити права користувача, та був повернути в вихідний стан. Цей ефект може бути отриманий при використанні привілейованих Загальних модулів.

Для цього в привілейованому Загальний модульслід оформити процедуру, яка звертається до потрібних даних.

Ця процедура викликатиметься із відповідного документа. Тобто. Користувачеві на момент виклику цієї процедури фактично надаються розширені права.

Для Загальних модулівІснує можливість вказувати місце компіляції. За допомогою прапорів встановлюється: чи буде доступний Загальний модуль на Клієнті (керований додаток) на Сервері в режимі роботи Зовнішнього з'єднання.

Крім того, якщо перевести режим редагування конфігурації в Керовану програму та звичайну програму, то буде можливий ще один контекст компіляції – Клієнт (звичайний додаток).

Таким чином, виділяється чотири варіанти функціонування програми. Залежно від запущеної програми, залежно від роботи на Клієнті або Сервері будуть доступні або недоступні певні Загальні модулі.

Крім можливості вказувати прапори компіляції, є можливість вказувати директиви компіляції для процедур і функцій, що знаходяться в Загальному модулі.

Якщо для методу вказана директива компіляції, то незважаючи на те, що Загальний модуль доступний у всіх зазначених контекстах, доступність конкретного методу буде обмежена директивою компіляції.

При цьому процедура не може бути доступна в контексті, який не є доступним в цілому для всього модуля.

Якщо директиву компіляції для процедури (функції) не вказувати, вона буде скомпільована у всіх контекстах, визначених для модуля.

Тобто. насправді буде зроблено кілька копій процедури. Вибір конкретного скомпільованого екземпляра залежить від місця виклику процедури (за правилом найближчого виклику). При цьому слід враховувати, що код такої процедури має бути написаний з урахуванням його доступності у всіх контекстах, визначених для модуля.

Загальні модулі, одночасно доступні в різних контекстах, в основному призначені для того, щоб створювати процедури, доступні в декількох контекстах.

При створенні Загального модуля правилом хорошого тону вважається не вказувати директиви компіляції. Тобто. доступність процедур та функцій має визначатися властивостями самого модуля.

При такому підході в окремих Загальних модулях будуть розміщені клієнтські процедури, і в окремих Загальних модулях – серверні процедури.

Модулі, у яких встановлено кілька прапорів компіляції, практично використовуються вкрай рідко. Це деякі спільні дії, доступні як на Клієнті, так і Сервері. Зазвичай це якісь найпростіші обчислення.

Важливо! З Клієнта можна звертатися до експортних серверних методів Спільного модуля, але тільки в тому випадку, якщо цей Спільний модуль скомпільований тільки на Сервері. При цьому для забезпечення доступу з Клієнта призначений спеціальний прапорець .

Для неглобальних загальних модулів існує можливість кешування тих значень, які повертаються функціями. Тобто. система може після першого виклику функції запам'ятати результат виконання. Якщо ця функція буде викликана знову з тими самими параметрами, система видасть значення вже з кешу.

Мета цього механізму – прискорити повторні дзвінки. Для налаштування такої поведінки необхідно в Палітрі властивостеймодуля виставити відповідне значення для властивості Повторне використання значень, що повертаються.

За промовчанням для цієї властивості визначено значення Не використовувати. Інші можливі значення: кешувати На час дзвінка, або На час сеансу.

Ця властивість має сенс використовувати тільки для тих функцій, результат яких залежить виключно від вхідних параметрів. Даний механізм доступний тільки для глобальних Загальних модулів.

Якщо вибрано значення відповідного параметра На час дзвінка, кеш буде діяти до тих пір, поки працює та процедура, звідки було здійснено виклик методу Спільного модуля. Якщо вибрано значення На час сеансу, умовно вважається, що кеш буде діяти, поки користувач працює.

Тим не менш, існують певні часові обмеження. Очищення кешу відбувається автоматично через 20 хвилин після потрапляння значення в кеш.

Модуль форми

Цей модуль призначений для того, щоб обробити дії користувача. Наприклад, описати алгоритм реакції програми при натисканні кнопки. Або, наприклад, у момент введення в поле значення одразу ж виконати перевірку на коректність.

Крім подій, що з елементами управління форми (кнопки, поля введення) існують події, пов'язані безпосередньо з формою.

Наприклад, можна опрацювати подію відкриття форми та провести якусь початкову ініціалізацію. Також можна обробити подію закриття форми і перевірити, чи все правильно ввів користувач.

Існують форми керовані та форми звичайні. Модулі даних форм відрізняються передусім тим, що модуль керованої форми чітко поділяється на контекст. Кожна процедура повинна мати директиву компіляції. У звичайній формі весь код використовується на Клієнті.

У модулі керованої форми можна оголошувати процедури та функції, можна оголошувати змінні та описувати розділ основної програми.

Програмний код основний програми виконуватиметься на момент ініціалізації форми, тобто. коли користувач починає її відчиняти. На малюнку представлено перелік стандартних подій для керованої форми.

Список подій керованої форми видно також у списку властивостей безпосередньо самої форми. Цей список викликається у редакторі керованих форм.

У керованій формі можна опрацювати подію запису елемента. Ця подія є лише форм об'єктів (довідників, документів та інших). Якщо форма не прив'язана до конкретного об'єкта, подія запису відсутня.

Для модуля нормальної форми перелік стандартних подій трохи менше, т.к. в керованій формі багато подій зроблено парними (одне виконується на Клієнті, а інше на Сервері). У звичайній формі весь код виконується на Клієнті.

Модуль об'єкта

Дані модулі характерні для довідників, документів, планів видів розрахунків, планів рахунків та багатьох інших об'єктів. Модуль об'єкта призначений для обробки стандартних подій. Наприклад, подія на введення елемента довідника, подія запис елемента, видалення, проведення документа тощо.

У принципі, подія запису існує й у Модулі форми. Але подія запису Модулі форми виникає у процесі інтерактивної записи, під час роботи з конкретної формою.

Подія запису в Модулі об'єкта буде виконуватися за будь-якого запису з будь-якої форми даного об'єкта. Крім того, якщо об'єкт записується програмно, в цьому випадку спрацьовуватиме подія модуля об'єкта.

У події запису Модуля об'єкта можна вбудовувати всі перевірки на коректність даних, що записуються, так як ця процедура буде відпрацьовувати в момент абсолютно будь-якого запису.

Модуль даного об'єкта можна викликати через контекстне меню, з палітри властивостей об'єкта та з вікна редагування об'єкта.

Нижче на малюнку представлено список доступних подій модуля довідника.

У Модулі об'єкта можна розміщувати розділ опису змінних, описувати довільні функції, які можуть бути не пов'язані з подією, а також розділ основної програми.

У розділі основної програми можна, наприклад, виконувати ініціалізацію локальних змінних модуля. Цей програмний код буде виконуватися при зверненні до цього Модулю об'єкта.

Слід зазначити, що всі процедури Модуля об'єкта скомпільовані на сервері. Відповідно директиви компіляції у процедур та функцій Модуля об'єкта вказувати не потрібно. Деякі об'єкти конфігурації не мають Модулів об'єктів.

Це з особливостями самих об'єктів. До таких об'єктів відносяться Константиі Реєстри. Для Константне існує модуля об'єкта, але існує дуже схожий модуль, який називається Модулем менеджера значення.

У Модулі менеджера значенняможна виконати обробку подій запису Константита обробку перевірки заповнення.

Весь контекст модуля виконується на сервері.

Для регістрів існує модуль набору записів.

У цьому модулі також є можливість обробляти події запису та виконувати перевірку заповнення.

У Модулях об'єктів, Модулях менеджера значення (для констант) та Модулях набору записів (для регістрів) можна описувати методи, які можна робити експортними, і ці методи будуть доступні з-за.

Тобто. Крім використання фіксованих методів класу об'єктів, можна створювати для об'єкта додаткові методи в Модулі об'єкта. У цьому модулі слід описати відповідну процедуру з ключовим словом Експорт.

Тоді можна буде звертатися до цієї процедури ззовні. Причому цей метод відображатиметься у контекстній підказці. Нові методи у контекстній підказці виділяються синім шрифтом (синій значок p()для процедур та f()для функцій).

Аналогічно можна створювати нову властивість, оголосивши змінну з ключовим словом Експорт. До цієї властивості також можна буде звертатися з зовні.

Таким чином можна розширювати функціональність об'єктів (довизначати нові методи та нові властивості). У цьому властивості є динамічними і зберігаються у базі даних.

Якщо необхідно використовувати для об'єкта властивість, яка зберігатиметься у базі даних, слід створювати реквізит об'єкта.

Модуль менеджера

Цей модуль існує для багатьох об'єктів (довідники, документи, регістри та ін.). Модуль відкривається через контекстне меню для об'єкта, або через Палітру властивостейабо через вікно редагування.

У Модулі менеджера можна перевизначити деякі стандартні події. ОбробціОтриманняДанихВибору, коли вибирається елемент із довідника, можна зробити якусь додаткову фільтрацію чи перевірку.

Крім цього, у Модулі менеджера можна створити додаткові методи та вказати, що вони є експортними. В цьому випадку можливе звернення до даних методів з-за.

Для того, щоб виконати це звернення, необхідно отримати тип даних Довідник Менеджер.

Відмінність експортних методів Модуля менеджера і Модуля об'єкта у тому, що з звернення до методу Модуля об'єкта спочатку необхідно одержати сам об'єкт (тобто якимось чином одержати посилання і далі це посилання перетворити на об'єкт).

Після цього будуть доступні експортні змінні та методи Модуля об'єкта. Для Модуля менеджера звернення простіше, наприклад:
Довідники.Контрагенти.Ім'яМетоду

Це два різні звернення. Перетворення з посилання на об'єкт (метод ОтриматиОб'єкт) - це досить серйозна дія для системи, так як при отриманні об'єкта читаються абсолютно всі дані цього об'єкта, що може бути досить тривалим.

Друга відмінність у тому, що МодульОб'єктавикликається у контексті конкретного елемента. Відповідно можна вважати, що він застосовний для даного елемента (у більшості випадків закладається саме така логіка).

Що стосується Модуля менеджера, то в ньому описується якась спільна дія для групи або для всіх елементів довідника чи документа. Наприклад, якщо потрібно надрукувати елемент довідника, можна використовувати Модуль об'єкта.

Але в Модулі менеджера можна створити більш універсальний механізм, який друкуватиме, в тому числі, і групу елементів.

Крім того, звернення до Модуля об'єкта – це все-таки триваліша дія. Тому вирішувати це завдання в модулі менеджера краще.

На цьому завершимо наше знайомство з модулями у конфігурації системи «1С:Підприємство». Якщо підвести коротке резюме всьому вищенаписаному, то в сухому залишку виходять такі висновки:

  • Програмний модуль – це частина конфігурації, яка може містити лише текст вбудованою мовою 1С
  • Програмні модулі класифікуються за видами, які ми розглянули у статті. Кожен вид визначається місцем розміщення та доступним програмним контекстом.
  • Структура модуля складається з деяких розділів, що розташовуються у певній послідовності. Склад розділів визначається видом модуля.

Також наголосимо, що ми свідомо опустили один вид модуля, а саме модуль команди. Нічого примітного він не представляє, і ми пропонуємо вам самостійно ознайомитися з його функціональністю.

Поки весь наш програмний код ми розглядали уривчасто від прикладного рішення, і, як правило, писали його в якійсь своїй невеликій тестовій конфігурації. А ви знаєте, що «не можна просто так взяти» і почати редагувати код типової конфігурації? Ні? Тоді у наступній статті ми все це пояснимо!

Awk 693 22.12.13 22:44 Зараз у темі

() Почнемо з головного. Маячня і нісенітниця - це спроба пофарбувати вирази емоціями. Що досить складно зробити за допомогою епістолярного жанру. Тож це вираз мого нерозуміння, а не спроба зачепити. Приємно мати справу з людиною що це розуміє. Якщо зачепив вибач.

Аналогія просто недоречна, за природою ОВП. ООП – спадкоємець процедурного, модульного програмування. Це все одно, що порівнювати батька та сина, при цьому ставлячи приклад батька сина.

Посперечатися із твердженням важко. Але за змістом це зауваження слабко пов'язане з місцем, що коментується в статті.

Це з наведеним у статті прикладом. Там метод має директиву компіляції, причому ключове слово "експорт", чомусь опущене.

З того, що йому жодного разу не доводилося чогось робити, ще не випливає, що це не є актуальним, або що цього не роблять інші.

Так. Мені не доводилося змінювати загальні модулі заради зовнішньої обробки. Робити різні версії, під різні конфігурації – доводилося.

У звичайному додатку вони часто використовуються для вирішення суто інтерфейсних завдань:

Отож і воно, що у звичайному. Я не передрікаю його смерть (цілком хороше і перевірене рішення), але тенденції такі, що 1С все далі йде в бік розподілених обчислень, з явним виділенням коду на місця його дії. Тут рідко прокочує (якщо прокатує взагалі): "Все на клієнта, а там розберемося" або "Дернем сервер пару разів - адже гігабітка у нас".

Я думаю, було б корисно розширити абстракцію, закладену в поняття "Загальний Модуль", і ввести в конфігурацію
сутності нового типу, скажімо, "Мудуль", аналогічні об'єктам Module з MS VBA.
"ЗагальніМодулі" були б окремим випадком об'єктів "ВиконуванийМодуль", що знаходяться приблизно
у тому ж співвідношенні, що об'єкти "ЗагальнаФорма" і просто "Форма".

Для початку, непогано було б в 1С реалізувати простори імен та метаданих модулів, а не як зараз (цитата із синтакс-помічника); "Невизначено - тому що не передбачається робота із вбудованої мови"

Допустимо число станів, що використовуються у формі, велике, і припустимо, що
при використанні форми можливість реалізації конкретного стану мала;

У класичному веб-програмуванні - це вирішується можливістю форми вкладати в форми та асинхронними викликами (AJAX), на жаль це проігноровано 1С. Отже, залишається три варіанти:

1. Використовувати різні форми
2. Передавати всі необхідні дані на клієнта
3. Смикати сервер.

Взагалі, позаконтекстні виклики сервера не вважаються чимось поганим, чого слід уникати.
- У принципі навіть існує думка (з якою я не дуже згоден), що якесь "зайве" число
серверних контекстних викликів - менше зло, якщо їх оптимізація "занадто" заплутує "читаність" коду.


Позаконтекстні виклики сервера призначені зменшення трафіку при передачі даних від клієнта на сервер. Лише цим вони відрізняються від контекстних.

Приклад 1: треба отримати контрагента за документом основи.

клієнт сервер
1. форма вибору -> отримання форми
2. При зміні<--
3. Отримати контрагента --> ДокументПідстава["Контрагент"]

На третьому етапі немає сенсу тягнути на сервер всю форму, з усіма реквізитами. Тому, доцільно використовувати НаСерверіБезКонтексту.

У твоєму варіанті можна просто використати:

Для методів модуля об'єкта:

&На СерверіБезКонтексту
Функція Что_то_с_чем_то(ОбъектОбработка, ТипОбработкиРядок, Параметры)
Повернення ДаніФормиЗначення(Об'єктОбробка, Тип(ТипОбробкиРядок)).ПотрібнаНамФункція(Параметри);
КінецьФункції

Для методів модуля менеджера:

&На СерверіБезКонтексту
Функція Что_то_с_чем_то(Имя, Параметры)
Повернення Обробки [Ім'я]. Потрібна Нам Функція (Параметри);
КінецьФункції

Питання: Як викликати функцію з керованої форми, що міститься в модулі іншого об'єкта?


Як викликати функцію з керованої форми, що міститься в модулі іншого об'єкта?

Пробую:
&На Сервері
Процедура МояПроцедура() Обробка = РеквізитФормиЗначення("Запис",Тип("ОбробкаОб'єкт.ПотрібнаОбробка")); Результат = Обробка.ЕкспортнаПроцедураВМодуліПотрібноїОбробки("ПотрібнийПараметр"); КінецьПроцедури Помилка: неправильний параметр № 1

Відповідь:І це стосується не лише обробок – а взагалі, в принципі, навіть будь-яких об'єктів.

Також ти можеш з однієї обробки зайняти в іншій реквізити та інші херовини які там є.


Привіт!
Підкажіть приклад коду, як можна програмно викликати заповнену друковану форму за посиланням на об'єкт,
наприклад,
посилання=Документи.РахунокФактураВиданий.ЗнайтиПоКоду(...);
...
посилання...ОтриматиДаніДрукованихФорм...
і т.п

Відповідь:Викличте команду з якої викликається друк цього документа і в ній один параметр - це документ.

Питання: керовані форми в УВП 1.3


Доброго дня! У конфігураторі створюю обробку з керованою формою (перемикаю прапор на керовану). У режимі підприємства ніяк не відкривається. Хто стикався? як відкрити створену керовану форму?

Відповідь:+() Класика жанру:

<<К сожалению, это невозможно. Свойство "Использовать управляемые формы в обычном приложении" не влияет на внешние обработки и отчёты. В обычном приложении можно открывать только обычные формы таких объектов, а в управляемом только управляемые. Это ограничение платформы.>>

Запитання: [ВИРІШЕНО] Виклик процедури модуля форми з модуля керованої форми зовнішньої обробки


Шановні експерти, підкажіть, будь ласка:
8.3.9.2170
Як із клієнтської процедури модуля форми зовнішньої обробки (УФ), прив'язаної до документа, викликати процедуру модуля форми цього документа?
Дякую

Відповідь:

Отримати форму документа та викликати потрібну експортну функцію у модулі отриманої форми.

Питання: Керовані форми, і навіть доп. реквізити довідника


Привіт!
Я почав працювати з керованими формами, а також доп. реквізитами довідника, які були запроваджені в режимі підприємства.
1С: Підприємство 8.3 (8.3.8.2054), 1С: Комплексна автоматизація 2 (2.2.3.196).
На жаль, зіткнувся з проблемою і не зміг налякати її рішення.
Суть така - є зовнішня обробка, у ній користувач вибирає номенклатуру, після чого інші поля цієї обробки мають автоматично заповнити додаткову обробку. реквізитами цієї номенклатури. Спіткнувся на початку - намагаюся запитом отримати ці додаткові. реквізити.
1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 & НаКлієнті Процедура НоменклатураПриЗміні(Елемент) ДопРеквізити = ЗапитДопРеквізитів(Об'єкт. Номенклатура) ; КінецьПроцедури & На сервері Функція ЗапитДопРеквізитів(Номенклатура) ЗапитДопРеквізитів = Новий Запит() ; ЗапитДопРеквізитів. Текст = "ВИБРАТИ | НоменклатураДодатковіРеквізити.Посилання, | НоменклатураДодатковіРеквізити.Властивість, | НоменклатураДодатковіРеквізити. | НоменклатураДодатковіРеквізити.ТекстоваРядок| Довідник.Номенклатура.ДодатковіРеквізити ЯК НоменклатураДодатковіРеквізити|ДЕ | НоменклатураДодатковіРеквізити.Посилання = &Номенклатура"; ЗапитДопРеквізитів. ВстановитиПараметр("Номенклатура", Об'єкт. Номенклатура); РезультатЗапитДопРеквізитів = ЗапитДопРеквізитів. Виконати (). Вивантажити (); Повернення РезультатЗапитДопРеквізитів; кінецьфункції

Видає

"(ЗовнішняОбробка.ДрукЕтикеток.Форма.Форма.Форма(11)): Помилка при виклику методу контексту (ЗапитДопРеквізитів)
ДопРеквізити = ЗапитДопРеквізитів (Об'єкт. номенклатура);
через:
Помилка передачі даних між клієнтом та сервером. Значення неприпустимого типу.
через:
Помилка перетворення даних XDTO:
ПочатокВластивості: ret Форма: Елемент Тип: (http://www.w3.org/2001/XMLSchema)anyType
через:
Помилка відображення типів:
Відсутнє відображення для типу "(http://v8.1c.ru/8.1/data/core)ValueTable""

Будь ласка, допоможіть!

Додано через 9 хвилин
У 28 рядку "Повернення РезультатЗапитДопРеквізитів;" повертається таблиця значень. Пробую на клієнті позначити змінну "ДопРеквізити" як "Новий ТаблицяЗначень" - програма лається, що не знає, що таке "ТаблицяЗначень". Намагаюся міняти контекст із "НаКлієнта" на "НаСервері" - тоді вже не лається, але й відладник перестає працювати.

Відповідь:Дякуємо за відповідь!

Розмістіть на формі табличну частину аналогічної структури

Але навіщо користувачеві ця таблична частина? Лише зайве нагромадження форми обробки.

Додано через 6 хвилин
Спробую створити таб. частина обробки (без винесення її у форму) й у неї завантажити результат.

Так і вийшло! Дякую!

Питання: Робота з ТаблицеюЗначень у керованій формі


Добрий день. ТаблицяЗначень мене не перестає дивувати. Ось власне питання: створю зовнішню обробку (керована форма). Створюю реквізит "ТЗ" з типом "ТаблицяЗначень". І перетягую його на форму. Далі в модулі форми, пишу "ТЗ" і після точки в списку випадаючому списку не бачу властивість "Колонки". Далі, створюю програмно:

і пишу "ТЗ." та у випадаючому списку є властивість "Колонки". Питання-чому????????

Відповідь:

Повідомлення від Briolin

А 1с треба зробити щоб прямий в конфігураторі було написано що у реквізиту на формі тип даних Дані Форми Колекція!

Тоді буде не зрозуміло в який прикладний об'єкт можна перекласти

Питання: Керована форма (доступність елементів)


На Базі УТешки 10.3.40.1 платформа 8.3.9.2033 роблю форму підбору товару у веб-і. Створив нову роль, для неї почав відкривати доступ до об'єктів поступово. Все було добре, доки не дійшов до довідника Значення властивостей об'єктів. Зрозуміло, що в 10 немає керованих форм, всі генеруються в процесі, але якщо форма вибору тих самих "Властивостей об'єктів" нормально створюється, то форма вибору "Значень властивостей об'єктів" створюється з неактивними елементами... І що я тільки не пробував - права на читання, на перегляд і довіднику та ПлануВідівХарактеристик.ВластивостіОб'єктів... нічого не допомагає. Куди рити? Варіант зробити окрему форму і все там прописати можна не пропонувати, його я залишив на випадок, якщо причина так і не з'ясується.

Відповідь:Чи може доступність встановлюється в самій формі за якоюсь умовою?

Питання: При закритті керованої форми довідника пишу до регістра відомостей,


При закритті керованої форми довідника пишу до регістра відомостей,
якщо запис довідника створюється нова, то помилка, об'єкт довідника ще створено. не зрозумію, як чекати створення об'єкта довідника.
Адже таким чином викликаю при закритті форми довідника?

&На Сервері
Процедура ПриЗакриттіНаСервері() Набір=РегістриВідомостей.КонтактнаІнформація.СтворитиНабірЗаписів(); Набір.Отбор.Объект.Установить(тек_.Объект); Набір. Відбір. Тип. Встановити (тек_. тип); Набір.Відбір.Від.Встановити(тек_.вид);

Відповідь:() Можливо, у його реалізації це зайве. () Думаю, він не коректно висловився. Малося на увазі модифіковані дані. У робив щось подібне, коли вводив інтернаціоналізацію, зберігання рядків реквізитів з англійськими/іспанськими та іншими найменуваннями. Щоб під кожну мову не робити реквізит до об'єкта, виніс усе в регістр. А запис проводився паралельно із записом будь-якого довідника, якось так.

Запитання: Структура елементів на керованій формі. Як знайти необхідний елемент без перебору елементів?


Потрібно знайти табличне поле на керованій формі. Роблю це перебором всіх елементів форми. Можливо є якийсь інший метод визначити потрібний елемент керованої форми?
Приклад пошуку перебором:
//***** ФлНашліТабличнуЧастину = Брехня; Для кожного Ел З _ЕтаФорма.Елементи Цикл Якщо ТипЗнч(Ел)<>Тип("ТаблицяФорми") Тоді Продовжити; КінецьЯкщо; Якщо Ел.ШляхКДаним = "Об'єкт." + _Ім'я Табличної Частини Тоді ФлНашлі Табличну Частину = Істина; Перервати; КінецьЯкщо; КінецьЦикл; //*****

Питання: Записати() у керованій формі


Ситуація така:

В мене ЗУП 3.0. Є документ "Зміна штатного розкладу". В організації штатні одиниці можуть запроваджуватися тимчасово. Для цього за кнопкою з вихідного документа за вибраними позиціями створюється документ на виключення позицій. Це посилання мені треба зберегти. Для цього я створив реквізит із типом "Зміна штатного розкладу".
Після того, як програмно записав документ, пишу посилання в цей реквізит. Викликаю метод записати з керованої форми з параметрами. А він бере і режим запису ставить ПРОВЕДЕННЯ. есно вихідний документ у мене проведений! але мені потрібно записати один реквізит і НЕ перевести вихідний документ. Начебто не бачив мого параметра. Код нижче. Питання, що не так зробив?

ДокументРозформування.Записати(РежимЗаписуДокумента.Запис);
Объект.итр_ДокументРозформування = ДокументРозформування.Посилання; ПараметриЗаписи = Новий Структура(); ПараметриЗапису.Вставити("РежимЗапису",РежимЗаписуДокумента.Запис); ЦяФорма.Записати(ПараметриЗапису);

Відповідь:що знайшов як зробити ... так і бути поділюся.

треба програмної отримати об'єкт для редагування незважаючи на те, що форма відкрита, відредагувати і записати звичним способом, а потім просто форму перечитати.