| 
    
            
         
         | 
    
  | 
Заполнить дополнительный реквизит типа булево программно | ☑ | ||
|---|---|---|---|---|
| 
    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) понятно, про составной тип интересный момент     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |