Имя: Пароль:
1C
1С v8
Преобразовать строку в Дополнительный реквизит с типом "Дополнительное значение"
0 zelenprog
 
28.06.23
09:49
Здрасте всем!

Делаю обработку по переносу контрагентов из 1С77 в 1С8.
Застрял на дополнительных реквизитах.

В 7-ке все дополнительные свойства контрагентов - это строки.
В 8-ке некоторые дополнительные реквизиты - это также строки - с ними проблем нету.

А вот некоторые реквизиты в 8-ке созданы с типом "Дополнительное значение".
Как по строке подобрать из такого реквизита соответствующее значение?
А если такого значения нету, то создать его?

Подскажите, плиз...
1 Fish
 
28.06.23
09:55
Ищи и создавай в справочнике ЗначенияСвойствОбъектов
2 Fish
 
28.06.23
09:59
И заодно посмотри процедуру ЗаписатьСвойстваУОбъекта в общем модуле УправлениеСвойствами
3 zelenprog
 
28.06.23
10:12
(1),(2) Направление понял, посмотрю.

Такой вопрос возник...

Попробовал сделать тупо: и записал в такой дополнительный реквизит (с типом "Дополнительное значение") просто строку.
И она записалась! И при чтении этого дополнительного реквизита в коде это значение-строка читается!
Однако, при просмотре контрагента в режиме предприятия этот дополнительный реквизит отображается пустой, как будто не заполнен, и в списке значений моей строки нету.
Где теперь найти и удалить эту строку?
4 Мультук
 
гуру
28.06.23
10:15
(3)

Может сначала разобраться "а как всё это работает" ?
А как справочнику "Контрагенты" назначаются доп.сведения и доп.реквизиты ?
А включены ли они в текущем конфигурации "1С8" вообще?

А зачем почти во всех справочниках и документах есть табличная часть "ДополнительныеРеквизиты", что там и как хранится ?
5 zelenprog
 
28.06.23
10:41
(4)
>> А как справочнику "Контрагенты" назначаются доп.сведения и доп.реквизиты ?
Я в общем разобрался.

>> А зачем почти во всех справочниках и документах есть табличная часть "ДополнительныеРеквизиты", что там и как хранится ?
Да, у контрагентов я эту табличную часть тоже смотрел.

>> А включены ли они в текущем конфигурации "1С8" вообще?
Включены и используются, уже частично заполнены.

Теперь надо из 7-ки перенести дополнительную информацию.
У некоторых контрагентов значения допреквизитов изменились.

Что касается структуры я разобрался.

У меня вопрос чисто по кодированию. Как быстро написать код, который ищет дополнительное значение реквизита по строке?
А если такого значения нет - то добавляет новое значение.
Желательно использовать какой-нибудь готовый метод из БСП, если есть таковой.
Думаю, что метод такой должен быть, так как в правилах конвертации это часто встречающаяся задача. Вряд ли каждый раз программист пишет код по работе со справочником "ЗначенияСвойствОбъектов".

Потому что "вручную" писать код - это конечно муторно.
Там ведь нужно:
- найти все подчиненные значения
- выполнить поиск по их наименованиям, сравнивая со строкой
- если не найдено, то добавить новое значение
- подставить ссылку на это значение в допреквизит контрагента
- записать контрагента
6 Donkey_hot
 
28.06.23
10:43
(5) Создать значение свойства с нужным владельцем (элементом ПВХ) вроде бы не должно быть проблемой.
7 zelenprog
 
28.06.23
11:00
(6) А можно пример кода?

Вот нашел что-то похожее:

Процедура СоздатьОбновитьЗначениеРеквизита(ДополнительныйРеквизит, СтрокаДанных, ЗначениеРеквизитаСсылка) Экспорт
    //++ Локализация
    НачатьТранзакцию();
    
    Попытка
        
        Если ЗначениеЗаполнено(ЗначениеРеквизитаСсылка) Тогда
            
            УстановитьИсключительнуюБлокировкуПоСсылке(ЗначениеРеквизитаСсылка);
            
            ЗначениеОбъект = ЗначениеРеквизитаСсылка.ПолучитьОбъект();
        Иначе        
            ЗначениеВБазе = РаботаСНоменклатурой.ЗначениеПоИдентификатору(ДополнительныйРеквизит, СтрокаДанных.Идентификатор);
            
            Если ЗначениеВБазе <> Неопределено Тогда
                ЗначениеРеквизитаСсылка = ЗначениеВБазе;
                ЗафиксироватьТранзакцию();
                Возврат;
            КонецЕсли;
            
            ЗначениеОбъект = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
        КонецЕсли;
        
        ЗначениеОбъект.Владелец           = ДополнительныйРеквизит;
        ЗначениеОбъект.Наименование       = СтрокаДанных.Наименование;
        ЗначениеОбъект.ПолноеНаименование = СтрокаДанных.Наименование;
        ЗначениеОбъект.Записать();
        
        ЗначениеРеквизитаСсылка = ЗначениеОбъект.Ссылка;

        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение;
    КонецПопытки;
    //-- Локализация
КонецПроцедуры


Это не подойдет?
8 АгентБезопасной Нацио
 
28.06.23
11:03
(7) а описание к БСП читать не пробовал?
9 zelenprog
 
28.06.23
11:34
(8) // Создание или обновление значения реквизита.
//
// Параметры:
//  ДополнительныйРеквизит           - ЛюбаяСсылка - ссылка на реквизит.
//  СтрокаДанных                     - СтрокаТаблицыЗначений - строка таблицы значений.
//                                                             Описание таблицы см. РаботаСНоменклатурой.ДанныеКатегорийСервиса,
//                                                             поле ДополнительныеРеквизиты, колонка Значения.
//  ЗначениеРеквизитаСсылка          - ЛюбаяСсылка - ссылка на новое значение.
//

Похоже этот метод не подходит :(
10 zelenprog
 
28.06.23
11:34
Ткните плиз носом, какой метод можно взять за основу?
11 zelenprog
 
28.06.23
12:09
Есть ссылка на допреквизит:

лДопРеквизитДляЗаписи = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", лИмяРеквизита);

А как определить тип значения этого допреквизита?
12 DJ Anthon
 
28.06.23
12:24
получает либо устанавливает значение по имени. это один из вариантов работы с ним. мне стандартная функция тоже не особо нравится, но лучше бы тебе немного посмотреть структуру тч допреквизиты какими-нибудь обработками, тогда все станет понятно.
&НаСервере
Функция ДопРеквизит(Спр, Имя, Значение = Неопределено) Экспорт
    Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(Имя);
    Если Свойство.Пустая() Тогда
        Сообщить("Ошибка! Не найден дополнительный реквизит " + Имя);
        Возврат Неопределено;
    КонецЕсли;
    Массив = Спр.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", Свойство));
    Если Значение = Неопределено Тогда
        Возврат ?(Массив.Количество() = 0, Неопределено, Массив[0].Значение);
    Иначе
        Если Массив.Количество() = 0 Тогда
            Строка = Спр.ДополнительныеРеквизиты.Добавить();
            Строка.Свойство = Свойство;
        Иначе
            Строка = Массив[0];
        КонецЕсли;
        Если ТипЗнч(Значение) = Тип("Строка") И СокрЛП(Свойство.ТипЗначения) = "Дополнительное значение" Тогда
            Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(Значение, Истина, , Свойство);
        КонецЕсли;
        Строка.Значение = Значение;
    КонецЕсли;
    Возврат Истина;
КонецФункции
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.