Имя: Пароль:
1C
1С v8
Ключ записи Регистра сведений, подчиненного регистратору
0 commdt
 
23.08.16
12:04
Есть динамический список со стандартным запросом, основной таблицей является, к примеру, регистр. На форму выведены все поля динамического списка, среди которых есть и Регистратор (если регистр подчинен регистратору).

Метод
Элементы.ДинамическийСписок.ТекущаяСтрока
возвращает ключ записи регистра. Далее, обходом отборов набора записей я устанавливаю значения из ключа записи. Если в ключе есть НомерСтроки, то выбираю соответствующую строку набора записей.

Пока дело касается Регистров накопления и бухгалтерии, всё в порядке - ключ содержит Регистратор и номер строки, в отборе есть единственное поле - "Регистратор". Также, всё в порядке с независимыми регистрами сведений: В отбор входят все измерения, они же присутствуют в ключе

Но вот как только дело доходит до Регистра сведений, подчиненного регистратору, начинается какое-то мракобесие. Единственным полем отбора набора записей регистра является "Регистратор", при этом ключ хоть и содержит регистратор, но он там Неопределено (а в динамическом списке представлен). При этом в ключе присутствуют измерения регистра, но на кой чёрт они мне нужны, если по ним не строится отбор.

ЧЯДНТ? Почему Регистратор = Неопределено, хотя он представлен? Как отобрать единственную запись регистра сведений, подчиненного регистратору, имея ключ записи?
1 commdt
 
23.08.16
14:15
Проверил - добавить новые отборы в набор записей нельзя. Косяк платформы или я туплю?
2 hhhh
 
23.08.16
14:22
а зачем вам этот ключ? Вроде у вас запрос, в нем поля, по ним и отбирайте. Так-то и ежу понятно, что отбор в этом регистре возможен только по периоду и регистратору.
3 commdt
 
23.08.16
16:19
(2) Суть в том, что мой динамический список действительно динамический. Т.е. при выборе объекта метаданных в нём задаётся основная таблица. Таблица на форме тоже формируется программно.
Далее по двойному клику на строке списка предполагается, что будут получены все данные строки (запись регистра сведений или ссылка) и по ним будет заполнена форма для просмотра и редактирования данных.

Проблема в том, что клик на клиенте, а заполнение формы - на сервере. На клиенте есть "ТекущиеДанные" и "ТекущаяСтрока". На сервере ничего этого нет. Текущие данные на сервер идут плохо, остаётся текущая строка, которая ключ записи или ссылка, что прекрасно. Но вот с регистром сведений получается такая ерунда.
При этом Ключ записи хоть и существует на клиенте, но недоступен - его не дозаполнить, не переформировать.
Похоже, придётся на сервере заново получать строку динамического списка по ключу, а уже потом смотреть, что получится
4 apokrit
 
23.08.16
16:32
(0) КлючЗаписи нужен для идентификации Записи (а не набора записей).
В регистре сведений (не важно подчиненном регистратору или нет) ключом является набор измерений (+ период если есть, + регистратор если периодичность по позиции регистратора)

Если нужен регистратор - его нужно явно добавить в выбираемые поля и поставить флаг "Использовать всегда" (/ вызвать метод УстановитьОбязательноеИспользование если это нужно сделать программно)
5 commdt
 
23.08.16
16:43
(4) В динамическом списке он выбирается, на форме есть и есть в ТекущиеДанные.
Да чёрт с ним, я даже принудительно установил для него обязательное использование перед получением КлючаЗаписи. Всё равно, в ключе записи Регистратор = Неопределено.

Я вот думаю, может, попробовать на сервере получить строку динамического списка по ключу, а уже из неё взять все данные
6 Fragster
 
гуру
23.08.16
16:44
так периодичность регистра-то какая?
7 apokrit
 
23.08.16
16:48
(4)  
>Всё равно, в ключе записи Регистратор = Неопределено.
Еще раз - регистратор не входит в ключ записи подчиненного регистра сведений, если только у этого регистра не стоит периодичность "по регистратору".
Можно использовать любые бубны - значение регистратора от этого в ключе записи не появится.
(То что там вообще есть поле Регистратор - конечно не красиво, но это особенность реализации)

>Я вот думаю, может, попробовать на сервере получить строку динамического списка по ключу, а уже из неё взять все данные

Зачем????
Если на руках уже есть регистратор и нужен регистратор, почему бы его просто не использовать?
8 commdt
 
23.08.16
16:52
Хаха, "Менеджер записи не может быть использован для регистра с режимом записи "Подчинение регистратору".
И куда мне сунуть твой ключ записи, нуралиев?

(7) Я заранее не знаю, что у меня есть на руках и с чем имею дело. Было 3 строчки кода, которые работали с любым объектом конфигурации, кроме чёртвого регистра сведений, подчиненного ергистратору
9 apokrit
 
23.08.16
16:57
(8) Ну вот я даже не знаю что еще написать.
Можно попробовать СП цитировать:
РегистрСведенийКлючЗаписи.<Имя регистра сведений> (InformationRegisterRecordKey.<Имя регистра сведений>)
Регистратор (Recorder)
Использование:

Только чтение.
Описание:

Тип: ДокументСсылка.<Имя документа>.
Содержит регистратор, который занес данную запись регистра сведений.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Имеет смысл только для регистра, у которого в Конфигураторе установлен режим записи "Подчинение регистратору" и периодичность "По позиции регистратора".
10 commdt
 
23.08.16
16:57
В общем, вопрос простой, как табуретка:
Как получить запись регистра сведений, подчиненного регистратору, имея на руках ключ записи?
11 Fragster
 
гуру
23.08.16
17:23
Запись = РегистрыСведений.ххх.СоздатьМенеджерЗаписи()
ЗаполнитьЗначенияСвойств();
Запись.Прочитать();
12 apokrit
 
23.08.16
17:24
(10) Прямо запись - эффективно не получится.
Можно данные записи.

Написать запрос к (основной) таблице регистра с условиями по всем полям. Еще через РегистрыСведений.<ИмяРегистра>.Выбрать() можно (с соответствующим отбором)
13 apokrit
 
23.08.16
17:24
(11) Это не будет работать для регистра подчиненного регистратору.
14 commdt
 
23.08.16
17:28
(11) "Менеджер записи не может быть использован для регистра с режимом записи "Подчинение регистратору".

(12) В принципе ок. Для периодического можно вместо регистратора использовать период, а для непериодического будет достаточно измерений. Но это какой-то бред по сравнению с тем, как легко это делается в любом другом случае
15 hhhh
 
23.08.16
17:58
(14) а зачем вам запись? Всё равно отредактировать ее вы не сможете. Редактирование идет только набора записей целиком. И для регистра накопления то же самое.
16 commdt
 
23.08.16
23:13
(15) ну да, для этого я и получаю набор записей. на форму выводятся реквизиты одной конкретной записи, её я правлю, а записываю весь набор.

Для сабжа сделаю свой аналог ключа записи - по набору измерений получу запросом регистратор и номер строки. суну в структуру, а дальше по накатанному
17 hhhh
 
23.08.16
23:37
тогда зачем городить фигню какую-то? получить набор записей, м с ним работать
18 commdt
 
23.08.16
23:58
(17) ну так в этом вся проблема. У набора записей отбор только по Регистратору. В ключе есть всё, кроме регистратора
Основная теорема систематики: Новые системы плодят новые проблемы.