Под капотом управляемых форм
Разработка - Механизмы платформы 1С
Введение
Данная статья ориентирована на разработчиков, которые волею судеб не успели плотно поработать с управляемыми формами. Если вы уже хорошо знаете, как работают УФ и вообще управляемый интерфейс приложения, то можете статью не читать, поскольку, вряд ли узнаете много нового.
Немного истории
Исторически сложилось, что клиентское приложение 1С всегда было реализовано в виде так называемого «толстого» клиента – программы, которая сама все делает в плане обработки данных. Это создавало заметную нагрузку на сеть, а кроме того, требовало наличия мощных клиентских машин.
Толстый клиент имеет и свои преимущества, поскольку прост, понятен и часто не требует дополнительных архитектурных звеньев в виде сервера приложений.
Версия 8.0 принесла нам трехзвенную архитектуру, в которой появился «сервер 1С:Предприятия» – отдельный программный компонент, который мог выполнять код бизнес-логики на специально выделенной мощной машине (сервере), тем самым, снизив объем данных, гуляющих по сети и требования к аппаратной части клиентских машин.
И все бы ничего, но до версии 8.2 и появления управляемого приложения реализация серверного кода была совсем необязательной частью. Существовал ряд проблем, объективных и субъективных, которые мешали использовать сервер для обработки бизнес-логики. Код на сервере выполнялся, но в очень редких случаях, когда его специально, не без помощи костылей, заставляли там выполняться.
В основном, все оставалось по-старому, и клиентское приложение так и оставалось «толстым» клиентом, гоняющим сотни мегабайт по сети.
Версия 8.2 кардинально сломала устоявшийся подход к работе приложения и заставила по-новому взглянуть на архитектуру приложения. Об этом новом подходе и пойдет речь в данной статье.
Волшебный зверь Клиент-сервер
С выходом версии 8.0 все учебные курсы, книжки, статьи на ИТС и прочее, и прочее, все в один голос твердили нам – «обработка данных должна идти на сервере», «все нужно выполнять на сервере». Волшебное заклинание «на сервере» плотно забило мозг, так сильно, что на него уже никто внимания не обращал, как на информационный шум.
Опыт показывает, что рядовой программист практически никогда не знал, как нужно перенести код на сервер и что это вообще значит – «на сервер». Удивительно часто встречался код, который переносился «на сервер», но был написан с явным непониманием того, что это в итоге принесет.
На самом деле, все просто. Фраза «выполнить на сервере», означает, что ваш код будет выполнен на физически другой машине. Совсем на другом компьютере (который может располагаться на другом континенте), со всеми вытекающими эффектами. Там будет другая структура каталогов, другие права доступа и даже другая операционная система.
Однако многие уже опытные разработчики запросто писали такой код:
- - Выбирается локальный файл
- - Его путь передается на сервер
- - Там по этому пути файл пытается открыться и падает с ошибкой «Файл не найден» (еще бы, он же остался на клиенте).
Переход на сервер
До версии 8.2 перенести исполнение кода на сервер можно было только одним способом – а именно, вызовом общего модуля с флагом «Сервер». Причем, только с этим флагом. Если помимо флага «сервер» поставить «клиент», то перехода не произойдет. По этому поводу на Инфостарте не так давно была неплохая статья про флажки в свойствах общих модулей (к сожалению, не могу найти ссылку, подскажете?).
Суть всех флагов модуля сводится к простым правилам:
- Флаг показывает, где будет скомпилирован код модуля (на клиенте, на сервере, во внешнем соединении)
- Если модуль скомпилирован в нескольких местах, то он будет виден только в соответствии с флагами. Клиентский – на клиенте, серверный на сервере. Переноса исполнения с машины на машину не будет.
- Перенос исполнения кода возможен только если в текущем контексте исполнения нет вызываемого модуля, но он есть в другом месте (если – модуль есть только на сервере, а на клиенте его нет, то будет сделан вызов сервера)
Флаг «Вызов сервера»
В версии 8.2 добавился флаг «вызов сервера», который помогает разрулить условия перехода на другую машину. Если модулю назначить этот флаг, то модуль будет виден с клиента, если нет – то попытка вызова с клиента приведет к ошибке. Код модуля виден не будет, как будто его нет совсем.
Таким образом, в обычном толстом клиенте перенести код на сервер можно, только если с клиента вызвать общий модуль, для которого:
- Установлен флажок «Сервер»
- Установлен флажок «Вызов сервера»
- Сняты все «клиентские» флажки
Особенности перехода на сервер
Платформа заботится о том, чтобы переход исполнения кода на другую машину был как можно более незаметным. Мы вызываем функции серверного кода, передаем туда параметры, получаем возвращаемые значения, получаем изменения параметров, передаваемых по ссылке. Все выглядит так, как будто никакого сервера нет. Однако, это не так.
При любом вызове серверного кода всегда происходит сериализация передаваемых данных. Все параметры упаковываются в строковый вид и передаются по сети. Результат работы также передается назад в сериализованном виде, где потом восстанавливается в привычные объекты.
Это объясняет, почему не все объекты можно передавать на сервер. Это все потому, что не все они поддерживают сериализацию (превращение в строку и обратно). На сервер нельзя передать, например, «ДокументОбъект», т.к. у него в модуле объекта могут быть глобальные переменные, а в них записаны какие-нибудь сложные несериализуемые значения, вроде COM-объектов… Короче, ограничения по обмену с сервером понятны и обоснованны. Нужно следить за тем, что мы передаем на сервер и что возвращаем назад.
Ну и, разумеется, на сервере недоступны некоторые интерфейсные вещи, вроде открытия форм. Открытые на сервере формы просто будет некому увидеть, некому тыкнуть в них мышкой, поскольку, пользователь остался сидеть у другого компьютера.
Мне кажется, что простота реализации серверного вызова сыграла с платформой 1С злую шутку. Серверный вызов настолько прозрачен, что его сложно заметить, сложно осознать, что вот здесь, с этого момента, мы находимся на совсем другом компьютере. В результате и получается такой код, о котором я написал выше.
Отсутствие контекста (состояния) на сервере
Существует такая модель серверных приложений, когда сервер только отвечает на запросы, но ничего не сохраняет у себя в промежутке между двумя запросами. Эта модель называется моделью «без состояния» (англ. state-less).
Все HTTP-серверы современного интернета работают именно так. Клиенты посылают запросы, сервер выдает ответ и забывает все, что получал от клиента. Разумеется, есть вариации, но общая модель именно такая: сервер отрабатывает запрос и очищает все данные.
Сервер 1С работает по такому же принципу. В общем случае, в памяти сервера нельзя сохранить промежуточные данные между вызовами. Нельзя определить переменную, которая будет хранить данные между двумя вызовами.
Есть специальные объекты, в которых можно хранить очень незначительную часть данных – так называемые «параметры сеанса», но это именно специально выделенное место для хранения состояния. Каждый серверный вызов выполняет некоторую работу, возвращает результат и забывает все свои данные. В управляемом режиме про это всегда необходимо помнить.
Управляемое приложение
С выходом управляемого приложения фирма «1С» поступила с клиент-серверным взаимодействием, на мой взгляд, совершенно правильно. Она не стала его прятать, наоборот, она заставила всех видеть его, тыкнула всех носом: «смотрите, тут вы пишете код для физически разных машин, думайте, что делаете».
Новый подход к взаимодействию клиента и сервера позволил создать новую модель пользовательского интерфейса. Теперь интерфейс декларируется, проектирование интерфейса начинается с данных, с реквизитов и табличных частей. Создавая реквизит, вы обязаны думать, как он будет выглядеть в интерфейсе, будет ли он обязательным, как связан с другими реквизитами и т.п.
Управляемые формы – это замечательный шаг вперед по сравнению со старым подходом. Все кто поработал с УФ более-менее плотно не хотят возвращаться назад, как в страшный кошмар. Управляемые формы позволили реализовать интерфейс в виде веб-страницы, причем разработчик практически не обязан думать о том, что пишет сайт. Один и тот же код работает и в браузере, и в родном клиенте. Как по мне, так это очень круто.
Тонкий клиент
Клиентское приложение максимально облегчили, оно больше не может выполнять запросы к базе данных, а значит, не требует огромных сетевых ресурсов. Оно может быть просто браузером, в конце-концов. Клиентское окно просто показывает нам картинку интерфейса, вся сложная обработка теперь обязана выполняться на сервере.
Такое облегчение не далось бесплатно. Очень многие привычные операции стали выполняться сложнее. Упомянутая выше сериализация никуда, разумеется, не делась, а данные, которые нельзя было передавать на сервер, так и нельзя туда передавать.
Все это привело к особенностям, с которыми мы сталкиваемся при разработке управляемых форм. Ключевая особенность, в общем-то, всего одна – форма полностью отделена от данных объекта.
Чтение данных из ИБ в форму и запись из формы в ИБ выполняется практически явно, этот момент можно отловить в событиях формы.
Тонкий клиент стал поистине «клиентом». Он больше не обрабатывает данные, он их показывает и позволяет редактировать. Всю обработку мы теперь явно переносим на сервер.
Устройство управляемой формы
Давайте рассмотрим, из каких частей состоит управляемая форма.

Самая важная часть в управляемой форме, это ее реквизиты. Те, синенькие, что расположены в панели справа вверху. Это, собственно, данные формы, ее основа. Только то, что указано в реквизитах можно разместить на форме.
В панели слева размещены элементы формы. Это кнопки, поля ввода, таблицы и т.п. Основное их отличие от обычных форм в том, что они обязательно связаны с каким-либо реквизитом формы. Отдельно висящий элемент на форму поместить нельзя, он обязательно должен быть связан с данными.
Данные формы
Есть старая уже хохма про ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокументИмениНуралиеваБорисаГеоргиевича.
Управляемая форма добавляет очередного претендента на звание длинного и непонятного идентификатора: ДанныеФормыСтруктураСКоллекцией и еще ряд новых классов с именами вида «ДанныеФормы….что-то там». Давайте попробуем выяснить, что это за новые объекты.
Как уже говорилось выше, сервер предприятия не сохраняет свое состояние между двумя вызовами. Когда мы обратимся к серверу, он что-то выполнит для нас и тут же очистит все данные, созданные во время вызова. Объекты с именами «ДанныеФормы…» это как раз то место, в котором мы можем сохранять свои данные между двумя серверными вызовами. На сервере нельзя создать глобальную переменную уровня формы. Такой глобальной переменной должен быть реквизит в данных формы.
Обратите внимание, что классы данных формы любопытно называются «ДанныеФормыСтруктура» или «ДанныеФормыКоллекция». Это вообще, как мне кажется, неспроста. Эти объекты – это просто немного модифицированная стандартная Структура (или ТаблицаЗначений, соответственно).
Здесь стоит немного вспомнить обычные формы. Ведь как мы привыкли – В форме справочника достаточно присвоить переменной «Наименование» какой-то текст и этот текст попадет в СправочникОбъект, а оттуда – в информационную базу.
У управляемой форме все почти так, за исключением того, что все совсем не так :).Платформа предпринимает массу усилий, чтобы в повседневной работе программиста ему не приходилось с этим заморачиваться. Как правило, мы, как и раньше, присваиваем свойства реквизитам формы, а они попадают в СправочникОбъект, а оттуда – в ИБ.
Разница заключается в том, что теперь на клиенте не существует «СправочникОбъект». Как я уже говорил, это сложный объект, он не сериализуется, а значит, его нельзя передавать с клиента на сервер. Вместо «Объекта» на клиенте существует его упрощенный аналог – хранилище данных – объект ДанныеФормы.
Это, по сути, просто структура, у которой свойства совпадают со свойством объекта. При всей «похожести», это совсем разные объекты. Причем, не просто концептуально, это различие явное, его можно «пощупать» из кода и с этим различием приходится работать в явном виде.
Адресация данных формы
Данные формы доступны непосредственно в коде по тем именам, как они расположены в дереве реквизитов формы (в окне редактора)
Реквизиты верхнего уровня доступны сразу. Вложенные реквизиты доступны через точку. Раньше в обычной форме мы обращались к данным объекта напрямую. Мы писали «Наименование = «АААААА» и данные попадали в объект. Теперь надо писать «Объект.Наименование = «ААААА», потому, что реквизит «Наименование» вложен внутрь реквизита «Объект».
Обмен формы с сервером
Основным «двигателем» всех аспектов управляемой формы является то, что у нас state-less сервер. На нем не сохраняется ничего, никаких промежуточных данных. Всё состояние формы (текст в полях ввода, строки табличных частей и т.п.) хранится на клиенте. Вся совокупность данных формы называется контекстом формы.
Весь клиент-серверный обмен выполняется через сериализацию данных, а это, в свою очередь накладывает ограничения на те типы данных, которые можно передавать на сервер и обратно. Объект ДанныеФормыСтруктура и его «родственники» является этаким «хранилищем», которое гуляет с клиента на сервер и обратно. Только то, что хранится в данных формы, может сохраняться в промежутках между серверными вызовами.
Жизненный цикл формы объекта
Давайте рассмотрим, что происходит, когда мы открываем форму существующего элемента справочника.
- На клиенте вызывается метод «ОткрытьФорму» или мы просто открываем форму из какого-либо списка справочника. Начинается серверный вызов
- В памяти сервера создается новый СправочникОбъект, выполняется код модуля объекта (тот, что написан в самом низу модуля)
- Данные объекта считываются из базы данных, присваиваются значения реквизитов, наполняются табличные части объекта СправочникОбъект.
- В памяти сервера создается новая управляемая форма элемента
- Вызывается событие формы ПриЧтенииНаСервере, куда передается свежесозданный СправочникОбъект в параметре ТекущийОбъект
- Основной реквизит формы «Объект», тот, что в списке реквизитов выделен жирным шрифтом наполняется данными на основании данных СправочникОбъект. Здесь происходит обычное поэлементное присваивание свойствам объекта ДанныеФормы значений, записанных в одноименных свойствах объекта СправочникОбъект. По сути, происходит «ЗаполнитьЗначенияСвойств(ДанныеФормы, СправочникОбъект)
- СправочникОбъект уничтожается. Все его данные стираются из памяти сервера.
- Вызывается событие формы «ПриСозданииНаСервере», в котором мы получаем уже заполненные ДанныеФормы
- Данные формы сериализуются и отправляются на клиента, где форма отображается пользователю
Обратите внимание, что СправочникОбъект, к которому мы так привыкли в обычном приложении, уничтожился. Если в модуле объекта были какие-либо глобальные переменные, экспортные или не экспортные, все они стали потеряны.
Сохранить что-либо в данных объекта больше нельзя, все сохранение состояния должно выполняться в ДанныхФормы.
Теперь, давайте рассмотрим процесс записи данных справочника:
- Пользователь нажимает кнопку «Записать»
- Выполняется обработчик формы «ПередЗаписью» (на клиенте)
- Происходит серверный вызов
- В памяти сервера создается новый СправочникОбъект, он наполняется данными на основании данных текущей формы (что-то вроде ЗаполнитьЗначенияСвойств, но в обратном направлении – пишется из формы в объект)
- Вызывается обработчик события формы «ПередЗаписьюНаСервере», куда передается свежесозданный СправочникОбъект. С этого момента, если мы хотим что-то записать в базу данных, то менять нужно именно СправочникОбъект. Изменения данных формы не отразятся в записываемом объекте.
- Вызывается обработчик «ПередЗаписью» самого СправочникОбъект (в модуле объекта)
- Вызывается обработчик «ПриЗаписи» самого СправочникОбъект (в модуле объекта)
- Вызывается обработчик события формы «ПриЗаписиНаСервере», транзакция записи еще не завершена и можно отменить запись
- Вызывается обработчик события формы «ПослеЗаписиНаСервере», транзакция записи уже завершена
- СправочникОбъект уничтожается
- Выполняется возврат на клиента, где вызывается обработчик события формы «ПослеЗаписи»
Обратите внимание, серверное состояние восстанавливается с нуля, каждый раз создается новый СправочникОбъект. В промежутках между вызовами сервера он не сохраняется.
Конвертация данных формы
Для упрощения жизни существуют простые способы преобразования универсальных объектов «ДанныеФормы….» в привычные прикладные объекты и наоборот.
Так, например, можно получить наполненный данными СправочникОбъект на основании данных формы, если вызвать метод «РеквизитФормыВЗначение(«Объект»). При этом произойдет то, что описано выше – будет создан новый СправочникОбъект и наполнен данными из указанного реквизита данных формы.
Обратное преобразование выполняется методом «ЗначениеВРеквизитФормы». Если мы произвели какие-то действия с данными СправочникОбъект, например, очистили табличную часть, то мы должны поместить наши изменения обратно в форму, иначе будет что?
Правильно, измененный СправочникОбъект будет уничтожен при возврате на клиента, а данные формы останутся неизменными. Цикл записи объекта будет построен на старых данных формы, а стало быть, изменение табличной части просто пропадет.
Не все так плохо ;)
Все эти сложности с преобразованием данных полезно знать, однако, они совсем не обязательны. Платформа прекрасно справляется с ними сама. В большинстве случаев достаточно никогда не вспоминать про СправочникОбъект, а работать непосредственно с данными формы. Грязную работу платформа сделает сама.
Команды формы
Про команды формы много говорить не получится, это довольно простая вещь. Команда олицетворяет некоторое действие, которое может запустить пользователь. Подобно тому, как поля ввода и флажки привязываются к реквизитам формы, кнопки и гиперссылки привязываются к командам. Каждая кнопка обязательно ссылается на какую-либо команду.
У команды есть обработчик, в этом и заключается главное отличие от кнопок в обычных формах. В управляемой форме у кнопки нет обработчиков событий. Кнопки лишь запускают исполнение команды.
Каждая команда может быть размещена в командной панели, подменю, или на самой форме. Создаются команды на закладке «Команды» в редакторе формы.
Параметры формы
Параметры, это специальные переменные, которые можно передать в форму в момент ее открытия. Параметры задаются на закладке «Параметры» редактора формы и о них речь пойдет чуть ниже.
Управление открытием формы
Отображение форм на экране в управляемом режиме также претерпело некоторые изменения. Прежде всего, формы получили имена, по которым к ним можно обращаться. Например, форма списка справочника «Контрагенты» будет называться «Справочник.Контрагенты1.ФормаСписка».
Методика открытия формы теперь такова: форма должна открываться одной строчкой кода и одним вызовом сервера. Эту задачу на себя берет глобальный метод «ОткрытьФорму». В данный метод мы должны передать имя формы (см. выше), параметры формы, владельца и ключ уникальности. Все параметры, кроме имени являются необязательными.
Поскольку открытие формы это интерактивная операция, то осуществляться она может только на клиенте. Однако, создание формы, как мы видели из ее жизненного цикла, происходит на сервере. Возникает резонный вопрос, а как открыть форму одной строчкой кода, если нужно каким-то образом параметризовать ее создание, передать ей что-то, чтобы она знала, как именно ей нужно создаваться?
Для этого и нужны Параметры формы. Это структура, которую можно передать в метод «ОткрытьФорму». Переданные параметры можно проанализировать в серверном коде формы и предпринять какие-то действия на основании переданных параметров.
Простой пример, открытие формы списка с отбором. Для того, чтобы список справочника открылся с отбором по определенному условию нужно открыть форму списка и передать ей параметр с именем «Отбор», значением которого будет структура с полями отбора и значениями отбора.
УсловияОтбора = Новый Структура;
УсловияОтбора.Вставить("ТипКонтрагента", "Поставщик");
УсловияОтбора.Вставить("Лояльность", "Надежный");
ПараметрыФормы = Новый Структура ("Отбор", УсловияОтбора);
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы);
Существуют системные параметры, на которые реагирует сама платформа. Упомянутый параметр «Отбор» как раз является системным, если он передан форме списка, то платформа сама установит отбор на список.
Кроме того, параметры можно создавать произвольные, в редакторе формы. Более того, параметры можно передавать даже с теми именами, которые не объявлены в форме, они все равно будут видны в серверном коде формы.
Жизненный цикл параметров
Все параметры, переданные в форму в момент ее открытия видны только в процедуре «ПриСозданииНаСервере». После создания все параметры уничтожаются и более не доступны в форме.
Исключение составляют параметры, которые в редакторе формы объявлены с признаком «Ключевой параметр». Такой параметр будет существовать до тех пор, пока существует сама форма.
Процедура ПриСозданииНаСервере(Отказ)
Если Параметры.ЗапуститьЯдерныйРеакторПриОткрытии Тогда
УправлениеРеактором.Запустить();
КонецЕсли;
КонецПроцедуры
Ключевые параметры определяют уникальность окна. В обычных формах был такой атрибут «Ключ уникальности». Если запрашивалась форма, то она сначала искалась в уже открытых. Ключ уникальности позволял варьировать условия при которых создавалась новая форма или возвращалась существующая. Ту же самую роль играют ключевые параметры. Если метод «ОткрытьФорму» вызван два раза подряд с одним и тем же значением ключевого параметра, то второй вызов не откроет новое окно, а активирует существующее.
Модуль формы
Управляемый интерфейс добавил несколько интересных вещей в модуль формы. Все эти вещи обеспечивают программирование клиент-серверного взаимодействия в явном виде. Я имею в виду директивы компиляции.
Справедливости ради стоит отметить, что они доступны не только в модулях форм, но, как правило, используются только там. Директива компиляции это строчка вида &НаКлиенте перед объявлением процедуры.
Для модуля форм возможны следующие директивы:
- &НаКлиенте
- &НаСервере
- &НаСервереБезКонтекста
- &НаКлиентеНаСервереБезКонтекста
Директива указывает компилятору, где нужно скомпилировать указанную процедуру. С директивами «НаКлиенте» и «НаСервере» все понятно, а вот с добавкой «БезКонтекста» нужно разобраться подробнее.
Вернемся еще раз к модели взаимодействия клиента и сервера. Представьте себе: пользователь редактирует большую форму, в ней несколько табличных частей и куча реквизитов. Все эти данные (если не учитывать разных, не зависящих от разработчика, оптимизаций) хранятся в контексте формы, то бишь, в ее реквизитах. На сервере никаких данных не хранится, он не знает о том, какие буквы написаны в полях нашей формы.
Теперь, пользователь нажимает кнопку, которая вызывает процедуру с директивой «НаСервере». Все данные формы, должны быть отправлены на сервер, чтобы там с ними можно было поработать. Процедуры «с контекстом» (НаКлиенте и НаСервере) видят контекст формы, т.е. ее данные. Когда мы вызываем сервер «с контекстом», то контекст должен быть передан на сервер, поскольку его там в данный момент просто не существует (сервер state-less).
Все реквизиты и табличные части сериализуются, формируется json-документ с данными формы и этот документ отправляется на сервер. На сервере json считывается и поднимается серверный контекст формы. Далее, запускается наш серверный код, который видит, что утю-тю-волшебство, на совсем другой машине, даже на другом континенте, в серверной части формы все данные живы-здоровы и с ними можно работать.
Поскольку все происходит настолько для нас прозрачно, что порой кажется: «какая красота, не надо заморачиваться, можно всегда писать «НаСервере» и на сервере все будет доступно». Однако, как видно из предыдущего абзаца, такая прозрачность не бесплатна. Все данные формы должны упаковаться, отправиться на другой континент, там распаковаться, после чего должен быть выполнен серверный код, и потом обратная упаковка и возврат изменений на клиента. Понятно, что накладные расходы на передачу контекста очень высоки.
Платформа выполняет ряд оптимизаций по передаче контекста. Так, например, между клиентом и сервером передаются только изменения контекста, а не весь контекст целиком. Тем не менее, так происходит не всегда, и часто форма пересылается почти полностью. Кроме того, программист не может явно управлять этим процессом и можно считать, что вызов серверного метода «с контекстом» передает все данные формы, а потом еще и получает их обратно с теми изменениями, которые внесены в данные на сервере.
Для облегчения клиент-серверного обмена введено понятие серверного вызова «без контекста». Отличается он тем, что при вызове «без контекста» контекст формы не передается и в серверном коде будет недоступен. Процедура «без контекста» не видит данных формы. Фактически, это вообще не модуль формы, а некий отдельный модуль, который ничего про форму не знает.
Во внеконтекстный метод можно передавать параметры и можно получать возвращаемые значения, однако, нельзя обращаться к данным формы, поскольку, нет самой формы.
Преимуществом внеконтекстного вызова является то, что он выполняется довольно быстро. Нет лишних данных, нет лишних операций, просто выполняется вызов сервера с передачей нескольких аргументов метода.
Внеконтекстные вызовы позволяют пообщаться с сервером и избежать ненужных расходов на передачу контекста формы. Разумеется, можно сделать очень медленным даже внеконтекстный вызов, если передать параметром метода какой-нибудь огромный текст на много мегабайт.
Переменные уровня модуля формы
В форме могут быть объявлены глобальные переменные, а их доступность отрегулирована все теми же директивами компиляции.
Причем, переменная, которая объявлена НаКлиенте, будет доступна все время жизни формы, а переменная НаСервере будет очищаться каждый раз при возврате с сервера (уничтожении данных серверного вызова).
Временное хранилище – секретное оружие
При работе с управляемыми формами быстро становится ясно, что ограничения клиент-серверного взаимодействия очень сильно сужают возможности разработчика. Поэтому, платформа 1С предоставляет хитрый секретный ход под названием «ВременноеХранилище». Эта сущность позволяет сохранить на сервере некоторое состояние между двумя серверными вызовами. Я слышу возгласы: «А кто сказал, что состояние нельзя хранить!» Справедливое замечание, состояние хранить все-таки можно, но недолго.
Временное хранилище позволяет оставить на сервере некоторые данные, а вместо них получить короткую строку – адрес временного хранилища. Этот адрес можно передать на клиента, там он будет спокойно лежать, а когда понадобятся данные из хранилища, то мы по этому адресу сможем их получить.
Для работы со временным хранилищем используются методы ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища.
С методом «Получить» все просто, он по заданному адресу возвращает значение, которое лежит в хранилище.
С методом «Поместить» несколько сложнее. Дело в том, что помещать можно в 2 разных хранилища – простое и хранилище формы. Хранилище формы живет на сервере столько, сколько живет сама форма. Простое хранилище живет ровно 2 серверных вызова. В синтакс-помощнике об этом написано целых несколько умных строк. Я никогда не понимал, что они означают. Опытным путем было установлено, что срок жизни – 2 серверных вызова.
- Первый – мы помещаем что-то в хранилище и возвращаем адрес на клиента.
- Клиент делает второй вызов и по этому адресу может получить данные.
- В третьем вызове по этому адресу уже ничего не будет. Платформа очистит хранилище
С хранилищем формы ситуация более интересная. Если вторым параметром метода «ПоместитьВоВременноеХранилище» передать идентификатор формы (ЭтаФорма.УникальныйИдентификатор), то данные в хранилище будут привязаны к сроку жизни формы и не будут удалятся ни в первых, ни во вторых, ни во всех прочих вызовах сервера.
Таким образом, временное хранилище, это еще одно место, в котором (помимо реквизитов формы) можно сохранять состояние на сервере. Причем, в хранилище можно хранить даже данные, которые на клиенте недоступны, а стало быть, в реквизитах формы их разместить нельзя.
Особенности временного хранилища
Временное хранилище лучше всего представить себе, как файл на сервере. Технически это не так, но особенности оптимизации могут попить крови. Проще думать о нем, как о файле.
Данные, которые мы помещаем в хранилище, должны быть сериализуемыми. В противном случае, они могут внезапно пропасть из временного хранилища.
Как примерно работает временное хранилище:
- Данные помещаются в ВХ
- Управление возвращается на клиента
- Клиент делает повторный серверный вызов
- Менеджер кластера переключает вызов на другую машину из кластера (не ту, что помещала данные в хранилище)
- И вот тут, если данные в хранилище были сериализуемые, то все отлично, мы получим их даже на другой машине кластера.
- Если данные не были сериализуемые (СправочникОбъект, COM-объект, что-то еще), то они просто пропадут, ибо нефиг.
Если не вдаваться в дебри документации, то можно сказать примерно следующее: данные во временном хранилище существуют в пределах двух серверных вызовов, либо, если они помещены в хранилище формы, то в течение жизни формы.
Данные в хранилище могут быть сериализованы в любой момент времени по усмотрению сервера. Если данным пришлось сериализоваться, то обратно их можно получить только если тип этих данных поддерживал сериализацию (большинство типов платформы поддерживает).
Если тип данных, помещенных в хранилище не поддерживал сериализацию, то данные просто уничтожаются.
Данные помещаются в хранилище по ссылке. Это значит, что помещая данные в хранилище и изменяя их вне хранилища мы, фактически, меняем и само хранилище, т.к. в нем лежит только ссылка на данные. Пример:
Массив = Новый Массив; Массив.Добавить("Привет");
Адрес = ПоместитьВоВременноеХранилище(Массив);
Массив.Добавить("До свидания");
МассивИзХранилища = ПолучитьИзВременногоХранилища(Адрес);
Сообщить(Массив = МассивИзХранилища); // Истина
Сообщить(МассивИзХранилища.Количество()); // 2 элемента
В приведенном коде массив помещается в хранилище, после чего к нему добавляется еще один элемент. Видим, что в хранилище лежит тот же самый объект и объект получаемый из хранилища тоже изменен.
Тем не менее, если данным пришлось сериализоваться (например, произошло переключение на другой сервер кластера), то ссылки уже будут разными, по понятным причинам.
С одной стороны, логика довольно путанная, с другой стороны, ничего страшного. Главное помнить о подводных камнях и не закладывать логику на какое-то побочное поведение хранилища.
Краткий итог
- - Взаимодействие с сервером теперь не спрятано от разработчика. Наоборот, оно каждую минуту напоминает о себе. И это хорошо.
- - Сервер 1С не сохраняет данные между обращениями клиента к серверу. Нужно проектировать взаимодействие с учетом этой особенности
- - Временное хранилище – мощное средство, которое нивелирует сложности state-less взаимодействия и позволяет строить сложные схемы серверных вызовов.
- - У формы есть контекст, который передается с клиента на сервер и обратно при каждом контекстном вызове сервера. Для несложных вызовов, где не требуется вся форма целиком, следует использовать внеконтекстные вызовы.
Заключение
Управляемый интерфейс – это кардинально новый подход к построению приложения на платформе 1С. Он привносит свои сложности, но привносит и массу преимуществ. Однозначно, за управляемым интерфейсом будущее, и я не видел еще ни одного человека, который поработав с управляемыми формами, захотел бы вернуться к обычным.
Понятно, что в рамках одной статьи нельзя описать все аспекты управляемых форм. Например, я совсем не затронул принципы размещения элементов на форме, группировку полей, команд и пр. Считаю, что на этот счет имеется достаточно литературы и пересказывать книжки просто неэффективно.
Литература к прочтению
Новичкам однозначно нужно прочитать книжку Максима Радченко «Разработка управляемого интерфейса». На старости лет мог напутать с точным названием, извиняйте. Книжка зеленоватая такая.
Все основные моменты разработки не только форм, но и вообще всего управляемого приложения в ней описаны просто замечательно.
Постскриптум
Я постарался затронуть наиболее неочевидные моменты устройства управляемых форм, те которые есть в документации и наблюдаются экспериментально, однако не упоминаются в учебниках. На этих особенностях можно потерять кучу времени, если не знать архитектурных принципов и особенностей взаимодействия клиента и сервера 1С. Если держать в голове то, как оно работает, то становится понятнее почему некий механизм реализован так, а не иначе.
Удачи вам в разработке управляемых форм. Если вы дочитали до конца, значит, вам было что узнать. Скорее ставьте плюсик :)
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45555 TitanLuchs 109
Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)
Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.
19.06.2025 18585 zeegin 15
Механизмы платформы 1С Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).
03.02.2025 25967 bayselonarrend 127
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.
30.01.2025 33174 user2122906 10
Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 Бесплатно (free)
Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.
17.01.2025 55539 user2122906 13
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46680 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26377 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40361 bayselonarrend 24
Некоторые только начинают учить... Книги - хорошо... Но потом, зачастую, нужна "шпаргалка" пока не "почувствуешь"... А в книге искать долго... Так, что на роль "шпаргалки" вполне тянет...
Не согласен.
Зря использовали это словосочетание. Оно напоминает "ХранилищеЗначений". Кто-то может спутать.
Не согласен.
При открытии формы элемента справочника СправочникОбъект остается на сервере, а на клиент передается описывающий его ДанныеФормыСтруктура*. И будет существовать этот СправочникОбъект на сервере до тех пор, пока форма не будет уничтожена (ну, может еще по таймауту).
Именно поэтому существуют контекстные и бесконтекстные вызовы сервера. Это подчеркивает, что контекст существует и на сервере и на клиенте.
Рискую ошибится, но думаю, что это ни о чем не говорит.
Я рассуждаю так: если СправочникОбъект остается на сервере, тогда зачем в принципе нужно разделение на контекстные и бесконтекстгые процедуры? Ведь контекст остался на сервере?
Но тут возникают но... Данные на форме могли поменяться и поэтому при контекстном вызове их надо обновить (должно происходить если на сервере контекст сохранен), либо если контекст уничтожен на сервере, тогда контекстный вызов просто необходим.
На личном опыте замечено что не важно сколько ты информации изменил на форме, на скорости контекстного вызова это не сказывается (т.е. платформа не отслеживает только измененные объекты и не передает только их) что косвенно подтверждает теорию отсутствия СправочникОбъект на сервере. Либо говорит о том что 1С здесь чего-то не доработало.
Это мое сугубо личное мнение и оно, возможно, является ошибочным.
СправочникОбъект уничтожается при возврате на клиента. Контекст формы существует только в виде ДанныхФормы и ее элементов. У вас есть подтверждения ваших слов про то, что СправочникОбъект живет на сервере пока открыта форма?
Доказательство - ХранилищеЗначения в реквизитах объекта.
Домашнее задание - сделать управляемую форму справочника с реквизитом типа ХранилищеЗначения. В хранилище нужно записать файл, выбранный с диска.
Затем, в событии "ПередЗаписьюНаСервере" проверять, если по этому адресу что-то лежит, то засунуть эти данные в ТекущийОбъект.
Работаю с УФ полгода и хотел бы вернуться к обычным. Часто занимаюсь конвертацией данных и сложными обменами между базам. Скорость разработки увеличилась. Нагрузка на сеть для меня не критична. Сложно организовать простой прогресс бар. Передавать файл через временное хранилище грустно. Но плюсы тоже есть, однако минусы их перекрывают.
Состояние (Status)
Синтаксис:
Состояние(<ТекстСообщения>, <Прогресс>, <Пояснение>, <Картинка>)
Параметры:
<ТекстСообщения> (необязательный)
Тип: Строка.
Строка, предназначенная для вывода в панель состояния. Если параметр не указан, возобновляется вывод системного текста в панель состояния.
<Прогресс> (необязательный)
Тип: Число.
Значение индикатора прогресса (от 1 до 100).
Если не задан, индикатор прогресса не отображается.
<Пояснение> (необязательный)
Тип: Строка.
Текст пояснения.
<Картинка> (необязательный)
Тип: Картинка.
Картинка.
Описание:
Выводит текст в панель состояния.
Доступность:
Тонкий клиент, веб-клиент, толстый клиент.
Примечание:
Для режима запуска ОбычноеПриложение используется только параметр <ТекстСообщения>, а вывод текста осуществляется в панель состояния.
Пример:
Состояние("Выполняется обновление информационной базы");
Частота исполнения строго на плечи программиста реализующего серверное решение.
С обычными формами работаю время от времени, но только по превеликой просьбе клиентов.
Франч, УТ 11, Розница 2, свои конфигурации.
в высоконагруженых системах, считаю, без УФ никуда, в параллель с обязательным клиент-сервером.
вот вы привели, что толстые формы быстрее в разработке, так давайте вернемся к 77 где вообще все просто как 3 рубля.
не помню где читал про похожий холивар, "усложнение" мол разработки, но в конечном итоге ведь - все во благо! а по другому никак. прогресс так сказать.
В каждом конкретном случае ессесно свои решения, вот Вы нашли такой вот подход, и самое классное что он работает! Но если делать на УФ и можно таки вообще развернуть веб сервер и юзверя с "карманников" не будут подымать rdp и т.д!
Каждому своё, и вы правильно указали, 500 документов в день, у кого то их 5000 на 500 пользователей, и тут, простите, файловым вариантом не отделаться. Сразу начнете изучать управляемые блокировки и кластеризацию.
Впрочем не стоит раздувать этот бесконечный холивар коих на просторах тырнета не счесть.
Я учился с 8ки, с 77 тоже сталкивался и работал (но не разрабатывал с "нуля") и то что я успел потрогать мне не очень понравилось. Сейчас у нас уже 83 накатываем, и то что мы видим нам очень нра :)
Часто по работе встречаю "пятиминутные доработки", последствия которых проявляются не сразу.
Для "обычного приложения" при организации правильной работы трехзвенки, разработка не совсем тривиальна.
Политика 1С вполне ясна, большинство 1С специалистов имеют низкую квалификацию, переход на УФ заставит писать более менее грамотно. Это повысит общий уровень продукции.
2024 год, вы все еще согласны что политика 1с в повышении грамотности специалистов ?
по факту - на данный момент основная доработка заключается в программном манипулировании интерфейсом(кстати, вполне очевидный костылинг растущий из нежелания 1с ЦЕЛИКОМ выкладывать то что они попячили ...ну я не знаю, WPF ? или из какого то андроидовского фреймворка? там такие изменения делаются через html с описанием формы), ну требующая ооочень большой грамотности(три-четыре шаблона по факту) .
"Разработка управляемого интерфейса" Ажеронок, Островерх, Радченко, Хрусталева - зеленая
"1C:Предприятие 8.2 Коротко о главном" Радченко - коричневая
П.С. Работаю и с обычными, и с управляемыми формами, обычные все-таки попроще, хотя и для управляемых если знать основные моменты (открытие файлов, передачу ссылки для обработки на сервер и т.д., ну и что где работает конечно), то все не так страшно, как кажется вначале. Хотя и задачи бывают разные...
А за статью спасибо!
Массив = Новый Массив; Массив.Добавить("Привет");
Адрес = ПоместитьВоВременноеХранилище(Массив);
Массив.Добавить("До свидания");
МассивИзХранилища = ПолучитьИзВременногоХранилища(Адрес);
Сообщить(Массив = МассивИзХранилища); // Истина
Сообщить(МассивИзХранилища.Количество()); // 2 элементаЕсли этот код выполнять с клиента, то результат будет вовсе не таким, как написано.
Однозначный "плюс", мне бы эту статью в начале работы с УФ :)
Как раз подхожу под
Данная статья ориентирована на разработчиков, которые волею судеб не успели плотно поработать с управляемыми формами. Если вы уже хорошо знаете, как работают УФ и вообще управляемый интерфейс приложения, то можете статью не читать, поскольку, вряд ли узнаете много нового.
Автору спасибо, буду ссылаться на Вашу статью)
Ключевые параметры определяют уникальность окна. В обычных формах был такой атрибут «Ключ уникальности». Если запрашивалась форма, то она сначала искалась в уже открытых. Ключ уникальности позволял варьировать условия при которых создавалась новая форма или возвращалась существующая. Ту же самую роль играют ключевые параметры. Если метод «ОткрытьФорму» вызван два раза подряд с одним и тем же значением ключевого параметра, то второй вызов не откроет новое окно, а активирует существующее.
[/QUOT]
Не совсем верно. Поиск по ключевым параметрам это поведение по умолчанию.
Но при этом у метода ОткрытьФорму есть параметр <Уникальность>, если его заполнить, то поиск среди открытых окон будет выполняться по нему.
Но при этом у метода ОткрытьФорму есть параметр <Уникальность>, если его заполнить, то поиск среди открытых окон будет выполняться по нему.
Не знал. Думал, что они друг-друга дополняют. Спасибо.
Ну ты за всех-то не расписуйся :) После таких заявок так и хочется минус влепить.
Понятно, что есть документированные особенности, как то "РасширениеРаботыСФайлами" и прочее...
А что именно неправда?
Проектная идеология подразумевает корректную работу кода в тонком и веб-клиентах.
По мне так УФ это г***о полное. Я работал с УФ и плевался на всем протяжении работы. Если кто-то все-таки захочет поспорить на счет "быстроты разработки", то я тоже подписываюсь! Я вижу УФ только в качестве того случая, когда нужно разработать функционал под "веб" (т.е. для работы в браузере).
Короче говоря, кто плюётся от управляемых форм, просто неудачники, не умеющие осваивать новые технологии и перестраивать мышление. Мозг жиром заплыл.
Скажите, коллеги - фраза "Все кто поработал с УФ более-менее плотно не хотят возвращаться назад, как в страшный кошмар" только мне кажется недостоверной, или я отстал от прогресса и то, что делалось на НФ за час теперь можно делать за 15 минут?
Асинхрон нормальный спустя сколько лет сделали, хотя в других языках Ajax-фишки, промисы и прочее были?..
Вызвали сервер, менеджер кластера передал вызов на машину с Windows, там создался ком объект. Предположим, что мы сможем его где-то сохранить.
Делаем другой вызов, менеджер кластера передает вызов на другую win-машину, где этот COM не создавался. Как его получить с первой машины?
Дальше-больше, третий вызов придет на машину с Linux, там вообще не бывает COM. Как вообще обеспечить работу такой информационной системы?
Ваша необходимость сохранять COM объекты между серверными вызовами, это архитектурный просчет и нужно менять само проектное решение.
Другой вопрос, если решается задача не кеширования объекта, а надежного хранения его состояния (состояния всех его внутренних переменных). В этом случае предложенное решение некорректно. В условиях нескольких серверов оно некорректно в принципе, даже если мы забудем про 1С и возьмем какую-то другую информационную систему.
Но я не разделяю эту радость от управляемых форм. Мне больше хотелось видеть больше возможностей на стороне клиента. Ну например:
1) Зачем ограничения сериализацией? Если бы оставался контекст и на сервере, то для не поддерживаемых типов можно организовать было что-то типа "проксирование" (Remoting, RMI). Ведь "невидимый" вызов производится, если на клиенте обратится к какой-то ссылке через точку, типа такой же "фокус" можно было делать и тут.
Я согласен, что возможность распределять нагрузку в кластере - это хорошо, но, как я помню, даже в Oracle Weblogic есть возможность и держать северный контекст и даже запретить ему распределять его в кластере.
2) Что за странное ограничения на работу с таблицей значений?
3) Особенно огорчило отсутствие метода "СоздатьКолонки", т.к. нет возможности сгеренировать правильно столбцы для системных таблиц (например КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор)
4) Почему обработка СКД выполняется на сервере? А может я хочу поработать только с набором данных "объект" и просто его по особенному "обработать" (наложить сложные отборы, использовать вычисляемые поля)
Вместе с правильными новшествами были принесены ограничения "высосанные из пальца"...
А после того, как стал интересоваться другими подходами (web-разработка на RubyOnRails, Node.js, Django на Pithon`e) - стало копиться какое-то раздражение на предлагаемые в 1С реализации и подходы.. и вообще - язык 1С - это по сути DSL..
.. ау, проджект Доминикана? Может проще запилить альтернативный интерпретатор 1С скриптов на то же Ruby, например? Не уж-то никому еще не приходили подобные мысли?
Ну допустим запилили. И что это решает? Только конкретно - мол, решает проблемы а, б, в, г?
Вообще-то уже запилил кто-то, создав свою 1С. Мой коллега как-то рассказывал, но я забыл название продукта.
(105)
1) Все возможности стороннего языка доступны, а так же их дополнения. Т.е. не нужно создавать COM/Native обёртки
2) Учитывая (1) мы получаем свободу способа создания форм, а так же применяя ООП более гибкое их "встраивание"
3) ... да кучи всего можем исправить...
А что-бы это не создало лишних проблем нужно и для IDE создать плагины с визуальным конструированием и настройкой, как в 1С.
P.S. Но это мечты... Кроме Google и Microsoft не найти компаний, готовых милионы просаживать в "возможную трубу" (если смотреть в сторону возврата инвестиций).
Я просил назвать конкретные прикладные проблемы разработки, которые решит переход на Руби/Питон/Ваш любимый язык. Т.е. я спрашивал сугубо про интерпретатор и возможности языка. Сравнение IDE в мой вопрос не входило.
А по поводу "свободы способа создания форм" то есть обычные формы - относительная свобода, есть веб-интеграция, а в 8.3 так обещают и вообще REST-API из коробки. Берете HTML+Руби/Питон/Ваш любимый язык и делаете свой интерфейс, какой захотите. Полная свобода.
А теперь считаем трудозатраты и скорость разработки веб-морды на управляемых формах и на Руби с аналогичным функционалом (моксель, СКД, формы объектов, ввод по строке и т.п.)...
Писать на Руби уже не так экономически эффективно, правда?
Вообще-то формы Windows Form на C# так же быстро собираются. А если использовать WPF то и Web поддержку сразу получаешь. При этом наследовать формы ни кто не запрещает. Если грамотно разрабатывать формы, то возможность их доработки "наследованием" снимает неудобства их обновления.
В формах 1С мне не нравится отсутствие возможности наследования, а в управляемых формах, в добавок, бесит отсудствия доступа к форме минуя 1С. Т.е. под уф стоит то же HTML + JavaScript, но, например, элементарное наложение компонентов друг на друга сделать не могу...
Ну а "доступ к форме, минуя 1С" - это как вообще? есть абстракция "форма 1С". Ее нельзя миновать, в веб она превращается в HTML+Ajax, в тонком клиенте - в отрисовку средствами ОС. Что вы миновать предлагаете - непонятно...
Я не спорю, что другие технологии разработки, тот же WPF или Ruby очень интересны, однако, в 1С вы получаете инструмент решения бизнес-задачи, а не универсальное средство построения любых приложений. Фреймворк 1С из коробки дает вам сразу подавляющее большинство элементов бизнес-приложения - ORM, Абстракцию от СУБД, RAD-подход, Reporting, автоматический веб-клиент (без отдельной HTML ветки разработки), распределенные базы, отказоустойчивый кластер серверов, SOAP/REST (на 8.3), доступ к разным non-text носителям, вроде DBF и FastInfoset, плюс возможность расширения внешними компонентами.
Какой фреймворк бизнес-разработки дает столько же всего сразу? Какова его стоимость?
Не будем далеко ходить. Возьмем очень простое 1С-приложение (
Оцените, пожалуйста, сколько времени/денег у вас займет реализация такого же, но на любом другом средстве разработки?
Ну для Oracle WebLogic мы тоже быстро создавали формы и HTML+Ajax "из коробки". И ORM с абстрагированием от базы данных и т.п.
Я "доступ к управ. форме" в 1С - это я про доступ к приложении, которое "воспроизводит" форму (как в объекте "HTML документа", где есть доступ к "Документ").
Кстати, я Вас поправлю: в тонком клиенте, под Windows, используется тот же IE, только подключен он через COM.
Мне 1С нравится, но очень "достаёт", что они столько искусственных ограничений накладывают. Зато радуют обычные программисты - сколько идей, что бы обойти эти ограничения :-)
И вопрос такой про Oracle и абстракцию от СУБД.. Что, правда инструмент в названии которого есть слово Oracle, может работать с MS SQL Server или IBM DB2?
А какой тогда смысл девать возможность создавать внешние компоненты, если так же нельзя гарантировать работу и на Windows и на Linux. И какой смысл тогда открывать доступ к объекту в компоненте "HTML документ" и не открывать в объекте управляемой формы?
А абстракция от СУБД у Oracle это: + . При этом нет ограничений программисту: хочешь напрямую работай с БД, хочешь через ORM.
СУБД - любая, что поддерживает JDBC. Среди них IBM, MS SQL, Oracle, MySQL, PostgreSQL, MS Access и т.д.
А вот быстрая разработка Ajax форм основана на технологии Oracle ADF (Servlet -> JSP -> JSF -> Trinidat -> ADF). IDE Oracle JDeveloper её позволяет использовать полноценно, если система подключена к СУБД Oracle, но есть хитрость: разработать приложение можно с СУБД Oracle, а потом можно поменять на любую, т.к. сама технология универсальная (просто в IDE ограничения встроены)
P.S. Кстати вспомнил странное ограничение в управ. формах - не поддерживается "Выполнить", хотя "Вычислить" поддерживается.
У меня из-за этого ограничения не работает система динамической подмены событий у управ. форм, т.к. я не могу вызвать оригинальную процедуру, если она с директивой "НаКлиенте".
Oracle для Российского рынка - дорого. Даже если взять только Java EE + Oracle ADF - то на одни лицензии уйму денег уйдёт.
1С как раз то, что может себе позволить Российский рынок.
Я 1С ругаю только за то, что они специально не дают доступа к многим механизмам. И они это не скрывают.
(117) scape,
Вот странно, что компания 1С в конфигурации БСП не создали модули, которые "сгладили" бы это неудобство.
Я наверное Вас расстрою, но 1С имеет преимущество только в небольших приложениях. Считаю, что тотальный ООП подход (как, например, в Ruby) позволил бы на 50% уменьшить код конфигураций.. а может и меньше..
Я участвовал на День программиста на хакатоне - .. и то, что я там увидел - вселило в меня сомнения на предмет удачности и скорости разработки в 1С - я говорю о web-морде 1С на управляемых формах..
А то, что в 1С отсутствует асинхронная обработка событий (правда разработчики платформы уже предложили оооочень геморройный способ разработки для поддержки ассинхронности - см. заметки из Зазеркалья) - отбрасывает её по юзабельности на последние места.. рядом с web-гонокдерами, не знающих о call-бэках и замыканиях.. а кстати - почему этого нет в 1С.. ну хотя бы первого?
Ну и web-сервисы можно упомянуть - ну где вы увидите больший геморр при работе с ними?
Так что - я бы так сказал - любой из перечисленных мной языков позволяет даже простое web-приложение разработать с такими качествами, которые на 1С дадутся Вам очень большой кровью.. ИМХО.
Т.е, обсуждая достоинства платформ, не забывайте включать в аргументацию их стоимость, а также стоимость поддержки и сопровождения.
.. не холивара ради, но погружаясь в тему web-разработки (Ruby, Python, node.js) - обнаруживаешь, что за цену 0 получаешь кучу плюшек.. в частности - ОТКРЫТЫЕ фреймворки на любой вкус с широкими возможностями. Эти обеспечиваются (назову так) "идеологией" пакетной сборки проектов.. Посмотрите сами - RubyOnRails, Django, Express и примочки к ним.. там свободно-доступные репозитории на github`е и ресурсы, где они упорядоченно хранятся для каждого языка..
Единственное, что не дотягивает до 1С - это специфические штуки, типа сложных 1С объектов - например, аналогов регистров бухгалтерии и расчета - тут 1С впереди..
Ну а на счет самых востребованных "складских" бизнес объектов - регистров накопления и сведений - по мне, их несложно и самому реализовать..
Вспомогательных же пакетов для генерации отчетов и выгрузки их в эксель или pdf - везде предостаточно.
В части же мастеров и построителей - не знаю, как Вы - но через несколько лет работы на 1С у мне потребность во всем, кроме построителей запросов и СКД практически сошла на нет.. как то проще взять пустую форму и нуля.
Ну а дальше - если касаться поддержки, сопровождения и быстроты разработки - тут я бы не был столь уверенным. Как сказал - если речь о простеньких решениях - может быть да, 1С будет иметь где-то преимущество.. но по мере усложнения - 1С (да и те же SAPы, axapt`ы и т.п.) будут терять свои преимущества. В силу того, что языки этих систем "плоские", не поддерживающие ни ООП, ни функциональный подход.
Про call-беки/замыкания.. ну, лучше всего посмотреть какая идеология заложена в node.js, что бы понять, что это дает и как это реализовывается. Эта платформа - "однопоточная", но способна обрабатывать большее количество одновременных запросов, т.к. получив запрос - связывает запрос и функцию, которая должна обработать этот запрос - и переходит с следующей строке кода.. т.е. она не ждет завершения обработки запроса - функция отработав сама ассинхронно возвратит результат пользователю..
вот этого в 1С сильно нехватает - и разработчики платформы это уже осознали.. но решение, которое предлагается (т.н. технология отказа от модальности) - это откровенная халтура, ИМХО, т.к. сильно загаживает код.. Вот ссылка, убедитесь сами -
Хотя то, что об этом задумались - уже хороший знак. Значит, что-то будет меняться. Главное - чтоб не через "одно место".
Собственно, об этом и речь. 1С начиналась с этих объектов, это ее основная задача и 1С прекрасно ее решает, лучше любого из веб-фреймворков. Средой веб-разработки 1С никогда не являлась и сейчас не является. Другое дело, что сейчас бизнес заинтересован в веб-ориентированных решениях, и мы видим, что новые изменения в платформе направлены на удовлетворение этих потребностей бизнеса.
Вот-вот... покажите мне бесплатный (или примерно равный по цене) инструмент для reporting хотя-бы немного близкий по функционалу к СКД.
Платформа однопоточная, асинка там пока нет. Но она изначально такой никогда не была и от нее этого не требовалось. Сейчас эти требования возникли, 1С их реализует. Думаю, что через год-другой в платформе появится много плюшек на тему веб-интеграции.
Приведите, пожалуйста, пример алгоритма, в котором можно продолжать выполнение кода, например, без результатов запроса(наиболее емкая операция в 1С).
Основная суть такая: Вы просите сервер выполнить долгую операцию. Когда она завершится, сервер САМ позовет ваш код для обработки результата.
Сейчас даже если запустить фоновое задание, то приходится по таймеру опрашивать его состояние, формируя кучу серверных вызовов.
.. выше Evil Beaver описал недостатки работы с фоновыми заданиями, но самое главное - они не обладают методами возврата результатов (точнее - единственный способ возвратить результат - вызвать ошибку и в её описании возвратить какой-то результат - т.е. это "костыль", придуманный 1С-никами обход проблемы)
К вопросу практической применимости: ну, например, можно было бы сделать так, что бы пользователю не нужно было каждый раз ожидать окончания работы обработки, а продолжать работать в программе. Выглядеть может так - пользователь запускает обработку - форма обработки блокируется до окончания работы её алгоритма.. а по окончании работы - пользователю выскакивает сообщение об окончании работы обработки.. Ну и - пока запущенная обработка дожидается результатов - пользователь может что-то делать в этом же сеансе - документы, там вводить... или другие обработки запускать.
Сейчас пользователи вынуждены открывать новый сеанс работы с базой для этого. И если в случае толстого клиента - это означает только лишь лишнее потребление ресурсов, то в случае вэб-доступа - еще и ЛИШНИЕ ЛИЦЕНЗИИ занимаются. А вот это уже совсем неправильно, не так ли?
.. ну можно и через хранилище значений.. регистр там организовать - типа очереди сообщений и может еще что придумать - но такие костыли еще больше усложняют разработку и снижают производительность (хотя могут обеспечить доп. защиту от сбоев) - в общем, их совсем не хочется рассматривать..
Основная причина снижения производительности при них - то, что передача данных происходит с участием HDD или с доп. преобразованиями данных.. в случае же передачи "по ошибке" - все в в пределах оперативной памяти, ИМХО
ага, понятно.. победил ;)
Надо бы попробовать.. А что можешь сказать, насколько шустро это работает с встроенными типами данных?
Я через него только файлы передавал с сервера и обратно.. ну и ассоциация укрепилась - где файлы, там и диски.
Получить из фонового сеанса через временное хранилище какой-либо результат можно только после его завершения. Когда оно завершится, можно по адресу забрать результат. Работает быстро, по отношению ко времени работы самого задания.
Если хочется следить за работой задания до его завершения, то единственное, что можно придумать это сообщения пользователю и метод "ПолучитьСообщенияПользователю". Разумеется, это дикий костыль, но он работает, я проверял :)
Это все понятно.. если фоновый процесс работает долго - то таки да.. а если мне надо интерфейсную логику перенести на сервер? Что-то типа MVC-паттерна сделать - а Модель - на сервере держать, скажем.. некоторые приложения на nodejs, например, допускают указывать, где и что будет обсчитываться, или даже - держать копию модели как на сервере, так и на клиенте.. ну и в случае краха клиента - ничего не теряется, все состояние его рабочее восстанавливается - ну удобно же? Но для этого как раз и нужно, чтоб скорость была адекватная..
Писать на Руби уже не так экономически эффективно, правда?
У Рубистов есть фреймворк RubyOnRails и куча гемов к нему - в т.ч. решающих проблемы учёта и движения товаров - для интернет магазинов.. с бухгалтерией связанного ничего не видел - но и не искал.
В общем и целом - на счёт экономической эффективности разработки на RoR & Ruby Вы сильно заблуждаетесь - был на Хакатоне в 2013 году.
За 2 суток люди поднимали проекты и с приличным UX и бизнеслогикой.. А если еще принять во внимание модель лицензирования - то вообще аут, ИМХО. Никакой REST-API не изменит этого. Да и REST API, говорят, не очень гибкое у 1С (ссылка ниже, где об этом пишут и предлагают альтернативное решение)
Да и потом - сделать на 1С то же, что и на Ruby - порой будет гораздо дороже или вовсе невозможно..
===
И Ваш скепсис тоже не совсем понятен - люди таки занимаются и что-то пытаются допилить в 1С.. близко к теме - посмотрите наработки вот тут и
Оцените скорость работы этого по сравнению с управляемыми формами в вэб_морде 1С.
Ну как?
В силу исторических причин, идеологи большинства фреймворков, рассматривают front-end лишь как средство отобразить данные и принять ввод пользователя.
Тонкий и веб-клиенты 1С, вместе с интернет-магазинами и платежными системами, справедливо названы и являются "мордами", а не клиентскими приложениями.
Фундаментальное отличие metadata.js - данные на клиенте. С настоящей ссылочной типизацией и настоящим SQL на клиенте. Полноценный ДокументОбъект или СправочникОбъект, а не убогая ДанныеФормыСтруктура. Короткие справочники (до 30 тысяч записей) рекомендуется кешировать целиком не задумываясь. Они займут в javascript-массивах лишь несколько десятков мегабайт. Документы, регистры и длинные справочники лучше оставить на сервере и получать на клиента по необходимости. Клиентский SQL к некешируемым объектам работать не будет - только серверный, но в остальном, некешируемые объекты ведут себя точно так же, как кешируемые. Работает ссылочная типизация и разыменование.
И зачем было это изобретать. Можно же было сделать "тонкое" управление взаимодействием клиента и сервера программистом там, где это действительно нужно, а не заставлять писать, например, говнофункцию возвращающую значение на клиент потому что функция платформы, которая возвращает это значение, работает только на сервере.
Современные стандарты языков программирования стремятся к облегчению жизни программиста, 1с похоже доставляет садистское удовольствие издеваться таким изощренным способом. Противно это все...
Никто не запрещает делать на обычных формах, хозяин-барин, но 50% ухудшение это, скорее всего, косяк разработчика.
Работа в толстом клиенте конечно примитивна и не столь гибка как в клиент серверном варианте.
тут я с вами согласен.
Но я пишу софт более 10 лет (из них, 6 лет в 1С:Предпиятии) и скажу вам вот что:
УФ афигеннейший инструмент для оптимизации клиент серверных процессов и уменьшения нагрузки на локальные машины.
Столкнулся сам, и не раз, при автоматизации крупных предприятий от 200 рабочих мест.
Но 95% всей моей клиентуры (как я думаю и в общей картине по России и СНГ) это небольшие конторки в стиле "бухгалтер<->директор<->оператор.менеджер<->зав.склада"
т.е. компании до 5 рабочих мест.
и как ни странно именно они кормят большинство 1С-ников потому как на всех 1С-ников крупных предприятий не напасешься.
а в этих мелких конторках, когда бухгалтеру необходимо добавить кнопочку в документ дабы автоматически создавать какое-нить пакетное начисление авансов и т.п. он зовет программиста 1С.
и раньше, любой мог напрямую с толстого клиента написать модуль обработки и взять за это с не очень то и богатой мелкой конторки какие то час или два.
Нынче же чтобы написать эту же кнопку приходится прыгать с бубном изгаляясь как бы передать те или иные данные с сервера на клиент. И счет тому же бухгалтеру приходится выставлять на порядок выше.
Само собой методом простой калькуляции все эти 95% клиентов посылают новомодную конфигурацию на УФ в .... и возвращаются к старой учетной системе.
Только в 2013 году я заработал кучу денег на клиентах которые просили перевести их с УТ11 на УТ10.3
(Это не значит, что я не пытался увещевать их и доказать что УТ11 лучше и более гибкая. Просто желание клиента все равно остается при нем) Писал правила конвертации, собственные обработки переноса и пр.
А все почему?
потому что ОЧЕНЬ МНОГИМ КЛИЕНТАМ УФ НА Х... НЕ СДАЛИСЬ. При всей их удобности и прочих плюшках.
Клиенты рассматривают управляемый интерфейс как очень хитрый способ компании 1С увеличить мзду с работы специалиста.
Теперь об удобстве написания кода для программиста:
Раньше у меня было четкое деление.
Клиент, придумавший очередное задание, в котором из 15 абсолютно не связанных регистров надо консолидировать данные и при выполнении условия в каком то там документе и вывести это в отчет или сохранить в каком нить непонятном формате на диске
и .. моя любимая и родная среда программирования где мы вместе с ней пытались решить задачу поставленную клиентом.
А теперь, вместо того чтобы полностью отдаться решению поставленной клиентом задачи ты еще должен постоянно думать как бы ублажить (см. обмануть, нае.... и пр.) среду программирования дабы она позволила все эти несериализуемые данные обработать и выдасть куда-либо.
Это все равно что при сексе вместо того чтобы наслаждаться процессом ты будешь вынужден (по новым правилам, утвержденным Министерством половых связей) держать вытянутым мизинец на правой ноге, причем так чтобы он не опускался ниже уровня 12 см от кромки матраца. Причем министерство будет убеждать вас что именно при таком методе достигается максимальная оптимизированность процесса и наименьшая нагрузка на позвоночник.
И все как бы правильно. И есть уже даже люди, которые по другому уже и не умеют.
Но, называйте меня ретроградом, даун-шифтером и пр. я все равно за старый добрый процесс программирования в толстом клиенте.
я для тех кому нужно клиент-серверное программирование пусть придумают насадки на ... платформу которые можно будет подключать при необходимости.
Просьба не кидать гнилые помидоры и постараться понять это крик души )))
Я на УФ с самого момента их появления, еще с бета-версии. Ни разу не испытал проблем с "ублажением" среды разработки. Решение задачи выполняется так же, как и раньше. Более того, если надо в середину большой формы добавить какой-нибудь флажочек, то делается это элементарно. На надо долбаться со сдвиганием элементов и последующей перенастройкой привязок.
Короче говоря, каждый делает, как хочет. Я не хочу обратно на обычные формы. А вы - дело ваше.
Я вообще не понимаю столь полярного разделения - всё с нового года мы будем жить только с УФ... Ура товарищи...
В 90% вся 1Сина крутится на локальной машине, и там УФ вообще нужны как собаке 5 лапа... ну а "удобств" особенно с написанием простеньких или непростеньких обработок и разного рода фичей, УФ приносят столько, что кроме матов в адрес 1С с её политикой больше ничего на язык не приходит...
Уговор - приводить в пример COM контролы на 1С-ных формах нельзя.
Единственное что меня еще напрягает в УФ это "перлы от 1С" типа функций РеквизитФормыВЗначение()...
Есть желание ЗДЕСЬ высказаться по поводу доработок типовых конфигураций "добавить КНОПОЧКУ". 75% пользователей программ 1С работают на ЧИСТО типовых конфигурациях и правильно делают. Они не ищут приключений на своё одно место. Обновления у них проходят без всяких проблем и без лишних расходов. Кроме того и с версии на версию они переходят практически безболезненно.
Из остальных 25% клиентов не многим повезло. Хорошо если они напали на Программиста, который прежде чем что то менять в типовой, сто раз подумает, не вылезет ли это потом ему и клиенту боком. Потом Программист постарается сделать всё так, чтобы даже при его уходе от клиента, сопровождение конфигурации не вызывало проблем.
И совсем не повезло тем бухгалтерам, которым установили КНОПОЧКУ по двум тривиальным причинам:
1. по требованию бухгалтера переделать типовую конфигурацию только потому, что сам бухгалтер с нею не знаком
2. есть программист, которому надо заработать. Для этого надо что то поменять в типовой, ведь просто так деньги не возьмёшь. Предлагается первая пришедшая на ум КНОПОЧКА. Всем нравиться.
Выполняется изменение, оплачивается работа и ... проблемы начинают накручиваться и расти как снежный ком(падает производительность системы, долго и нудно выполняются обновления и так далее). Решение их связано с большими финансовыми затратами. Да и часть отрицательных эмоций этой темы тоже связаны с решением аналогичных, высосанных из пальца проблем.
Что же касается сложности разработки. Когда-то в начале программирования на УФ я бы с вами согласился, но не теперь. Некоторые вещи безусловно сложнее, но что б в разы... нет.
Скажете, да кому нужны эти веб-клиенты?
А кому тогда нужны эти сложные иномарки? Давайте будем и дальше делать "девятки", "четырки", ведь они такие простые и понятные, можно любой косячек починить с помощью молотка и благого мата ("полностью отдаться решению поставленной клиентом задачи"). Большинство пользователей "девяток" (читай "обычных форм") всегда довольны тем, что у них есть, и искренне не понимают, зачем хоть что-менять в их привычном мире, кому это надо вообще.
А есть задачи и цели, которые можно достичь только новыми подходами, и хвала Нуралиеву (может быть тут перегнул палку), что он, несмотря на такой вот мелькающий негатив, стремиться к созданию своего, отечественного БМВ.
А УФ нормально программируются, если не лениться, почитать хотя бы "Разработка управляемого интерфейса" (250 руб.) и приятно для себя подтянуть знания по 1С, которая развивается. И дальше, как и привычно "полностью отдаться решению поставленной клиентом задачи".
ПС: в машинах абсолютно не разбираюсь, просто попытался провести понятную (надеюсь) аналогию.
Короче, сможете сделать конкретный пример воспроизведения в виде обработки, чтобы не тратить время на подготовку к поиску проблемы?
Все комментарии читать смысла не увидел, но пробежался по некоторым и понял, что спор по поводу обычных и управляемых форм ещё долго не утихнет. Призывая фирму 1С сохранить обычные формы, не забывайте, что фирма 1С создана для получения прибыли, содержать штат поддерживающий много различных версий и вариаций конфигураций - это слишком затратный подход. В их подходе есть свои причины, когда ты создаешь новые конфигурации, которые по сути подходят и малым и средним и крупным(? рассчитывают по крайней мере) предприятиям, и тем кто хочет разместить данные в облаке, и тем кто локально, и тем кто на Linux, и тем кто на Windows, и тем у кого мощные клиентские машины и тем у кого "тонкие" клиенты. Если посмотреть интервью Бориса Нуралиева, то он выделяет для критерия успеха фирмы 1С:
1) большая партнерская сеть благодаря выгодным условиям
2) ориентация на массовый рынок (т.е. "в среднем" подходит всем)
есть ещё неофициальное мнение, что сейчас фирма 1С своей политикой пытается поднять рейтинг СПЕЦИАЛИСТОВ и серьёзных партнёров (считай, убрать с рынка "неугодных", дискредитирующих фирму 1С и её разработки своим непрофессионализмом)
Общие модули???.. если у вас общий модуль серверный, то ошибка такая может быть)))
Поставьте галочку в свойствах общего модуля ещё и "ВызовСервера" - и тогда можно будет к нему обращаться с клиента, все будет ок)
ВНИМАНИЕ:
открываем форму списка с пользователем (любую, например справочник номенклатуры, контрагентов) где много-много записей и считаем до 10 (иногда до 30, но мгновенно не открывается ни одна форма списка), пользователь поворачивается ко мне и спрашивает:
"Сколько по твоему я буду набивать накладную из 10 строк?" (Кладовщик)
"Сколько приказов о приеме на работу я смогу оформить в день?" (Кадровик)
"Я каждый раз так по долгу буду вносить одну сраную проводку?" (Бухгалтер)
"Во сколько раз увеличится мой штат сотрудников после внедрения?" (Директор)
я конечно отмазываюсь, что выйдут обновления, что все исправится, что мы все настроим...
но люди передо мной сидят видавшие виды, они помнят с какой скоростью можно было колотить данные и обрабатывать их в 1С 7.7
С 1С 8.1 они тоже были рады так как скорость работы с лихвой окупилась новыми удобными фишками из-за нового функционала и удобства
но в УФ от 8.3 никто ничего хорошего не видит
стремно говорить о распределении нагрузок, когда клиент написанный на УФ тормозит и жутко лагает, а на сервере в диспетчере задач - тишина, там процессор вообще не работает, там MS SQL на 1% жрет скорость жесткого диска и процесс 1С сервера просто потихонечку пухнет съедая по паре килобайт в минуту, не напрягая ни сеть ни процессор ни жесткий диск. Такое ощущение, что серверу кроме оперативной памяти ничего и не нужно, а заказчик купил духпроцессорный сервак с 8 ядрами каждый, а он простаивает
Зачем всё валить на УФ???
В 8.3 файловом работает ещё и фоновый процесс для рег./фон задач. Можно просто произвести отключение не нужных рег. задач (типа обновление индекса ППД, которым ни один наш клиент не пользуется). Скорость вырастит в разы. Это можно сделать и в клиент-серверном варианте.
Не забывает, что УФ (тонкий клиент) в видне - это IE, а IE нужны обновления винды и он зависит от оптимальности настройки. Если винду настроил хорошо и она обновляется, то IE тоже начинает "полётывать".
P.S. Вам не хватает знаний ХОРОШЕГО системного администратора и знаний работы 1С "за кадром". Знания работы HDD (чтение/запись данных на "блины" или правила работы SDD (работа контролера при перемагничивании)), работы ОС с разделами (смещение, размеры кластеров и т.п.), знаний в работе файловых систем (индексирование, журнал транзакций, файловые потоки, фрагментация). Плюсом идут специфики работы СУБД разных производителей и разных версий.
Тут всё накладывается так или иначе. А если ставите на "то, что есть", то ни кто Вам не гарантирует, что это вообще будет работать (рекомендуемые параметры системы - это для "идеального мира")
До последнего времени ее отключение было нормой.
Но сайчас, в свете последних тенденций развития платформы это решение будет скорее мешать пользователю. Например в случае, если он воспользуется поиском данных в динамическом списке.
Нововведение от 1С о котором идет речь, обсуждается в статье
Ну начнем с того, что типовые конфигурации пишутся той же конторой, что и платформа. Я понимаю, что это разные команды разработчиков, но никто им не мешает общаться и обсуждать использование тех или иных приемов. Если в конфе задумана индексация ПП, то пусть индексирует. Мне обещали быструю работу программы, а в ответ они на якобы более быстрой платформе запускают функционал, который делает новую систему более медленной, чем систему двумя поколениями старше. ЗУП 3.0 - провал 1С. Они там такое нахреновертили, что лагает просто до невозможного. Видимо, они тестировали производительность на одном сотруднике, в реальности - лагает все.
Второе - не надо для установки системы делать шаманство. Запусти сетуп и начал работать. Все настройки и конфиги - от лукавого, я допускаю такое только для бесплатного ПО. Если Вы говорите, что для 1С нужен обновленный IE (в чем я сомневаюсь), то пусть они сами проверяют версию IE и его настройку при запуске или установке. телепатов.net
Ну если кто-то знает как создать сервер приёма TCP сообщений на JavaScript, то можно подумать как "это" заставить крутиться на клиенте и принимать вызовы с сервера 1С.
Супер интересно.
Мир UNIX смотрит на Вас с недоумением. И допускает конфиги для платного ПО, независимо от того, что Вы такого не допускаете. А так - гнев насчет УПП понятен)
ох как верно сказано.. занимался на прошлой работе вот таким ( да и сейчас кусками.. благо сейчас имею возможность полностью выкинуть написаное через жо (потому что база еще не работает) и написать с нуля по нормальному.
а как же быть скажем с разным аппаратно-программным обеспечением сервера скажем.. у одного пользователя сервер это простой комп с 8гб оперативы и PostGreSQL, а у другого 128Гб оперативы и SaaS диски.. вы им предлагаете одинаковые конфигурации SQL-сервера лепить? да и от специфики работы баз очень много что зависит.. какие запросы, какая база, количество операций записи\чтения, количество юзеров и тд и тп.. как без тонкой настройки то?
ммм, а скуль сам не видит сколько оперативы? скока подкачки? каков объем базы? скорость работы дисков? он сам не может выбрать оптимальный режим работы?
кажись, что может
а вот Постгре - бесплатный, так к нему и претензий нет
Повышение уровня разработчиков вряд ли произойдет - ну только если самые бестолковые отсеются, а индусский код как писали так и будут писать. Тем более что в части составления запросов чистые 1С-ники будут лажать намного чаще чем специалисты, знакомые с SQL в принципе.
Ситуация как с бейсиком или PHP - языки изначально имеют низкий порог вхождения, и на них пишется много фигни. При этом и классный код на них тоже пишут.
Но по своему самоопределению, я "чистый" 1С`ник, т.к. уже давно работаю в 1С, достиг в нем определенного уровня и ничем другим пока заниматься не собираюсь.
Печально что куча написанных обработок под толстый клиент в новых конфигурациях только на управляемых формах для обычного пользователя, который не умеет переключать режим запуска стали недоступны.
Может существует какой-то конвертер перехода с неуправляемых форм на УФ?
И притом они еще и не структуированны грамотно, где нормальная конвертация, особенно это видно в объектах для работы с СКД.
Где нормальная классовая структура с абстракцией чтобы большинство объектов имели во первых нормально перегруженные операторы присвоения, чтобы во всех объектов метод получить был получить, а не так что тут получить тут квадратные скобки в других найти
На месте 1С я вообще бы не стал плодить объекты типа обработка, отчет если в принципе это одно и тоже.
Когда же 1С будут улучшать на свистелки и перделки интерфейсные а среду разработки, когда наконец то сделают в запросах нормальный ltrim(rtrim), самое смешное что в практически любом полноценном SQL это есть, где конвертация в запросах строки в число и наоборот.
Кстате про УФ можно было модули разделить на блоки вот блок для сервера, это для клиента а не пихать все в одну кучу, когда грамотный отлатчик чтобы посмотреть стек вызовов функций, где нормальный intelisearch, блин в телепате для 7.7 это реализовано а в 8.х нормально до сих пор не сделано
ЗЫ: И Самое обидное что раньше чем 1с 9 и более: нормально структуированного интуитивно понятного языка мы не получим, а скорее всего вообще некогда :(
Переходить о толстого к тонкому клиенту так же психологически сложно как с процедурного языка переходить на объектный. Вроде бы все то же самое, а проектировать код надо по другому.
Следующий разрыв шаблона будет если в 1С надумают внедрять асинхронный принцип работы с сервером.
Т.е. 1С нам что-то сообщает, а что реализовано на самом деле - это искусственное разделение на уровне платформы (а не клиента-сервера), и, как и ранее, код как исполнялся "везде и всюду", так и исполняется "везде и всюду". Отсюда, кстати, и тормоза на формах УФ в 8.3 под всякими "тонкими клиентами".
Так что все остальные построения "от клиента-сервера" рассыпаются в самом начале.
Т.е. 1С нам что-то сообщает, а что реализовано на самом деле - это искусственное разделение на уровне платформы (а не клиента-сервера), и, как и ранее, код как исполнялся "везде и всюду", так и исполняется "везде и всюду"
лолшто?
"ДокументОбъект" - нельзя передать на сервер в сериализуемом виде.
я как-то по наивной простоте думал что документ, как объект - это совокупность его реквизитов и их значений, без модулей и форм. А получается - что я глубоко заблуждался..?
(196) CheBurator,
А почему не сериализуется? Потому что 1С никак не может нормально "разложить" свои же объекты. Идут попытки в 8.3 (выгрузка конфигурации в XMl и прочее), но вот просто сохранить и восстановить объект, как в ООП - 1С не может. Хотя и платформа её, и делает в ней, что хочет. А - не может, и все тут.
На ваш вопрос можно ответить очень просто:
ДокументОбъект - это не только набор реквизитов, это еще и состояние переменных, которые объявлены в начале модуля объекта. Представьте, что у вас там записано
Перем мСложныйКомОбъектВ этой переменной лежит что-то, что ваш объект в своем коде использует. Представьте, что это значение - объект из внешней DLL. 1С не может знать о его внутреннем устройстве и не может как-то его превратить в набор байт и обратно для передачи на сервер. Если мы захотим наш ДокументОбъект передать куда-то, то целым его передать не получится (из-за состояния в переменных), а частичный объект не имеет смысла воссоздавать на сервере.
Поэтому, в УФ сделан облегченный вариант - объект ДанныеФормы. Вот он хранит ровно то, что может передаваться туда-сюда.
AlexO тут еще сказал про временное хранилище, но это он тоже от недостатка опыта и легкомыслия. Временное хранилище не поможет. Если кластер серверов захочет сбросить содержимое временного хранилища на диск (он в ряде случаев это делает), то ДокументОбъект, лежащий в хранилище будет уничтожен, а его данные потеряны.
Поэтому, в УФ сделан облегченный вариант - объект ДанныеФормы. Вот он хранит ровно то, что может передаваться туда-сюда.
Высший балл по бессмысленности. А вот этот всевдоумный набор слов: "1С не может знать о его внутреннем устройстве и не может как-то его превратить в набор байт и обратно для передачи на сервер." - его вообще большими буквами, и вывесить над всей вашей всевдостуденческой братией.
Чтобы вы издалека предупреждали нормальных профессионалов об уровне знаний вашего кружка.
Надо же, что ни пассаж, то "шедевр", чувствуется долгая практика взаимного перекрестного оболванивания:
"Если мы захотим наш ДокументОбъект передать куда-то, то целым его передать не получится (из-за состояния в переменных)".
А вы его половинчатым передайте. А на остальное ответьте "из-за состояния переменной, увы..."
Ваши подзащитные без ругани и оскорблений не смогли прояснить сей "конструктив".
Вариант "так художник видит", конечно, что-то объяснит, но далеко не все... :)
Ни я, ни Хрусталева (вообще, В. А. Ажеронок, А. В. Островерх, М. Г. Радченко, собственно Е. Ю. Хрусталева - на последнем месте) через страницы 388-389 - из конструктивных объяснений Evil Beaver понять не можем.
Итак, AlexO, вы пишете "и каким образом ДанныеФормы стали тождественны ДокументОбъект"
У меня вопрос:
1) где вы прочитали у меня, что ДокументОбъект тождественен ДаннымФормы? Я такого нигде не говорил, напротив, цитата:
Это, по сути, просто структура, у которой свойства совпадают со свойством объекта. При всей «похожести», это совсем разные объекты. Причем, не просто концептуально, это различие явное, его можно «пощупать» из кода и с этим различием приходится работать в явном виде
Возможно, это непонятно написано, не знаю... ДанныеФормы и ДокументОбъект это разные объекты, они не тождественны.
Далее, вы спрашиваете:
"куда девается ДокументОбъект между клиентом-сервером, почему его "целым его передать не получится"
Отвечаю: ДокументОбъект уничтожается каждый раз при возврате на клиента и каждый раз воссоздается с нуля при каждой попытке поработать с ним, как с "объектом".
Этот принцип написан у Радченко, это написано в статье.
2) Какой момент в этом тезисе кажется вам непонятным или неправильным?
И наконец, третий пункт: передать ДокументОбъект между клиентом и сервером не получится, потому, что передача по сети это всегда сериализация. 1С не может сериализовать объекты, которые ей не принадлежат. Представьте, что в модуле документа есть глобальная переменная, в которую записан COM-объект скажем MSWord и в этом объекте открыт какой-то файл. Процедуры в модуле завязаны на состояние этого объекта MSWord, учитывают его. Можно передать, как вы говорите, на клиента объект "частично", но это получится уже некорректный, нецелостный объект.
3) Как ДокументОбъект поведет себя поведет при потере части своих данных? Что станет с поведением процедур, которые завязаны на потерянный COM?
Прошу конструктивно ответить на вопросы 1), 2), 3).
Спасибо.
По остальным пунктам - такие же нелепости.
(198)
Если не можете - не тратьте мое время.
(218)
Отвечаю: ДокументОбъект уничтожается каждый раз при возврате на клиента
Этот "пудреж" от 1С вы и смакуете раз за разом, вместо вдумчивого понимания - что происходит, и как оно должно быть.
Ерунда у вас и с третьим пунктом.
Поэтому это
Вопрос же "принадлежности" (цитата "Процедуры в модуле завязаны на состояние этого объекта MSWord, учитывают его. Можно передать, как вы говорите, на клиента объект "частично", но это получится уже некорректный, нецелостный объект.") тут вообще увидели только вы - COM объект (его "содержимое", ради чего его и "замутили") никаким образом не обновляется "онлайн", это всего-навсего подключение для получения данных из другой базы.
Захотели бы (или смогли - уж не знаю, у 1С причина обычно "ну не шмогла я, не шмогла...") - получили бы нормальный COM-"объект" со всеми нормально читаемыми реквизитами-причиндалами, а не какую-то ахинею со значением полей "COM-объект", которую надо дополнительно потом получать "индивидуально".
Понятно, что таким образом 1С как-бы говорит "там же ссылка на объект в другой базе, я не могу её "развернуть" в этой", но говорит как-то шепеляво, прикрыв рот рукой и отвернувшись в сторону.
Причем говорит это уже столько времени, что у тру-одноэсников выработалось стойкое "Так было всегда! Так должно быть! Знамена вверх!" ну и т.д., "не отдадим на поругание..." ))))
-------------------
В общем, конструктива у вас - ровно на составление слова "конструктив". А все описанное в статье - повторение размусоливания "мути" из желтых книжек (причем - неверное, пересказанное своими словами в меру собственного понимания и в силу "обожания", что мы и разобрали в (210))
И чего вы там все "щупаете"?
Эти переменные существуют отдельно, и передаются - да-да, тоже отдельно. И даже больше - они к объекту-то вообще никак не привязаны. Получай и передавай.
хм... то есть теперь объект, например, Документ.ПриходнаяНакладная - когда я этот объект "использую" со стороны, я должен еще знать, что там внутри есть "код объекта"...? и что этот код делает...? то есть я не могу тупо взять объект, перебрать его реквизиты (условно) и сделатьс реквизитами то что мне надо (например модифицировать реквизит). я еще каким-то образом должен знать, что я не могу модифицировать реквизит просто так ибо там еще какой-то код объекта должен выполниться?
.
странно, для меня как ключшечника - объект - это статическая структура, а код обработки объекта, или код взаимосвязи реквизитов когда при изменении одного реквизита меняется другой реквизит этого же объекта - такой код полностью независим от объекта, как и объект от кода...
Товарищ явно не понимает, что пишет, пытаясь недостаток знаний прикрыть одноэсовой кашей терминов и бессмысленного набором фраз, густо сдобренных невежеством, не зная ни 1С77, ни 8.х, ни вообще не понимая программирования, его функций, способов, целей и задач.
Про ВременноеХранилище - это он тоже от недостатка опыта и легкомыслия: этот "объект" в 1С доступен минимум в течении вызова других "объектов", и применяется как раз для передачи данных клиент-сервер на УФ в том числе.
Конечно, это не замена глобальной переменной или константе, - о чем предыдущий оратор из-за недостатка опыта даже не подозревает.
Процедура ПриОткрытии()
Сообщить(ПримерФункции());
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПримерФункции()
Возврат "Hello world!";
КонецФункции ПоказатьКонечно на сервер я иду не для того чтобы строковую константу вернуть, а например для выполнения запроса к базе или вызова эскортной процедуры из общего модуля (модуль без флажка "Вызов сервера").
1. по поводу самой статьи - нужная и полезная
2. по поводу ругани УФ и всего, что с ними связано
а) понятно, что если я с ОФ работаю на 7 лет дольше, то и привык, и накопилось много заготовок и утилит, чисто на автомате многое делаю, то на УФ оно неудобнее (пока?)
б) не знаю как у кого, у меня почему-то на одних и тех же серверах чисто открытие-сохранение-запуск и т.п. в конфах на УФ работает намного дольше, в разы. из-за этого тоже уходит много дополнительного времени, что раздражает (
Потом была УТ 11, уровень модификации которой заставляет говорить о совершенно иной, отличной от УТ, разработки. Там уже все отчеты на СКД, варианты отчетов, СКД-отборы, как функции для отбора значений, выгрузка СКД в табличные документы - это не говоря об управляемых формах, которые ни сначала, ни потом не вызывали никаких неприятных мыслей. Да, были в самом начале заморочки, но они быстро прошли. И те, кто до сих пор управляет видимостью отдельных элементов УФ с помощью кода, вызывают лишь улыбку. А посты в защиту толстого клиента не более, чем умиляют. И все из-за того, что нет хорошей и качественной документации об УФ, СКД, а теперь и асинхронному вызову форм. Но если ты не только в 1С умеешь программировать и знаешь о виртуальных объектах, которые могут отображать себя в каком-нибудь листбоксе, то такая ерунда, как управляемые формы вряд ли сможет ввести тебя в ступор надолго - так, на неделю для осмысления задуманного технологического чуда. А дальше уже нет никаких проблем с клиент-серверным взаимодействием, ибо просто меняешь подход, учитывая новые возможности. для которых старые подходы оказываются просто-напросто устаревшими.
Главным недостатком является попытка сделать часть значимых операций незаметными для программиста. В итоге вытекают последствия, которые существенно ограничивают в полном использовании всех предлагаемых возможностей.
Короче, УФ - это построенная четко под задачи типовиков система, которая при должной реализации могла бы стать реально полезным инструментом. Некий обрезок, который можно применять лишь для узкого типа задач и невозможно применять на уровне дельфи и с++. Слишком много ограничений у формы, слишком много отрезано возможностей.
Статья очень подробная, проясняющая многие принципы взаимодействия клиент-серверной технологии. Автору, большое спасибо и пожелания дальнейших таких же статей.
У меня есть вопрос. Можно ли создав общую форму, скажем для редактирования контактной информации контрагентов, физлиц, сотрудников и т.д, и её программно внедрить в форму соответствующего справочника?
Некий такой фрейм, который отображался во вкладке (на странице) формы справочника, а не вызывалась новая форма (много форм на экране - это всегда плохо). На мой взгляд, механизм фреймов был бы очень удобен: один внешний вид некоего блока информации, и один отлаженный функционал.
Заранее благодарен за ответы.
Хочется обработчики их модуля "фрейма" подключать, а не в модуле целевой формы заново создавать.
Делаете команду в форме, размещаете ее в панели навигации. В коде команды пишете, что окно должно быть тем же самым.
УсловияОтбора = Новый Структура;
УсловияОтбора.Вставить("ТипКонтрагента", "Поставщик");
УсловияОтбора.Вставить("Лояльность", "Надежный");
ПараметрыФормы = Новый Структура ("Отбор", УсловияОтбора);
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы);imho, может оно и круто, только кому это нужно. 1С по большей части используется как desktop приложение. А попытка сделать универсальный код, который будет выполняться и под веб-клиента привела к существенному усложнению кода. Да что там говорить, код становится просто нечитабельным. Все эти асинхронные вызовы, ограничения и особенности веб-клиента необходимо учитывать. Возьмите БСП и посмотрите реализацию какой-либо функции. Поддерживать такой код конечно можно, но вот как-то нет желания. Клиент-серверная архитектура это хорошо, а вот затачивать конфигурации под веб-клиент не слишком изящное решение. Чисто IMHO.
А ничего другого автор и не утверждал.
Что вынужденная разработка под тонкий клиент приносит дополнительные сложности в случаях, когда тонкий клиент не требуется - это уже отдельный разговор. Но и тут дело не в изяществе. Тут банальное отсутствие вариантов у 1С. Попытка развивать и поддерживать параллельно две концепции таит в себе гораздо больше проблем, чем неудобства разработчиков пилить тонкого клиента когда тонкий клиент не нужен. Никаких изящных решений тут в принципе быть не может. Банальный выбор меньшего из зол. Или скажите, как бы вы поступили на месте 1С.
А что именно вас напрягает из того, что спецом под веб-клиента заточено? Я такого особо и не припоминаю.
Разве что отказ от модальности, так это и так всегда считалось плохим тоном в UI, просто для веба это особенные неудобства создавало.
Про облачные решения согласен. Но есть сомнение в востребованности этих решений. Думаю, основные клиенты это мелкие компании. Навряд ли крупная, или даже средняя компания перейдет на аутсорс или сделает свое облако. В наших реалиях вопрос контроля и безопасности стоит на первом месте. И если, например, у 1С доля облачных решений 10 %, а все остальное это desktop приложения, то стоит ли затачивать систему под эти 10 % (цифры условные, но думаю соотношение примерно такое). Опять же, никому не навязываю, чисто IMHO :) . Это скорее мои размышления, полной уверенности в своей правоте у меня нет, но думаю такой взгляд тоже имеет право быть. Ну и надеюсь, когда-нибудь, они сделают нормальный асинхрон :) .
Да, в вашей статье это хорошо показано :). Понятно, что надо шагать в ногу со временем. Будем надеяться что 1С все таки реализует асинхрон с человеческим лицом :)
1. Фирма 1С стала продвигать кучу всяких сервисов 1СПАРК Риски, 1С:ДиректБанк, 1С-ЭДО и т.д, для работы которых в типовые конфигурации включаются большие блоки программного кода.
2. Наши "любимые" контролирующие органы автоматизируют свои системы и требуют от всех остальных интеграции и выгрузки данных в электронном виде в разных форматах (ЕГАИС, Маркировка, онлайн кассы по 54-ФЗ, Электронные больничные).
Поэтому в типовых конфигурации пухнут как на дрожжах.
Это нужно клиентам в первую очередь которые хотят зайти в базу 1С со своего iPad или iPhone, у которых распределенная структура услуги во Владивостоке, а бухгалтер в Красноярске.
И много ли найдется желающих через iphone или ipad заходить в базу 1С через веб-клиент. Смогут ли они нормально работать там? Сомневаюсь. Это должно быть реализовано по другому, на уровне сервисов. Есть конечно какой-то сегмент, в котором будут использовать веб-клиент (облачные решения в основном), но думаю он не очень велик.
2. Хранение значений, которые не требуют миграции между клиентом и сервером
зы:Я знаю,что в платформу встроен тест/манипулятор действий - для задачи не подходит
- а с какими данными связана например кнопка "Закрыть", которая тупо закрывает форму..?
Если передан УникальныйИдентификатор, не являющийся уникальным идентификатором формы, то значение будет удалено после завершения сеанса пользователя.
Если передан адрес уже удаленного значения, будет сгенерировано исключение.
Если параметр не указан, помещенное значение будет удалено после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 198766
Создание 26.08.13 18:47
Обновление 25.04.17 16:25
Просмотры 367620
Загрузки 0
Рейтинг
1292
Комментарии 293
Код открыт Не указано
Рубрики Механизмы платформы 1С
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)
