1с повторне використання значень, що повертаються. Загальні модулі. Прапор "Зовнішнє з'єднання"


   Друк (Ctrl + P)

Об'єкти, розташовані в гілки дерева конфігурації Загальні модулі, призначені для розміщення в них текстів функцій і процедур, які можуть викликатися з будь-якої іншої модуля конфігурації.
УВАГА! Загальний модуль може містити тільки визначення процедур і функцій.
  Процедури і функції загального модуля, для яких в заголовках вказано ключове слово Експорт, є одними із складових частин глобального контексту. Детальніше про написання процедур в загальному модулі можна дізнатися в розділах «Формат вихідних текстів програмних модулів» і «Оператори» довідки по вбудованому мови.
  Для редагування загального модуля необхідно в палітрі властивостей об'єкта типу Загальні модулі вікна Конфігурація у властивості Модуль клацнути мишею посилання Відкрити. Текст загального модулі буде виданий для редагування в редакторі текстів системи "1С: Підприємство» в режимі редагування тексту програмного модуля.
  Загальний модуль, будучи частиною конфігурації, зберігається тільки в складі конфігурації.
  Властивість Глобальний визначає, чи є експортовані методи загального модуля частиною глобального контексту.
  Якщо властивість Глобальний встановлено в значення Істина, те що експортуються методи загального модуля доступні як методи глобального контексту.
  Якщо властивість Глобальний встановлено в значення Брехня, то в глобальному контексті створюється властивість з ім'ям, відповідним імені загального модуля в метаданих. Дана властивість доступно тільки для читання. Значенням даного властивості є об'єкт ОбщійМодуль. Через даний об'єкт доступні експортовані методи даного загального модуля. Таким чином, звернення до методів неглобальні загальних модулів виглядає як XXXXX.YYYYY, де XXXXX - це ім'я властивості, відповідне контексту загального модуля, а YYYYY - ім'я експортованого методу загального модуля.
  приклад:

РаботаСТорговимОборудованіем.ПодключітьСканерШтріхкодов ();

Різні контекст і загальні модулі

За допомогою властивостей загальних модулів і інструкцій препроцесора можна організувати виконання різноманітних методів загальних модулів в потрібному контексті.
  Кожна властивість загального модуля відповідає за можливість компіляції (і виконання) загального модуля в тому чи іншому контексті.
  В наявності є таке властивості, що відповідають за контекст, в якому доступні методи загального модулі:
Клієнт (звичайна програма) - методи загального модуля будуть доступні для товстого клієнта в режимі звичайного застосування;
  ● - методи спільного модуля будуть доступні для тонкого клієнта, веб-клієнта, а також для товстого клієнта в
  режимі керованого застосування;
  ● Сервер - методи загального модуля будуть доступні на сервері;
Зовнішнє з'єднання   - методи загального модуля будуть доступні в зовнішньому з'єднанні.
  Якщо встановлюються одночасно кілька властивостей, то це означає, що методи загального модуля будуть доступні в декількох контекстах.
  Якщо у загального модуля встановлено властивість Сервер і ще якесь властивість, то це означає, що загальний модуль буде доступний одночасно на сервері і в обраному клієнта. При цьому необхідно розуміти, що фактично це буде кілька варіантів скомпільованої коду (по числу обраних клієнтів і власне для сервера).
  При цьому якщо метод, розташований в такому загальному модулі, викликається з боку клієнта, то буде використана клієнтська копія загального модуля, а якщо з сервера - серверна. В цьому випадку за допомогою директив препроцесора (докладніше див. Тут) можна «захистити» сервер від того коду, який на ньому не може виконуватися.
  Розглянемо приклад. Загалом модулі (який може виконуватися на тонкій клієнта і на сервері) є метод, який має кілька різну поведінку на стороні тонкого клієнта і на стороні сервера. Подивимося, як це можна зробити:



# Якщо ТонкійКліент Тоді
// Покажемо попередження
ПоказатьОповещеніеПользователя( "На клієнті");
# КонецЕсли
КонецПроцедури
  Тоді на стороні сервера код придбає такий вигляд:
процедура МетодОбщегоМодуля ()   експорт
// Тут розміщується різний важливий код
КонецПроцедури
  А на стороні тонкого клієнта код буде мати наступний вигляд:
Процедура МетодОбщегоМодуля () Експорт
// Тут розміщується різний важливий код
// Покажемо попередження
  ПоказатьОповещеніеПользователя ( "На клієнті");
КонецПроцедури

Для передачі управління з клієнта на сервер існує кілька способів:
  ● викликати метод серверного загального модуля;
  ● в модулі форми або команди викликати метод, який передує директивами компіляції & НаСервере, & НаСервереБезКонтекста

При цьому з серверних процедур неможливо викликати способи клієнтських загальних модулів (у яких не встановлено властивість Сервер) і клієнтські методи модуля форми або модуля команди. Управління повернеться на клієнта після того, як буде завершено самий зовнішній виклик серверного методу.
  Виняток становлять методи модуля форми і модуля команди, які передують директивами компіляції & НаКліентеНаСервере, & НаКліентеНаСервереБезКонтекста
Також слід згадати такі моменти:
  ● Якщо загальний модуль доступний більш ніж для одного клієнта, то при написанні програмного коду слід враховувати максимальні обмеження, які можуть накладатися клієнтами, або використовувати інструкції препроцесора для «ізоляції» коду, специфічного для того чи іншого клієнта.
  ● Інструкції препроцесора також мають сенс тоді, коли одну спільну модуль має кілька контекстів виконання, наприклад, зовнішнє з'єднання і тонкий клієнт або (що зустрічається значно частіше) будь-якої клієнт і сервер. У цьому випадку інструкції препроцесора обрамлятимуть інтерактивний код, який неможливо використовувати на сервері, але можливо на клієнті (див. Приклад вище).
  Детальніше про інструкції препроцесора і директивах компіляції в розділі «Виконання процедур і функцій» довідки по вбудованому мови.
  Властивість Виклик сервера можна керувати можливістю виклику експортованих методів серверного загальної модуля з клієнтського коду.
  Якщо властивість встановлено, то експортовані методи серверного загального модуля доступні для виклику з боку клієнта. Якщо властивість не встановлено, то такі експортовані методи можна викликати тільки з серверних методів (як методів серверних загальних модулів, так і серверних методів модуля форми і модулів команд).
Порада . Рекомендується встановлювати в значення Брехня властивість Викликати сервера в тих випадках, коли серверний загальний модуль містить методи, які небажано викликати з клієнта (наприклад, з причин безпеки).
Примітка. Якщо одночасно встановлені властивості Клієнт (звичайна програма), Клієнт (кероване додаток), Зовнішнє з'єднання, То властивість Виклик сервера автоматично скидається. Якщо встановлюється властивість Виклик сервера, то автоматично скидаються властивості Клієнт (звичайна програма), Клієнт (кероване додаток)   і Зовнішнє з'єднання, Якщо ці властивості були встановлені одночасно.
  властивість привілейований   призначене для відключення контролю прав доступу при виконанні методів загального модуля.
  ПРИМІТКА. якщо властивість привілейований   встановлено, то загальному модулю автоматично встановлюється властивість Сервер і скидаються інші властивості ( Клієнт (звичайна програма), Клієнт (кероване додаток)   і В нинішні з'єднання). Привілейований загальний модуль може виконуватися тільки на сервері.

Повторне використання значень, що повертаються

Якщо загальний модуль не є глобальним, то стає доступно властивість Повторне використання повертаються значень. Це властивість може набувати таких значень:
  ● Не використовуйте - повторне використання значень, що повертаються для функцій цього загального модуля не використовується.
● Під час дзвінка і На час сеансу - для загального модуля використовується метод визначення повторного використання даних. Суть цього методу полягає в тому, що в ході виконання коду система запам'ятовує параметри і результат роботи функцій після першого виклику функції. При повторному виклику функції з такими ж параметрами, відбувається повернення запомненного значення (з першого виклику) без виконання самої функції. Якщо функція під час свого виконання змінює значення параметрів, то повторний виклик функції не буде це робити.
  Можна виділити наступні особливості збереження результатів виклику:
  ● якщо функція виконується на сервері і викликається з серверного коду, то значення параметрів і результат виклику запам'ятовуються для поточного сеансу на стороні сервера;
  ● якщо функція виконується на товстому або тонкому клієнті, то значення параметрів і результатів виклику запам'ятовуються на стороні клієнта;
  ● якщо функція виконується на стороні сервера, а викликається з клієнтського коду, то значення параметрів виклику запам'ятовуються і на стороні клієнта, і на стороні сервера (для поточного сеансу).
  Збережені значення видаляються:
  ● якщо властивість встановлено в значення Під час дзвінка:
  ● на стороні сервера - при поверненні управління з сервера;
  ● на стороні клієнта - при завершенні роботи процедури або функції вбудованого мови верхнього рівня (викликаної системою з інтерфейсу, а не з іншої процедури або функції вбудованого мови);
  ● якщо властивість загального модуля встановлено в значення На час сеансу:
  ● на стороні сервера - при закінченні сеансу;
  ● на стороні клієнта - при закритті клієнтського додатку.
  Збережені значення будуть видалені:
  ● на сервері, в товстому клієнті, в зовнішньому з'єднанні, в тонкому клієнті і в веб-клієнті зі звичайною швидкістю з'єднання - через 20 хвилин після обчислення зберігається значення або через 6 хвилин після останнього використання;
  ● в тонкому клієнті і веб-клієнта з низькою швидкістю з'єднання - через 20 хвилин після обчислення зберігається значення;
  ● при нестачі оперативної пам'яті в робочому процесі сервера;
  ● при перезапуску робочого процесу;
  ● при перемиканні клієнта на інший робочий процес.
  Після видалення значень виклик функції, що експортується виконується як при першому виклику.
  На виконання процедур ця властивість загальних модулів не впливає - процедури виконуються завжди.

Якщо у загального модуля встановлено повторне використання значень, що повертаються, то на типи параметрів експортованих функції накладається ряд обмежень. Типи параметрів можуть бути тільки:
  ● Примітивними типами ( Не визначено, NULL, Булево, Число, Рядок, Дата).
  ● Будь-якими посиланнями на об'єкти бази даних.
  ● Структурами зі значеннями властивостей перерахованих вище типів. В цьому випадку ідентичність параметрів контролюється «по вмісту» структур.
  Якщо продукція, що експортується функція повертає який-небудь об'єкт, то фактично повертається посилання на об'єкт, що зберігається в кеші. Якщо після отримання цього посилання станеться зміна стану об'єкта, то наступний виклик тій же самій функції призведе до повернення посилання на вже змінений об'єкт без фактичного виконання функції. Така поведінка буде спостерігатися до видалення збереженого значення (по будь-якої причини). Іншими словами - зміна стану об'єкта, отриманого в результаті виклику функції із загального модуля з повторним використанням значень, що повертаються, не є підставою для фактичного до функції. Також слід пам'ятати, що кеш повертаються об'єктів індиферентний до
  станом привілейованих режиму в момент виклику функції з повторним використанням значень, що повертаються. Ця особливість може привести до наступної особливості поведінки:
  ● Фактичне виконання виклику функції з повторним використанням значень, що повертаються (перший виклик) виконувалося при включеному привілейованих режимі.
  ● При виконанні функції був отриманий об'єкт, який не може бути отриманий з відключеним привілейованих режиму.
  ● Наступні виклики функції виконувалися без установки привілейованих режиму.
  ● Однак, до моменту очищення кеша повертаються об'єктів або повторного фактичного виклику, функція буде повертати формально недоступний об'єкт.
  ● Також вірно і зворотне поведінка, коли перший виклик виконується без установки привілейованих режиму, а в привілейований режимі не повертається об'єкт, який міг бути отриманий в привілейований режим.

Якщо у загального модуля властивість Повторне використання значень, що повертаються   встановлено в значення На час сеансу, то в значеннях, що повертаються функціями такого модуля, не можна використовувати значення типу МенеджерВременнихТабліц.
Якщо функція загального модуля, з встановленим повторним використанням, викликаються з цього ж самого загального модуля (наприклад, з ім'ям ОбщійМодуль), то слід пам'ятати про наступну особливість: якщо функція викликається на ім'я МояФункція (), то виконання функції буде відбуватися при кожному виклику функції . Для того щоб використовувалися записані часові функція слід викликати по повному імені:
ОбщійМодуль.МояФункція ().
  Метод глобального контексту видаляє всі повторно використовувані значення, як на стороні сервера, так і на стороні клієнта, незалежно від місця виклику методу. Після виконання методу ОбновітьПовторноІспользуемиеЗначенія ()   перший виклик функції буде виконаний повністю.

Загальні модулі 1С   - об'єкт метаданих конфігурації 1С 8.3 і 8.2, який зберігає в собі програмний код, який часто викликається в конфігурації. Функцію / процедуру можна викликати з будь-якого місця конфігурації (якщо вона експортне).

Як використовувати загальний модуль

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

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

Властивості загальних модулів

Одне з основних особливостей загальних модулів від інших модулів - не можна оголошувати загальні змінні.

Отримайте 267 відеоуроків по 1С безкоштовно:

Розглянемо докладніше палітру властивостей загального модуля:

  • Глобальний   - якщо прапорець встановлений, функції і процедури з цього модуля стають доступні в глобальному контексті. Тобто їх можна викликати в будь-якому місці конфігурації, звертаючись без назви загального модуля. Однак додається умова - назва процедур і функцій в цьому загальному модулі повинні бути унікальні в рамках глобального контексту.
  • сервер   - процедури та функції даного загального модуля можуть бути виконані на сервері.
  • Зовнішнє з'єднання   - програмні коди даного загального модуля можуть бути виконані при підключенні зовнішнім джерелом (наприклад, COM).
  • Клієнт (кероване додаток)   - процедури та функції даного загального модуля можуть бути використані в товстому клієнті в режимі керованого застосування.
  • Клієнт (звичайна програма)   - програмні коди даного загального модуля можуть бути використані в товстому клієнті в режимі звичайного застосування.
  • виклик сервера   - прапор, який дозволяє на клієнті використовувати процедури і функції з цього загального модуля.
  • - якщо встановлена \u200b\u200bІстина, в цьому загальному модулі буде відключена перевірка прав доступу.
  • Повторне використання   - визначає налаштування значень, що повертаються, якщо опція включена, то після першого виконання система запам'ятає значення для даних вхідних параметрів і буде повертати вже готове значення. Може приймати наступні значення: не використовується   - відключення, на час виклику   - на час виконання певної процедури, на час сеансу   - поки користувач не закрив сеанс (програму).

Якщо Ви починаєте вивчати 1С програмування, рекомендуємо наш безкоштовний курс (не забудьте

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

модуль додатки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

модуль форми

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Не думаючи, "на льоту" такі завдання вирішуються конструкціями виду:

Якщо ДатаДокумента\u003e Константи.ДатаНачалаПрімененіяПостановленія1137.Получіть () Тоді

В результаті, кожен раз коли виконується цей код - відбувається "смикання" бази даних.

Програмісти більш педантично відносяться до свого коду, виконують один запит до бази даних, кешіруя всі дані які їм знадобляться, однак такий підхід не завжди призводить до бажаної розвантаження БД:

  1. Цикл виконання коду може бути неявним (наприклад, групове перепроведення документів)
  2. Отримати строгий набір даних (не більше і не менше), які будуть потрібні пізніше, іноді важко або зовсім неможливо.
  3. Кешовані значення потрібно використовувати в різних викликах / формах

Модуль з повторним використанням значень, що повертаються

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

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

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

Узел1 \u003d НашМодуль.ПолучітьУзелОбменаСБухгалтеріей ( "0001"); Узел2 \u003d НашМодуль.ПолучітьУзелОбменаСБухгалтеріей ( "0002");

Обидва виклику дійсно приведуть до виконання відповідної процедури і повернуть різні посилання, а при наступних спробах отримати вузол з кодом 0001 або 0002 - будуть повертатися відповідні вузли без виклику процедури і, як наслідок, бази даних.

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

Чого робити не можна

Є одне обмеження. Як параметри функцій можна вказувати тільки прості типи. Не визначено, Null, Булево, Дата, Рядок, Число, Посилання. Ніяких структур, таблиць значень, об'єктів і т.п. Якщо ви спробуєте передати в якості параметра, наприклад, структуру - все відпрацює, але про повторне використання отриманого значення можете забути.

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

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

Баг або фіча від 1С

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

ЗначеніеСтруктура1 \u003d НашМодуль.ПолучітьСтруктуруЗначенійРеквізітов (СсилкаНаОб'ект); ЗначеніеСтруктура1.Наіменованіе \u003d "Нове найменування"; ЗначеніеСтруктура2 \u003d НашМодуль.ПолучітьСтруктуруЗначенійРеквізітов (СсилкаНаОб'ект);

То в ЗначеніеСтруктура2.Наіменованіе буде лежати саме "Нове найменування". В принципі, це можна використовувати для оновлення значень, реально змінених в БД, але коли прикриють і прикриють чи лавочку - незрозуміло. При розробці типових рішень так робити заборонено.

Що робити при зміні закешовану даних

Є всього лише один "легітимний" метод обробити ситуацію зі зміною закешовану значення в базі даних. Це метод ОбновітьПовторноІспользуемиеЗначенія (). Буде скинуто значення всіх функцій по всіх параметрах всіх модулів. Оновити за конкретним значенням параметрів / функцій / модулів можна.

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

Робимо замах на святе: пишемо запит в циклі

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

  • Написання універсальних процедур, які повертають реквізити довільних посилань (є в БСП)
  • Написання процедур, які повертають значення констант на ім'я константи (є в більшості типових)
  • Повернення "трохи більшого" обсягу даних, ніж необхідно заради зменшення кількості викликів (напр. Якщо потрібно отримати курси відразу декількох валют, має сенс викликати функцію за датою без відбору валюти, отримати курси всіх валют і далі "розбиратися на місці" яка з валют в зараз потрібна)
  • Написання процедури, яка виконує запит з кешуванням результату (що входять параметрами при цьому будуть текст запиту і пара-трійка імен та значень параметрів)

Але є ще один підхід, на якому я хочу зупинитися детально. Це використання функції, що містить виклик БД, з повторним використанням значення, що повертається в циклі. Тобто фактично це запит в циклі. Взагалі, нас вчили так не робити, але бувають випадки, коли така побудова коду призведе до кращої продуктивності, якщо:

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

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

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

Проблеми при роботі з 1С

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

Вирішуються подібні завдання швидко і просто з використанням конструкцій наступного типу:

Якщо ДатаДокумента\u003e Константи.ДатаНачалаПрімененіяПостановленія1137.Получіть () Тоді

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

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

· Не цілком ясний цикл виконання коду (наприклад, при груповому перепроведенні документів);

· Отримання суворого набору даних, необхідних не в даний момент, іноді неможливо або вдається насилу;

· Використання вже кешованих даних в різних формах / викликах.

Модуль з повторним використанням значень, що повертаються

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

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

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

Узел1 \u003d НашМодуль.ПолучітьУзелОбменаСБухгалтеріей ( "0001");

   Узел2 \u003d НашМодуль.ПолучітьУзелОбменаСБухгалтеріей ( "0002");

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

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

кілька АЛЕ

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

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

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

Фича або баг від 1С

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

При введенні наступного коду:

ЗначеніеСтруктура1 \u003d НашМодуль.ПолучітьСтруктуруЗначенійРеквізітов (СсилкаНаОб'ект);
   ЗначеніеСтруктура1.Наіменованіе \u003d "Нове найменування";
   ЗначеніеСтруктура2 \u003d НашМодуль.ПолучітьСтруктуруЗначенійРеквізітов (СсилкаНаОб'ект);

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

Якщо було змінено закешовану дані

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

Як здійснюється запит в циклі

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

· Універсальні процедури, які повертають реквізити довільних посилань.

· Створення процедури, які повертають значення констант по їх імені. До речі, такі процедури є в типових версіях.

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

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

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

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