При попытке развернуть все строки дерева на форме - разворачивает только первую строку...
Развертывание строк во всем дереве можно сделать вот так:
&НаКлиенте
Процедура РаскрытьДерево()
Строки = ДеревоСТрок.ПолучитьЭлементы();
Для каждого ТЕкСтрока из Строки Цикл
Элементы.ДеревоСтрок.Развернуть(ТекСтрока.ПолучитьИдентификатор());
КонецЦикла
КонецПроцедуры
Душелов пишет:
Код
&НаКлиенте
Процедура РазвернутьДерево()
Строки = ДеревоДанных.ПолучитьЭлементы();
Для сч = 0 По Строки.Количество() - 1 Цикл
Элементы.ДеревоДанных.Развернуть(сч, Истина);
КонецЦикла;
КонецПроцедуры
Попробуй так:
&НаКлиенте
Процедура РазвернутьДерево()
Строки = ДеревоДанных.ПолучитьЭлементы();
Для каждого Элемент ИЗ Строки Цикл
Элементы.ДеревоДанных.Развернуть(Элемент.ПолучитьИдентификатор(), Истина);
КонецЦикла;
КонецПроцедуры
А как лучше передать СписокЗначений из модуля документа в его форму, но до записи этого документа. Это нужно для реализации нестандартного ввода на основании. Пока документ не записан, ссылка пустая и его переменные - неопределенные.
помните ситуацию с потерей серверных переменных между клиентскими вызовами.
то есть следующий код
Перем гыСервернаяПеременная;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
гыСервернаяПеременная = "траливалипассатижи";
КонецПроцедуры
&НаСервере
Функция МояСервернаяПеременнаяЖива()
Если гыСервернаяПеременная = "траливалипассатижи" Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ВыполнитьНажатие(Команда)
Сообщить("Моя серверная переменная жива ? " + МояСервернаяПеременнаяЖива());
КонецПроцедуры
Показать
ну все мы знаем что в серверной переменной будет Неопределенно в момент вызова сервера с клиента, но вот почему я до сих пор не знал точно/
Но на просторах партнерского форума я обнаружил следующий комментарий:
Перем <какая-то-переменная>;
Это будет каждый раз инициализироваться при вызове серверных процедур. (т.е. при переходе контекста на серверный).
если это так ТО:
1. был прав mini_root что "1С-ники не умеют хранить состояние сервера между клиентскими вызовами" 2. .....
P.S. Ну вот как так можно - блин: если я объявляю переменную внутри модуля - я ожидаю что ее жизненный цикл будет равен жизненному циклу этого модуля, а тут нифига.
Добрый день. На ту же тему. В модуле формы документа НАКЛИЕНТЕ я не могу перебрать табличную часть справочника Номеклатура(Номенклатура-один из реквизитов документа) и на ее основании заполнить табличную часть уже документа. Насколько я понимаю все это необходимр сделать НАСЕРВЕРЕ. Подскажите как это правильнее сделать. Передать таблицу значений с сервера на клиент не получается.
Для Каждого Строка Из Комплект.СоставКомплекта Цикл
НоваяСтрока = ТЧасть.Добавить();
НоваяСтрока.Номенклатура = Строка.НоменклатураКомплекта;
НоваяСтрока.Количество = Строка.Количество;
Вплотную занялся 8.2.
Изучил проблему ВК в 8.2 :) Не визуальные актив-иксы работают на ура (тестирую чтение/запись экзелевских файлов напрямую) не серверной части (что очень удобно, не надо устанавливать ВК на клиентских машинах).
Но столкнулся с платформенными "фичами".
Из серверной части в клиентскую не могу передать ТЗ:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: ret Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Value Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable'
Аналогично - вчера решил написал простейшую обработку (выполнение запроса и вывод результата в таблицу). Нашел еще один странный момент: если написать функцию выполняющуюся в серверном контексте и возвращающее ТЗ, а потом вызвать ее из клиента (из процедуры помеченной "&НаКлиенте") - получим как раз исключение с ValueTable. А если объявить реквизит типа ТЗ и заполнить его в серверном контексте, то потом эти же данные будут видны и клиенту. Более того, можно замечательно заполнять ТабличныйДокумент в серверном контексе и видеть результат в тонком клиенте. Но тут надо отметить, что я использовать вырожденный случай - реального сервера как такового не было, надо будет поднять апач и еще раз проверить уже с корректным разделением на клиента и сервера.
Либо там внутри сделан какой-то дикий костыль, который позволяет прозрачно работать с реквизитами клиенту и серверу, не имеющий ничего общего с механизмами сериалиазации/десериализации, про которые благополучно забыли - это ОЧЕНЬ плохой вариант, потому что мы возвращаемся к написанию софта с одними "глобальными" переменными + скорее всего, невозможность выцепить чего-нить на клиента именно для автономной работы. Но тут могу ошибаться.
Либо одинэсовцы чего-то не доделали.
Либо я чего-то не понял.
P.S. Меня вообще всегда шокировала невозможность сериализации универсальных коллекций - уже это то надо было сделать в первую очередь, но будем надеяться на лучшее. Идеи у одинэсовцев здравые, но тут главное не обделаться с реализацией, что, к сожалению, весьма вероятно.
Щас раскопал еще одну граблю - модуль формы у них stateless. Ты конечно можешь объявить там переменную модуля, но значение свое она сохранять не будет, даже между двумя вызовами методов помеченных как "&НаСервере".
По поводу (1). На тонком клиенте нет объекта "ТаблицаЗначений".
Так что нашел выход ;)
&НаСервере
Функция ТаблицуЗначенийВМассив(ТЗ) Экспорт
МассивТЗ = Новый Массив();
Для Каждого Стр Из ТЗ Цикл
СтрокаТЗ = Новый Структура;
Для сч = 0 По ТЗ.Колонки.Количество() - 1 Цикл
СтрокаТЗ.Вставить(ТЗ.Колонки.Получить(сч).Имя, Стр[сч]);
КонецЦикла;
МассивТЗ.Добавить(СтрокаТЗ);
КонецЦикла;
Возврат МассивТЗ;
КонецФункции
Показать
Аналогично можно сделать дерево ;) Добавить только структуру "Строки" - с массивом подчиненных строк.
Мда, а потом ручками его туда-сюда? В 8.2 принудительно приходится использоваться разделение на клиента и сервера: запрос ты на клиентской стороне не выполнишь, а раз так - должен быть какой-то прозрачный механизм передачи данных. И он таки есть, но только не на основе передачи, а на основе общих реквизитов. Попробуй создать реквизит типа ТабилицаЗначений и заполнить его на серверной стороне, а потом прочитать данные на клиенте.
(11) Не-не-не, я могу конечно ошибаться, но ты посмотри как там конструкция устроена: объявляется реквизит типа ТЗ, добавляется на форме Таблица и привязывается к ТЗ. Таблица на форме, то есть на клиенте, а ее источник данных на сервере. Заполняешь таблицу ручками на форме, а из метода помеченного "&НаСервере" достаешь данные из ТЗ. Вот и получается, что ТЗ разделяется клиентом и сервером. Как это там внутри сделано - хз.
(14) Прибавь сюда невнятную ситуацию с сохранением состояния глобальных для модуля формы переменных на серверной стороне и получатся крайне симпатичные грабельки, причем детские, которые будут доставлять массу удовольствия всем подряд. Впрочем, может быть к релизу они это исправят.
Сегодня продолжу безумные эксперименты, меня тоже интересует вопрос COM'ов и ActiveX'ов.
Еще один нюанс: создай обработку, создай в модуле обработки процедуру с экспортом, создай форму... а потом попробуй из модуля формы (из серверной процедуры) вызвать процедуру в модуле обработки.
(15) Ну с комами и активиксами работает нормально, если не сериализовать ;)
(16) Я уже с этим столкнулся - когда попытался вызвать методы модуля справочника.
У меня глобальная переменная модуля формы в обработке упорно не хочет сохранять свое состояние между двумя вызовами серверных процедур. Все помечено НаСервере, но вот переменная свое состояние теряет.
(21) А мне он не нужен на клиенте - мне надо чтобы он хранился где-нибудь между двумя вызовами серверных процедур, а не превращался в Неопределено, как в случае с глобальной переменной модуля формы.
{Обработка.УниверсальнаяКонсоль.Форма.Форма.Форма(11)}: Поле объекта не обнаружено (Менеджер)
Параметры.Менеджер = Новый МенеджерВременныхТаблиц();
Зато с реквизитом произвольного типа вот такая хрень:
{Обработка.УниверсальнаяКонсоль.Форма.Форма.Форма(11)}: Ошибка при установке значения атрибута контекста (Реквизит1): Тип "МенеджерВременныхТаблиц" не может использоваться в данных формы
Реквизит1 = менеджерВременныхТаблиц;
по причине:
Тип "МенеджерВременныхТаблиц" не может использоваться в данных формы
{Обработка.УниверсальнаяКонсоль.Форма.Форма.Форма(11)}: Поле объекта не обнаружено (Менеджер)
Параметры.Менеджер = Новый МенеджерВременныхТаблиц();
при том что в выпадающем списке он таки есть....
Зато с реквизитом произвольного типа вот такая хрень:
{Обработка.УниверсальнаяКонсоль.Форма.Форма.Форма(11)}: Ошибка при установке значения атрибута контекста (Реквизит1): Тип "МенеджерВременныхТаблиц" не может использоваться в данных формы
Реквизит1 = менеджерВременныхТаблиц;
по причине:
Тип "МенеджерВременныхТаблиц" не может использоваться в данных формы
1. возврат ТЗ на клиента из сервера не возможен - судя по документации это фича, а не баг (в документации отдельно написано что разработчик должен сам тады позаботиться о сериализации)
2. хранение состояний мне удалось добиться этого с помощью реквизитов формы (ведь их не обязательно отображать на форме)
3. реквизит Объект доступен по умолчанию и хранит ссылку на объект Обработка (в моем отладочном примере) - так что ДанныеУправляемойФормы тоже получаются доступны на сервере
4. менеджер временных таблиц = 1С-нина мне однозначно говорит что нефиг хранить такой объект в данных формы
короче - для меня лично ожидаемое поведение новой платформы
Последние процедуры дергаются из соответствующих клиентских методов (ПриОткрытии и ПриЗакрытии)
1. Если откомментировать QQQ - мы увидим что в переменной модуля обработки дейстивтельно сохранился менеджер временных таблиц.
2. А если закомментировать QQQ, и откомментировать WWW - мы видим что там нихрена нету.
Вопрос - иде собственно сохранение состояния экземпляра обработки, при том что именно обработка в 1С всегда существовала именно в виде экземпляра (чем и пользовались 1С++'ники)?
P.S. Я скажу больше, если сделать вот так:
&НаСервере
Процедура СерверПриОткрытии()
об = ПолучитьОбъект();
об.УстановитьМенеджерВременныхТаблиц(Новый МенеджерВременныхТаблиц());
УстановитьОбъект(об);
об = ПолучитьОбъект();
ВызватьИсключение "QQQ " + об.ПолучитьМенеджерВременныхТаблиц();
КонецПроцедуры
(33) А меня вот глюки с потерей состояния мягко говоря расстраивают (если совсем по честному - это полный П) - продолжу играться дальше, но ИМХО платформа пока мертвая. Надо подождать какой-нибудь 8.2.20...
Кстати, иногда при запуске конфигурации вылетает ошибка "типа не найден такой-то регистр (в моем случае регистр версирования объектов, что присутствует в подсистемах разработчика)...
А потом нормально все...
Сегодня под администратором вываливался на типовом мониторе активных пользователей, не хватало прав на получение списка активных соединений... А потом прокатило...
Забавно :)
Но в целом работает, только не забыть отрубить касперский на клиентской машине или сильно поковырять, чтобы он не реагировал на тонкого и веб-клиента.
И еще так и не понял, как убрать регистр сведений из панели навигации ("Перейти"), у той же номенклатуры, только убрав галочку у регистра "Использовать стандартные команды"...
В документах (в остальном пока не пробовал особо) не отображаются label-ы (надписи). Только поля ввода без надписей, табличные поля, именованные области, а надписей нет! Выгружаю базу в ДТ, загружаю в файловую на винде - все ОК. Типовая, не типовая, самописная - без разницы.
(43) Не, это специфичный глюк под конкретную ОС, его рано или поздно пофиксят, и он не так страшен как те же висящие сессии от умершего веб клиента (с учетом транзакций/блокировок) или потеря состояния глобальной переменной на сервере.
P.S. Кстати, кто-нибудь пробовал держать транзакцию между двумя вызовам серверных методов?
Структ = новый Структура("Ключи", Новый Структура());
Структ.Ключи.Вставить("Первый", Новый Структура());
Структ.Ключи.Первый.Вставить("Ключи", Новый Структура());
Структ.Ключи.Вставить("Второй", Новый Структура());
Структ.Ключи.Второй.Вставить("Ключи", Структ);
{Обработка.ТестированиеСерверныхКонтекстов.Форма.ФормаОбработки(13)}: Ошибка при вызове метода контекста (ЗафиксироватьТранзакцию): Транзакция не активна
* Два клиентских вызова серверного метода
* При первом транзакция открывается
* При втором закрывается
Ошибку вы видите выше
Собственно и это опять по вроде как по дзену, и не совсем понятно реальное применение транзакций между клиентскими вызовами...
переменные "Перем" заставить хранить состояние мне так и не удалось, по дзену получается что необходимо использовать РеквизитОбъектаФормы или РеквизитФормы
(55) Лёх, понимаешь, есть вещи которые работают неправильно по сути и от дзена это не зависит:
- состояния
- потеря транзакции между двумя серверными вызовами (скорее всего, причины те же, что и при потери состояния) (44)
- висящие сессии и, скорее всего, отсутствие явного управления жизненным циклом сессии на серверной стороне (тогда бы можно было сделать корректное завершение серверного контекста по таймауту для отвалившегося клиента).
(56) уже вышла тестовая, она же видимо сегодня станет и финальной - я на ней и экспериментировал
по поводу дзена:
давай исходить из того что 1С-овцы не дураки.
если сейчас у финальной (не тестовой) версии платформы такое поведение , то значит что это неспроста
причин может быть две
* 1С-овцы сдеалали это специально, и это для чего то надо
* 1С-овцы не сделали это осознанно, но сделают в будущем.
короче вопрос открытый
ЗЫ кто-нибудь кстати видел в Демонстрационной, Управлении Торговлей и Архиве которые вроде заточены под 8.2 использование ключевого слова Перем в модулях отличных от глобальных.
* Сделали НЕ осознано, и теперь будут с той или иной степенью интенсивности исправлять (или уже исправили, или не будут исправлять).
Не надо считать меня ретроградом, 1С рулит (у нас обоих была и есть прекрасная возможность увидеть это своими глазами), но если желто-красные товарищи обоср*лись - я не буду молчать и делать вид, что ничего не произошло и все по Радченко. Тем более, что и раньше такие косяки за ними водились: те же веб-сервисы в 8.1 - жизненный цикл контекста не отрабатывает (ПриНачале.../ПриЗавершении...), методы объявленные в глобальнике не доступны и пр. прелести.
P.S. Давай подождем и посмотрим, что будет в 8.2.10.
(60) Тем более, я вроде бы нигде не видел громогласных официальных заявлений о том, что пользоваться глобальными переменными нельзя и надо исходить из того, что серверная часть stateless - щас бы тут такой вой стоял, это ж любимый прием одинэсеров :) Да и если честно, какие есть альтернативы в процедурном ЯП одинэса? Особенно, если надо сохранить нечто, что не отображается на БД и не помещается в реквизиты формы....
(60) про ретроградство, небольшое алаверды - не надо меня считать идеологом тезиса "1С всегда прав"
я тоже копаю, но опять с другой точки зрения - меня больше интересует почему именно так... в нашу бы дискуссию потянуть кого-нибудь кто доступ имеет к партнерскому форуму, или хоть какой то информацией обладает из кулуаров...
ладно этот наш с тобой спор видимо вечен
докладываю коротко: на платформе 8.2.10 поведение исследованных вещей не изменилось. В списке исправлений на сайте 1С ничего про наши проблемы не сказано.
И еще раз советую всем подглядеть уже имеющиеся конфигурации для УправляемогоПриложения. Как там сделано. В том числе и библиотеку стандартных подсистем.
Ушел к доктору на УЗИ - вернусь в 14:00 :)
ЗЫ Сегодня ночью попробовал перелить через стандартный ВебСервис 1С 30.000 проводок (то есть забрать в клиента быстренько на RORе сделанном) через один вызов ;) , 1С отвалилось с превышением по памяти.
ЗЫЫ Даже vandalsvq на 1С++ форуме заметил что под 8.2 стиль программирования и собственно "голову" придется менять, о чем кстати я и говорил