Имя: Пароль:
1C
1С v8
Получение ссылки на справочник из элемента табличной части документа
,
0 ligatr
 
03.10.18
14:38
Добрый день!
Есть необходимость при изменении поля "Счетчик" (ссылка на справочник) ТЧ элемента изменять остальные колонки в данной строке. Если поле "Счетчик" пустой, то надо очистить все остальные поля, а если выбрано какое-либо значение справочника, то необходимо получить ссылку на элемент справочника.
Создал процедуру ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент).
Если делаю вот так - Сообщить(Элемент.Родитель.ТекущиеДанные.Счетчик);, то выводить реквизит "Наименование" нужного элемента справочника.
Если делаю вот так (чтобы получить ссылка на объект) - Элемент.Родитель.ТекущиеДанные.Счетчик.Ссылка;, то ничего не получается хотя тип полученного результата "СправочникСсылка.Счетчики"

&НаСервере
Функция ВыборкаДанных()
                Запрос = Новый Запрос;
                Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                |            ВладелецСчетчикаСрезПоследних.Счетчик КАК Счетчик,
                |            ВладелецСчетчикаСрезПоследних.Абонент КАК Абонент,
                |            ВладелецСчетчикаСрезПоследних.МестоУстановки КАК МестоУстановки,
                |            ВладелецСчетчикаСрезПоследних.Счетчик.МестаПодключения КАК СчетчикМестаПодключения,
                |            ВладелецСчетчикаСрезПоследних.Счетчик.Коэффициент КАК СчетчикКоэффициент,
                |            ВладелецСчетчикаСрезПоследних.Счетчик.ЗаводскойНомер КАК СчетчикЗаводскойНомер
                |ИЗ
                |            РегистрСведений.ВладелецСчетчика.СрезПоследних КАК ВладелецСчетчикаСрезПоследних
                |ГДЕ
                |            ВладелецСчетчикаСрезПоследних.МестоУстановки.Ссылка ЕСТЬ НЕ NULL
                |            И
                |  ВладелецСчетчикаСрезПоследних.Счетчик.ВидУслуги = &ВидУслуги
                |
                |УПОРЯДОЧИТЬ ПО
                |            Абонент";
              
                Запрос.УстановитьПараметр("ВидУслуги",Объект.ВидУслуг);
                Результат = Запрос.Выполнить().Выбрать();
                Объект.ТЧВводПоказанийСчетчиков.Очистить();
                Пока Результат.Следующий() Цикл
                               НоваяСтрока = Объект.ТЧВводПоказанийСчетчиков.Добавить();
                               НоваяСтрока.Контрагенты = Результат.Абонент.Ссылка;                    
                               НоваяСтрока.МестоУстановки = Результат.МестоУстановки;
                               НоваяСтрока.МестоПодключения = Результат.СчетчикМестаПодключения;
                               НоваяСтрока.Счетчик = Результат.Счетчик.Ссылка;
                               НоваяСтрока.КонецМесяца = "";
                               НоваяСтрока.НачалоМесяца = "";
                               НоваяСтрока.РазностьПоказаний = "";
                               НоваяСтрока.Коэффициент = Результат.СчетчикКоэффициент;
                               НоваяСтрока.Потери = "";
                               НоваяСтрока.Расход = "";
                КонецЦикла;
                Возврат 0;
КонецФункции              

&НаКлиенте
Процедура Заполнить(Команда)
                ВД = ВыборкаДанных();
КонецПроцедуры

&НаКлиенте
Процедура ТЧВводПоказанийСчетчиковСчетчикПриИзменении(Элемент)
                ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент)
                Если Элемент.ТекстРедактирования = "" Тогда
                               Сообщить("Удалить");
                              
                Иначе
//                           Сообщить(Элемент.Родитель.ТекущиеДанные.Счетчик);
                               Счетчикбъект = Элемент.Родитель.ТекущиеДанные.Счетчик.Ссылка;
                КонецЕсли;
КонецПроцедуры

Подскажите как получить ссылку на объект который находится текущем элементе табличной части формы?
1 Lexey_
 
03.10.18
15:11
(0) "то ничего не получается хотя тип полученного результата "СправочникСсылка.Счетчики""
так получается или не получается?
2 ligatr
 
03.10.18
15:23
Не получается, иначе бы сюда не писал.
Непонятно в чем ошибка.
Возможно я вообще не так как нужно решаю эту задачу.
3 Lexey_
 
03.10.18
15:37
(2) не понятно, что не получается
4 ligatr
 
03.10.18
15:52
В результат выполнения вот это сроки Счетчикбъект = Элемент.Родитель.ТекущиеДанные.Счетчик.Ссылка; переменная Счетчикбъект не является элементом справочника который на данный момент находится в таблично части документа. Т.е. я не могу сделать например так Счетчикбъект.Код или Счетчикбъект.ВидУслуги и обратиться к реквизитам справочника.
5 unregistered
 
03.10.18
15:55
(4) > я не могу сделать например так Счетчикбъект.Код или Счетчикбъект.ВидУслуги и обратиться к реквизитам справочника

Всё верно. Там же русскими буквами написано - &НаКлиенте
А на клиенте таких возможностей нет.
6 Lexey_
 
03.10.18
15:57
(4) "переменная Счетчикбъект не является элементом справочника который на данный момент находится в таблично части документа"
ты врешь
7 ligatr
 
03.10.18
15:58
А как быть?
Мне нужно чтобы если пользователь изменил значение (ссылка на спровочнк) я смог изменить значения в других полях этой конкретной строки ТЧ формы.
Как это сделать?
8 Lexey_
 
03.10.18
15:59
(7) ну если на клиенте нельзя, то какой вариант остается?
9 unregistered
 
03.10.18
15:59
(4) > переменная Счетчикбъект не является элементом справочника

Ну тоже логично. Скорее всего ссылка на счетчик это Элемент.Родитель.ТекущиеДанные.Счетчик.
Чтобы получить на клиента реквизиты счетчика придётся сбегать за ними на сервер.
10 ligatr
 
03.10.18
16:00
буду пробовать на сервере :-)
11 Kondarat
 
03.10.18
16:02
Если НЕ ЗначениеЗаполнено(Элементы.ТЧ.ТекущиеДанные.Счетчик) Тогда

//Всем почиститься!!!

КОнецЕсли;
12 ligatr
 
03.10.18
16:14
Если делать так

&НаСервере
Процедура ТЧВводПоказанийСчетчиковСчетчикПриИзменении(Элемент)
                ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент);
КонецПроцедуры

&НаСервере
Процедура ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент)
                Если Элемент.ТекстРедактирования = "" Тогда
                               Сообщить("Удалить");
                              
                Иначе
//                           Сообщить(Элемент.Родитель.ТекущиеДанные.Счетчик);

                               Счетчикбъект = Элемент.Родитель.ТекущиеДанные.Счетчик.Ссылка;
                КонецЕсли;
КонецПроцедуры

то вообще не отрабатывае (что как мне кажется логично).

Если делаю так

&НаКлиенте
Процедура ТЧВводПоказанийСчетчиковСчетчикПриИзменении(Элемент)
                ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент);
КонецПроцедуры

&НаСервере
Процедура ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент)
                Если Элемент.ТекстРедактирования = "" Тогда
                               Сообщить("Удалить");
                              
                Иначе
//                           Сообщить(Элемент.Родитель.ТекущиеДанные.Счетчик);

                               Счетчикбъект = Элемент.Родитель.ТекущиеДанные.Счетчик.Ссылка;
                КонецЕсли;
КонецПроцедуры

то вываливается с такой ошибкой
{Документ.ВводПоказанийСчетчиков.Форма.ФормаДокумента.Форма(47)}: Ошибка при вызове метода контекста (ЗаполнениеТЧНаОсновеВведенныхДанных)
                ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
                форма: Элемент
                имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ПолеФормы'
13 ligatr
 
03.10.18
16:15
Что не правильно делаю?
14 Kondarat
 
03.10.18
16:16
(13) 11 читал?
15 ligatr
 
03.10.18
16:26
Читал, но не понял как это может устранить эту проблему.

Я сделал так
&НаКлиенте
Процедура ТЧВводПоказанийСчетчиковСчетчикПриИзменении(Элемент)
                ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент);
КонецПроцедуры

&НаСервере
Процедура ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент)
                Если Не ЗначениеЗаполнено(Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик) Тогда
                               Сообщить("Всем почиститься");
                Иначе
                               Счетчикбъект = Элемент.Родитель.ТекущиеДанные.Счетчик.Ссылка;
                КонецЕсли;
КонецПроцедуры

Валится вот на этом шаге
ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент);

т.е. в процедуру ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент) даже не заходит
16 Cool_Profi
 
03.10.18
16:27
Ну так привяжи её к реквизиту как обработчик события...
17 ligatr
 
03.10.18
16:28
причем валится в любом случае заполнено или не заполнено поле Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик
18 hhhh
 
03.10.18
16:29
(15) так пробуй

ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент.Родитель.ТекущиеДанные);
19 ligatr
 
03.10.18
16:30
(16) Она уже привязан ТЧВводПоказанийСчетчиковСчетчикПриИзменении
20 Kondarat
 
03.10.18
16:30
&НаКлиенте

Процедура ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент)
                Если Не ЗначениеЗаполнено(Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик) Тогда
                               Сообщить("Всем почиститься");
                Иначе
                               СчетчикСсылка = Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик
                КонецЕсли;
КонецПроцедуры
21 ligatr
 
03.10.18
16:47
(20) Если делаю так
&НаКлиенте
Процедура ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент)
                Если Не ЗначениеЗаполнено(Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик) Тогда
                               Сообщить("Всем почиститься");
                Иначе
//                           СчетчикСсылка = Элемент.Родитель.ТекущиеДанные.Счетчик.Ссылка;
                               СчетчикСсылка = Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик;
                               Сообщить(СчетчикСсылка.Коэффициент);
                КонецЕсли;
КонецПроцедуры

то происходит тоже самое что в исходном моем вопросе, т.е. не передается ссылка на справочник.
22 ligatr
 
03.10.18
16:48
(18) Если делаю так

&НаКлиенте
Процедура ТЧВводПоказанийСчетчиковСчетчикПриИзменении(Элемент)
//            ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент);
                ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент.Родитель.ТекущиеДанные);

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

&НаСервере
Процедура ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент)
                Если Не ЗначениеЗаполнено(Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик) Тогда
                               Сообщить("Всем почиститься");
                Иначе
                               СчетчикСсылка = Элемент.Счетчик.Ссылка;
//                           СчетчикСсылка = Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик;
//                           Сообщить(СчетчикСсылка.Коэффициент);
                КонецЕсли;
КонецПроцедуры

то валится вот такая ошибка

{Документ.ВводПоказанийСчетчиков.Форма.ФормаДокумента.Форма(48)}: Ошибка при вызове метода контекста (ЗаполнениеТЧНаОсновеВведенныхДанных)
                ЗаполнениеТЧНаОсновеВведенныхДанных(Элемент.Родитель.ТекущиеДанные);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
                форма: Элемент
                имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'
23 Lexey_
 
03.10.18
16:50
(22) передавай ссылку на сервер, а не вот эту вот дичь
24 ligatr
 
03.10.18
16:51
(23) Подскажи как это сделать?
25 Lexey_
 
03.10.18
16:56
(24) в параметре процедуры/функции же
26 ligatr
 
03.10.18
16:58
(25) Я понимаю что в параметре процедуры/функции, но не могу понять что/как передавать.
27 hhhh
 
03.10.18
16:59
(24) а так?

ЗаполнениеТЧНаОсновеВведенныхДанных(Элементы.ТЧВводПоказанийСчетчиков.ТекущиеДанные.Счетчик);
28 ligatr
 
03.10.18
17:04
(27) Фух... Вот так заработало
29 ligatr
 
03.10.18
17:05
Спасибо за помощь!!!