Добавление префикса к коду справочников

1. lafkraft 03.12.13 10:04 Сейчас в теме
Доброго дня.

Подскажите, как добавить префикс к коду всех переносимых справочников?
Сделать это необходимо на этапе выгрузки данных.
Не хочется в ПКС "код->код" (событие перед выгрузкой) каждого справочника прописывать "Значение = Параметры.Префикс + Источник.Код;".
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. insurgut 208 11.12.13 07:51 Сейчас в теме
Открываем свойства вашей Конвертации - событие Перед выгрузкой объекта

Событие вызывается перед выгрузкой всех объектов в файл обмена, не зависимо от того какой объект выгружается. Вызов осуществляется до вызова одноименного обработчика "Правила выгрузки данных". Могут использоваться все параметры, определенные для одноименного обработчика правила выгрузки данных. По сути и назначению это тот же обработчик, но определенный на глобальном уровне - то есть вызываемый для всех правил выгрузки данных. Обработчик удобен, например, когда для документов всех видов нужно проверить одно и то же условие. Обработчик вызывается только для объектов которые выгружаются непосредственно, а не при выгрузке объекта по ссылке. В этом случае обработчики выгрузки не вызываются, а вызываются обработчики конвертации объекта.


На вскидку код для решения вашей задачи:

Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект)) Тогда
 Если Объект.Метаданные().Реквизиты.Найти("Код") <> Неопределено Тогда
  Объект.Код = Префикс + Прав(Объект.Код, СтрДлина(Объект.Код) - СтрДлина(Префикс));
 КонецЕсли;
КонецЕсли;
3. lafkraft 11.12.13 09:45 Сейчас в теме
(2) insurgut, спасибо за ответ. Есть один момент: "Обработчик вызывается только для объектов которые выгружаются непосредственно, а не при выгрузке объекта по ссылке." Необходимо чтобы префикс добавлялся и к справочникам, которые выгружаются по ссылке.
В итоге пришлось прописывать ПКС (код->код) всех справочников.
4. insurgut 208 11.12.13 10:00 Сейчас в теме
Тогда используем Перед конвертацией объекта, там же. Не надо трогать ПКС :)
5. lafkraft 11.12.13 10:16 Сейчас в теме
(4) insurgut, а как записать реквизит приемника в этом обработчике? В хелпе написано, что данный обработчик полностью аналогичен обработчику "Перед выгрузкой" ПКО. В параметрах "Перед выгрузкой" присутствует параметр:

Приемник - Строка. Строковое представление объекта приемника. Может использоваться для тех правил, у которых приемник является значением примитивного типа (Строка, Число, Булево, Дата) или если при помощи правила предполагается идентифицировать по имени предопреденные значения какого-либо ссылочного типа.


Но как понимаю, он мне не подойдет.
6. insurgut 208 11.12.13 10:25 Сейчас в теме
Берете код выше, и заменяете "Объект" на "Источник"
7. lafkraft 11.12.13 11:25 Сейчас в теме
В обработчике "Перед конвертацией объекта" написал следующее:

Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник)) Тогда
	Если Источник.Метаданные().ДлинаКода > 0 Тогда
		ИсточникОбъект = Источник.ПолучитьОбъект();
 		ИсточникОбъект.Код = Параметры.Префикс + Прав(ИсточникОбъект.Код, СтрДлина(ИсточникОбъект.Код) - СтрДлина(Параметры.Префикс));
	КонецЕсли; 
КонецЕсли; 


В отладчике убедился, что код отрабатывает, но в файл код выгружается без префикса. Можно конечно ИсточникОбъект записать, но добавлять префиксы в базе источника мне не нужно :)
8. insurgut 208 11.12.13 11:32 Сейчас в теме
Ну конечно код у вас не появится, зачем выдумываете дополнительный код вроде " ИсточникОбъект = Источник.ПолучитьОбъект();"?

Не нужно ничего получать - код 1 в 1, только заменяете слово Объект на Источник.
9. insurgut 208 11.12.13 11:34 Сейчас в теме
Вот так будет работать:

Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник)) Тогда
    Если Источник.Метаданные().Реквизиты.Найти("Код") <> Неопределено Тогда
         Источник.Код = Параметры.Префикс + Прав(Источник.Код, СтрДлина(Источник.Код) - СтрДлина(Параметры.Префикс));
    КонецЕсли; 
КонецЕсли;
10. lafkraft 11.12.13 12:00 Сейчас в теме
(9) insurgut, попробовал сначала так как вы написали, но вылезли ошибки.
1. Источник - тип СправочникСсылка, соответственно изменять нельзя.
2. У метаданных справочника нет реквизита "Код".
11. insurgut 208 11.12.13 12:53 Сейчас в теме
Да, действительно, так не получится. Могу предложить вариант (самому стало интересно, проверил все на работоспособность).

В Конвертации для события "Перед конвертацией объекта":
Если Лев(ПКО.Приемник, 10) = "Справочник" Тогда
	Если Источник.ПолучитьОбъект().Метаданные().ДлинаКода > СтрДлина(Параметры.Префикс) Тогда
		ВходящиеДанные = Новый Структура;
		ВходящиеДанные.Вставить("Код", Параметры.Префикс + Прав(Источник.Код, СтрДлина(Источник.Код) - СтрДлина(Параметры.Префикс)));
	 КонецЕсли; 
КонецЕсли;


Ну и далее, для каждого ПКО справочника для реквизита Код надо лишь установить галочку "Получить из входящий данных".

Хоть и приходится как то настраивать сами ПКО, но все равно доработка алгоритма формирования кода в одном месте.
info1ctart; v-oksana; Gasilin; +3 Ответить
12. lafkraft 11.12.13 13:10 Сейчас в теме
Хоть и приходится как то настраивать сами ПКО, но все равно доработка алгоритма формирования кода в одном месте.
Согласен, ваш вариант мне больше нравится :) Спасибо за помощь.
13. Wefast 01.12.15 11:08 Сейчас в теме
Выдает ошибку
шибка получения свойства объекта из входящих данных 
	ПКО                    =  ППИ  (Документ: Платежное поручение исходящее)
	ПКС                    =  35  (--> Номер)
	Объект                 =  Платежное поручение исходящее УСО00000002 от 10.11.2015 16:16:05  (Платежное поручение исходящее)
	СвойствоПриемника      =  Номер  (Строка)
	ОписаниеОшибки         =  Получение элемента по индексу для значения не определено
	ПозицияМодуля          =  ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8282)
	КодСообщения           =  68

Ошибка при выгрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1693)}: Ошибка получения свойства объекта из входящих данных 
	ПКО                    =  ППИ  (Документ: Платежное поручение исходящее)
	ПКС                    =  35  (--> Номер)
	Объект                 =  Платежное поручение исходящее УСО00000002 от 10.11.2015 16:16:05  (Платежное поручение исходящее)
	СвойствоПриемника      =  Номер  (Строка)
	ОписаниеОшибки         =  Получение элемента по индексу для значения не определено
	ПозицияМодуля          =  ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8282)
	КодСообщения           =  68
Показать
14. Xershi 1539 01.12.15 11:11 Сейчас в теме
(13) Wefast, ну так код в:
ПКО = ППИ (Документ: Платежное поручение исходящее)
ПКС = 35 (--> Номер)

Какой?
15. insurgut 208 01.12.15 11:31 Сейчас в теме
(13) Wefast, ваше сообщение имеет отношение к указанной теме и к предложенному мною решению?
16. Xershi 1539 01.12.15 11:34 Сейчас в теме
(15) insurgut, выложит код узнаем.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот