Имя: Пароль:
1C
1С v8
Как программно добавить дополнительные реквизиты?
,
0 Vito
 
04.07.22
12:07
Подскажите, пожалуйста, как добавить программно дополнительные реквизиты контрагенту в справочнике контрагентов.
1 saaken
 
04.07.22
12:39
сначала вводишь руками, потом аналогично делаешь в конфинураторе
2 Ryzeman
 
04.07.22
12:43
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта()
Если тебе надо именно добавить новый допреквизит на кой то чёрт, то сделай ручками, посмотри что заполнилось, сделай то же самое программно.
3 Vito
 
04.07.22
12:56
Реквизит уже добавлен в ручную. Как обратиться к этому реквизиту, чтобы добавить его значение?

Объект.ДополнительныеРекивзиты.<Как соcлаться на реквизит с именем "ExternalId"?>
4 Vito
 
04.07.22
12:59
И где хранятся значения, доп.реквизитов? Где их можно посмотреть?
5 xenos
 
04.07.22
12:59
(3) найди свойство по имени перебери все строки и найди нужное свойство
6 Ryzeman
 
04.07.22
13:00
(3) я тебе уже написал.
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта()

Через точку обращаться нельзя, это не реквизит. Это строка табличной части ДополнительныеРеквизиты. В запросе надо обращаться туда. Вне запросов делай через БСП
7 Dmitry1c
 
04.07.22
13:01
(0) наркоманы ...
8 Vito
 
04.07.22
13:21
Простите чайника . Ничего не пойму. Получается, что обратиться можно только через запрос, если не использовать БСП?
(6) Как обратиться, можете пример написать? Ну вот никак не соображу как сделать, сижу часов 8 уже с этой проблемой.
(5) Как найти свойство?
9 Vito
 
04.07.22
13:24
(6) Пробовал вот так но не получается:
Объект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("ExternalId",""))[0].Значение
10 rudnitskij
 
04.07.22
13:34
(9) НовСтр = Объект.ДополнительныеРеквизиты.Добавить()...
и заполнять реквизиты строки таб части.
Писали же выше, что это обычная табчасть
11 Ryzeman
 
04.07.22
13:35
Для начала тебе надо почитать про то, что такое вообще дополнительные реквизиты. Заодно что такое ПланыВидовХарактеристик и как с ними работать.
Затем, тебе надо понять твою задачу.
Затем, тебе надо понять как работать с БСП.
Я тебе в третий раз пишу - установить значение, задача, которую ты написал в (0) делается через УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(). Это метод БСП, который именно для этого написан. Он тебе и нужен и правильнее всего им и воспользоваться.
Что у тебя в строках табличной части ты можешь посмотреть в конфигураторе. Какие там значения - тем же запросом "ВЫБРАТЬ * ИЗ МойДокумент.ДополнительныеРеквизиты КАК МойДокумент ГДЕ МойДокумент.Ссылка = &СсылкаНаДокумент"

В БСП и так все функции задукоментированы, достаточно перейти в модуль и там всё предельно ясно описано:

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

Изучи всё это, попробуй, что не получится - напиши.
12 Vito
 
04.07.22
14:13
БСП, к сожалению нет, нужно как-то решить задачу без БСП.
Насчет получения информации и Доп.Реквизитов, понял, что только через запрос к БД, а не к объекту конфигурации БД. Спасибо!
13 Ryzeman
 
04.07.22
14:17
(12) Я прошу прощения, а откуда у тебя взялись доп реквизиты без БСП?
14 Vito
 
04.07.22
14:32
(13) В ручную в карточке контрагента добавил
15 Ryzeman
 
04.07.22
14:34
(14) Ты издеваешься сейчас?) Какая конфигурация? Что такое по-твоему БСП?) Ты путаешь с ИТС? Что будет если ты в конфигураторе в любом модуле напишешь УправлениеСвойствами.ЗаписатьСвойстваУОбъекта() и нажмёшь F12 на нём?)
16 Vito
 
04.07.22
15:17
(15) Я не издеваюсь, я в 1С погружаю только 3-ю неделю (правда до этого были курсы 6 мес, но для аналитика). Конфигурация УНФ. Т.е. Вы хотите сказать, что БСП является частью стандартной конфигурации? Зачем тогда о ней вообще упоминать. Я думал это некая внешняя подключаемая библиотека.
Нажал F12 м попал в общий модуль, а там всякие процедуры и функции интересные лежат. Мне что теперь использовать соответствующую процедуру: ЗаполнитьДополнительныеРеквизитыВФорме ?
17 Ryzeman
 
04.07.22
15:23
(16) БСП = Библиотека Стандартных Подсистем, и во все (какие мне известно) типовые тиражные решения от 1с и франчей она входит. Сам механизм дополнительных реквизитов и сведений - это стандартная подсистема из этой библиотеки. То есть это есть в любой современной конфигурации на БСП.

>> Зачем тогда о ней вообще упоминать

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

>>Мне что теперь использовать соответствующую процедуру
Да. Это самый правильный вариант решения задачи из (0). Не надо изобретать велосипедов, надо вдумчиво посмотреть как работает уже существующий и правильно крутануть педаль.
18 Vito
 
04.07.22
19:28
(17) Спасибо! Попробовал вот такой вариант:
        МассивСтруктур = Новый Массив;
    Z =ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ExternalId", Истина);
    S = Новый Структура("Свойство, Значение",Z,"123456789");     
    МассивСтруктур.Добавить(S);
    УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(NewCounterparty,МассивСтруктур);

Но на последней строке получаю ошибку:
Ошибка при вызове метода контекста (Заблокировать)
{ОбщийМодуль.УправлениеСвойствами.Модуль(1175)}:Блокировка.Заблокировать();
по причине:
Неверный тип значения: Справочник.Контрагенты.Ссылка

Никак не пойму почему. Вроде в отладчики структура правильная...
19 Ryzeman
 
04.07.22
19:52
(18) Сделай точку на останова на функции, посмотри что передаёшь в NewCounterparty.
Не совсем понял что у тебя за версия БСП, почему массив структур? В моей таблицу значений надо.
Если не поможет - попробуй остановку по ошибке (отладка - остановка по ошибке...). Там посмотри что у тебя вообще передаётся во ВладелецСвойств. И дальше через стек вызовов сможешь отследить. Чёт думается что ты пустую ссылку кидаешь или ещё что-то непотребное.

Ещё два совета - не используй короткие перменные типа Z и S даже в таких случаях. В 1с это не принято, если перебираешься к нам - избавляйся от этой привычки.
ПВХ лучше искать по полю "имя", оно уникально. В режиме предприятия это в самом низу будет. Там по умолчанию добавляется УИД, но ты сам можешь задать как тебе надо.
20 Ryzeman
 
04.07.22
19:53
(19) если вдруг не знаешь как смотреть - выделяешь переменную, shift+F9. Ну вообще отладчиком пользоваться надо обязательно научиться. Это ключевой навык.
21 Vito
 
04.07.22
20:18
( (19) Получилось ! Спасибо за помощь!

Как Вы и предположили передавал в NewCounterparty не ссылку, а объект.

Подскажите, как узнать используемую в конфигурации версию БСП?
22 Гений 1С
 
гуру
04.07.22
20:21
Мой гений дарит вам, ггг (запоздало):

&НаСервере
Функция СоздатьДопРеквизитНаСервере(НаборСвойствСтрокой, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения = Неопределено, Многострочный = 0) Экспорт
    УстановитьПривилегированныйРежим(Истина);
    
    //включим константу использования
    Если Не Константы.ИспользоватьДополнительныеРеквизитыИСведения.Получить() Тогда
        Константы.ИспользоватьДополнительныеРеквизитыИСведения.Установить(Истина);
    КонецЕсли;
    
    //попробуем найти реквизит по наименованию
    //ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
    ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИдентификаторРеквизита);
    Если НЕ ЗначениеЗаполнено(ДопРеквизитСсылка) Тогда
        //если не нашли реквизит - будем его создавать
        ДопРеквизитОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
        ДопРеквизитОбъект.Заголовок = НаименованиеРеквизита;
        ДопРеквизитОбъект.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений[НаборСвойствСтрокой]; //.Справочник_Контрагенты;
        Если ТипЗначения = Неопределено Тогда
            ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(250));
        КонецЕсли;
        ДопРеквизитОбъект.ТипЗначения = ТипЗначения; //
        ДопРеквизитОбъект.Наименование = ДопРеквизитОбъект.Заголовок + " ("+ДопРеквизитОбъект.НаборСвойств+")";
        ДопРеквизитОбъект.Виден = Истина;
        ДопРеквизитОбъект.Доступен = Истина;
        ДопРеквизитОбъект.МногострочноеПолеВвода = Многострочный;
        ДопРеквизитОбъект.ДополнительныеЗначенияИспользуются = Истина;
        //зададим имя нового реквизита
        ДопРеквизитОбъект.Имя = ИдентификаторРеквизита; //"filap_"+СтрЗаменить(ИмяРеквизита," ","");
        ДопРеквизитОбъект.Записать();
        ДопРеквизитСсылка = ДопРеквизитОбъект.Ссылка;        
    КонецЕсли;
    
    //добавим наш реквизит в набор дополнительных реквизитов контрагента
    НаборДополнительныхРеквизитовКонтрагента = Справочники.НаборыДополнительныхРеквизитовИСведений[НаборСвойствСтрокой].ПолучитьОбъект(); //Справочник_Контрагенты
    Если НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Свойство") = Неопределено Тогда
        //добавим реквизит в набор
        Стр = НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Добавить();
        Стр.Свойство = ДопРеквизитСсылка;
        НаборДополнительныхРеквизитовКонтрагента.Записать();
    КонецЕсли;
    
    Возврат  ДопРеквизитСсылка;
КонецФункции



Примеры вызова:

&НаСервере
Функция  ДатьЗначениеДопРеквизитаНаСервере(Ссылка, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения = Неопределено, Многострочный = 0) Экспорт
    Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.Контрагенты") Тогда
        НаборСвойствСтрокой = "Справочник_Контрагенты";
    ИначеЕсли ТипЗнч(Ссылка) = Тип("СправочникСсылка.Партнеры") Тогда
        НаборСвойствСтрокой = "Справочник_Партнеры_Общие";
    ИначеЕсли ТипЗнч(Ссылка) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда
        НаборСвойствСтрокой = "Справочник_ДоговорыКонтрагентов";
    ИначеЕсли ТипЗнч(Ссылка) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
        НаборСвойствСтрокой = "Документ_ЗаказКлиента";
    Иначе
        Возврат Неопределено;
    КонецЕсли;
    УстановитьПривилегированныйРежим(Истина);
    Реквизит = СоздатьДопРеквизитНаСервере(НаборСвойствСтрокой, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения, Многострочный);
    ИскСтрока = Ссылка.ДополнительныеРеквизиты.Найти(Реквизит, "Свойство");
    Если ИскСтрока = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    Возврат ИскСтрока.Значение;
КонецФункции


    ДанныеДоговора.Вставить("ПодписантКлиентаФИО",  ДатьЗначениеДопРеквизитаНаСервере(Договор, "Договор_ПодписантКлиентаФИО", "Подписант клиента ФИО", ТипСтрока250));
    ДанныеДоговора.Вставить("ПодписантКлиентаДолжность",  ДатьЗначениеДопРеквизитаНаСервере(Договор, "Договор_ПодписантКлиентаДолжность", "Подписант клиента должность", ТипСтрока250));
    ДанныеДоговора.Вставить("ОГРН",  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, "Партнер_ОГРН", "ОГРН", ТипСтрока250));
    ДанныеДоговора.Вставить("ДействующийНаОсновании",  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, "Партнер_ДействующийНаОсновании", "Действующий на основании", ТипСтрока250));


    ТипСтрока250 = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(250));
    
    ДанныеДоговора.Вставить("ПодписантКлиентаФИО",  ДатьЗначениеДопРеквизитаНаСервере(Договор, "Договор_ПодписантКлиентаФИО", "Подписант клиента ФИО", ТипСтрока250));
    ДанныеДоговора.Вставить("ПодписантКлиентаДолжность",  ДатьЗначениеДопРеквизитаНаСервере(Договор, "Договор_ПодписантКлиентаДолжность", "Подписант клиента должность", ТипСтрока250));
    ДанныеДоговора.Вставить("ОГРН",  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, "Партнер_ОГРН", "ОГРН", ТипСтрока250));
    ДанныеДоговора.Вставить("ДействующийНаОсновании",  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, "Партнер_ДействующийНаОсновании", "Действующий на основании", ТипСтрока250));
23 Фантазер
 
04.07.22
20:29
(21) Ну вот еще одно зачатие 1С-ника. А злые языки говорят - вырождаемся.
24 Vito
 
04.07.22
20:44
(23) Зачался как 1С-ник месяцев 6 назад еще, а сейчас Спасибо всем за то, что грудями выкармливаете!
25 Ryzeman
 
04.07.22
20:55
(21) Пожалуйста :)

>>Подскажите, как узнать используемую в конфигурации версию БСП?

В режиме предприятия посмотреть регистр сведений "Версии подсистем"
У меня, например, СтандартныеПодсистемы версии 3.1.5.385

(22) Кыш! Не порти нам человека своей гггениальностью))
26 Garykom
 
гуру
04.07.22
21:03
(22) А если "Дополнительное значение (иерархия)" где?
27 Гений 1С
 
гуру
04.07.22
22:13
(26) допили