Внешняя компонента(namedecl.dll) и тонкий клиент

1. l4h 19.02.18 19:16 Сейчас в теме
Доброго времени суток.
Пытаюсь разобраться с "программированием" на 1с и не смотря на то, что купил книгу Радченко и Хрусталевой "Практическое пособие разработчика 1с 8.3" и по книге идешь и все получается, чувствую, что понимаю далеко не все, в связи с чем обращаюсь тут за помощью к вам.
В общем, есть конфигурация Салон красоты и стоит задача прикрутить договор, тот функционал что предлагает конфа не достаточен, поэтому решил доработать конфигурацию(добавить несколько реквизитов, прикрутить указанную в заголовке компоненту склонения и автоматизировать заполнение вновь добавленных реквизитов на форме создаваемого/изменяемого документа). В итоге, разобрался, но не со всем. Остались вопросы:
1. Как заставить работать внешнюю компоненту в режиме тонкого клиента? если запускать 1с в режиме толстого клиента, то она пашет(не важно от админа или от обычного пользователя)
Как реализовано: Создал общий модуль, в него воткнул функцию с кодом подключения этой компоненты, дальше обращаюсь к этой функции передавая ей строку которую нужно просклонять, все отрабатывает, но только в режиме толстого клиента.

Функция ПросклонятьФИО(КлиентСсылка) Экспорт
	Попытка                              
		ЗагрузитьВнешнююКомпоненту("NameDecl.dll"); // Загружаем внешнюю компоненту
		Библиотека=Новый("AddIn.NameDeclension");
	Исключение
		Сообщить("Не удается загрузить внешнюю библиотеку: " + ОписаниеОшибки());
	КонецПопытки;
	
	ФИО=Строка(КлиентСсылка.Наименование);
	Возврат Библиотека.Просклонять(ФИО, 2);
КонецФункции
Показать


2. Есть форма документа, в которую я добавил реквизиты(Услуга, КоличествоЗанятий, Скидка, СтоимостьПоДоговору), связал их с реквизитами объекта, все отображается, заполняется, сохраняется, вопросов по этому нет. Но хочется заполнять эти реквизиты автоматически, т.е. меняем услугу и сразу автоматом из регистра сведений берется ее цена, умножается на количество занятий, применяется скидка и поле стоимость по договору заполняется автоматически.
Сначала пробовал так:
//упрощенный вариант без учета скидки
Если Элементы.КоличествоЗанятий <> 0 ТОГДА 
		Элементы.СтоимостьПоДоговору = ДополнительныйФункционал.КлиентПолучитьЦенуНоменклатуры(Элементы.Дата,Элементы.Номенклатура) * Элементы.КоличествоЗанятий;
	КонецЕсли



Но как вы уже догадались не взлетело, т.к. в данном случае я получаю не значения этих реквизитов формы, а не понятно что с типом "ПолеФормы"(вроде). Затем я решил обращаться не к самой форме, а к реквизитам объекта(Заменил слово Элементы, на слово Объект), которые хранят нужные мне значения, хотя мне казалось, что если я создам новый документ, то введенные данные будут учитываться только после записи документа, по факту- нет, все отрабатывает сразу после ввода и нажатия enter и вроде бы все на этом, но нет. Опять же это все работает только в режиме толстого клиента. Часть функций вынес в отдельный общий модуль, т.к. приходится обращаться к регистру сведений, а из контекста тонкого клиента этого сделать нельзя(понял это уже после того как попробовал), поэтому написал функцию:

&НаСервере
Функция ПолучитьСтоимостьУслуги(Дата, Услуга) Экспорт 
	Отбор = Новый Структура("Номенклатура",Услуга);
	РезультатОтбора = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(Дата,Отбор);//кстати, нельзя ли тут сразу обратиться к св-ву цена через точку?
	Возврат РезультатОтбора.Цена;
КонецФункции

Показать


Эту функцию вызываю из другой функции в этом же модуле
Функция КлиентПолучитьЦенуНоменклатуры(Дата, Услуга) Экспорт
	Цена = ДополнительныйФункционал.ПолучитьСтоимостьУслуги(Дата, Услуга);
	Возврат Цена;
КонецФункции


если на толстом клиенте, то все пашет, если же на тонком, то ругается что метод ПолучитьСтоимостьУслуги(Дата, Услуга) не обнаружен. Подскажите плиз, что мне подучить, чтобы разобраться с этим вопросом, так же хочется лучше разбираться в контексте выполнения(когда нужно указывать директивы &НаСервере, когда &НаКлиенте). Спасибо!
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Alexei_Siva 182 20.02.18 07:34 Сейчас в теме
Если в модуле ДополнительныйФункционал поставить галку "Вызов сервера", то можно к нему и из тонкого клиента обращаться.
По поводу директив - стоит почитать материалы по теме, например вот https://infostart.ru/public/682305/ , ну и куча других есть
Если вкратце, то нужно обращать внимание на какой директиве можно использовать нужную функцию, обычно это в справке ctrl+F1 описано. Также нужно понимать, что реквизиты формы и всякие события формы доступны только на клиенте, при обращении к директиве формы &НаСервере на модуле автоматически создается структура из реквизитов формы, которая передается на сервер, благодаря чему реквизиты формы становятся доступны, директива формы &НаСервереБезКонтекста не предусматривает передачу реквизитов формы на сервер и, соответственно, делается быстрее. Обращение к общему модулю аналогично вызову директивы &НаСервереБезКонтекста. Ну и если база Скульная (или на подобной субд, то есть не файловая), то нужно понимать, что директивы &НаКлиенте и &НаСервере выполняются на разных машинах - клиент на вашей, а сервер, соответственно, на серверной машине.
3. l4h 19.04.18 16:06 Сейчас в теме
По факту эта функция может быть вызвана лишь из толстого клиента, поэтому реализовать подключение компоненты в режиме тонкого клиента этим методом нельзя. Возможно нужно использовать другую функцию ПодключитьВнешнююКомпоненту, ее можно использовать в тонком клиенте. Я оставил все пока так, т.к. копятся другие задачи.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот