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

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

См. также

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

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

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

11.03.2024    3640    dsdred    48    

66

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

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

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

24.01.2024    5045    YA_418728146    25    

62

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

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

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

11.12.2023    6175    dsdred    36    

110

1С-ная магия

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

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

06.10.2023    18206    SeiOkami    46    

116

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

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

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

14.09.2023    11784    human_new    27    

72

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

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

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

28.08.2023    8568    YA_418728146    6    

139

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

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

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

20.08.2023    6207    sebekerga    54    

93

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15553    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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. Душелов 4013 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. Душелов 4013 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. Душелов 4013 23.11.09 09:25 Сейчас в теме
(8) Если есть возможность, дай свою конфигурацию посмотреть...
10. awk 741 23.11.09 09:31 Сейчас в теме
Пиши it@selenia.ru... Метода Вывести в Графической схеме нет. Есть в Географической. Я только одного не понимаю, почему 1С-ка зацикливается, вместо вывода ошибки.
11. Душелов 4013 23.11.09 10:21 Сейчас в теме
12. awk 741 23.11.09 11:04 Сейчас в теме
13. Душелов 4013 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. Душелов 4013 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. Душелов 4013 16.12.09 22:46 Сейчас в теме
(23) 1. Ничего не понятно.
2. Все заходит. В конфигураторе надо еще разрешить отладку.
И вообще, отлаживать серверные модули лучше в файловом режиме.
25. DimaP 63 19.12.09 17:37 Сейчас в теме
Разрешена отладка. Ещё сюрприз работы с SQL - это при запуске приложения в режиме отладки оно имеет свойство зависать на этапе заставки и нужно перезапустить всё - это только у меня?
26. Душелов 4013 20.12.09 14:31 Сейчас в теме
(25) Никаких таких проблем не замечено. У нас все работает в промышленной эксплуатации с тонким и веб-клиентом.
27. Елисеева 29.06.10 13:10 Сейчас в теме
Оставьте свое сообщение