Добрый день. Помогите не привыкшему к "правая рука не знает, что делает левая" в 1С.
Создал для Справочники.Номенклатура (1С 8.3 УТ 11.4, управляемые формы) два дополнительных реквизита (ИдентификаторИМ и НаименованиеИМ), но только для Справочники.Номенклатура.ВидНоменклатуры - "Товар для ИМ". Непосредственно в 1С вижу, что при нажатии на кнопку "Дополнительные сведения" (!!!) у товаров для ИМ есть два соответствующих реквизита/поля с соответствующими названиями.
Прочитав forum.infostart.ru непосредственно в коде пишу

```1c
    Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор1С);
    Если Номенклатура <> Неопределено Тогда
    Ссылка = Номенклатура.ПолучитьОбъект();
    Если Номенклатура.ВидНоменклатуры.Наименование <> "Товар для ИМ" Тогда
    ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар для ИМ",Истина);
    Если Не ВидНоменклатуры.Пустая() Тогда
    Ссылка.ВидНоменклатуры = ВидНоменклатуры;
    Ссылка.Записать();
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецЕсли;
    ИденИМ = Истина;
    НаимИМ = Истина;
    Для Каждого Реквизит Из Ссылка.ДополнительныеРеквизиты Цикл
    Если Реквизит.Свойство.Наименование = "ИдентификаторИМ" Тогда
    Реквизит.Значение = ИдентификаторИМ;
    ИденИМ = Ложь;
    ИначеЕсли Реквизит.Свойство.Наименование = "НаименованиеИМ" Тогда
    Реквизит.Значение = НаименованиеИМ;
    НаимИМ = Ложь;
    КонецЕсли;
    КонецЦикла;
    Если ИденИМ Тогда
    Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
    Реквизит.Значение = ИдентификаторИМ;
    КонецЕсли;
    Если НаимИМ Тогда
    Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
    Реквизит.Значение = НаименованиеИМ;
    КонецЕсли;
    Ссылка.Записать();
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
```

Ошибок не возникает, но и не добавляются/обновляются данные.
Что делаю не так?
---
Если ИденИМ Тогда
                Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
                Реквизит.Значение = ИдентификаторИМ;
            КонецЕсли;
            Если НаимИМ Тогда

Вы только значение добавляете, а нужно ещё свойство:

```1c
    Реквизит.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИдентификаторИМ(Товар для ИМ)")
```
---
```1c
    Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор1С);
    Если Номенклатура <> Неопределено Тогда
    Ссылка = Номенклатура.ПолучитьОбъект();
    Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
    Реквизит.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИдентификаторИМ")
    Реквизит.Значение = НаименованиеИМ;
    КонецЕсли;
    Ссылка.Записать();

    Иначе
    сообщить(ОписаниеОшибки());
    КонецЕсли;
```

Если выполнить только эту часть, значение реквизита ИдентификаторИМ появляется?
---
Если Реквизит.Свойство.Наименование = "ИдентификаторИМ"
Наименование у свойства не такое. Посмотрите в консоли запросов ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.
---
Посмотрел... "ИдентификаторИМ(Товар для ИМ)" . Исправил в коде... Но это - не решение проблемы при добавлении.
---
Если ИденИМ Тогда
                Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
                Реквизит.Значение = ИдентификаторИМ;
            КонецЕсли;
            Если НаимИМ Тогда

Вы только значение добавляете, а нужно ещё свойство:

```1c
    Реквизит.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИдентификаторИМ(Товар для ИМ)")
```
---
```1c
    Если ИденИМ Тогда
    Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
    Реквизит.Значение = ИдентификаторИМ;
    КонецЕсли;
    Если НаимИМ Тогда
    Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
    Реквизит.Значение = НаименованиеИМ;
    КонецЕсли;
```

А свойство кто будет устанавливать?
---
Подскажите, как должно быть? Нигде не могу найти внятную инфу по полям/методам Дополнительных реквизитов в частности.
---
найти ссылку на свойство и запихать ее в Реквизит.Свойство
---
```1c
    Ссылка = Номенклатура.ПолучитьОбъект();
```

ну почему Ссылка, когда это объект?

По вопросу - а что там должно работать? В коде меняется вид номенклатуры, к допреквизитам это не имеет отношения. Непонятна связь вопроса с приведенным кодом.
---
Просто чтобы шпионы не догадались, и чтобы левая рука не догадалась на всякий случай что написала правая
---
Вам больше нравится Объект = Номенклатура.ПолучитьОбъект(); ??? А связь чтобы понять - нужно вопрос читать и код весь смотреть.
---
Зачем такие сложности когда есть БСП?

```1c
    // Записывает дополнительные реквизиты и сведения владельцу свойств.
    // Изменения происходят в транзакции.
    //
    // Параметры:
    // ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ...
    // ТаблицаСвойствИЗначений - ТаблицаЗначений - с колонками:
    // * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца.
    // * Значение - Произвольный - любое значение, допустимое для свойства (указано в элементе свойства).

    УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений)
```
---
Я не знаю, что такое БСП. Могу попробовать предложенный код. Он, в принципе, понятен. Хочу понять физику этих Дополнительных реквизитов... Что это, где описано, как хранится, с какими связями. Ваш код, наверное, решит проблему, но как "черный ящик" или "четырехполюсник". Простите, но как "решение", даже если и сработает, считать не могу.
---
Доп реквизиты хранятся в табличной части объекта "ДополнительныеРеквизиты".
Доп сведения хранятся в в регистре сведений "ДополнительныеСведения"
Сами же Доп сведения и Доп реквизиты это план ПланВидовХарактеристик

И ни какого черного ящика. открываем общий модуль "УправлениеСвойствами" находим процедуру "ЗаписатьСвойстваУОбъекта" и читаем код. все как на ладони.
---
Я неонократно встречался с программистами под Windows. не знающих понятие Message. Таким же программистом под 1С быть не хочу. Поясните, что такое "табличная часть" физически, пожалуйста.
---
Блин, господа, он троллит что ли?!

Фрагмент Вашего кода

```1c
    Для Каждого Реквизит Из Ссылка.ДополнительныеРеквизиты Цикл
```

Что такое "ДополнительныеРеквизиты" ?!
---
Вот я у Вас и спрашиваю, что это физически?
---
Если свосем в 2х словах, то это таблица справочника, в которой хранятся данные.
Например у документа "РеализацияТоваровИУслуг" есть табличная часть Товары - это таблица, в которой хранятся данные в колонках "номенклатура, количество, сумма и т.д."

Здесь, доп реквизиты это такая же таблица, она конкретно в Вашем примере аналогично принадлежит справочнику "номенклатура". У нее хранятся данные в колонках "свойство реквизита, значение". СВойство - это очень грубо говоря чтобы отличать один доп реквизит от другого, а значение это непосредственно само значение реквизита
---
Теперь, в процессе всей этой дискуссии, я понял, что "Свойство" - это физически поле типа GUID, по которому можно найти описание его в некоей таблице. Я же его не присваивал!!! Блин... эта "уникальная" лексика и фразеология 1С убивает.
---
Да, необхоимо установить свойство, как писали в сообщении (14)
только, судя по всему свойство называется следующим образом

```1c
    ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИдентификаторИМ")
```

Проверьте в отладке, чтобы исключить опять его незаполенние
---
Вот как все...

https://its.1c.ru/db/metod8dev#content:1798:hdoc

А вообще вам лучше посмотреть какую нибудь обучалку по 1с а-ля "для самых маленьких" тогда подобные вопросы отпадут сами...
---
Физически - таблица базы данных. В понятиях 1С - смотрите справку.
Встроенный язык -> Прикладные объекты -> Универсальные объекты -> Табличная часть:
Табличные части предназначены для хранения наборов однородной информации, принадлежащих объекту (справочнику, документу, отчету или обработке) и не используемых самостоятельно. Строки табличной части не являются самостоятельными объектами базы данных, доступ к ним осуществляется только при помощи индекса строки в табличной части объекта.
Табличные части обычно имеют визуальное представление в виде элемента формы ТаблицаФормы.
Примером использования табличной части может быть многострочная часть документа, каждая строка которой содержит одинаковый набор реквизитов. Например, в документе "Заказ" - таблица, содержащая перечень товаров и услуг с указанием количества, стоимости, налогов и т.д.
---
```1c
    Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор1С);
    Если Номенклатура <> Неопределено Тогда
    Ссылка = Номенклатура.ПолучитьОбъект();
    Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
    Реквизит.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИдентификаторИМ")
    Реквизит.Значение = НаименованиеИМ;
    КонецЕсли;
    Ссылка.Записать();

    Иначе
    сообщить(ОписаниеОшибки());
    КонецЕсли;
```

Если выполнить только эту часть, значение реквизита ИдентификаторИМ появляется?
---
Буду пробовать... уже начал понимать что есть что в этих 1С-ах. Только в консоли Наименование выводится как "ИдентификаторИМ(Товар для ИМ)", а вот Заголовок действительно есть "ИндентификаторИМ". Спасибо.
---
Удачи! Когда разберете для себя этот механизм, попробуйте и предложенную готовую функцию из БСП - ее смысл в том, что в эту конструкцию:

```1c
    УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений)
```

Нужно передать ссылку на элемент справчоника Номенклатура в качестве параметра "ВладелецСвойств" и таблицу значений(см в синтакс помошнике), у которой одна колонка будет "значение", а другая "свойство". Тогда одной этой строчкой у Вас для номенклатуры создастся доп реквизит с заданным свойством и нужным значением
---
В этом ключе вопрос... А что будет, если такое свойство уже есть и нужно лишь обновить значение? Из кода БСП ясного ответа не получил.
---
```1c
    Если ЕстьДопРеквизиты Тогда
    ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект();
    ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка);
    Для Каждого ДопРеквизит Из ТаблицаДопРеквизитов Цикл
    Если МассивДопРеквизитов.Найти(ДопРеквизит.Свойство) = Неопределено Тогда
    Продолжить;
    КонецЕсли;
    МассивСтрок = ВладелецСвойствОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизит.Свойство));
    Если МассивСтрок.Количество() Тогда
    СтрокаСвойства = МассивСтрок[0];
    Иначе
    СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить();
    КонецЕсли;
    ЗаполнитьЗначенияСвойств(СтрокаСвойства, ДопРеквизит, "Свойство,Значение");
    КонецЦикла;
    ВладелецСвойствОбъект.Записать();
    КонецЕсли;
```

Ответ в данном фрагменте - в тч доп реквизитов ищется свойство и, при наличии ему присваивается значение

```1c
    Если МассивСтрок.Количество() Тогда
    СтрокаСвойства = МассивСтрок[0];
    Иначе
    СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить();
    КонецЕсли;
```
---
Точнее, если такое свойство не найдено - добавляется новая строка, в противном случае ведется работа с уже существующей (МассивСтрок[0])
---
дополнит реквизиты, это табличная часть справочника
---
Спасибо за "открываем общий модуль "УправлениеСвойствами" находим процедуру "ЗаписатьСвойстваУОбъекта" и читаем код. все как на ладони". Теперь понятно, что и как искать, и как изменять/добавлять. Физика данных, правда, пока все равно - "черный ящик".
---
Возможно это лишнее, но на всякий случай:

```1c
    Если Номенклатура <> Неопределено Тогда
```

это условие отрабатывает? может по какой-то причине оно вообще не выполняется
---
Да в отладчике логика четко отрабатывает, по нужным строчкам кода программа проходит... эффекта, как и ошибок, нет.
---
Эффекта нет, то есть не появляется значение реквизита на форме? А если вывести все доп реквизиты номенклатуры в консоли запросов, что-нибудь выдает?
---
Проверяю в самой 1С, открыв Номенклатура, а в ней Дополнительные сведения. Сами свойства есть, но с пустыми значениями. Вот все через ж... в этом 1С! Я определил доп.реквизиты только для определенного вида номенклатуры. НИЧЕГО НЕ ДОБАВЛЯЛ! При просмотре "Дополнительные свойства" у конкретной номенклатуры нужного вида ВИЖУ эти реквизиты, но с "пустыми" значениями. Что это значит? Есть реквизиты с незаполненными значениями, или физически еще нет этих реквизитов???
---
Начинается, что такое табличная часть знать не знаем (но хотим узнать физику процессов) что такое БСП гуглить не хотим, но хотим использовать Доп реквизиты и сведения, которые и существуют благодаря БСП. Потом создаем доп сведение, а найти его пытаемся в доп реквизитах.... И вообще похоже автор 1с видит впервые, и решил начать знакомство с доп сведений.

И после всего этого все в 1с через ж.....

Вы совершенно правы это АдынЭс корявый.... Вы тут совершенно не причем
---
От того, что Вы знаете что такое БСП... ну возьмите с полки пирожок. Особенно большой, если "Доп реквизиты и сведения, которые и существуют благодаря БСП". Не удивлюсь, что Вы искренне верите в существование баттонклика. Но все равно спасибо за ликбез. Я действительно имею слабое представление о 1С. У меня просто сертификат SQL Server 2008 Database Development... Трудновато...
---
Есть реквизиты с незаполненными значениями, или физически еще нет этих реквизитов???
Оба варианта возможны.
---
ПолучитьСсылку() всегда вернет ссылку, даже если физически в БД ее нет. Если проверять, то через Если НЕ ОбщегоНазначения.СсылкаСуществует(Номенклатура)
---
Всем спасибо за ликбез.
Итоговый код вот такой получился

```1c
    &НаСервере
    Функция ПривязатьНоменклатуруВ1С()
    Попытка
    СсылкаИдентификаторИМ =
    ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ИдентификаторИМ (Товар для ИМ)",Истина);
    СсылкаНаименованиеИМ =
    ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("НаименованиеИМ (Товар для ИМ)",Истина);
    Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор1С);
    Если Номенклатура <> Неопределено Тогда
    Ссылка = Номенклатура.ПолучитьОбъект();
    Если Номенклатура.ВидНоменклатуры.Наименование <> "Товар для ИМ" Тогда
    ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар для ИМ",Истина);
    Если Не ВидНоменклатуры.Пустая() Тогда
    Сообщить(ВидНоменклатуры);
    Ссылка.ВидНоменклатуры = ВидНоменклатуры;
    Ссылка.Записать();
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецЕсли;
    ИденИМ = Истина;
    НаимИМ = Истина;
    Для Каждого Реквизит Из Ссылка.ДополнительныеРеквизиты Цикл
    Если Реквизит.Свойство = СсылкаИдентификаторИМ Тогда
    Реквизит.Значение = ИдентификаторИМ;
    ИденИМ = Ложь;
    ИначеЕсли Реквизит.Свойство = СсылкаНаименованиеИМ Тогда
    Реквизит.Значение = НаименованиеИМ;
    НаимИМ = Ложь;
    КонецЕсли;
    КонецЦикла;
    Если ИденИМ Тогда
    Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
    Реквизит.Свойство = СсылкаИдентификаторИМ;
    Реквизит.Значение = ИдентификаторИМ;
    КонецЕсли;
    Если НаимИМ Тогда
    Реквизит = Ссылка.ДополнительныеРеквизиты.Добавить();
    Реквизит.Свойство = СсылкаНаименованиеИМ;
    Реквизит.Значение = НаименованиеИМ;
    КонецЕсли;
    Ссылка.Записать(); *****
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    Исключение
    Возврат Ложь;
    КонецПопытки;
    КонецФункции
```

Чисто у знатоков... Строка со ***** обязательна? Я по логике пытался написать что-то типа Реквизит.Записать() или Сохранить, но сие вызывало ошибку по отсутствию метода.
---
Здесь обязательна. Табличные части - это части объектов, сами по себе не живут.
А вот после установки вида номенклатуры, раз ссылки на допреквизиты ищешь вручную, а не через наборы, можно и не записывать лишний раз.