Имя: Пароль:
1C
1С v8
Заполнить дополнительный реквизит типа булево программно
0 Надмозг
 
20.07.23
11:28
Казалось бы избитая тема, как заполнить доп. реквизит программно, но есть нюансы.
Всегда думал, что мы можем использовать типовую процедуру УправлениеСвойствами.ЗаписатьСвойстваУОбъекта, но, заметил такую особенность.
У нас есть доп. реквизит типа булево.
1) Делаем запрос к ТЧ Дополнительные реквизиты с отбором по ссылке и свойству. В результате ничего нет, естественно, т.к. мы еще не устанавливали значение.
2) Открываем форму объекта, устанавливаем значение доп. реквизита Истина, записываем. Делаем тот же запрос. У нас предсказуемо появляется строчка со значением Истина.
А дальше идет расхождение
3.1) Открываем форму еще раз, устанавливаем Ложь, записываем, смотрим запрос, там - пусто, т.е. строчка из ТЧ была удалена.
3.2) Вместо предыдущего пункта используем процедуру УправлениеСвойствами.ЗаписатьСвойстваУОбъекта, смотрим запрос - там есть строка со значением доп. реквизита Ложь

В итоге получается, что типовая процедура УправлениеСвойствами.ЗаписатьСвойстваУОбъекта работает не так, как если бы мы редактировали реквизит на форме объекта.

В связи с этим вопрос:
Может быть, надо использовать другую процедуру для того чтобы работало по-типовому вместо или дополнительно к ЗаписатьСвойстваУОбъекта?
1 1CBaseV8
 
20.07.23
11:39
Заполнить на форме или через объект?

Через объект вообще проблемы не вижу? Что-то типа:

      
      
      объНомен = Справочники.Номенклатура.ПустаяСсылка().ПолучитьОбъект();
      
      пвхРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ИмяДопРеквизита")
      хххЗначение = "ХХХ";
      
      Если ЗначениеЗаполнено(пвхРеквизит) Тогда  
          стрРекв = Неопределено;
          ДЛя каждого стрДоп из объНомен.ДополнительныеРеквизиты цикл
              Если стрДоп.Свойство = пвхРеквизит тогда
                  стрРекв = стрДоп;
                  Прервать;
              КонецЦикла;
          КонецЕсли;
          
          Если не ЗначениеЗаполнено(стрРекв) Тогда
              стрРекв =  объНомен.ДополнительныеРеквизиты.Добавить();
              стрРекв.Свойство = пвхРеквизит;
          КонецЕсли;
          
          стрРекв.Значение = хххЗначение;
      КонецЕсли;
2 1CBaseV8
 
20.07.23
11:40
(0) Может забыл записать объект послу установки реквизита?
3 Timon1405
 
20.07.23
11:41
(0) если не булево, а другой тип так записать, работает?
4 Надмозг
 
20.07.23
11:47
(1) Я не понял, что ты хочешь сказать. Задача в том, чтобы при установке доп. реквизита в значение Ложь, работало как по типовому при снятии флажка на форме, т.е. удалялась строка из ТЧ Дополнителные реквизиты. Твой код это не делает
5 Надмозг
 
20.07.23
11:48
(2) Я записываю объект из другой формы, напрямую с ним не работаю, передаю ссылку в типовую процедуру УправлениеСвойствами.ЗаписатьСвойстваУОбъекта, она там сама все записывает, в этом и смысл, чтобы использовать типовой механизм
6 Надмозг
 
20.07.23
11:52
(3) да, сейчас проверил. Если удалить ссылку в поле со значением ссылочного доп. реквизита и оставить пустую ссылку, эта строка так же удаляется из ТЧ
7 ass1c
 
20.07.23
12:40
(0) Не парься, так и работай. Это похоже на типовой функционал. УправлениеСвойствами.ЗаписатьСвойстваУОбъекта - используется по конфе в типовых решениях и записывает все переданные свойства с любыми значениями. А при записи из формы - свойства с пустыми значениями или со значением = Ложь удаляются из ТЧ - это если свойство имеет 1 тип значений. Если свойство имеет более 1 типа значений - то все значения будут записаны в ТЧ, кроме когда Значение = Неопределено (не выбран тип - нажата шифт F4).
В любом случае если ты запишешь значения программно, а кто-то потом перезапишет форму - то значения пустые удалятся. Хз зачем так сделано - может для оптимизации...
8 Donkey_hot
 
20.07.23
12:47
Проблемы вроде нет. В запросах если надо выбрать ложь, используем ЕстьNULL(Значение, ЛОЖЬ).
9 Надмозг
 
21.07.23
11:44
(8) я знаю, что это можно учитывать при разработке прописав соответствующие проверки. Вопрос в том, почему при использовании типовых механизмов состояние базы данных различное. Это как-то странно
10 Надмозг
 
21.07.23
11:45
(7) понятно, про составной тип интересный момент