В этой статье мы покажем, как взаимодействуют клиентская и серверная части платформы и какие есть особенности в использовании директив компиляции.
Это будет полезно начинающим разработчикам и тем, у кого есть пробелы в области клиент-серверного взаимодействия — всё объясним «на пальцах» :)
![]()
Клиент-серверная архитектура заложена в платформе изначально — со времен «1С:Предприятие 8.0».
Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере.
Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере — другой. Клиент и сервер «общаются» между собой с помощью серверного вызова.
Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.
Немного базовой теории
Перед тем, как перейти к содержательной части, договоримся о некоторых ограничениях:
- Мы подразумеваем, что Вы знаете о существовании четырёх директив компиляции, доступных в модулях формы: «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста».
- Все примеры будут опираться на работу «1С:Предприятие 8» в клиент-серверном режиме. Файловый вариант по сути является эмуляцией клиент-серверного режима, с небольшими отклонениями (для данной статьи это не критично)
- В рамках этого материала рассматривается исключительно взаимодействие клиента и сервера 1С. Работа с базой данных, преобразование данных и прочие нюансы работы системы – это темы других статей.
Далее, освежим в памяти немного теории.
Директивы, в имени которых упоминается «Клиент», устанавливают ограничение на обращение к базе данных.
Процедуры или функции, написанные под директивой «Без контекста», не имеют доступа к контексту (данным) формы. Исходя из этой информации, легко представить ограничения директив по доступу к данным в виде следующей таблицы:
| Директива | Данные формы | База данных |
| &НаКлиенте | + | – |
| &НаСервере | + | + |
| &НаСервереБезКонтекста | – | + |
| &НаКлиентеНаСервереБезКонтекста | – | – |
Опережая вопрос «Для чего же директива с самым длинным названием, если она ограничивает и использование контекста форм, и обращения к базе данных?», напомню: любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.
Отсюда делаем вывод: у методов, описанных под директивой «&НаКлиентеНаСервереБезКонтекста», единственным источником данных являются эти самые переданные параметры.
Не стоит забывать и про доступность вызова одних процедур и функций из других. Для этого стоит запомнить, что можно вызывать только те процедуры и функции, которые находятся под одноимённой (с родительским методом) директивой или под директивой, находящейся ниже (чем у родительского метода) согласно списку:
- &НаКлиенте
- &НаСервере
- &НаСервереБезКонтекста
- &НаКлиентеНаСервереБезКонтекста.
То есть из метода, описанного под директивой «&НаКлиенте», можно вызывать процедуры и функции, описанные под любой директивой. А вот «из-под» директивы «&НаСервереБезКонтекста» можно вызывать только то, что описано под директивой «&НаСервереБезКонтекста» или «&НаКлиентеНаСервереБезКонтекста».
Теперь про серверный вызов
Серверный вызов — это передача какой-то информации с клиентской части «1С:Предприятие 8» на серверную часть с целью вернуть обратно некий набор данных.
Самый первый серверный вызов инициализируется в момент начала сеанса работы 1С. То есть когда пользователь выполняет вход в информационную базу:
«Оу! При чём тут Библиотека?!» — спросите Вы.
Всё очень просто:
Обратите внимание, что доступ к базе данных есть только на серверной части, а соединение между клиентом и сервером имеет ограниченную пропускную способность. Это и неудивительно – ведь соединение между клиентской и серверной частью может быть установлено даже по нестабильному низкоскоростному каналу связи (например, посредством мобильного интернета).
Кроме этого, передача данных между клиентом и сервером возможна только посредством серверного вызова.
Но, для того чтобы перейти к основной теме данной статьи, необходимо сначала разобраться – где будет выполняться программный код, написанный под определенными директивами. То есть на какой части приложения «1С:Предприятие 8» будут доступны процедуры и функции, описанные под директивами «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста»:
Видим, что на стороне клиента у нас будут доступны процедуры и функции, написанные под двумя директивами из четырёх, а на стороне сервера – под тремя из четырёх.
Сразу возникают вопросы: «Зачем такое многообразие и чем оно полезно?», «Как метод, описанный под директивой «&НаКлиентеНаСервереБезКонтекста» может выполняться и на клиенте, и на сервере?».
Сейчас мы постараемся понять особенности работы системы при использовании директив и почему необходимо уметь правильно использовать каждую из существующих директив компиляции.
И в этом нам помогут наши новые друзья, знакомьтесь!



Итак, давайте рассмотрим несколько особенностей работы программного кода в «1С:Предприятие 8», написанного под разными директивами.
Действие 1. Открытие пользователем формы с данными.
Действие 2. Получение из открытой Пользователем формы дополнительных данных из Базы данных.
Получение этих данных может быть описано под двумя директивами — «&НаСервере» и «&НаСервереБезКонтекста». Рассмотрим оба случая.
Явление 1. Директива «&НаСервере»
После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.
Явление 2. Директива «&НаСервереБезКонтекста»
Таким образом, серверный вызов не несёт лишней нагрузки, и для передачи данных между клиентом и сервером потребуется меньше ресурсов.
Из примеров видно, что далеко не всегда оправдано указание директивы компиляции «&НаСервере» с точки зрения использования контекста (данных) формы на сервере.
Если возможно решить возникшую задачу путём отправки на сервер только определённого набора данных, то надо эту возможность использовать и описывать метод под директивой «&НаСервереБезКонтекста». Это позволит уменьшить нагрузку на серверный вызов, а также не занимать сервер обработкой и хранением ненужной в текущий момент информации.
До этого момента при каждом изменении свойства «Видимость» происходил серверный вызов, как при использовании директивы «&НаСервере».
Но использование директивы «&НаСервереБезКонтекста» не является панацеей. Помимо нагрузки на серверный вызов, всегда необходимо задумываться ещё над одним параметром.
Действие 3. Обработка данных табличной части формы с получением дополнительной информации из Базы данных.
Явление 1. Построчная обработка табличной части на стороне клиента с организацией серверного вызова для получения дополнительной информации из базы данных.
Мы уже знаем – лучше использовать директиву «&НаСервереБезКонтекста».
Явление 2. Предварительная обработка табличной части на стороне клиента с целью подготовки требуемых к обработке на сервере данных и «упаковки» их в набор параметров. Затем передача этого набора на сервер для получения дополнительной информации из базы данных.
Используем всё ту же директиву «&НаСервереБезКонтекста».
Большое количество текущих серверных вызовов может свидетельствовать о неоптимальном программном коде.
Избегайте создания серверных вызовов внутри цикла. Подготовьте набор параметров и единожды выполните его передачу для обработки на сервер. Если предполагается сложная обработка большого количества данных формы – передайте её полностью на сервер (при помощи директивы «&НаСервере») и выполните все действия на стороне сервера.
С директивой «&НаСервереБезКонтекста» вроде бы разобрались. Она нужна для того, чтобы уменьшить объем информации, передаваемой в рамках одного серверного вызова. Дополнительно разобрались с количеством текущих серверных вызовов – необходимо стремиться к их минимизации.
Давайте теперь попробуем разобраться, для чего нужна директива «&НаКлиентеНаСервереБезКонтекста».
Действие 4. Выполнение обработки данных.
Когда предполагается выполнение одной и той же обработки данных из нескольких участков программного кода, разумно этот код поместить в самостоятельную процедуру или функцию. Остаётся только решить, под какой директивой её написать.
Та-дам!
Для копирования у нас есть ксерокс. Но куда его поставить? На сторону клиента или сервера? Под какой директивой его разместить?
Как было озвучено ранее – любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.
Давайте для начала попробуем разместить копировальный аппарат на стороне клиента. Для этого описываем процедуру или функцию «Ксерокс» под директивой «&НаКлиенте». Тогда процесс клиентской части в любой момент сможет без проблем обратиться к ней и все действия будут выполнены в соответствии с программным кодом.
Но что произойдёт, если потребность в копировании возникнет на стороне сервера? Например, для подготовки данных, передаваемых на сторону клиента, потребуется сделать копию? Напомню – процесс серверной части не имеет возможности самостоятельно инициировать клиентские вызовы.
Получается, что использовать директиву «&НаКлиенте» неправильно, а директиву «&НаСервере», как мы изучили ранее – нежелательно. Давайте посмотрим поведение системы при использовании директивы «&НаСервереБезКонтекста».
Вроде бы результат достигнут – и с сервера, и с клиента доступно копирование. Но для того, чтобы получить копию данных, используемых на клиенте, приходится делать серверный вызов. А это опять ведет к лишней нагрузке на соединение и временным затратам.
Избавиться от излишней передачи на сервер при сохранении возможности копирования на клиенте и на сервере можно при помощи директивы «&НаКлиентеНаСервереБезКонтекста».
Не углубляясь в детали, отметим, что метод, описанный под данной директивой управления, создаётся в двух копиях – и на стороне клиента, и на стороне сервера. Это позволяет выполнить необходимые действия там, где появилась потребность в них (клиент/сервер), без лишних серверных вызовов.
С точки зрения выполнения программы результат будет одинаков. Но объяснение «почему так не надо делать» – это уже совершенно другая тема…
Вместо заключения
В данной статье мы на наглядных примерах рассмотрели влияние различных директив компиляции на такое явление системы «1С:Предприятие 8», как серверный вызов. Как видно, основная причина для выбора правильной директивы – производительность транспортировки данных между клиентской и серверной частью.
Придерживайтесь при разработке следующих правил:
- По возможности не передавайте контекст формы на сторону сервера
- Минимизируйте количество текущих серверных вызовов
- Длительные и ресурсоёмкие задачи запускайте на выполнение на стороне сервера (при возможности – в фоновом режиме).
Учитывайте потребность в доступности тех или иных видов данных, обоснованность передачи управления и не стесняйтесь при необходимости дробить процедуры и функции. И будет Вашему серверному вызову всегда легко, а Вы от пользователей Вашей программы получите «молчаливую благодарность»!
Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.
Пользователей, применяющих этот функционал, – 25 человек, и каждый из них за рабочий день в среднем совершает 110 таких операций. Всего впустую за рабочий месяц потрачено 28875 секунд (21 рабочий день * 25 человек * 110 операций * 0,5 секунды) = 8,02 часов.
Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?
Об авторе

PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте — http://vk.com/kursypo1c.
Если Вы еще не вступили в нее — сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.
[sociallocker id=»136011″]

Шикарно!
> Знает, какие клиентские сеансы в данный момент запущены, но самостоятельно не может инициировать взаимодействие с ними. Работает с клиентской частью только через полученный от неё серверный вызов.
Вроде как на последнем семинаре партнеров показывали будущую возможность платформы, когда сервер самостоятельно может инициировать взаимодействие с клиентом и показали демо-вариант бота.
Когда это случится, будет повод выпустить новую серию приключений :)
Очень хорошая и ПОЛЕЗНАЯ стаья
Добрый день!
Есть текущая проблема:
На форме следующие элементы: дерево значений и динамический список. При активизации строки в дереве значений, перерисовываются большая часть колонок динамического списка (происходит управление видимостью колонок).
Все тормозит, т.к. в обработке «ПриАктивизацииСтроки» не доступны процедуры &НаСервере, сейчас видимость управляется на клиенте (порядка 30 колонок).
Каждая строчка на клиенте Элементы.Список.Контрагент.Видимость = Ложь и пр. вызывает перерисовку формы. То есть в обработке на клиенте перерисовка, как я понял просходит после каждой строчки установки видимости.
Хорошо было бы один раз уйти на сервер, всю видимость там установить и вернуться с «Серверного вызова» на «Клиентский» с одной прорисовкой формы. Но, как я писал выше, процедура &НаСервере не доступна в обработчике «ПриАктивизацииСтроки», что посоветуете в этом случае?
P.S. Есть идея подключить «ОбработчикОжидания» в конце события «ПриАктивизацииСтроки» со временем к примеру 0,2 секунды и через него уже уйти на сервер, с последующим его выключением.
Denis_Denis, добрый день!
Если у Вас используется платформа версии 8.3.7.1759 или выше, то серверные вызовы связаны скорее всего не с перерисовкой формы, а с неявными серверными вызовами при изменении настроек динамического списка. Вообще, на мой взгляд, весьма странное решение — в зависимости от данных конкретной строки менять видимость колонок у всего списка. Складывается ощущение, что Ваше решение можно модернизировать и постараться вообще уйти от ненужных неявных серверных вызовов. Например, если видимость колонок отрабатывается для того, чтобы скрыть/отобразить вспомогательные данные конкретной строки, то можно вынести эти данные за пределы динамического списка и управлять их видимостью. Или использовать вместо динамического списка таблицу значений (но нужно понимать, что у таблицы значений свои особенности :)).
Набросал «на коленке» маленький пример с 3-мя вариантами: 1) изменение видимости колонок динамического списка; 2) вынос скрываемых колонок в самостоятельные реквизиты формы; 3) таблица значений. Во всех случаях смотрите текущие и накопленные серверные вызовы.
Ссылка на скачивание примера: https://drive.google.com/open?id=0B3myabD_PtnzWUVTamlaUVdWU3c
Pahich, добрый день!
Спасибо за ответ, не могли бы вы выгрузить ещё раз базу, но поставить режим совместимости 8.3.8 в настройках.
А то на работе текущая версия платформы 8.3.8.
База не открывается, пишет необходима платформа 8.3.9.
Спасибо.
Denis_Denis, Конечно! Ловите: https://drive.google.com/file/d/0B3myabD_PtnzSDZZSldhVS0xSkk/view?usp=sharing
Забыл написать про обработчик ожидания. Он срабатывает только тогда, когда наступит «состояние покоя» программы :) Не факт, что это состояние наступит в нужный момент :)
Поэтому, такой вариант лучше не рассматривать для решения подобного вопроса.
А можно немного поподробнее об этом, ни разу об этом не слышал.
Смоделируем случай:
1. Подключим «ОбработчикиОжидания» при открытии формы, на 3 секунды:
ПодключитьОбработчикОжидания(«ПроверкаТест», 3);
2. В событии «ПриИзменении» реквизита формы, поставим паузу в 20 секунд.
Результат должен быть, следующий:
Пока форма не закончит выполнение события «ПриИзменении», обработчик ожидания не сработает.
Верно я понимаю?
Denis_Denis, думаю, что Вы с лёгкостью смоделируете этот случай самостоятельно :)
Что имелось в виду под подобным описанием метода «ПодключитьОбработчикОжидания», я Вам прямо сейчас не готов сказать.
Но то, что обработчик управления видимостью элементов Вашей формы будет «оторван» от действий пользователя и привязан к особенностям поведения платформы — это кажется не очень правильным.
Спасибо.
Вечером, дома, попробую, затем обязательно отпишусь о результатах.
Все попробовал. Все верно.
Если программа ушла в долгие расчеты, то обработчик ожидания ждет, пока программа вернется в состояние покоя или бездействия.
Denis_Denis, Отлично! :)
Какая прелесть! Статья очень понравилась. При такой подаче шансов что-то не понять ну просто нет:) Сразу включается ассоциативное мышление. Картинки замечательные получились. Даже захотелось продолжения сериала.
Добрый день.
К чему оживление статей последнее время? готовится какой-то курс?
Добрый день!
Курсы готовятся непрерывно, но они никак не связаны с выпускаемыми статьями.
Как обычно мы проводим эксперименты, смотрим на реакцию и понимаем — в ту ли сторону движемся, или нужна корректировка :)
Здравствуйте, Евгений!
К сожалению, на сайте нету прямого канала на Вас, поэтому задам вопрос здесь.
Недавно было мероприятие Infostart event 2016, там Олег Филиппов рассказывал доклад на тему «Применение нейронных сетей и генетических алгоритмов в прикладных решениях на платформе 1С».
С учётом, что искусственный интеллект на 1с на сегодняшний день никак не развит, было бы очень круто, если бы у Вас появилась бы какая нибудь аналогичная статья, где можно было бы на простом примере на 1С выполнить задачку по данной теме.
У нас на заводе есть задачка «Автозаказы товаров на торговые точки», я пробовал изучить тему «нейронных сетей» самостоятельно, но не получилось, слишком уж заумно написано в научных книгах :( На данный момент, пришлось решить задачку алгоритмическим путём :(
Очень надеюсь, что у Вас может быть, что-то будет на эту тему…
Добрый день, Дмитрий!
Тема интересная, запишу в список планируемых статей.
Прямо сейчас нет автора на эту тему, но возможно найдем :)
Было бы интересно увидеть таблицу сравнения количества передаваемой информации между клиентом, сервером 1С и сервером СУБД при использовании разных директив вызова. Это поможет правильно и экономно проектировать систему 1С и распределять нагрузку на физические серверы на практике.
Количеством информации мерить директивы не правильно. Так как одна и та же процедура может отрабатываться по-разному (в комментариях ниже это упоминалось). А одна и та же процедура в разных формах будет работать совершенно с разными наборами данных.
В платформе есть встроенный инструмент — замер производительности. При помощи него можно собрать статистику, которая поможет сделать правильный выбор директивы.
Но это уже выходит за рамки данной статьи. :)
Статья дает просто разъяснение по вызовам и это ее плюс. Но в заключении показан не верный расчет экономии времени человеческих ресурсов на по казаном в нем же примере. Такими не корректными примерами обычно многие франчайзи показывают расчет выгоды от внедрения. Делают это либо по своему незнанию или же преднамерено вводят в заблуждение, чтобы повысить свою оценку перед клиентом.
А сама статья по теме отлична.
Mike-Gv, я буду благодарен, если Вы более подробно раскроете свое видение расчета экономии времени. Вы меня очень заинтересовали!
А так… Статья о серверных вызовах, а вовсе не о расчете зависимостей эффективности сотрудников предприятия от скорости работы программно-аппаратного комплекса :)
Статья очень понравилась.
Правильные картинки передают больше информации, чем страницы текста.
Супер!
Супер!
красиво…… картинки…… :-))))
Добрый день.
Замечательная статья, замечательный уровень абстракции.
Было бы здорово узнать как происходит серверный вызов из клиента на более низком уровне и какими инструментами это можно посмотреть.
Создает ли сервер web-сервис с набором функций для клиента или же это реализовано как-то по другому? Как представлены процедуры и функции, написанные разработчиком?
Как сериализуются данные между клиентом и сервером, при помощи XML или своим протоколом?
Roman78RUS, спасибо за отзыв!
К сожалению, в рамках одной статьи весь озвученный Вами материал описать невозможно. Вы можете пояснить — для каких целей такие глубокие знания Вам необходимы? Думаю, что это может повлиять на выбор тем для последующих материалов.
Добрый день, Павел.
Разработкой на 1С занялся недавно, до этого программировал на С#. Пока изучаю платформу и одно из интересных для меня мест — клиент-серверное взаимодействие.
Понравился новый формат подачи материала. Спасибо Павел! Такую статью, да лет ..ть назад.
Прэлестно, просто прэлестно. Материал отличный, все доступно, понятно, с картинками )))).
Просто — «Вау!».
С большим удовольствием прочитал.
Спасибо.
Помню эта тема разбиралась лет 8 назад. Евгений Гилев тогда объяснял на примере космического корабля и космонавта которому надо доставить чашечку кофе, что сажать ради этого корабль директивой &НаСервере не целесообразно.
Спасибо за отличную статью!;)
С одной стороны подача в виде комикса кажется простой, особенно если ты понимаешь тему, с другой стороны, на таких комиксах формируется визуальная память и при написании кода это может помочь.
Нажатие на кнопку «Подписаться» не дает никакого результата. Очистка кэша и другой браузер не решают проблему. Хочу получить статью в pdf формате.
Александр, мы проверили — замок работает.
Нажмите «Подписаться» и далее авторизуйтесь под Вашим профилем ВКонтакте. После этого скрипт Вас узнает.
Отправьте, пожалуйста, скриншот страницы на support@kursy-po-1c.ru
Спасибо за статью!
Было бы неплохо дополнительно рассказать про: &НаСервереНаКлиенте(Хотя бы о ее наличии).
А так же что не все безконтекстные вызовы полезны, и бывает так что безконтекстный обходится в 2 раза дророже из за:
а. Платформа может делать не явные контекстные вызовы. Пример: УстановкаОтбораДинСписка в безконтекстной процедуре после возвращения на клиент выполнит контекстный вызов сервера.
б. Из за оптимизаций контекстного вызова в результате на сервер могут передаваться не все данные формы а только дельта, и если передается большой массив данных который не изменялся в случае безконтекстного он будет передан полностью а в случае контекстного только дельта. Пример: Табличный документ.
Ну и про встроенный счетчик вызовов(и трафика), отображение серверных вызовов в замере производительности, было бы интересно подробнее с примерами.
В текущем виде статья ну прям для совсем начинающих, т.к. это самые базовые понятия.
Но статья безусловно отличная особенно в качестве «введения»
vvi3ard, Вы правы — есть директива «&НаКлиентеНаСервере». Она доступна в модуле команды и по сути равна директиве «&НаКлиентеНаСервереБезКонтекста», так как в командах отсутствует контекст формы. Так что любой читатель, столкнувшись с потребностью использовать директиву «&НаКлиентеНаСервере», без труда разберется в её особенностях.
Да и в статье указано, что рассматриваются директивы, доступные в модуле формы.
По поводу неявных контекстных вызовов — безусловно их влияние очень важно. Желательно их знать и принимать во внимание. Но нужно учитывать и тот факт, что разработчики платформы работают над улучшением механизмов. И никакие недокументированные возможности не должны влиять на архитектуру приложений.
Спасибо большое, что Вы прочитали статью и я очень рад, что она Вам понравилась!
и вам спасибо, очень ждём статью про показатели производительности, потому как не понятно что за цифры там бегают…
Картинки класс! очень доходчиво! Спасибо!
Большое спасибо! Иллюстрации и в целом материал очень понравились :))
Большое спасибо! Все объяснено отлично.
Все отлично, только «копировальный аппарат» будет более уместен, чем «ксерокс».
Для копирования у нас есть ксерокс Источник: ©Курсы-по-1С.рф
Простите, но не КСЕРОКС. а копировальный аппарат.
Это было сделано намеренно.
Некоторую «живость» персонажам придать просто необходимо :)
Михаил наверное и «ноутбук» не произносит. Только «лэптоп», только хардкор!
Автор бесспорно потрудился на славу. Ему за это спасибо! Но вам не кажется что материал походит на содержимое букваря, а при этом аудитория давно памперсы не носит? :)
Очень надеюсь что такой подход не будет использован при подаче курсов, материал «к прочтению» сильно раздувается, хотя и весело. Но мы же здесь не за этим?
Для Вас мы подготовили статью другого уровня:
http://курсы-по-1с.рф/news/2017-03-09-how-attribute-lock-to-change-works/
Была надежда, что после прочтения введения, будет понятно, для кого предназначена текущая статья.
Не согласен. Для начинающих — самое то! И что значит МЫ ? Ну Вы супер, а я нет. Материал для тех кто не знает. Вы знаете — не читайте.
Спасибо! хотелось бы еще увидеть нюансы или отличия
&НаКлиенте
Процедура КомандаПервая()
ОбыкновенныйВызов()
КонецПроцедуры
&НаСервере
Процедура ОбыкновенныйВызов()
// код
КонецПроцедуры
от
&НаКлиенте
Процедура КомандаВторая()
НеобыкновенныйВызов(ЭтаФорма)
КонецПроцедуры
&НаСервереБезКонтекста
Процедура НеобыкновенныйВызов(ФормаСправочника)
// код
КонецПроцедуры
сори, забыл скобки кода как вставлять
«Ошибка при вызове метода контекста (НеобыкновенныйВызов)
НеобыкновенныйВызов(ЭтаФорма)
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.»
В данном случае накладываются ограничения не на уровне директив, а на уровне передачи данных между клиентом и сервером. У управляемой формы отсутствует возможность сериализации. Поэтому ошибка будет возникать при попытке передать форму в качестве параметра через соединение между клиентом и сервером. В других случаях передача формы в качестве параметра возможна.
Да например вполне можно передать форму из контекстного в безконтекстный вызов.
можно, в рамках сервера
извиняюсь, поторопился … писал код без конфигуратор
Отличия в том что на сервер передаётся не «форма» а «ДанныеФормыСтруктура» :-)
Очень полезная и занимательная статья! Виден труд автора и эффект.
Понравилась статья!Понравились иллюстрации! Спасибо!
Чисто для деревянных , все понятно , везде бы с начала так объясняли и может быть проблем бы у людей меньше было.
Куда Лайк тыкнуть? :)
Дмитрий, такая функция на сайте планируется.
Хорошая статья, доступное изложение, очень понравилась (особенно иллюстрации)!
можно здесь вопрос задать не совсем по теме:
-У вас (Курсы1сПоРФ) не планируется всеохватывающая статься или видеокурс на тему работы с расширениями. Когда лучше использовать расширения, а когда изменять конфигурацию…?
Да, планируем выпустить курс по приемам доработки типовых (включая расширения). Работы в этом направлении уже начались :)
Очень наглядно и просто. СПАСИБО!
1) Можите объяснить почему в типовых конфигурациях в частности в УТ 11, очень много процедур в общих модулях состоящих из одной строчки кода, которые просто перекидивают в другую процедуру, которая опять перекидывает в процедуру из одной строчки кода в другом модуле и т.д. Это как-то связано с серверными вызовами или разработчикам типовых теперь платят зарплату за количество созданных процедур? Код стал не читаемый, после 15 процедуры, в отладке голова пухнет.
2) Почему регулярно в типовых конфигурациях в обновлениях, меняются Имена реквизитов и Объектов, в результате летят все доработки, внешние печ. формы, отчеты, обмены, и эта круговерть бесконечна. В Фирме 1С действительно считают, что у нас в стране другой работы нет, как бесконечно переименовывать программный код, в авральном режиме, у тысяч клиентов? Посчитайте сколько человеко дней-месяцев-лет уходит на это. Почему нельзя менять Синонимы, ведь они для этого и сделаны.
Больная тема, внедрять типовые нет никакого желания.
1) Разработчики типовых пытаются так добиться возможности более гибкой адаптации типовых конфигураций при внедрении на местах. Код может перебрасываться через несколько методов, находящихся в разных общих модулях с постфиксом «…Переопределяемый». Есть еще ряд причин, но это — одна из основных.
Очень много таких случаев в типовых конфигурациях относятся к БСП. За счет этого БСП получается гибкая и настраиваемая, хотя и медленная. С тем, что голова от этого пухнет при поиске сложных ошибок согласен.
Добро пожаловать в попытку реализовать полиморфизм и инкапсуляцию путем применения процедурного подхода )) Почитайте про шаблоны ООП «Прокси» и «Декоратор». То, что мы видим сегодня в типовых конфигурациях — это как раз попытка 1С их применить не имея подходящего инструмента.
2) Плохие архитекторы и приоритет скорости выпуска новых непродуманных функций над надежностью и обратной совместимостью.
Между прочим это «мы с вами» идем работать в 1С над типовыми. Фирма 1С ищет сотрудников там же, где и другие работодатели. Хотим большей надежности и обратной совместимости — надо начать с себя. Еще не разу не встречал на предприятиях программистов 1С которые действительно бы с этим заморачивались )) Хотя слышал, что такие существуют ))
Опередили меня, полностью согласен! )
Алексей, я не работал никогда в фирме 1С и не знаю их системы оплаты труда :) Поэтому могу только высказать свои предположения:
1) Естественно, в первую очередь накладываются нюансы 3-х звенной архитектуры и директив. Так, в общих модулях не рекомендуется использовать директивы компиляции. Правильнее будет указать место компиляции в свойствах модуля. А это уже может влечь за собой разделение одной процедуры на две, да еще в разных модулях (одну на клиенте, другую — на сервере). Дальше идут наложения стандартов разработки. Если предполагается, что данный учаток кода может быть изменен в ходе внедрения, то создаются аналогичные процедуры (как правило пустые) в модулях с именем «переопределяемый». Еще на это все влияют и участки кода от предыдущих версий конфигурации, оставленные для сохранения совместимости. К сожалению, это все негативно сказывается на отладке и доработке библиотечных конфигураций.
2) Скорее всего не просто меняются имена реквизитов, а появляются новые взамен старых с новыми именами. Старые временно помечаются как «Удалить» для дальнейшего исключения из конфигурации. Думаю, что это связано с тем, что требуется не просто изменить имя реквизита, но и произвести некоторую обработку накопленных данных перед помещением в новые места хранения. Поэтому, изменения синонимов недостаточно. Сомневаюсь, что разработчикам «по-приколу» выпускать релизы только для изменения представления объекта в пользовательском режиме.
Подводя итог, я разделяю Ваше огорчение и сам какое-то время назад размышлял так-же. Но переосмыслив понял, что будущее за стандартами, библиотеками и синтезом. И для того, чтобы «быть на коне» уже недостаточно просто уметь хорошо разбираться в программном коде.
Очень крутой подход к написанию статьи! :)
Если после статьи захотелось залезть в свою нетленку и переделать ее — это полезная статья. Вот после этой — уже запустил конфигуратор)
Очень полезная и понятная статья, спасибо большое!
Спасибо!
Отличная статья. Всё просто и понятно
Интересная и доступная для понимания информация.
Очень круто!) Где тут кнопка «Like» и «Share» ?)
Вадим, такая функция планируется.
Иллюстрации просто супер.
Спасибо, Павел! Теперь, надеюсь, в голове лучше уложатся отличия директив. Пример с библиотекой и протекающими в ней процессами очень удачный и наглядный.
Павел, Шикарная статья! Мне понравились картинки! Отправлю супруге!:-)
Отличная подача материала!
Автор здоров? Кажется ему совсем плохо — тут же не детский сад.
Жив и здоров :)
Если есть что сказать по существу — пишите, а иначе все эти слова — пустое.
Какой молодец, Павел! Виден профессионализм, ассоциативное мышление, системный подход. Хвала такому человеку!
Фарит, видимо, как и говорил на конференции Инфостарт решил перейти на комиксы )))
Клевый стиль подачи материала и оформления, как и сам материал :)