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

23.11.09

Разработка - Механизмы платформы 1С

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

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

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

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

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

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

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

 

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

&НаКлиенте

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

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

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

&НаСервере

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

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

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

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

 

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

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

 

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


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


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

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

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


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

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

 

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

dushelov 23.11.2009 11:49:35

(12)

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

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    8749    bayselonarrend    20    

156

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    6592    dsdred    18    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    20555    YA_418728146    26    

72

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24550    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15710    YA_418728146    8    

170
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. maxlab 77 22.11.09 01:40 Сейчас в теме
Сразу хочу предупредить о "кроссплатформенности" данного продукта - это пока миф. Сервер 1С на Debian 5 вылетает примерно раз в два часа. Может конечно и руки кривые, но на Windows 2003 все работает, причем быстрее.


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

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

Вывести (Put)

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

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

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

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


Сборка такая же - 1С:Предприятие 8.2 (8.2.9.356)
5. DimaP 64 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. Душелов 4021 22.11.09 19:37 Сейчас в теме
(5) Я думаю, что стоит прочитать документацию и руководство разработчика. Там черным по белому написано про объекты, которые используются в тонком клиенте.

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

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


Зачем нагружать обработкой клиентские машины?
7. awk 744 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 744 23.11.09 09:00 Сейчас в теме
dushelov 22.11.2009 10:51:09

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

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

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


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

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