Имя: Пароль:
1C
1С v8
Нужна оценка по плану реализации
0 СемёнКим
 
10.09.21
10:56
Всем привет. 1С:8.3(.9)

Есть периодический и независимый регистр сведений СведенияОНоменклатуре с измерением Номенклатура (тип ссылка на справочник Номенклатура) и различные ресурсы: Р1,Р2,Р3...Рn. Далее, заполняется макет( это обычная таблица с колонками: Наименование номенклатуры, Р1, Р2) в таб.доке на форме документа по запросу к этому регистру сведений.

Задача: Нужно при двойном нажатии в макете по наименованию номенклатуры открыть форму записи регистра сведений СведенияОНоменклатуре с заполненными данными соответствующими выбранной строке в макете. В открывшейся форме что-то изменить (или оставить без изменения) и записать, при чем не должна появиться новая запись, а должна быть отредактирована старая.

Реализация: В запросе к регистру сведений во время заполнения полей макета: Наименование номенклатуры, Р1 и Р2. Получать все остальные ресурсы Р3,Р4,...,Рn и период записи Период, и засунуть все это в структуру. Далее, при заполнении макета эту структуру присвоить расшифровке области макета поля наименование номенклатуры, т.е. само наименование номенклатуры идет в значение области таб.дока: ТД.Область("<имя>").значение, а структура в его расшифровку: ТД.Область("<имя>").расшифровка. Далее, двойное нажатие по наименованию номенклатуры обрабатывает событие Выбор и в этой процедуре прописываем получение формы записи регистра сведений и ее заполнение через расшифровку, т.е.
```форма.Период = расшифровка.Период,
форма.Номенклатура = расшифровка.Номенклатура,
форма.Р1=расшифровка.Р1,
форма.Р2=расшифровка.Р2,
...
форма.Рn=расшифровка.Рn```
И открываем форму. Пользователь вносит свои изменения, нажимает записать/закрыть. и уже в модуле формы регистра сведений в процедуре ПередЗаписью прописываем, типа:
Набор = РегистрСведений.СведенияОНоменклатуре.СоздатьНаборЗаписей();
Набор.отбор.Номенклатура.установить(Запись.Номенклатура);
Набор.отбор.Период.установить(Запись.Период); // нашли текущую запись в регистре сведений
Набор.Записать();      // удаляем текущую запись

По сути, сначала удаляется текущая запись и стандартной обработкой добавляется новая.

Вопрос: Не сложно ли это все? В смысле, не чешу ли я зад через голову.
1 Мультук
 
гуру
10.09.21
11:08
(0)

1) Зачем значения ресурсов хранить в расшифровке?
Почему их нельзя получить в самой форме редактирования из регистра по номенклатура + период ?

2) Форма редактирования создается на лету динамически?
3) зачем здесь набор записей ? зачем "Перед записью"? Имхо менеджера записи более чем хватит.
2 СемёнКим
 
10.09.21
11:32
(1) Спасибо, вот именно такой коммент я и ожидал.
Учитывая 1), в процедуре Выбор после получения формы записи регистра сведений СведенияОНоменклатуре, нужно передать параметрам формы Период и Номенклатура полученные значения из макета, а уже в модуле формы записи регистра в процедуре при открытии запросом подтянуть остальные параметры. Тогда отпадет нагромождение данными области макета.
По 2), если я правильно понимаю про динамическое создание формы, то нет. Динамическое создание формы я понимаю так, что элемент Запись/Объект... на форме в верхнем правом окне должен иметь тип Динамический список, а в свойствах должна стоять галка ПроизвольныйЗапрос, а уже в самом запросе берешь что можешь. Сейчас же тип элемента формы (Запись) есть РегистрСведенеийМенеджерЗаписи.СведенияОНоменклатуре.  

3) Я помню, что было написано про менеджер записи, что при его использовании в любом случае создается набор записей. Но я еще не глубоко понимаю работу программной записи в регистр сведений, поэтому последняя часть в реализации хромает. Но мне кажется, что должно быть какое то свойство замены текущей записи новой, если обе записи совпадают по измерениям и периоду. Вот это свойство я видел в работе с набором записей.