"Маленькие" неприятности 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)

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

13.03.2024    2525    dsdred    16    

57

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5796    dsdred    53    

82

Как готовить и есть массивы

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

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

24.01.2024    5785    YA_418728146    25    

67

Планы обмена VS История данных

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6914    dsdred    36    

113

1С-ная магия

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

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

06.10.2023    18991    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12664    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    9331    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6508    sebekerga    54    

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


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

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

Вывести (Put)

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

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

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

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


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

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

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


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

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

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

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


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

&НаСервере
Процедура ПолучитьКарту(БизнессПроцесс)
	Схема = БизнессПроцесс.ПолучитьОбъект().ПолучитьКартуМаршрута();
КонецПроцедуры
+
14. awk 741 23.11.09 11:58 Сейчас в теме
15. afanasko 35 23.11.09 12:21 Сейчас в теме
(0) Фиг с ней, с этой схемой! Ты лучше расскажи как конфигуратор на Убунту запустил )))
+
16. awk 741 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. Душелов 4017 25.11.09 10:10 Сейчас в теме
(18) А в чем проблема использования РеквизитФормыВЗначение и ЗначениеВРеквизитФормы ?
+
20. MSensey 49 25.11.09 12:13 Сейчас в теме
(19) Поясню на задаче.
На клиенте пользователь вводит настройки. Потом хочет получить информацию.
Для этого мы идем на сервер. Получаем данные, по ним формируем информацию и возвращаем ее.
При этом полученные данные хотелось бы сохранить, чтобы не получать снова.
В 8.1 для этого мы записывали ее в реквизиты объекта или переменные.
В 8.2. так делать нельзя, т.к. в первом случае они приедут на клиента, а во втором случае потеряются.
+
22. awk 741 26.11.09 13:07 Сейчас в теме
Я сделал то же самое, но не помогло. Хотя мистики тут нет. Все просто путь поиска файла (nethasp.ini) начинается с каталога программы, потом переходит в каталог программы\conf потом смотрит ConfLocation в conf.cfg
+
23. DimaP 63 16.12.09 21:47 Сейчас в теме
Общее (видимо для 8.1 и 8.2 +sql), относительно процедур НаКлиенте и НаСервере:
1) сначала оказывается надо передать управление общему модулю, вот там выполнятся серверные, а в модуле (скажем, объекта) не получается жонглировать взаимными вызовами из НаКлиенте процедур НаСеревер :(
2) отладчик не заходит в серверные процедуры (даже если я выполняю отладку на самом сервере, но это, видимо, никак не влияет и не связано).
+
24. Душелов 4017 16.12.09 22:46 Сейчас в теме
(23) 1. Ничего не понятно.
2. Все заходит. В конфигураторе надо еще разрешить отладку.
И вообще, отлаживать серверные модули лучше в файловом режиме.
+
25. DimaP 63 19.12.09 17:37 Сейчас в теме
Разрешена отладка. Ещё сюрприз работы с SQL - это при запуске приложения в режиме отладки оно имеет свойство зависать на этапе заставки и нужно перезапустить всё - это только у меня?
+
26. Душелов 4017 20.12.09 14:31 Сейчас в теме
(25) Никаких таких проблем не замечено. У нас все работает в промышленной эксплуатации с тонким и веб-клиентом.
+
27. Елисеева 29.06.10 13:10 Сейчас в теме
Спасибо, помогло :)
+
Внимание! Тема сдана в архив