gifts2017

"Маленькие" неприятности 1С 8.2

Опубликовал Василий Казьмин (awk) в раздел Программирование - Практика программирования

Иногда одна строчка кода может быть гениальной и рождается годами, но на эти несколько строк я убил день. Как же рождалась графическая схема в 1С 8.2.

    В ноябрьском выпуске ИТС появился дистрибутив 1С 8.2.9.356 и я решил его опробывать. Сразу хочу предупредить о "кроссплатформенности" данного продукта - это пока миф. Сервер 1С на Debian 5 вылетает примерно раз в два часа. Может конечно и руки кривые, но на Windows 2003 все работает, причем быстрее.

    Однако встала у меня задача по отображению карты маршрута бизнеспроцесса на управляемой форме. Но не просто, а для каждой строки таблицы - своя карта.

Сделал я форму и написал код:

Процедура ВыполнениеНарядовПриАктивизацииСтроки(Элемент)

     Карта = Элементы.ВыполнениеНарядов.ТекущаяСтрока.ПолучитьОбъект().ПолучитьКартуМаршрута();

    Схема.УстановитьСхему(Карта);
КонецПроцедуры

 

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

&НаКлиенте

Процедура ВыполнениеНарядовПриАктивизацииСтроки(Элемент)

     ПолучитьКартуНаСервере(Элементы.ВыполнениеНарядов.ТекущаяСтрока);

КонецПроцедуры

&НаСервере

Процедура ПолучитьКартуНаСервере(Процесс)

     Карта = Процесс.ПолучитьОбъект().ПолучитьКартуМаршрута();

    Схема.УстановитьСхему(Карта);

КонецПроцедуры

 

дальше произошло очень интересное событие. 1С ушло в бесконечную рекурсию.

Я долго боролся с ней, но когда поборол, то оказалось, что метода "УстановитьСхему" просто нет. Код преобразился до:

 

&НаКлиенте
Процедура ВыполнениеНарядовПриАктивизацииСтроки(Элемент)
    // Вставить содержимое обработчика.
    Карта = ПолучитьКарту(Элементы.ВыполнениеНарядов.ТекущаяСтрока);
    ИмяФайла = КаталогВременныхФайлов() + Элементы.ВыполнениеНарядов.ТекущаяСтрока;
    Карта.Записать(ИмяФайла);
    Схема.Прочитать(ИмяФайла);
КонецПроцедуры


&НаСервере
Функция ПолучитьКарту(БизнессПроцесс)
    Возврат БизнессПроцесс.ПолучитьОбъект().ПолучитьКартуМаршрута();
КонецФункции


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

Код который оказался в конце:

&НаКлиенте
Процедура ВыполнениеНарядовПриАктивизацииСтроки(Элемент)
    // Вставить содержимое обработчика.
    ПолучитьКарту();
КонецПроцедуры


&НаСервере
Процедура ПолучитьКарту()

    БизнессПроцесс = Элементы.ВыполнениеНарядов.ТекущаяСтрока;
    Карта = БизнессПроцесс.ПолучитьОбъект().ПолучитьКартуМаршрута();
    ИмяФайла = КаталогВременныхФайлов() + БизнессПроцесс;
    Карта.Записать(ИмяФайла);
    Схема = Новый ГрафическаяСхема;
    Схема.Прочитать(ИмяФайла);
КонецПроцедуры

 

И самый простой вариант как я говорил: прост и гениален...

dushelov 23.11.2009 11:49:35

(12)

Код
&НаСервере
Процедура ПолучитьКарту(БизнессПроцесс)
   Схема = БизнессПроцесс.ПолучитьОбъект().ПолучитьКартуМаршрута();
КонецПроцедуры

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Анатолий Щербаков (maxlab) 22.11.09 01:40
Сразу хочу предупредить о "кроссплатформенности" данного продукта - это пока миф. Сервер 1С на Debian 5 вылетает примерно раз в два часа. Может конечно и руки кривые, но на Windows 2003 все работает, причем быстрее.


На FC8(32bit) работает уже две недели на пару с 8.1
2. Василий Казьмин (awk) 22.11.09 09:51
А какая сборка 1С? Вылетала, кстати, когда работали две базы. В одну я переносил из семерки данные, а в другой активно конфигуратором пользовался.
3. dushelov (Душелов) 22.11.09 10:51
>метода "УстановитьСхему" просто нет

Он есть. Только называется "Вывести"

Вывести (Put)

Синтаксис:
Вывести(<Схема>)

Параметры:
<Схема> (обязательный)
Тип: ГеографическаяСхема. Выводимая схема.

Описание:
Выводит в схему данные из макета географической схемы.

Доступность:
Сервер, толстый клиент, внешнее соединение.
4. Анатолий Щербаков (maxlab) 22.11.09 18:05
А какая сборка 1С? Вылетала, кстати, когда работали две базы. В одну я переносил из семерки данные, а в другой активно конфигуратором пользовался.


Сборка такая же - 1С:Предприятие 8.2 (8.2.9.356)
5. Дмитрий Павлик (DimaP) 22.11.09 19:32
Да, "сюрпризы" есть.
Платформа 8.2.9.356
Конфа своя
Почему-то при попытке передать с сервера на веб-клиент маленькую таблицу значений выдаёт ошибку -мол такое нельзя :cry:

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	
	Если Объект.IP<>"" Тогда 	
		Результат= ЗапросПоИП(Объект.IP,Объект.Код);
		Если Результат=0 Тогда 
			Отказ=0;
		Иначе 
			Предупреждение("IP "+Объект.IP+" уже используется!");
			Отказ=1;
		КонецЕсли;
	КонецЕсли; // ip неопределён
...Показать Скрыть


&НаСервере
Функция ЗапросПоИП(IP,Код)
		ЗапросПоIP=Новый Запрос;
		ЗапросПоIP.Текст="ВЫБРАТЬ
						 |	ФИОПользователя.IP,
						 |	ФИОПользователя.Код,
						 |	ФИОПользователя.Выбыл
						 |ИЗ
						 |	Справочник.ФИОПользователя КАК ФИОПользователя
						 |ГДЕ
						 |	ФИОПользователя.IP = &IP
						 |	И ФИОПользователя.Код <> &Код
						 |	И ФИОПользователя.Выбыл = &Ложь";
		ЗапросПоIP.УстановитьПараметр("IP",IP);
		ЗапросПоIP.УстановитьПараметр("Код",Код);
		ЗапросПоIP.УстановитьПараметр("Ложь",Ложь);
		Результат=ЗапросПоIP.Выполнить().Выгрузить();
		Возврат Результат.Количество();
КонецФункции // ()
...Показать Скрыть


Просто Результат нельзя передать ...
6. dushelov (Душелов) 22.11.09 19:37
(5) Я думаю, что стоит прочитать документацию и руководство разработчика. Там черным по белому написано про объекты, которые используются в тонком клиенте.

В приведенном выше примере эту проверку надо делать в контексте сервера:

&НаКлиенте 
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) 
    Отказ = ПроверитьIP();
КонецЕсли; // ip неопределён


Зачем нагружать обработкой клиентские машины?
7. Василий Казьмин (awk) 23.11.09 08:44
А ещё есть ПередЗаписьюНаСервере()
и
ЗапросПоIP=Новый Запрос;
ЗапросПоIP.Текст="ВЫБРАТЬ
| ФИОПользователя.IP,
| ФИОПользователя.Код,
| ФИОПользователя.Выбыл
|ИЗ
| Справочник.ФИОПользователя КАК ФИОПользователя
|ГДЕ
| ФИОПользователя.IP = &IP
| И ФИОПользователя.Код <> &Код
| И ФИОПользователя.Выбыл = &Ложь";
ЗапросПоIP.УстановитьПараметр("IP",IP);
ЗапросПоIP.УстановитьПараметр("Код",Код);
ЗапросПоIP.УстановитьПараметр("Ложь",Ложь);
Результат=ЗапросПоIP.Выполнить().Выгрузить();
Возврат Результат.Количество();
я бы заменил на:
ЗапросПоIP=Новый Запрос;
ЗапросПоIP.Текст="ВЫБРАТЬ
| ВЫБРАТЬ Первые 1 ФИОПользователя.Ссылка
|ИЗ
| Справочник.ФИОПользователя КАК ФИОПользователя
|ГДЕ
| ФИОПользователя.IP = &IP
| И ФИОПользователя.Код <> &Код
| И ФИОПользователя.Выбыл = &Ложь";
ЗапросПоIP.УстановитьПараметр("IP",IP);
ЗапросПоIP.УстановитьПараметр("Код",Код);
ЗапросПоIP.УстановитьПараметр("Ложь",Ложь);
Отказ = Не ЗапросПоIP.Выполнить().Пустой();
Душелов; +1 Ответить
8. Василий Казьмин (awk) 23.11.09 09:00
dushelov 22.11.2009 10:51:09

>метода "УстановитьСхему" просто нет

Он есть. Только называется "Вывести"

Есть, но приложение уходит в бесконечную рекурсию.
	Карта = БизнессПроцесс.ПолучитьОбъект().ПолучитьКартуМаршрута();
	//ИмяФайла = КаталогВременныхФайлов() + Элементы.ВыполнениеНарядов.ТекущаяСтрока;
	//Карта.Записать(ИмяФайла);
	Схема = Новый ГрафическаяСхема;
	//Схема.Прочитать(ИмяФайла);
	Схема.Вывести(Карта);
...Показать Скрыть


Перед тем как написать проверь. (Проверял на тонком клиенте)
9. dushelov (Душелов) 23.11.09 09:25
(8) Если есть возможность, дай свою конфигурацию посмотреть...
10. Василий Казьмин (awk) 23.11.09 09:31
Пиши it@selenia.ru... Метода Вывести в Графической схеме нет. Есть в Географической. Я только одного не понимаю, почему 1С-ка зацикливается, вместо вывода ошибки.
11. dushelov (Душелов) 23.11.09 10:21
12. Василий Казьмин (awk) 23.11.09 11:04
13. dushelov (Душелов) 23.11.09 11:49
(12)

&НаСервере
Процедура ПолучитьКарту(БизнессПроцесс)
	Схема = БизнессПроцесс.ПолучитьОбъект().ПолучитьКартуМаршрута();
КонецПроцедуры
14. Василий Казьмин (awk) 23.11.09 11:58
15. Dmitry Afanasyev (afanasko) 23.11.09 12:21
(0) Фиг с ней, с этой схемой! Ты лучше расскажи как конфигуратор на Убунту запустил )))
16. Василий Казьмин (awk) 23.11.09 16:55
Virtual box - хорошо виден на скриншоте. На debian lenny и из-под wine заработал. Только вылетает при создании форм. Говорит Ключ защиты больше не доступен. На Ubuntu ключа так и не видит. Интересно кто виноват wine или 1С...
P.S. 8.1 под wine не вылетает.
17. Александр Пронюшкин (pron2) 25.11.09 06:47
Структура кода должна быть определена не прикладной логикой, а логикой клиент-серверного взаимодействия
Нужно научиться мыслить клиент-серверной логикой!
18. Sensey Master (MSensey) 25.11.09 09:21
Для меня один из главных сюрпризов, то что объект не хранится на сервере. При переходе с клиента на сервер объект создается заново.
При этом заполняется данными которые есть на клиенте. Но ведь на клиенте не все можно хранить. Получается, что нужно использовать временные хранилища. Вобщем гемор.
19. dushelov (Душелов) 25.11.09 10:10
(18) А в чем проблема использования РеквизитФормыВЗначение и ЗначениеВРеквизитФормы ?
20. Sensey Master (MSensey) 25.11.09 12:13
(19) Поясню на задаче.
На клиенте пользователь вводит настройки. Потом хочет получить информацию.
Для этого мы идем на сервер. Получаем данные, по ним формируем информацию и возвращаем ее.
При этом полученные данные хотелось бы сохранить, чтобы не получать снова.
В 8.1 для этого мы записывали ее в реквизиты объекта или переменные.
В 8.2. так делать нельзя, т.к. в первом случае они приедут на клиента, а во втором случае потеряются.
21. Артемий Трушин (extreme) 25.11.09 21:42
(16) ключ в 8.2 на ubuntu под wine заставили видеть методом тыка, хотя мистики я не понял: nethasp.ini с прописанным ip менеджера лицензий переложили из 1Cv82/conf/ в 1Cv82/8.2.9.356/bin/conf/ - и заработало сразу.
До этого стабильно ругался при запуске "Ключ защиты более недоступен"
22. Василий Казьмин (awk) 26.11.09 13:07
Я сделал то же самое, но не помогло. Хотя мистики тут нет. Все просто путь поиска файла (nethasp.ini) начинается с каталога программы, потом переходит в каталог программы\conf потом смотрит ConfLocation в conf.cfg
23. Дмитрий Павлик (DimaP) 16.12.09 21:47
Общее (видимо для 8.1 и 8.2 +sql), относительно процедур НаКлиенте и НаСервере:
1) сначала оказывается надо передать управление общему модулю, вот там выполнятся серверные, а в модуле (скажем, объекта) не получается жонглировать взаимными вызовами из НаКлиенте процедур НаСеревер :(
2) отладчик не заходит в серверные процедуры (даже если я выполняю отладку на самом сервере, но это, видимо, никак не влияет и не связано).
24. dushelov (Душелов) 16.12.09 22:46
(23) 1. Ничего не понятно.
2. Все заходит. В конфигураторе надо еще разрешить отладку.
И вообще, отлаживать серверные модули лучше в файловом режиме.
25. Дмитрий Павлик (DimaP) 19.12.09 17:37
Разрешена отладка. Ещё сюрприз работы с SQL - это при запуске приложения в режиме отладки оно имеет свойство зависать на этапе заставки и нужно перезапустить всё - это только у меня?
26. dushelov (Душелов) 20.12.09 14:31
(25) Никаких таких проблем не замечено. У нас все работает в промышленной эксплуатации с тонким и веб-клиентом.
27. НедавноНачалаПисатьНа1С (Елисеева) 29.06.10 13:10
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа