Пятница, 11.10.2024, 14:55
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Некорректная запись дополнительных сведений
ElgregoДата: Четверг, 25.03.2021, 08:54 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 57
Репутация: 59
Статус: Оффлайн
Доброе утро, Сергей!

Платформа: 8.3.18.1334
Режим БД: клиент-серверный
Конфигурация. Название: Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.89.47)
Конфигурация. Основной режим запуска: Управляемое приложение
Конфигурация. Вариант встроенного языка: Русский
Конфигурация. Режим управления блокировкой данных: Управляемый
Конфигурация. Режим совместимости: НеИспользовать
Конфигурация. Версия БСП: 3.1.3.417
Инструменты разработчика. Версия: Конфигурация 5.82
Инструменты разработчика. Инструмент: Прочее
Инструменты разработчика. Объекты на сервере: Да
Инструменты разработчика. Разрешены имитаторы: Да
Расширения. СМ_Роли (1.0.0.1)
Расширения. СМ_Модули (1.0.0.1)
Клиент. ОС: Microsoft Windows Server 2016 Standard 64-bit Русский
Клиент. Приложение: Управляемое приложение 64б
Клиент. Проверка модальных вызовов: Нет
Клиент. Язык интерфейса конфигурации: ru
Клиент. Язык интерфейса системы: ru
Клиент. От имени администратора Windows: Нет
Сервер. ОС: Microsoft Windows Server 2016 Standard 64-bit НеРусский-0409
Сервер. Отладка: нет

При записи дополнительных сведений обнаружил следующие проблемы:
1. В типовом регистре сведений "ДополнительныеСведения" сейчас находится вот такой код:


1.1. Это приводит к вызову исключения при работе в управляемом приложении из-за отсутствия клиента управляемого приложения в директиве #Если;
1.2. Игнорируются настройки параметров записи объектов, т.к. запись в данный регистр происходит не через набор, а через менеджер записи. Это приводит к вызову исключения;
Для исправления этого был вынужден изменить код в процедуре УстановитьЗначениеДопРеквизитаБСПЛкс

//МенеджерЗаписи = РегистрыСведений["ДополнительныеСведения"].СоздатьМенеджерЗаписи();
//МенеджерЗаписи.Объект = Объект[ИмяПоляСсылка];
//МенеджерЗаписи.Свойство = ДопРеквизит;
//МенеджерЗаписи.Значение = НовоеЗначение;
//МенеджерЗаписи.Записать();
РегДопСвед = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
РегДопСвед.ОбменДанными.Загрузка = Объект.ОбменДанными.Загрузка;
РегДопСвед.Отбор.Объект.Установить(Объект[ИмяПоляСсылка]);
РегДопСвед.Отбор.Свойство.Установить(ДопРеквизит);
РегДопСвед.Прочитать();
Если РегДопСвед.Количество()=0 Тогда
Зап = РегДопСвед.Добавить();
Иначе
Зап = РегДопСвед[0];
КонецЕсли;
Зап.Объект = Объект[ИмяПоляСсылка];
Зап.Свойство = ДопРеквизит;
Зап.Значение = НовоеЗначение;
ЗаписатьОбъектЛкс(РегДопСвед);

2. Вызов записи в регистр дополнителных сведений происходит всегда, даже если никакие сведения не были изменены/добавлены
Для устранения изменил код в модуле формы редактора объекта:


Просьба исправить алгоритм записи дополнительных сведений, а также сделать возможным работать в управляемом приложении.

Заранее спасибо.
Прикрепления: 1102789.png (34.4 Kb) · 1656415.png (21.5 Kb)
 
tormozitДата: Четверг, 25.03.2021, 19:44 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Оффлайн
По п.1 ошибку подтверждаю https://www.hostedredmine.com/issues/923842
По п.2 ты предлагаешь оптимизацию, которая не согласуется с общих подходом инструмента - пишем объект целиком и таким образом повышаем согласованность записи. Например аналогично уже делается для движений документа - они пишутся независимо от того, были ли изменены. Менять этот подход я пока не готов. Выигрыш в длительности записи твоего варианта очевиден, но мне не кажется что он не стоит понижения согласованности.
 
ElgregoДата: Четверг, 25.03.2021, 19:55 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 57
Репутация: 59
Статус: Оффлайн
Цитата tormozit ()
но мне не кажется что он не стоит понижения согласованности


Cергей, проблема в том, что ты будешь писать в регистр несуществующие в нем до этого записи!!!
Например, у нас для справочника договоры добавлено полтора десятка дополнительных реквизитов. Но это не означает, что все они заданы для конкретного договора! У одного договора может быть установлено все 15 допсвойств, а у другого ни одного.
Если производить запись твоим алгоритмом, то ты запишешь в регистр 15 новых записей с пустыми значениями свойств, которых до редактирования объекта вообще не было в регистре.
Для обеспечения твоего подхода потребуется первоначально считать все записи регистра с отбором по ведущей ссылке, и лишь в случае несоответствия данным в форме объекта менять набор записей регистра дополнительных сведений. В противном случае можно получить не совсем то, что было до редактирования объекта...

Добавлено (25.03.2021, 20:28)
---------------------------------------------
Немного дополню - ситуация осложняется еще тем, что теоретически может понадобиться записать именно пустое значение в допсвойство. Я предлагаю в такой ситуации использовать флаг модифицированности реквизита на форме объекта. И добавлять запись с пустым значением только если этот флаг=Истина. Так будет понятно большинству разработчиков. Если же просто сравнивать набор записей с текущими значениями объекта, и не добавлять в регистр пустые значения, то добавить допсвойство с пустым значением будет невозможно!

 
tormozitДата: Пятница, 26.03.2021, 00:03 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Оффлайн
Убедил. Создал задачу по приведению логики записи доп. сведений к типовому виду https://www.hostedredmine.com/issues/923855

Проблему БСП с невозможностью намеренной записи пустых значений свойств решать не планирую. Даже если я ее решу, то пользователь через родную форму доп. сведений объекта легко удалит все пустые значения, даже не поняв этого.
 
tormozitДата: Воскресенье, 28.03.2021, 22:36 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 6388
Репутация: 165
Статус: Оффлайн
1. Исправлено
2. Реализовано
в 5.85
 
  • Страница 1 из 1
  • 1
Поиск: