Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Плагин Данные / Переиспользует состояние, если есть вложенные вызовы #825

Closed
kuntashov opened this issue Dec 18, 2020 · 2 comments
Labels
Milestone

Comments

@kuntashov
Copy link
Contributor

Есть такой код:

	Номенклатура1С = Данные.НачатьСоздание("Справочник.Номенклатура")
		.Реквизит("ВидНоменклатуры", НовыйВидНоменклатуры())
		.Создать(); 

Метод НовыйВидНоменклатуры() определен так:

Функция НовыйВидНоменклатуры()
   	ВидНоменклатуры = Данные.НачатьСоздание("Справочник.ВидыНоменклатуры")
		.Создать();	
	Возврат ВидНоменклатуры;
КонецФункции

В результате в переменной Номенклатура1С у нас объект СправочникСсылка.ВидНоменклатуры, а ожидал, что будет СправочникСсылка.Номенклатура.

Судя по всему, плагин использует единственный экземпляр обработки и все состояние хранит в нем, поэтому вложенные вызовы невозможны.

Это не удобно/не естественно и про такую особенность нужно помнить, а если забыть - сложно отлаживать.

В качестве обхода можно делать так:

    ВидНоменклатуры = НовыйВидНоменклатуры();

	Номенклатура1С = Данные.НачатьСоздание("Справочник.Номенклатура")
		.Реквизит("ВидНоменклатуры", ВидНоменклатуры)
		.Создать(); 

Но это тоже не всегда удобно (и опять же, про это нужно знать/помнить).

В качестве решения предлагаю рассмотреть возможность сделать так, чтобы метод НачатьСоздание() возвращал новый экземпляр плагина "Данные".

@artbear
Copy link
Collaborator

artbear commented Dec 18, 2020

@kuntashov интересно.

предложение метод НачатьСоздание() возвращал новый экземпляр плагина "Данные"полезно.
но возможно особенности использования создания объектов через КонтекстЯдра.

в серверных тестах проще всего заюзать вариант
НовыйОбъект = ВнешниеОбработки.Создать("Данные");

особенность работы на сервере

если у плагина Данные имя метаданные Данные

@artbear
Copy link
Collaborator

artbear commented Dec 18, 2020

@kuntashov в принципе, я с этой проблемой разобрался.
как я и предполагал, так и решается

одна проблема
теперь нельзя юзать такой код - т.е. отдельно обращаться к методам уже после создания

  • особенность текучих интерфейсов
Данные.НачатьСоздание("Справочники.Справочник1")
	.Реквизит("СоставнойРеквизит");
ОбъектДанных = Данные.Создать();

правильно

ОбъектДанных = Данные.НачатьСоздание("Справочники.Справочник1")
	.Реквизит("СоставнойРеквизит")
	.Создать();

в тестах был именно такой код, он легко и просто исправлен.

проблема небольшая и легко решаемася, но у кого-то может выстрелить )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants