Имя: Пароль:
1C
1С v8
Определить ТаблицуЗначений, связанную с ТаблицейФормы
,
0 zelenprog
 
07.07.23
14:20
Добрый день!

У объекта внешней обработки есть несколько реквизитов типа ТаблицаЗначений.
На форме есть несколько страниц (вкладки), на каждой странице - ТаблицаФормы, связанная с соответствующей ТаблицейЗначений.

Также на форме есть поле ввода и кнопка, при нажатии на которую должно быть выполнено действие с выделенной строкой в таблице на текущей странице.

Обычно, когда последний щелчок мыши был на таблице, то при нажатии на кнопку текущую строку можно получить такой командой:
"ЭтаФорма.ТекущийЭлемент.ТекущиеДанные".

Однако, если перед нажатием на кнопку перейти в поле ввода, то возникает проблема.
"ЭтаФорма.ТекущийЭлемент" - уже ссылается на поле ввода.
Хотя выделенная строка в таблице есть.

Можно получить ТаблицуФормы вот так:

    лТаблица = 0;
    Для Каждого лЭлемент Из Элементы.Страницы.ТекущаяСтраница.ПодчиненныеЭлементы Цикл
        Если ТипЗнч(лЭлемент) = Тип("ТаблицаФормы") Тогда
            лТаблица = лЭлемент;
            Прервать;
        КонецЕсли;
    КонецЦикла;


Но у этой таблицы значения свойств "ТекущаяСтрока" и "ТекущиеДанные" имеют значение "Неопределено".

Как получить выделенную строку?
Подскажите, пожалуйста.
1 azernot
 
07.07.23
14:23
(0) ЭлементыФормы.ТаСамаяТаблицаФормы.ТекущаяСтрока
Ну или
ЭлементыФормы.ТаСамаяТаблицаФормы.ВыделенныеСтроки
2 azernot
 
07.07.23
14:25
Т.е. задача сводится к тому, чтобы определить, какое именно табличное поле сейчас нужно обработать А это можно определить, например, проверив, какая сейчас текущая страница у группы формы типа "страницы".. Ну или любым другим способом.
3 Жан Пердежон
 
07.07.23
14:27
ТекущиеДанные
ТекущаяСтрока
ВыделенныеСтроки

Если Неопределено - скорее всего что-то не так делаешь.
Цикл - убери, лучше определять имя элемента-таблицы по имени страницы.
4 Admin_Net_1C
 
07.07.23
14:29
(1) скорее всего, раз активный элемент уже не таблица на форме, а поле ввода, то поэтому у таблицы на форме "ТекущаяСтрока" и "ТекущиеДанные" = Неопределено. Вижу только вариант: в событии ПриАктивизацииСтроки запоминать значения из ТекущиеДанные таблицы и далее уже использовать их, когда сменили фокус на поле ввода
5 azernot
 
07.07.23
14:42
(4) Нет. Текущая строка (текущие данные) в табличном поле, если она хотя бы один раз была выбрана, потом никуда не денется, даже если активный элемент формы поменяется.
Очень легко в этом убедиться через отладчик. В форме, где несколько табличных полей, в каждом выделить разные строки, а потом остановиться на любом месте, по любой кнопке. В коллекции "Элементы" у всех элементов типа "ТаблицаФормы" будет заполнено свойство ТекущаяСТрока и ТекущиеДанные
6 zelenprog
 
07.07.23
15:34
(3) >> лучше определять имя элемента-таблицы по имени страницы

Это как? Жестко в коде забить имена?

        Если (ИмяСтраницы = "СтрГрузополучатели") Тогда
            ИмяТаблицы = "ТабГрузополучатели";
        ИначеЕсли (ИмяСтраницы = "СтрКонтрагенты") Тогда
            ИмяТаблицы = "ТабКонтрагенты";
        КонецЕсли;
7 zelenprog
 
07.07.23
15:37
(5) Ваша правда.

Мне почему-то первый раз в отладчике показалось, что в такой ситуации "ТекущаяСтрока" и "ТекущиеДанные" имели значение "Неопределено".

А сейчас проверил еще раз - действительно у всех элементов "ТаблицаФормы" свойство "ТекущаяСтрока" и "ТекущиеДанные" заполнены как положено.
Спасибо.
Видимо, в первый раз я что-то не так сделал.
8 zelenprog
 
07.07.23
15:50
А можно ли по ссылке на "ТаблицуФормы" получить ссылку на связанную с ней "(ТаблицуЗначений)"?

Точнее, в отладчике тип этой "(ТаблицыЗначений)" отображается как "ДанныеФормыКоллекция".
Как бы ее "вытащить"?
9 azernot
 
07.07.23
15:58
(6) Вам виднее, как лучше. Например, у вас это может быть  
ИмяТаблицы = СтрЗаменить(ИмяСтраницы, "Стр", "Таб");

(8) Непонятно что вам надо и зачем. Таблица формы - элемент формы для отображения "табличных" данных. И это может быть табличная часть, динамический список, произвольный реквизит формы типа "ТаблицаЗначений" и т.п.
При этом, это именно "ДанныеФормыКоллекция". Потому как на клиенте "ТаблицаЗначений" недоступна
10 zelenprog
 
07.07.23
16:18
(9) Это внешняя обработка по обработке контрагентов.
Есть несколько ТаблицЗначений, которые отображаются на разных вкладках (страницах).
Каждая строка этих ТаблицЗначений - это информация о контрагентах, которая загружена из внешнего файла.
Все контрагенты (точнее загруженная информация о контрагентах) условно разделены на "категории".
Каждая "категория" отображается на своей странице. Поэтому и понадобилось сделать несколько страниц и несколько Таблиц.

Нужно сделать следующее.
Нажимаем на кнопку, выполняем некоторые действия с контрагентами в базе в соответствии с выделенной строкой в ТаблицеФормы на текущей странице.
После выполнения действия нужно изменить ТаблицуФормы.

Например, нажимаем кнопку "Удалить".
По текущей странице определяем имя ТаблицыФормы. Из этой ТаблицыФормы берем номер строки (ТекущаяСтрока).
Как-то эту информацию надо передать на сервер, чтобы процедура на сервере "поняла" с какой строкой и с какой "ТаблицейЗначений" надо работать.
Затем процедура на сервере берет по номеру текущей строки в "связанной" ТаблицеЗначений нужные данные.
Затем находит по этим данным контрагента в базе и удаляет его из базы. Затем нужно удалить соответствующую строку из "ТаблицыЗначений".
Ну и в итоге обновить "ТаблицуФормы".

Получается, что как-то нужно установить связь между ТаблицейФормы, и связанной с ней ТаблицейЗначений.
Иначе сервер не поймет с какой таблицей работать.
11 azernot
 
07.07.23
16:26
(10) Ну так и передавайте на сервер имя этой таблицы. Я по-прежнему не понимаю, в чём проблема.
Очевидно, что для чего-то же у вас организованы РАЗНЫЕ таблицы, а значит в них хранятся РАЗНЫЕ данные и обрабатывать их надо по-разному. Вот и сделайте процедуру маршрутизации, которая по имени таблицы, имени команды понимает, что нужно сделать и с чем, и далее уже вызывает соответствующий обработчик.

А если данные у вас одинаковые, то вам не нужны разные таблицы. Вы вполне можете обойтись одной, но на разных страницах отображать по-разному отобранные данные. Например отбор по "категории".
12 Мультук
 
гуру
07.07.23
16:39
(10)

Затем процедура на сервере берет по номеру текущей строки в "связанной" ТаблицеЗначений нужные данные.

-/-
"Преждевременная оптимизация -- корень всех зол" (с)


Вы изобретаете какой-то велосипед с квадратными колёсами.
Сколько строк и столбцов в вашей неведомой таблице ?

И я так понял, всё это ради "одноразовой обработки"

P.S.
Вы пытаетесь удалить дубли контрагентов ?
В УТ, ЕРП, КА -- уже есть встроенная обработка.
В ней же можно посмотреть "а как это делает" 1С
13 lubitelxml
 
07.07.23
16:40
(0) цепляйся к текущей странице, как уже подсказали выше, можно реквизит формы добавить, и ПриСменеСтраницы (ну или как там событие называется) присваивай имя нужной тебе ТЧ, и далее обрабатывай
14 Жан Пердежон
 
07.07.23
16:43
(6)
Как из строк
"СтраницаТаблица1", "СтраницаТаблица2", "СтраницаТаблица3"
получить
"Таблица1", "Таблица2", "Таблица3"?

Это не то, что программист должен спрашивать)
15 zelenprog
 
07.07.23
17:04
(11) >> Ну так и передавайте на сервер имя этой таблицы. Я по-прежнему не понимаю, в чём проблема.

(14) >> Как из строк "СтраницаТаблица1", "СтраницаТаблица2", "СтраницаТаблица3"
     >> получить "Таблица1", "Таблица2", "Таблица3"?

Хм...
Ну я думал, что можно обойтись без строк.
Я думал, что можно как-то тип такого: ТекущиеДанные.РодительТаблицаФормы.СвязаннаяТаблицаЗначений.

А пользуясь строками, на сервере придется писать что-то типа:

    Если пИмяТЗ = "ГоловныеКонтрагенты" Тогда
        лТЗ = Объект.ТЗКонтрагенты;
    ИначеЕсли пИмяТЗ = "Грузополучатели" Тогда
        лТЗ = Объект.ТЗГрузополучатели;
    ИначеЕсли пИмяТЗ = "Выбывшие" Тогда
        лТЗ = Объект.ТЗВыбывшие;
    .....
    КонецЕсли;


Ну как-то это не красиво что-ли.
16 zelenprog
 
07.07.23
17:09
(12)
>> Сколько строк и столбцов в вашей неведомой таблице ?

Это продолжение нашего "теоретического" обсуждения.
Давайте продолжим в той теме, в которой мы это начинали обсуждать:
Обработка выбора в ТаблицеФормы - открыть элемент справочника

Вы там так и не ответили.

>> Вы изобретаете какой-то велосипед с квадратными колёсами.
>> И я так понял, всё это ради "одноразовой обработки"

Возможно.
Просто я не знаю как сделать по другому.
"Я пока только учусь".
17 azernot
 
07.07.23
17:15
(15) >Я думал, что можно как-то тип такого: ТекущиеДанные.РодительТаблицаФормы.СвязаннаяТаблицаЗначений.
Ну, допустим у элемента формы есть "ПутьКДанным", там хранится имя нужной вам таблицы.
18 dmt
 
07.07.23
17:23
(15) обычно так и делают, как тебе и написали:
лТЗ = Объект["ТЗ" + пИмяТЗ]
19 Жан Пердежон
 
07.07.23
17:31
(15) если давать имена элементам и реквизитам рандомно, то другого варианта не будет;
если придерживаться каких-то правил - это потом можно в коде использовать
20 zelenprog
 
09.07.23
06:34
(17), (18)
Скомбинировал "ПутьКДанным" и обращение к реквизиту через "Объект[пИмяТЗ]".
Работает! Спасибо!

Получилась вот такая функция:


&НаСервере
Функция ПолучитьСсылкуНаТекущуюТЗ_НаСервере (пИмяТаблицыФормы)
    
    лТаблицаФормы = Элементы[пИмяТаблицыФормы];
    лПутьКДанным = лТаблицаФормы.ПутьКДанным;
    лСоставПутиКДанным = СтрРазделить(лПутьКДанным, ".", Ложь);
    
    лЭтоРеквизитФормы = Ложь;
    лЭтоРеквизитОбъекта = Ложь;
    лИмяТЗ = "";
    
    Если лСоставПутиКДанным.Количество() = 1 Тогда
        лИмяТЗ = лСоставПутиКДанным[0];
        лЭтоРеквизитФормы = Истина;
    ИначеЕсли лСоставПутиКДанным.Количество() = 2 Тогда
        Если лСоставПутиКДанным[0] = "Объект" Тогда
            лЭтоРеквизитОбъекта = Истина;
            лИмяТЗ = лСоставПутиКДанным[1];
        КонецЕсли;
    КонецЕсли;
    
    лТЗ = Неопределено;
    Если лЭтоРеквизитФормы = Истина Тогда
        лТЗ = ЭтаФорма[лИмяДЗ];
    ИначеЕсли лЭтоРеквизитОбъекта = Истина Тогда
        лТЗ = Объект[лИмяДЗ];
    КонецЕсли;
        
    Если лТЗ = Неопределено Тогда
        ВызватьИсключение("Не указан идентификатор таблицы для поиска контрагента!");
    КонецЕсли;

    Возврат лТЗ;

КонецФункции


Но свойство "ПутьКДанным" доступно только на сервере.
&НаКлиенте эта функция не сработает, &НаКлиенте придется делать с помощью строк.

И еще попалась интересная статья на похожую тему:
https://infostart.ru/1c/articles/1116586/
Независимо от того, куда вы едете — это в гору и против ветра!