Как работает серверный вызов в 1С

Публикация № 682305

Разработка - Математика и алгоритмы

Клиент-серверная архитектура заложена в платформе изначально — со времен «1С:Предприятие 8.0». Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере. Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере — другой. Клиент и сервер «общаются» между собой с помощью серверного вызова. Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.

Немного базовой теории

Перед тем, как перейти к содержательной части, договоримся о некоторых ограничениях:

  • Мы подразумеваем, что Вы знаете о существовании четырёх директив компиляции, доступных в модулях формы: «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста».

  • Все примеры будут опираться на работу «1С:Предприятие 8» в клиент-серверном режиме. Файловый вариант по сути является эмуляцией клиент-серверного режима, с небольшими отклонениями (для данной статьи это не критично).

  • В рамках этого материала рассматривается исключительно взаимодействие клиента и сервера 1С. Работа с базой данных, преобразование данных и прочие нюансы работы системы – это темы других статей.

Далее, освежим в памяти немного теории.

Директивы, в имени которых упоминается «Клиент», устанавливают ограничение на обращение к базе данных.

Процедуры или функции, написанные под директивой «Без контекста», не имеют доступа к контексту (данным) формы. Исходя из этой информации, легко представить ограничения директив по доступу к данным в виде следующей таблицы:

Директива Данные формы База данных
 &НаКлиенте +
 &НаСервере + +
 &НаСервереБезКонтекста +
 &НаКлиентеНаСервереБезКонтекста

 

Опережая вопрос «Для чего же директива с самым длинным названием, если она ограничивает и использование контекста форм, и обращения к базе данных?», напомню: любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.

Отсюда делаем вывод: у методов, описанных под директивой «&НаКлиентеНаСервереБезКонтекста», единственным источником данных являются эти самые переданные параметры.

Не стоит забывать и про доступность вызова одних процедур и функций из других. Для этого стоит запомнить, что можно вызывать только те процедуры и функции, которые находятся под одноимённой (с родительским методом) директивой или под директивой, находящейся ниже (чем у родительского метода) согласно списку:

  • &НаКлиенте;
  • &НаСервере;
  • &НаСервереБезКонтекста;
  • &НаКлиентеНаСервереБезКонтекста.

То есть из метода, описанного под директивой «&НаКлиенте», можно вызывать процедуры и функции, описанные под любой директивой. А вот «из-под» директивы «&НаСервереБезКонтекста» можно вызывать только то, что описано под директивой «&НаСервереБезКонтекста» или «&НаКлиентеНаСервереБезКонтекста». 

Теперь про серверный вызов

Серверный вызов — это передача какой-то информации с клиентской части «1С:Предприятие 8» на серверную часть с целью вернуть обратно некий набор данных.

Самый первый серверный вызов инициализируется в момент начала сеанса работы 1С. То есть когда пользователь выполняет вход в информационную базу:

Серверный вызов в момент входа пользователя в информационную базу

Рисунок 1

«Оу! При чём тут Библиотека?!» — спросите Вы.

Всё очень просто:

Рисунок 2

Обратите внимание, что доступ к базе данных есть только на серверной части, а соединение между клиентом и сервером имеет ограниченную пропускную способность. Это и неудивительно – ведь соединение между клиентской и серверной частью может быть установлено даже по нестабильному низкоскоростному каналу связи (например, посредством мобильного интернета).

Кроме этого, передача данных между клиентом и сервером возможна только посредством серверного вызова.

Но, для того чтобы перейти к основной теме данной статьи, необходимо сначала разобраться – где будет выполняться программный код, написанный под определенными директивами. То есть на какой части приложения «1С:Предприятие 8» будут доступны процедуры и функции, описанные под директивами «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста»:

Рисунок 3

Видим, что на стороне клиента у нас будут доступны процедуры и функции, написанные под двумя директивами из четырёх, а на стороне сервера – под тремя из четырёх.

Сразу возникают вопросы: «Зачем такое многообразие и чем оно полезно?», «Как метод, описанный под директивой «&НаКлиентеНаСервереБезКонтекста» может выполняться и на клиенте, и на сервере?».

Сейчас мы постараемся понять особенности работы системы при использовании директив и почему необходимо уметь правильно использовать каждую из существующих директив компиляции.

И в этом нам помогут наши новые друзья, знакомьтесь!

Это процесс клиентской части приложения «1С:Предприятие 8». Он запускается на компьютере пользователя и сожительствует в оперативной памяти с другими процессами (38 вкладок браузера, поток аудио из социальной сети, telegram и другие). Может порождать серверный вызов.

Это процесс серверной части приложения «1С:Предприятие 8». Он существует на сервере 1С. Знает, какие клиентские сеансы в данный момент запущены, но самостоятельно не может инициировать взаимодействие с ними. Работает с клиентской частью только через полученный от неё серверный вызов.

А это серверный вызов. Как было сказано выше, он порождается процессом клиентской части и призван «прислуживать» ему. Он передает запросы со стороны клиента на сторону сервера, а также занимается транспортировкой данных с клиента на сервер и обратно.
 

Итак, давайте рассмотрим несколько особенностей работы программного кода в «1С:Предприятие 8», написанного под разными директивами.

Действие 1. Открытие пользователем формы с данными.

Рисунок 4

Рисунок 5

В момент нажатия Пользователем кнопки открытия формы из интерфейса, происходит передача управления на Сервер. По переданным параметрам получаются необходимые для построения данные из БД и происходит формирование контекста формы, который затем отправляется на клиентскую часть. У пользователя на экране отображается запрошенная форма.

Действие 2. Получение из открытой Пользователем формы дополнительных данных из Базы данных.

Рисунок 6

Получение этих данных может быть описано под двумя директивами — «&НаСервере» и «&НаСервереБезКонтекста». Рассмотрим оба случая.

Явление 1. Директива «&НаСервере»

Рисунок 7

При вызове процедуры или функции под директивой «&НаСервере» из формы со стороны клиента происходит «упаковка» всего контекста формы и отправка его на сторону сервера.

После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.

Явление 2. Директива «&НаСервереБезКонтекста»

Рисунок 8

При вызове процедуры или функции под директивой «&НаСервереБезКонтекста» из формы со стороны клиента происходит передача на сторону сервера только тех данных, которые были указаны в качестве параметров. Обратно же передаётся только необходимая информация в уже подготовленном виде.

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

Из примеров видно, что далеко не всегда оправдано указание директивы компиляции «&НаСервере» с точки зрения использования контекста (данных) формы на сервере.

Если возможно решить возникшую задачу путём отправки на сервер только определённого набора данных, то надо эту возможность использовать и описывать метод под директивой «&НаСервереБезКонтекста». Это позволит уменьшить нагрузку на серверный вызов, а также не занимать сервер обработкой и хранением ненужной в текущий момент информации.

Кстати, именно поэтому до версии платформы 8.3.7.1759 на сложных формах для управления видимостью элементов рекомендовалось использовать панели со страницами, а не свойство «Видимость». Только начиная с этого релиза отработка изменения видимости элементов стала выполняться на стороне клиента.

До этого момента при каждом изменении свойства «Видимость» происходил серверный вызов, как при использовании директивы «&НаСервере».

Но использование директивы «&НаСервереБезКонтекста» не является панацеей. Помимо нагрузки на серверный вызов, всегда необходимо задумываться ещё над одним параметром.

Действие 3. Обработка данных табличной части формы с получением дополнительной информации из Базы данных.

Рисунок 9

Явление 1. Построчная обработка табличной части на стороне клиента с организацией серверного вызова для получения дополнительной информации из базы данных.

Мы уже знаем – лучше использовать директиву «&НаСервереБезКонтекста».

Рисунок 10

Рисунок 11

При таком построении программного кода происходит множественное обращение со стороны клиента на сервер – по количеству элементов цикла, запущенного на стороне клиента.

Явление 2. Предварительная обработка табличной части на стороне клиента с целью подготовки требуемых к обработке на сервере данных и «упаковки» их в набор параметров. Затем передача этого набора на сервер для получения дополнительной информации из базы данных.

Используем всё ту же директиву «&НаСервереБезКонтекста».

Рисунок 12

В данном случае количество серверных вызовов сведено к минимуму за счёт предварительной подготовки параметров.

Большое количество текущих серверных вызовов может свидетельствовать о неоптимальном программном коде.

Избегайте создания серверных вызовов внутри цикла. Подготовьте набор параметров и единожды выполните его передачу для обработки на сервер. Если предполагается сложная обработка большого количества данных формы – передайте её полностью на сервер (при помощи директивы «&НаСервере») и выполните все действия на стороне сервера.

Если цель серверного вызова, созданного внутри цикла – получить какую-либо информацию из базы данных, то данная операция включает в себя запрос в цикле. А это очень негативно влияет на производительность всей системы в целом.

С директивой «&НаСервереБезКонтекста» вроде бы разобрались. Она нужна для того, чтобы уменьшить объем информации, передаваемой в рамках одного серверного вызова. Дополнительно разобрались с количеством текущих серверных вызовов – необходимо стремиться к их минимизации.

Давайте теперь попробуем разобраться, для чего нужна директива «&НаКлиентеНаСервереБезКонтекста».

Действие 4. Выполнение обработки данных.

Когда предполагается выполнение одной и той же обработки данных из нескольких участков программного кода, разумно этот код поместить в самостоятельную процедуру или функцию. Остаётся только решить, под какой директивой её написать.

Рисунок 13

Та-дам!

Рисунок 14

Для копирования у нас есть ксерокс. Но куда его поставить? На сторону клиента или сервера? Под какой директивой его разместить?

Как было озвучено ранее – любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.

 

Давайте для начала попробуем разместить копировальный аппарат на стороне клиента. Для этого описываем процедуру или функцию «Ксерокс» под директивой «&НаКлиенте». Тогда процесс клиентской части в любой момент сможет без проблем обратиться к ней и все действия будут выполнены в соответствии с программным кодом.

Но что произойдёт, если потребность в копировании возникнет на стороне сервера? Например, для подготовки данных, передаваемых на сторону клиента, потребуется сделать копию? Напомню – процесс серверной части не имеет возможности самостоятельно инициировать клиентские вызовы. 

Рисунок 15

Получается, что использовать директиву «&НаКлиенте» неправильно, а директиву «&НаСервере», как мы изучили ранее – нежелательно. Давайте посмотрим поведение системы при использовании директивы «&НаСервереБезКонтекста».

Рисунок 16

Вроде бы результат достигнут – и с сервера, и с клиента доступно копирование. Но для того, чтобы получить копию данных, используемых на клиенте, приходится делать серверный вызов. А это опять ведет к лишней нагрузке на соединение и временным затратам.

Избавиться от излишней передачи на сервер при сохранении возможности копирования на клиенте и на сервере можно при помощи директивы «&НаКлиентеНаСервереБезКонтекста».

Рисунок 17

Не углубляясь в детали, отметим, что метод, описанный под данной директивой управления, создаётся в двух копиях – и на стороне клиента, и на стороне сервера. Это позволяет выполнить необходимые действия там, где появилась потребность в них (клиент/сервер), без лишних серверных вызовов.

Конечно, вместо того чтобы выделять повторяющийся программный код, описывать его в отдельном методе под директивой «&НаКлиентеНаСервереБезКонтекста», можно поступить по-другому. Просто взять и написать один и тот же участок кода и в клиентской, и в серверной процедуре.

С точки зрения выполнения программы результат будет одинаков. Но объяснение «почему так не надо делать» – это уже совершенно другая тема…

Вместо заключения

В данной статье мы на наглядных примерах рассмотрели влияние различных директив компиляции на такое явление системы «1С:Предприятие 8», как серверный вызов. Как видно, основная причина для выбора правильной директивы – производительность транспортировки данных между клиентской и серверной частью.

Придерживайтесь при разработке следующих правил:

  • По возможности не передавайте контекст формы на сторону сервера
  • Минимизируйте количество текущих серверных вызовов
  • Длительные и ресурсоёмкие задачи запускайте на выполнение на стороне сервера (при возможности – в фоновом режиме).

Учитывайте потребность в доступности тех или иных видов данных, обоснованность передачи управления и не стесняйтесь при необходимости дробить процедуры и функции. И будет Вашему серверному вызову всегда легко, а Вы от пользователей Вашей программы получите «молчаливую благодарность»!

Так ли это важно думать об оптимизации? Тут имеет смысл вспомнить одну историю.

Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.

Пользователей, применяющих этот функционал, – 25 человек, и каждый из них за рабочий день в среднем совершает 110 таких операций. Всего впустую за рабочий месяц потрачено 28875 секунд (21 рабочий день * 25 человек * 110 операций * 0,5 секунды) = 8,02 часов.

Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?

О статье

Данную статью я написал для проекта «Курсы-по-1С» и она вызвала там достаточно высокий интерес. Для того, чтобы ещё больше начинающих (и не только) 1С-разработчиков могло получить пользу от прочтения данного материала, размещаем его полностью тут.

Читайте также и другие мои статьи: [ Наглядно о непонятном ] – Про «догмы» в 1СОтображение прогресса длительных операций в 8.3.10 (и более ранних версиях)Система взаимодействий в платформе 8.3.10.

Надеюсь, материал кому-то принесет пользу, а кого-то просто позабавит. Спасибо за внимание! :)

Специальные предложения

Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Dzenn 409 18.11.17 13:32 Сейчас в теме
где-то это уже было
Lo1jke; rpgshnik; корум; AlexGroovy; Evil Beaver; KroVladS; +6 Ответить
2. Fragster 1013 18.11.17 14:34 Сейчас в теме
(1) курсы-по-1с рф/news/2017-03-09-how-server-call-works/
(не работают ссылки на национальные домены :) )
Lo1jke; Mahon83; DrAku1a; KroVladS; +4 Ответить
3. unichkin 1276 18.11.17 14:46 Сейчас в теме
Подумал что плагиат сначала - поставил минус, потом увидел что автор тот же) Спасибо, хороший материал.
SunShinne; +1 Ответить
4. echo77 1161 19.11.17 13:01 Сейчас в теме
Отдельный плюс за картиночки! Информация преподнесена легко и доходчиво.
АлександрЯрославичъ; maksa2005; letarch; SunShinne; shard; Lo1jke; rpgshnik; d.samsonov92y; kuzyara; kraynev-navi; +10 Ответить
5. Malfarion 200 19.11.17 13:25 Сейчас в теме
Очень хороший материал, все правильно и понятно описано. Продолжайте.
6. LexSeIch 206 19.11.17 21:06 Сейчас в теме
Спасибо за статью. Читал Вас на курсах по 1С. Ждём других статей на актуальные темы...
7. script 221 19.11.17 22:14 Сейчас в теме
В 8.3.11 появилась возможность передачи информации на клиент по инициативе сервера.
Так что статью нужно немного дополнить, мне кажется.
Передача информации по инициативе сервера
Maxis; корум; BigB; +3 Ответить
8. pahich 601 19.11.17 22:55 Сейчас в теме
(7) Спасибо за прочтение и замечание. Отмечу, что "возможность передачи информации на клиент по инициативе сервера" является механизмом системы взаимодействий, а не стандартной возможностью платформы. Поэтому, рассматривать ее в рамках данного материала не совсем правильно. Рекомендую к прочтению статью про систему взаимодействий, а также про длительные операции.
vv2; Denis_CFO; ekaruk; malenushka1; +4 Ответить
9. Brawler 470 19.11.17 23:54 Сейчас в теме
10. ValeriTim 20 20.11.17 10:17 Сейчас в теме
Отличная статья! И наглядно и читать приятно, и что самое главное - понятно :) Держи звездочку!

Огромное спасибо.

А остальным только поучиться в оформлении :)
maksa2005; BoryaMbi; nagaitseff; dim9; +4 Ответить
11. 🅵🅾️🆇 20.11.17 10:29 Сейчас в теме
Неплохо для новичков. По хорошему стоит углубиться в тему и показать, что именно физически передается между клиентом и сервером (как форма запаковывается в xml).
У меня все лапки не доходят Wireshark'ом отследить.
12. spy-83 187 20.11.17 13:07 Сейчас в теме
круто.
очень удобно и понятно! визуальное оформление + комментарии
+++
13. AlexeyPapanov 21.11.17 11:15 Сейчас в теме
Комиксы излишние на мой вкус. А текст стоящий.
20. Serj1C 479 22.11.17 08:08 Сейчас в теме
(13) А мне больше картинки понравились
14. Абушев 133 21.11.17 11:44 Сейчас в теме
А как же "ПредопределенноеЗначение" на клиенте?
Можно было в статью про него тоже.
17. pahich 601 21.11.17 19:29 Сейчас в теме
(14) :) спасибо! Думаю, что есть много о чем ещё рассказать! Но в рамках данной статьи это будет перегруз...
15. Glebis 11 21.11.17 17:12 Сейчас в теме
Почему не описано применение оператора "Знач", который позволяет не возвращать значение параметра с клиента на сервер и тем самым уменьшает размер возвращаемого результата серверного вызова?
18. pahich 601 21.11.17 19:31 Сейчас в теме
(15) ну это уже особенность работы с данными, а не принцип работы серверного вызова.
23. Glebis 11 22.11.17 09:31 Сейчас в теме
(15)
с клиента на сервер
*с сервера на клиент.
(18)
(15) ну это уже особенность работы с данными, а не принцип работы серверного вызова.
дык это же серверный вызов не возвращает данные, взятые на сервере по значению. Поэтому и считаю, что нужно рассказывать про это в рамках рассмотрения работы серверного вызова.
28. pahich 601 22.11.17 22:36 Сейчас в теме
(23) Глеб, серверный вызов - транспорт. Что «положат», то и «повезет». Данная тема больше относится к (11) :)
16. Yashazz 3332 21.11.17 17:30 Сейчас в теме
Блин. Тоже сначала подумал, что плагиат... Да, неплохая и полезная статья.
19. user705522_constantin_h 27 21.11.17 19:54 Сейчас в теме
Хорошая статья. Спасибо.
21. Andry.Boris 56 22.11.17 08:44 Сейчас в теме
Хорошая и полезная статья.
22. DPotapov90 22.11.17 09:07 Сейчас в теме
Очень полезная статья, особенно для начинающих. Спасибо :)
24. Alex 98 22.11.17 09:31 Сейчас в теме
Очень понравился стиль передачи информации... респект!
25. SeerRM 12 22.11.17 10:53 Сейчас в теме
Круто! Побольше бы таких статей!
26. arekin 22.11.17 11:22 Сейчас в теме
Роль картинок в этой статьей просто бесценна.
Спасибо за статью.
maksa2005; dj_serega; JohnConnor; kn; DrAku1a; +5 Ответить
27. mikl79 109 22.11.17 14:12 Сейчас в теме
спасибо, все очень понятно
29. zurapa 23.11.17 06:50 Сейчас в теме
Статья шикарнейшая - понятно, даже самым маленьким.
А вот вывод из истории в конце не понравился. Оптимизация - это замечательно! Но, говорить, что программист кому-то задолжал?.. Если бухгалтер медленно считает, или продажник немного продаёт - значит ли это, что он задолжал?..
Если так важна скорость работы приложения, то 1С в сухую проигрывает другим решениям на java, PostgreSQL и прочему зоопарку технологий... И базы получаются куда живей и масштабируемей.
Основная прелесть 1С в быстрой удобной разработки и получения результата вчера, при довольно-таки хилом планировании, проектировании... И это играет куда большую роль... А оптимизация в свободное время.
Сразу написать оптимально не всегда получается. А порой не нужно, потому что делается обработка на раз, или два и срочно. Спасибо не скажут за оптимально написанный код за 8 часов и 1 час работы этой обработки, нежели написать за 30 минут, тяп-ляп и выполнение обработки займёт 3 часа... Вот в этом сила 1С. И говорить, что разработчик кому-то должен, за неоптимальный код совершенно не правильно. Генеральный директор компании "Рога и Копыта" вряд-ли лучше напишет.
user783928; Maximum.proger; YAN; v3132; JohnConnor; +5 1 Ответить
32. pahich 601 23.11.17 12:55 Сейчас в теме
(29) Михаил, спасибо за прочтение! :)

Цель выдуманной истории - дать пищу для дум на тему "а не стать ли мне еще лучше, чем я есть сейчас" :) Кстати, на эту тему уже холиварят в соседней статье про "Суррогаты" :)
41. DrAku1a 1314 25.01.18 11:43 Сейчас в теме
Вообще-то, это вольный пересказ анекдота "Серийный программист Джон"
Плохой программист Джон сделал ошибку в коде, из-за которой каждый пользователь программы был вынужден потратить в среднем 15 минут времени на поиск обхода возникшей проблемы. Пользователей было 10 миллионов. Всего впустую потрачено 150 миллионов минут = 2.5 миллиона часов. Если человек спит 8 часов в сутки, то на сознательную деятельность у него остается 16 часов. То есть Джон уничтожил 156250 человеко-дней ≈ 427.8 человеко-лет. Средний мужчина живет 64 года, значит Джон убил примерно 6 целых 68 сотых человека.

Как тебе спится, Джон — серийный программист?

Источник (статья на Хабре), не факт что первоисточник, но в ней не указывается авторство.

Тут вопрос целесообразности. Если программист тратит неделю на то, чтобы оптимизировать код, в результате - получая указанный прирост, то его труд предприятию окупится примерно через пол-года, и это в рамках указанной частоты использования, при условии что стоимость человекочаса программиста равна стоимости человекочаса бухгалтера. В реальности, для обработки запускаемой одним пользователем раз в месяц - в такой оптимизации вообще нет смысла. Например, в основном, все используют универсальные механизмы обмена - на базе конвертации данных. Работает такой обмен гораздо медленнее, чем специально написанная программистом обработка. Почему тогда всё делается через КД?!!
43. pahich 601 25.01.18 18:24 Сейчас в теме
(41) Андрей, спасибо за прочтение! )

Идея истории взята оттуда, но не является "вольным пересказом". Надеюсь, Вы не считаете, что позаимствовать идею - плохо? ))

Про целесообразность - всегда есть "рамки разумного". Но согласитесь - "сделать быстро" не всегда значит "сделать не оптимально"? Ну и наоборот - "делать медленно" не всегда значит "делать хорошо"...
30. Xershi 1003 23.11.17 12:35 Сейчас в теме
Из справки:
&НаКлиенте (&AtClient) — определяет клиентскую процедуру (функцию);
&НаСервере (&AtServer) — определяет серверную процедуру (функцию);
&НаСервереБезКонтекста (&AtServerNoContext) — определяет серверную процедуру (функцию), исполняемую на сервере вне контекста формы. Переменные не могут быть внеконтекстными. В таких методах недоступен контекст формы (включая данные формы). Допустимыми являются вызовы только других внеконтекстных методов. При вызове этих методов не выполняется передача данных формы на сервер и обратно. Применение внеконтекстных методов позволяет существенно уменьшить объем передаваемых данных при вызове серверной процедуры из среды клиентского приложения;
&НаКлиентеНаСервереБезКонтекста (&AtClientAtServerNoContext) — определяет процедуру (функцию), исполняемую в модуле формы на клиенте и на сервере, не имеющую доступа к контексту формы, данным формы, переменным, но имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно. Сама процедура (функция) доступна для клиентский, серверных контекстных и неконтекстных процедур и функций модуля формы. Из серверных внеконтекстных методов формы допускается вызов серверных методов общих модулей;
&НаКлиентеНаСервере (&AtClientAtServer) — определяет процедуру (функцию), исполняемую в модуле команды, выполняемую на клиенте и на сервере, имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно, не имеющую доступ к переменным. Сама процедура (функция) доступна для клиентских серверных процедур и функций модуля команды.

Почему только 4 описали?
31. pahich 601 23.11.17 12:48 Сейчас в теме
(30) Максим, добрый день!

Аналогичный вопрос задавали мне в "первоисточнике" вот ссылка

Частично цитирую ответ:

"есть директива «&НаКлиентеНаСервере». Она доступна в модуле команды и по сути равна директиве «&НаКлиентеНаСервереБезКонтекста», так как в командах отсутствует контекст формы. Так что любой читатель, столкнувшись с потребностью использовать директиву «&НаКлиентеНаСервере», без труда разберется в её особенностях. Да и в статье указано, что рассматриваются директивы, доступные в модуле формы."

Спасибо за прочтение! :)
33. Xershi 1003 23.11.17 14:02 Сейчас в теме
(31) проверил!
Да действительно «&НаКлиентеНаСервере» выдает ошибку в модуле формы на 8.3.10.
Вот пример обработки кому охота это проверить.
Но я бы все таки оставил оговорку, что 5 метод не для формы!
Прикрепленные файлы:
ВнешняяОбработка1.epf
АлександрЯрославичъ; +1 Ответить
35. pahich 601 23.11.17 15:33 Сейчас в теме
34. DonAlPatino 142 23.11.17 14:33 Сейчас в теме
Вот такую бы статью, когда тонкий клиент появился. Помню куча времени ушла, чтобы работу директив осознать. И почему родную 1совскую документацию таким языком пишут, что ничего не понятно :-). Согласен с теме кто одобрил картинки. Картинку с кучей книжке таскаемых туда-сюда в явлении 1 можно на стенку повесить.
36. Xershi 1003 23.11.17 15:37 Сейчас в теме
(34) документацию пишут технари, которые это разработали. А те кто не в теме и не могут понять, что они имели в виду. Для этого такие статьи и разрабатывают, чтобы понизить уровень входа!
АлександрЯрославичъ; ЧерныйКот; rpgshnik; +3 Ответить
37. ifilll 27.11.17 16:47 Сейчас в теме
По поводу "Вместо заключения", есть другой вариант.

Плохой программист Джон сделал ошибку в коде, из-за которой каждый пользователь программы был вынужден потратить в среднем 15 минут времени на поиск обхода возникшей проблемы. Пользователей было 10 миллионов. Всего впустую потрачено 150 миллионов минут = 2.5 миллиона часов. Если человек спит 8 часов в сутки, то на сознательную деятельность у него остается 16 часов. То есть Джон уничтожил 156250 человеко-дней ≈ 427.8 человеко-лет. Средний мужчина живет 64 года, значит Джон убил примерно 6 целых 68 сотых человека.

Как тебе спится, Джон — серийный программист?
ЧерныйКот; корум; +2 Ответить
38. spacecraft 27.11.17 16:56 Сейчас в теме
(37) 1,5 землекопа... где-то уже это было :)
39. ifilll 28.11.17 09:31 Сейчас в теме
В русскоязычном интернете это было на habr'е, в мире это уже давний мем, откуда он появился мне не известно, варьируется он деталями, а суть не меняется.
46. DonAlPatino 142 05.02.18 11:41 Сейчас в теме
(39) Эх, молодежь(с завистью) Старый советский мультфильм: "В стране невыученных уроков"
40. tivanitsky 12 11.01.18 13:37 Сейчас в теме
Восхитительная статья! :-). Особенно картиночки.
maksa2005; Artios; DrAku1a; +3 Ответить
42. ЧерныйКот 25.01.18 12:24 Сейчас в теме
Автор молодец! очень понятно и доходчиво о теме, которая часто вызывает трудности у начинающих.
44. pahich 601 25.01.18 18:25 Сейчас в теме
45. FlyNN 233 31.01.18 11:09 Сейчас в теме
ЭТАШЭДЭВР!) За одни только картинки поставил бы +100500)
47. smokevg 11 08.02.18 17:40 Сейчас в теме
Случайно наткнулся на статью, очень хорошо и понятно написано, спасибо.
48. AnnieCoder 08.02.18 17:44 Сейчас в теме
Если не ошибаюсь, читала статью на гилевском ресурсе. Хорошо разложено по полочкам.
49. АлександрЯрославичъ 09.04.18 10:59 Сейчас в теме
Спасибо! Познавательно и интересно.
52. METAL 117 08.06.18 13:10 Сейчас в теме
Не совсем в тему, но таки спрошу.
Есть общий модуль, типовой, название заканчивается на "...ПолныеПрава".
Стоят галки "Сервер" и "Вызов сервера".
"Клиент" и "Привилегированный" - НЕ стоят.
Выполняется метод из этого модуля и даёт ошибку "Нарушение прав доступа" (действительно, пользователь, под которым выполняется код, не имеет доступа к данной таблице)
Режим - файловый (НЕ клиент-сервер).
Вопрос: правильно ли понимаю, что в клиент-серверном режиме метод будет реально выполняться без контроля прав (с полными правами независимо от назначенных пользователю ролей), а в файловом - для этого надо будет установить галку Привилегированный?
53. spacecraft 08.06.18 13:14 Сейчас в теме
(52) от названия модуля ничего не зависит, от слова "совсем".
55. METAL 117 09.06.18 10:34 Сейчас в теме
(53) Ну, в типовых же его не просто так пишут. Стандарты как бы намекают :) Но пробежался, все что нашёл - такие модули привилегированные
54. pahich 601 08.06.18 13:24 Сейчас в теме
(52) Михаил, добрый день.
Нет, отличий в правах доступа к таблицам базы данных между файловым и клиент-серверным вариантом быть не должно. Если только какие-то недокументированные возможности.

Поэтому или давайте пользователю соответствующие права, или ставьте свойство выполнения в привилегированном режиме у модуля в значение истина. Но тут тоже могут быть подводные камни : )
56. METAL 117 09.06.18 10:40 Сейчас в теме
(54) Добрый день, Павел.
Спасибо за ответ.
Да, похоже в нашем случае кто-то сделал этот модуль непривилегированным, который изначально таковым был при выпуске типового решения. На 100% неизвестно, так как нет возможности сравнить с конфигурацией поставщика, но похоже всё так и было.
Сделал привилегированным, пока всё хорошо. Постараемся расследовать почему таки когда-то сняли эту галку, возможно действительно были какие-то подводные камни. Было бы интересно услышать пару примеров, если сталкивались (ну или в теории)
Отдельное спасибо за статью и еще одно отдельно за рисунки, огонь!)
57. user1052892 19.09.18 21:51 Сейчас в теме
Добрый день! Подскажите, пожалуйста насчет установки видимости реквизитов формы. Есть функция, которая устанавливает видимость элементов формы. Причем видимость различных элементов зависит от значения констант и реквизитов объектов БД, на которые ссылаются реквизиты объекта формы. Как лучше сделать с точки зрения быстродействия: получать необходимые значения, обращаясь к серверу (возможно, несколько раз) и затем, вернувшись на клиент, установить видимость элементов; или сразу уйти на сервер, там получить все необходимое и там же выставить видимость? Другими словами, в функцией с какой директивой - &насервере или &наклиенте написать: элементы.элемент.видимость = ложь (или истина)? Если в 1-ом варианте удастся получить все данные за 1 раз, то будет ли разница в быстродействии со вторым вариантом? платформа 8.3.10. Спасибо заранее.
58. pahich 601 19.09.18 23:22 Сейчас в теме
(57) Добрый день. По идее, если это возможно, то лучше получить все за 1 раз в процедуре/функции под директивой "&НаСервереБезКонтекста" и на стороне клиента установить виимость. Если же получение значений для установки видимости невозможно за 1 обращение к БД, то правильнее уйти на сервер и там управлять видимостью. Но это в теории. На самом деле очень многое зависит от сложности формы и количества явных и неявных серверных вызовов. Пробуйте разные варианты и смотрите замер производительности - он покажет и серверные вызовы и потери на каждом из них.
59. user1052892 20.09.18 09:25 Сейчас в теме
60. user1052892 20.09.18 20:35 Сейчас в теме
Добрый день, не могли бы Вы ещё рассказать, как работает вызов функции модуля с флагом вызов сервера из клиентской процедуры формы (что происходит при вызове). Везде рекомендуют ограничивать такие вызовы, но я не нашла информации почему. Чем такие вызовы опаснее, чем, например, вызов процедуры модуля формы с директивой & насервере
61. pahich 601 21.09.18 09:22 Сейчас в теме
(60) Ольга, добрый день!

Не готов сейчас ответить на этот вопрос. Если будет возможность - расследую подробно этот вопрос и оформлю в виде отдельной статьи. Но не обещаю этого : )

Извините, что не смог помочь )
62. user1052892 21.09.18 12:19 Сейчас в теме
(61) спасибо, ничего страшного. Очень буду ждать статью ))
63. spacecraft 21.09.18 21:58 Сейчас в теме
(60)
Везде рекомендуют ограничивать такие вызовы, но я не нашла информации почему

Рекомендация носит не запрещающий характер на сами вызовы, а ограничение на бесконтрольные частые вызовы клиентом сервера. Передача управления с клиента на сервер требует транспортных затрат. Обычно это самое узкое горлышко в работе. Дополнительная "холостая" работа сервера на их обслуживание. Клиент, с момента передачи управления на сервер, ожидает возвращения управления.
Чем такие вызовы опаснее, чем, например, вызов процедуры модуля формы с директивой & насервере

Если имеется ввиду такие вызовы с клиента, то они по определению не могут быть опаснее. Это практически такой же вызов, только без сериализации/десериализации данных форм и их передачи.
Можно их сравнивать с работой вызова клиентом серверного метода с директивой &НаСервереБезКонтекста
64. user1052892 22.09.18 14:20 Сейчас в теме
65. user1052892 22.09.18 14:39 Сейчас в теме
(63) я когда-то читала статью, где кажется была фраза о том, что такие вызовы могут быть потенциально небезопасны с точки зрения безопасности данных (извиняюсь за тавтологию). Там подробно не говорилось, не знаю насколько это правда.
66. spacecraft 22.09.18 17:01 Сейчас в теме
(65) в данном контексте уже рассматривается не сам вызов сервера с клиента, а безопасность модуля.
Нельзя вызвать серверный метод напрямую с клиента, если он располагается в общем серверном модуле без флага "вызов сервера". Вот эта безопасность и подразумевается.
Т.е. для обеспечение безопасности, когда к коду/данным нужно обеспечить доступ только с сервера, то такой код необходимо располагать только в серверном общем модуле без флага "вызов сервера". И обращение к нему осуществлять через промежуточные модули, где использовать "вызов сервера".
Daynestro07; user1052892; +2 Ответить
67. user1052892 23.09.18 13:05 Сейчас в теме
(66)Если я правильно поняла, то некая зловредная программа может получить доступ к данным, если будет вызов функции модуля с флагом "вызов сервера" с клиента, и не сможет этого сделать, если с клиента вызвать серверную функцию модуля формы, а уже оттуда общий модуль без флага "вызов сервера". Так? А почему? А если с клиента вызвать серверную функцию модуля формы, а оттуда общий модуль с флагом"вызов сервера"?
68. spacecraft 23.09.18 13:14 Сейчас в теме
(67) в качестве примера:
В общем серверном модуле написали функцию, принимающую в качестве параметра модуль формы. Так как это серверная функция (выполняется в контексте сервера), то ожидается получение серверной формы.
Если этот общий модуль указать флаг "вызов сервера", то возможна ситуация вызова этой функции с клиента. И даже попытки передать туда форму. Но это будет уже клиентская форма, которую на сервер просто так не передать.
Получаем ситуацию, в которой ошибки при сохранении не будет, но возможна ошибка при выполнении кода во время работы.
Ошибки времени выполнения более опасны, чем ошибки времени компиляции, так как не отслеживаются сразу.
user1052892; +1 Ответить
69. user1052892 23.09.18 14:04 Сейчас в теме
(68) спасибо. Т.е. зловредные программы здесь ни при чём?
70. spacecraft 23.09.18 14:13 Сейчас в теме
(69) еще может быть ситуация, где в таком общем модуле устанавливается привилегированный режим, и открывать доступ с "вызов сервера" тоже не всегда разумно. Это уже от бизнеслогики зависит.
user1052892; +1 Ответить
71. user1052892 23.09.18 14:23 Сейчас в теме
72. Darklight 22 15.11.18 14:47 Сейчас в теме
(68)1С намудрила, конечно со своими директивами. Нет, чтобы просто сделать атрибуты:
&Сервер
&Клиент
&ВнешнееСоединение
&ПередачаКонтекста
&СерверныйВызов
&ПривилегированныйВызов (необходимость вообще сомнительна - так как есть функция "УстановитьПривилегированныйРежим")
&КешированныйВызов (для механизма повторного использования + &КешированныйВызовНаСеанс)

И всё - берешь и помечаешь процедуры/функции (ограничение переменные), которые должны быть доступны в том или ином контексте, и реализовывать разные модели вызова функции такими атрибутами. Причём комбинируешь друг с другом, чтобы достигнуть совмещённый эффект, например: например если вызов функции должен быть доступен с клиента, внешнего соединения и с сервера и быть анкетированным на сеанс, но контекст вызова передавать не нужно - то можно было бы указать три директивы у функции (в модуле формы или в общем модуле, или в любом другом модуле:

&Сервер&Клиент&ВнешнееСоединение&СерверныйВызов&Кешированный­ВызовНаСеанс
функция КакаятоФункция(парам1, парам1) экспорт

КонецФункции

Если с сервера вызов не должен быть доступен - то убираем атрибут &Сервер.

Для доступности на сервере и на клиенте без контекста формы без серверного вызова и кеширования
&Клиент&Сервер
функция КакаятоФункция(парам1, парам1) экспорт

КонецФункции

С контектсом формы и серверным вызовом
&Клиент&Сервер&СерверныйВызов&ПередачаКонтекста
функция КакаятоФункция(парам1, парам1) экспорт

КонецФункции

А ещё я бы ввёл параметры у атрибутов - например для кешировнного вызова - задать режим кеширвоания (чтобы не делать два разных атрибута):
&КешированныйВызов(Режим=Вызов) //на время вызова
&КешированныйВызов(Режим=Сеанс) //на время сеанса - вариант по умолчанию, когда параметр не указан: "&КешированныйВызов"
Ну, сразу намекну, что хотелось бы и временем жизни управлять более точно:
&КешированныйВызов(Режим=Время,Время=3600) //На один час (параметров атрибутов могло бы быть несколько)
&КешированныйВызов(Режим=Время,Время=3600,Группа=ЛюбоеНазваниеИдентификатораГруппа) //И чтобы в методе "ОбновитьПовторноИспользуемыеЗначения" можно было указать в параметре значение такого идентификатора группы "ЛюбоеНазваниеИдентификатораГруппа" одного или нескольких - чтобы можно было сбросить только определённые части кеша, а не весь целиком).

Для клиентов тоже можно было бы указывать ограничения на вид клиента в параметрах атрибутах
&Клиент(Толстый=Истина,Тонкий=Истина,WЕB=Ложь) //Разрешено для тостого и тонкого клиента - для WEB - запрещено - для Мобильного - неопределено - определяется глобальной настройкой значения по умолчанию)

Тогда внешнее соединение бы приравнял к виду клиента:
&Клиент(ВнешнееСоединение=Да,Толстый=Да,Тонкий=Нет,WЕB=Нет)

Ну и для Сервера тоже могут быть варианты
&Сервер(Десктоп=Да,Мобильный=Нет) //Разрешено только для классического серверного контекста

А ещё можно было тут и платфору определять - вдруг это будет актуально для каких-то алгоритмов (ведь есть же свои нюансы для у разных платформ):

&Сервер(Десктоп=Да,Windows=Да,Linux=Нет)

&Сервер(Мобильный=Да,WindowsMobile=Да,Android=Да,iOS=Нет)

Можно было бы размести две разные функции (с разным алгоритмы, разными атрибутами, но одним именем) - которые были бы различно выбраны для разного контекста и платформы исполнения.

Хотя, возможно для платформ лучше отдельный атрибут завести: &Платформа и просто сочетать его с другими атрибутами контекста,
чтобы задавать больше специфических значений параметров атрибута: &Платформа(WindowsDesktop=Да,WindowsServer=Да,LinuxDesktop=Нет,LinuxServer=Да,WindowsMobile=Да,Версия,Android=Да,iOS=Нет,LinuxServerВерсия="Core>=4;Base=Debian", WindowsMobileВерсия=">=10.1",AndroidВерсия=">=8.1",1СПредприятиеВерсия=">=8.3.12")

Кстати, чтобы отказаться от директив "ПривилегированныйВызов" и "СерверныйВызов" , можно их включить в параметры атрибута контекста
&Сервер(Клиент=Истина, Привилегированный=Истина) //Такая процедура/автоматически бы стала доступна и на сервере и на клиенте с серверным вызовом, и выполнялась бы в привилегированном режиме - хот, как я написал выше, я бы вообще убрал директиву "Привилегированный вызов".

Тогда сюда же можно перенести и передачу контекста
&Сервер(Клиент=Истина, Контекст=Истина) //Доступно и на сервере и на клиенте - при вызове с клиента требуется серверный вызов и передача контекста

Итого можно было бы обойтись несколькими всего атрибутами с наборами параметров атрибутов:

&Сервер
&Клиент
&Кешировать (переименовал для простоты)

И в а атрибуты я перенёс бы ещё и ключевое слово "экспорт", заодно инвертировав бы его - т.е. сделав процедуру/функци/переменную по умолчанию доступной для всех - и только для случая, когда её нужно скрыть - я бы это добавил - в параметр атрибута доступности

&Клиент(Доступность=Модуль)&Сервер(Доступность=Конфигурация)
функция КакаятоФункция(парам1, парам1) экспорт
//Функция будет доступна в клиентском контексте только внутри модуля, и в серверном - всей конфигурации
КонецФункции

Или даже круче - задать доступность только определённым модулям

&Клиент(Доступность=Ограничения,ОграниченияДоступности="ЭтотМодуль,Обработка.Обработка1.Форма.ФормаОбработки.МодульФормы")&Сервер(Доступность=Ограничения, ОграниченияДоступности="ОбщийМодуль.Модуль1,ОбщийМодуль.Модуль2,Обработка.Обработка1.МодульМенеджера,Обработка.Обработка1.МодульОбъекта") //Задаётся персональная доступность функции для разных модулей клиентского и серверного контекста)

Но, повторюсь, лично я сторонник того, чтобы ограничения доступности задавались только в случае реальной необходимости - в остальных случаях достаточно полной доступности в рамках заданного контекста.

И не пришлось бы плодить кучу общих модулей с "одинаковыми" названиями но разными окончаниями и настройками для разграничения серверных, клиентских и прочих вызовов. И таскать кучу не экспортируемых функций из типовых модулей - если их логика нужна в не типовых модулях.

Сюда бы ещё возможность делать вложенные друг в друга модули (общие и не только общие, например модули форм, и вообще несколько модулей у формы или объекта, менеджера) - чтобы функции/процедуры можно было бы по ним разбросать и более гибко настроить доступность (как показано выше) - то вообще было бы очень всё круто и удобно! Особенно при обновлении изменённых конфигураций, содержимое которых было бы более чётко разбито на отдельные кусочки.

Тогда и от директив препроцессора #ЕСЛИ Сервер ТОГДА #КОНЕЦЕСЛИ можно было бы отказаться (но я бы всё-таки не стал, просто сейчас есть целых две разных схемы разграничения контекста - у форм и общих модулей (и отчасти модулей объектов): атрибуты и директивы препроцессора, а хотелось бы единую схему для всех). А для директив препроцессора как раз хорошо было бы добавить дополнительные возможности контроля параметров "компиляции" - которые можно было бы гибко настраивать для конфигурации + вводить свои.
73. Daynestro07 22.11.18 15:12 Сейчас в теме
Хорошая статья, все понятно разжевала на счет клиент-серверного взаимодействия. Сейчас без этого понимания на УФ можно не соваться.
74. user907301 09.01.19 12:45 Сейчас в теме
А мне очень понравилось, особенно все становится понятно при просмотре комиксов!
75. prime9 977 18.01.19 13:58 Сейчас в теме
Статья огонь! Ржали как кони, всем отделом когда сервер копию пытался сделать :)
76. user876469 25.07.19 03:20 Сейчас в теме
Спасибо, очень познавательно и доходчиво объяснено!
77. pahich 601 25.07.19 09:11 Сейчас в теме
78. RGEGSD 14.11.19 14:41 Сейчас в теме
Как это я ваще не вник к этому
79. pahich 601 14.11.19 20:33 Сейчас в теме
80. owson 16.02.20 12:34 Сейчас в теме
Почему директиву &НаСервереБезКонтекста нельзя использовать в общих модулях? Нигде не используется в типовой конфигурации, ну и платформа этого не позволяет. Но это не очевидно.
81. pahich 601 17.02.20 09:45 Сейчас в теме
(80) Все процедуры и функции общих модулей не имеют контекста формы. Поэтому вызов из модуля формы процедуры или функции общего модуля с директивой &НаСервере подразумевает, что контекст будет “отсечен”.

Если необходимо иметь возможность работы с формой в общих модулях, ее необходимо передавать методу в качестве параметра.
82. timeforlive 15 27.03.20 07:13 Сейчас в теме
Как я сюда попал на эту статью?

Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.


Бухгалтер Галя нагло пользовалась этой полсекундой и устраивала себе получасовые чаепития с обсуждением последних мировых новостей.

Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?


Замерил потребление количество воды за месяц и пакетиков чая, уволили половину бухгалтеров (в большую сторону). Сэкономили ежегодные 4млн.р.
(25000р. * 12 месяцев * 13 сотрудников), без учета налогов.
83. VitaliyCeban 403 16.04.20 12:48 Сейчас в теме
Скажите, пожалуйста, как согласуются Ваши утверждения
При вызове процедуры или функции под директивой «&НаСервере» из формы со стороны клиента происходит «упаковка» всего контекста формы и отправка его на сторону сервера.

После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.


с
Внимание! При вызове серверных процедур и функций и возврате управления на клиента выполняется передача только изменений в данных формы.

из руководства 1С:Предприятие 8.3. Руководство разработчика. Глава 7.2.2. Типы данных формы ?

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

Исходя из Вашей статьи я подумал было что тонкий клиент работает в режиме stateless, но как видим, если передаются только изменения, а это так, то о stateless говорить не приходтся. Интересно, где и в каком состоянии находится форма на сервере между контекстными вызовами?
84. pahich 601 16.04.20 14:53 Сейчас в теме
(83) Добрый день!

Статья нацелена на наглядное пояснение разницы работы в директивах. Ваш же вопрос лежит в плоскости механизма работы конкретной директивы. Исследований по этой теме я не проводил, поэтому и ответить на ваш вопрос не могу.

Если Вы проведете детальный разбор и оформите это в виде общедоступного контента - с удовольствием ознакомлюсь =)

Спасибо за проявленный интерес к статье )
Оставьте свое сообщение

См. также

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    33776    ids79    40    

Партионный учет по двум количественным показателям

Математика и алгоритмы Учет ТМЦ v8 1cv8.cf Оптовая торговля, дистрибуция, логистика Россия УУ Бесплатно (free)

Особенности учета партионной системы при наличии двух количественных показателей.

26.03.2020    3238    lastcontra    4    

Получение значений всех полей в иерархии структуры отчета

Практика программирования Математика и алгоритмы v8::СКД Россия Бесплатно (free)

При обработке расшифровки данных в отчете (да и не только отчете), основанном на СКД, может потребоваться получить значения всех полей, находящихся в текущей группировке и её родителях. Представляю вашему вниманию алгоритм, выполняющий эту задачу. Как говорится, "просто оставлю это здесь".

28.02.2020    2072    real_MaxA    1    

Treemapping — способ визуализации данных древовидной структуры. Карта-схема дерева

Математика и алгоритмы Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Предлагается ознакомиться с редким способом графического представления иерархических данных. Приводится алгоритм формирования и пример реализации.

18.02.2020    4601    randomus    18    

Будни автоматизации или "мне нужна программка для 3D упаковки" Промо

Практика программирования Математика и алгоритмы Оптовая торговля Оптовая торговля v8 1cv8.cf УУ Бесплатно (free)

Автоматизация отечественных предприятий, которой приходиться заниматься, это нужная и высокооплачиваемая, но довольно нервная работа. Выручает юмор. Например, при общении с требовательным клиентом можно вспомнить анекдот: "Держась руками за стену, на ногах еле стоит мужик. К нему пристает ребенок: "Ну, папа, пожалуйста, сделай мне кораблик!", папа отвечает: "Ага! - Сейчас все брошу и пойду делать тебе кораблик!". Про один такой сделанный для клиента "кораблик" и хочется рассказать. Надеюсь, совместное погружение в теплое ламповое (то есть клиентоориентированное) программирование доставит Вам положительные эмоции, да и задача попалась интересная. Поплыли?

24.03.2014    45117    ildarovich    116    

[После]Новогодние задачи

Практика программирования Математика и алгоритмы v8 Бесплатно (free)

Совсем немного времени осталось до того момента, когда отзвучат куранты, шампанское будет выпито, мандарины съедены, и даже оливье закончится. Возникнет вопрос: чем бы занять неожиданно появившееся свободное время?

30.12.2019    3010    Alxby    23    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    26347    YPermitin    24    

"Хочу универсально!" [Часть 1]

Математика и алгоритмы Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Сентябрьская серия статей про то, как начинающий разработчик Вася проходит путь от простой задачки к созданию своего механизма. На этот раз - открытие значения из текущей колонки.

02.09.2019    9652    SeiOkami    35    

Приемы обработки больших данных в 1С Промо

Универсальные обработки Математика и алгоритмы Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

Рассказ об эффективных приемах организации обработок больших объемов данных на платформе 1С

07.08.2015    66474    tormozit    27    

Иерархия без "В ИЕРАРХИИ"

Математика и алгоритмы v8 Бесплатно (free)

Говорится о том, как эффективно представлять иерархию в СУБД, как получать и использовать эти представления при решении задач в запросной технике. Уточняются и дополняются запросы из статьи "Уровни, глубина, прародители, циклы и аналоги запросом" [https://infostart.ru/public/160707/].

22.08.2019    12019    ildarovich    19    

EnterpriseData – часть 3. Загрузка данных, идентификация объектов

Практика программирования Математика и алгоритмы Перенос данных из 1C8 в 1C8 Разработка v8 v8::УФ 1cv8.cf Бесплатно (free)

Основные этапы загрузки данных через EnterpriseData. Идентификация объектов загружаемых полностью и по ссылке. Приведены схемы процессов загрузки данных. Описание основных операций и обработчиков. Перечень процедур БСП, используемых при загрузке данных, структура «КомпонентыОбмена».

22.08.2019    14361    ids79    8    

Обработчики событий при записи объектов. Зачем и что за чем?

Математика и алгоритмы v8 Бесплатно (free)

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

25.07.2019    44296    AlbinaAAA    28    

XDTO - это просто Промо

Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

С появлением платформы 8.1 фирма “1С” представила механизм, носящий интригующее название XML Data Transfer Objects или, если коротко - XDTO. По традиции, документирование механизма составлял тот, кто хорошо разбирался в вопросе, а стало быть опустил “и так понятные” с его точки зрения моменты. Целью данной статьи (или цикла статей, как получится) стало желание поделиться накопленным опытом. Мне кажется, многие неочевидные вещи в механизме XDTO необходимо осветить получше.

24.12.2012    289737    Evil Beaver    173    

Как проводятся документы в типовых конфигурациях от 1С

Математика и алгоритмы Практика программирования Разработка v8::ОУ ERP2 УТ11 Россия УУ Бесплатно (free)

В свое время, когда только начинал шаги в 1С и изучал, как проводятся документы в конфигурациях на платформе 1С по книге "Разработка управляемого интерфейса" (Хрусталева Е.Ю.), и там были представлены примеры совсем далекие от того, как сейчас проводятся документы в современных конфигурациях от 1С.

24.07.2019    26535    skv_79    35    

FizzBuzz на 1С. Чем короче, тем веселее. Варианты принимаются...

Практика программирования Математика и алгоритмы Разработка v8 Бесплатно (free)

Мне было скучно, я не мог себя заставить написать ничего полезного. И читал статью на Хабре. Потом я читал комментарии, а потом... нет я не ушел смотреть котиков на ютюбе. Я решил сделать несколько решений задачки FizzBuzz на 1С, с целью "чем короче, тем лучше". Прошу сильно не пинать, это просто развлечение для вечера.

24.07.2019    5371    vandalsvq    16    

Управление качеством кода

Математика и алгоритмы Рефакторинг и качество кода v8 Бесплатно (free)

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    15961    Stepa86    33    

Самоучитель языка запросов 1С. Промо

Практика программирования Решение задач на 1С:Специалист Математика и алгоритмы v8 v8::Запросы Бесплатно (free)

Сервис для изучения запросов 1С: "Консоль изучения запросов 1С:Предприятие 8". Теперь и с конструктором запросов!

07.05.2013    109250    bpc222    327    

Что делает "В ИЕРАРХИИ" в запросе?

Математика и алгоритмы v8 Бесплатно (free)

Описание действий платформы 1С при использовании конструкции "В ИЕРАРХИИ" в запросах.

16.07.2019    24313    YPermitin    34    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    49149    ids79    25    

Реализуем Стек, Очередь и Приоритетную очередь в 1С

Практика программирования Математика и алгоритмы v8 1cv8.cf Россия Бесплатно (free)

В статье рассматриваются способы реализации таких абстрактных структур данных, как стек, очередь и приоритетная очередь, используя готовые типы данных 1С. Выявляются "узкие" места, сложные моменты в реализации и сравнивается скорость работы.

24.06.2019    13826    RonX01    65    

Решение транспортной задачи запросом Промо

Математика и алгоритмы v8 Бесплатно (free)

Списание по двум последовательностям партий запросом (без программной обработки)

1 стартмани

30.04.2014    34923    bforce    22    

Почему вообще работает мой запрос? или Ещё раз о планах запросов

Математика и алгоритмы Практика программирования Разработка v8::Запросы Бесплатно (free)

Другие статьи на эту тему объясняют, что такое план выполнения запроса, но не рассказывают о том, как его получить. Эта заметка призвана заполнить этот пробел. Её цель - популяризировать общедоступные инструменты получения плана запроса среди разработчиков, которые ещё не начали их использовать.

10.06.2019    9263    DataReducer    12    

Организация хранения промежуточных данных

Математика и алгоритмы v8 Бесплатно (free)

Организация хранения промежуточных данных в процедуре сверки.

29.05.2019    4155    scientes    1    

Вычисление 200 тысяч знаков числа pi

Математика и алгоритмы v8 Россия Бесплатно (free)

В статье рассматриваются возможности платформы выполнять сверхточные вычисления без использования сложных алгоритмов и внешних компонент на примере вычисления числа pi.

28.05.2019    7702    Oleg_nsk    96    

Парсер запросов 1С. Часть 1: Введение, разбор математических выражений Промо

Математика и алгоритмы v8 Бесплатно (free)

Рано или поздно становится скучно решать типичные задачи, для которых придумана 1С. Голова пухнет от бухгалтерских терминов и очередных "хотелок" пользователей. Именно в такие моменты хочется гордо поднять голову, воскликнуть "Но я же программист!" и заняться чем-то интересным. В цикле статей я постараюсь доступно описать, как устроены парсеры в целом и на примере парсера языка запросов 1С. Требования к навыкам читающего: основы языка 1С, основы алгоритмизации.

1 стартмани

04.12.2013    30622    juntatalor    49    

Регистры накопления. Виртуальные таблицы. Часть №1: Обороты

Практика программирования Математика и алгоритмы Разработка v8 1cv8.cf Бесплатно (free)

Описание работы платформы 1С:Предприятие 8.2 с виртуальной таблицей "Обороты" регистров накопления.

20.05.2019    25822    YPermitin    7    

Даем названия переменным: как префиксы экономят наше время

Практика программирования Математика и алгоритмы Разработка v8 Бесплатно (free)

Понятные названия переменных экономят время и силы разработчика : в начале, когда мы даём названия переменным, в процессе развития разработки, когда мы "на лету" понимаем назначение той или иной переменной, в конце, когда мы передаём разработку на поддержку других программистов, сами переходя к новым разработкам

06.05.2019    6739    Designer1C    81    

Заметки по SQL: Срез последних - аналог запроса

Математика и алгоритмы Практика программирования v8 1cv8.cf Россия Бесплатно (free)

В статье описывается создание среза последних данных средствами классического языка запросов. Причем метод построения запроса был разработан еще во времена, когда автор работал с СУБД Oracle 9i и программировал на PL SQL. Основная идея заключается преобразовании запроса с подзапросом, в запрос без подзапроса (в примерах описывается преобразование до двух вложенных подзапросов). Запросы тестировались на реальных базах данных. Платформа - 1С:Предприятие 8.3 (8.3.10.2561).

15.01.2019    11251    IVC_goal    7    

Сервис для изучения методов платформы 1С:Предприятие 8. Бесплатно! Промо

Практика программирования Решение задач на 1С:Специалист Математика и алгоритмы v8 Бесплатно (free)

Бесплатный ON-Line сервис изучения методов платформы 1С:Предприятие 8. Подготовка к аттестации 1С:Специалист on-line! Тестовые задания по различным видам учета! Подсказки для оптимального решения!

27.06.2013    49750    bpc222    51    

Многопоточное восстановление последовательностей

Производительность и оптимизация (HighLoad) Практика программирования Математика и алгоритмы Универсальные функции v8 Бесплатно (free)

Универсальный алгоритм многопоточного фонового восстановления любой последовательности.

05.12.2018    12986    _ASZ_    33    

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C

Математика и алгоритмы Практика программирования v8 Россия Бесплатно (free)

У многих начинающих 1С программистов часто возникают вопросы про клиент-серверное взаимодействие в 1С и чтобы разобраться в непростых механизмах платформы, необходимо понять, что же такое контекст, для чего предназначены директивы компиляции, что представляют собой контекстные/внеконтекстные вызовы и как наиболее оптимально описывать прикладные задачи в модулях управляемых форм.

23.08.2018    37585    Rain88    46    

v8: Концепция минимального изменения конфигурации для легкого обновления Промо

Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

"Лучше день потерять потом за пять минут долететь" ((с) "Крылья, ноги и хвосты") или как сделать так чтобы обновление конфигурации проходило с минимальными трудозатратами.

28.01.2013    37988    MarSeN    57    

Теорема номер тринадцать

Математика и алгоритмы v8 Бесплатно (free)

Использование математических методов для языка запросов.

15.03.2018    12057    vasilev2015    24    

"Взлом" теста "1С:Профессионал" методом машинного обучения

Практика программирования Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

Нейронные сети – не единственная модель, реализующая принципы машинного обучения. Есть еще байесовская модель, которая математически строже и определеннее, поскольку построена на надежном фундаменте теории вероятностей. Применению байесовского вывода к решению интересной теоретической задачи и посвящена данная статья. Слово "взлом" в заголовке использовано для привлечения внимания. Речь идет исключительно о математическом методе, показанном на примере знакомой всем задачи. 

12.03.2018    18997    ildarovich    19    

Введение в CI для 1С

Математика и алгоритмы v8 Россия Бесплатно (free)

Значение роли тестирования при разработке ПО трудно переоценить, его применение позволяет повысить надёжность продукта и улучшить качество кода. Для продуктов для платформы 1С:Предприятие существует ряд инструментов для проведения тестирования, в том числе и от самого вендора. Но, также появились открытые инструменты, реализующие мировые практики проведения тестирования (проверки продукта), поддерживаемые сообществом. В этой статье описаны базовые принципы, которые необходимо понимать перед началом применения этих инструментов.

21.11.2017    23440    real_MaxA    22    

Пример выбора несколько обработчиков событий записи объекта для решения одной задачи Промо

Математика и алгоритмы v8 Бесплатно (free)

Данная публикация предназначена для начинающих разработчиков и является продолжением статьи "Обработчики событий при записи объектов. Зачем и что за чем?" (ссылка далее). Содержит пример использования несколько обработчиков событий для решения одной задачи и объясняется почему выбраны именно они.

27.09.2012    194441    AlbinaAAA    65    

#Область ВНЕШНИЕ_ВЫЗОВЫ или MVC в 1С, библиотечность и упрощение интеграции кода

Практика программирования Математика и алгоритмы Универсальные функции v8 Бесплатно (free)

Зачастую почти любой модуль в 1С содержит от одного до несметного множества вызовов других модулей. Как с этим бороться, чтобы было проще куда-то что-то переносить - в этом посте.

12.10.2017    17867    for_sale    58    

Пишем игру Минер. Обработка событий ActiveX в 1С

Практика программирования Математика и алгоритмы v8 Россия Бесплатно (free)

Пример демонстрирует обработку событий генерируемых компонентой ActiveX в 1С.

29.05.2017    14730    user621724_Dimav1979    12    

Как я доступ на kb.1c.ru получал

Решение задач на 1С:Специалист Математика и алгоритмы v8 Россия Бесплатно (free)

kb.1c - база знаний по технологическим вопросам крупных внедрений и не только. В этой базе знаний собираются методики и решения технологических проблем эксплуатации 1с, check-list'ы и инструкции по настройке ПО на серверах. Какие-то из размещенных статей дублируются на ИТС. Когда я искал пути получения доступа к нему я столкнулся с проблемой: мало кто доподлинно знает как получить доступ к нему, не работая у франчайзи 1с. Я опишу путь, который прошёл я, как физическое лицо.

01.05.2017    26053    ikekoval    34    

Альтернативные способы работы с XML. Часть 2: Введение в xPath или запросы к XML Промо

Обмен через XML Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

В предыдущей статье "Введение в DOM или объектная модель документа" было описано понятие объектной модели документа (DOM), раскрыты плюсы и минусы использования модели при разборе файлов XML, приведено сравнение с построчным последовательным разбором. Были представлены варианты выборки данных с помощью объекта 1С ДокументDOM. Теперь настало время познакомить читателей с самым, на мой взгляд, интересным способом извлечения данных из XML - при помощи языка запросов xPath.

09.08.2012    42005    1cspecialist    13    

УФ: программное создание и копирование документов с использованием конструкций ДанныеФормыВЗначение, ЗначениеВДанныеФормы

Практика программирования Математика и алгоритмы v8::УФ Россия Бесплатно (free)

1С:Предприятие 8.3. Управляемые формы. Программное создание и копирование документов. Использование методов ДанныеФормыВЗначение(), ЗначениеВДанныеФормы() и КопироватьДанныеФормы().

27.04.2017    27218    alexhline    9    

Улучшение стандарта "Структура модуля"

Математика и алгоритмы v8 1cv8.cf Россия Бесплатно (free)

Описывается структура областей модулей, которую я использую при разработке на своих проектах. Обсуждаются недостатки стандарта 1С "Структура модуля". Предложен улучшенный подход к работе со структурой модуля.

26.03.2017    14380    o.nikolaev    23    

Маленькая хитрость СКД - выводим строки X раз

Математика и алгоритмы Практика программирования v8::СКД 1cv8.cf Россия Бесплатно (free)

Здесь я расскажу, как вывести в отчет СКД произвольное количество одинаковых строк.

17.12.2016    17426    alexandersh    16    

От Hello world - к защите конфигураций за 1 минуту Промо

Защита и шифрование Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

Вы всегда хотели но боялись создать COM объект? Тогда мы идем к вам! С обычным блокнотом, где будем программировать на c#, и таймером ...

19.05.2012    34806    O-Planet    130    

"Распределение в запросе" или "избавляемся от перебора"

Математика и алгоритмы Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

Хороший перебор - это отсутствие перебора. Рассмотрим пример замены полного перебора запросом.

16.12.2016    33467    alexandersh    48    

Планы обмена. Квитировать или гарантировать?

Практика программирования Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

Планы обмена предлагают использовать две стратегии удаления обработанных изменений: квитирование и гарантированная доставка сообщений. Как сделать правильный выбор?

12.12.2016    17142    zhichkin    9    

Некоторые принципы оптимизации запросов 1С (+SQL)

Математика и алгоритмы v8 Бесплатно (free)

Разработка нового функционала часто связана с созданием новых таблиц в базе и написанием запросов. Собственно, размышляя о запросах, мы и формируем в голове содержание таблиц, индексы и количество таблиц и индексов. Заранее можно уверенно рассуждать о том, какая нужна архитектура, если задачу удалось понять. На этом этапе важно привлекать свой опыт. Что же делать, если его нет? Как рассуждать о запросах и формате хранения?

17.11.2016    10742    ture    40    

Новые функции СКД 8.2.14 Промо

Математика и алгоритмы v8::СКД 1cv8.cf Россия Бесплатно (free)

Демонстрация новых функций СКД 8.2.14

29.06.2011    215357    fishca    51    

Использование git для доработки типовых конфигураций 1С

Математика и алгоритмы v8 Беларусь Украина Россия Бесплатно (free)

Рассмотрены способы доработок типовой конфигурации 1C для различных изменений, и на картинках продемонстрирован подход к разработке с использованием git и частично с тестами.

11.10.2016    205982    pumbaE    31    

Оптимизация запросов 1С:Предприятие – от теории к практике

Практика программирования Математика и алгоритмы v8 Бесплатно (free)

Я давно отметил достаточно серьезный интерес сообщества к вопросам оптимизации и повышения производительности высоконагруженных систем. Общаясь с различными специалистами, обслуживающими малые и большие предприятия (торговые и производственные), я пришел к выводу, что вопросы повышения производительности интересны почти всем, вне зависимости от того, какую конфигурацию они обслуживают – большую или маленькую, измененную или без значительных изменений. В связи с этим я пришел к выводу, что стоит посвятить данный материал вопросам оптимизации запросов, поскольку именно запросы являются основным инструментом извлечения данных из системы.

07.10.2016    37648    bpc222    20    

Регистры сведений 1С. Как это устроено.

Математика и алгоритмы v8 Бесплатно (free)

Основная идея публикации - собрать в одном месте информацию о внутреннем устройстве такой абстрактной сущности, как "Регистр сведений 1С" и ответить на ряд вопросов: Что происходит при записи регистра в различных режимах? Что такое на самом деле "СрезПервых" и "СрезПоследних"? Как оптимально выбрать структуру регистра? Это та информация, владея которой, начинаешь лучше понимать как это работает и как правильно использовать регистры сведений.

05.08.2016    183665    Sergey.Noskov    156