|
Преобразовать строку в Дополнительный реквизит с типом "Дополнительное значение" | ☑ | ||
---|---|---|---|---|
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]; КонецЕсли; Если ТипЗнч(Значение) = Тип("Строка") И СокрЛП(Свойство.ТипЗначения) = "Дополнительное значение" Тогда Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(Значение, Истина, , Свойство); КонецЕсли; Строка.Значение = Значение; КонецЕсли; Возврат Истина; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |