Добавление префикса к коду справочников
По теме из базы знаний
- Исправление кодов и инвентарных номеров ОС в 1С: Бухгалтерия бюджетного учреждения 8 и 1С: Бухгалтерия государственного учреждения 8
- Добавление префикса к кодам справочников
- Пример переноса справочников, документов и движений через Эксель и "Конвертацию данных 2" из оптовой учетной системы 1С 7.7 Комплексной 4.2 и розничной учетной системы Рарус Торговый комплекс -> в 1С 8.3 ЕРП 2.4 (расширение и дополнительные реквизиты)
- Универсальная замена префиксов объектов
- Префиксация номеров документов в 1С (структурное подразделение: склад/магазин/подразделение)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Открываем свойства вашей Конвертации - событие Перед выгрузкой объекта
На вскидку код для решения вашей задачи:
Событие вызывается перед выгрузкой всех объектов в файл обмена, не зависимо от того какой объект выгружается. Вызов осуществляется до вызова одноименного обработчика "Правила выгрузки данных". Могут использоваться все параметры, определенные для одноименного обработчика правила выгрузки данных. По сути и назначению это тот же обработчик, но определенный на глобальном уровне - то есть вызываемый для всех правил выгрузки данных. Обработчик удобен, например, когда для документов всех видов нужно проверить одно и то же условие. Обработчик вызывается только для объектов которые выгружаются непосредственно, а не при выгрузке объекта по ссылке. В этом случае обработчики выгрузки не вызываются, а вызываются обработчики конвертации объекта.
На вскидку код для решения вашей задачи:
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект)) Тогда
Если Объект.Метаданные().Реквизиты.Найти("Код") <> Неопределено Тогда
Объект.Код = Префикс + Прав(Объект.Код, СтрДлина(Объект.Код) - СтрДлина(Префикс));
КонецЕсли;
КонецЕсли;
(2) insurgut, спасибо за ответ. Есть один момент: "Обработчик вызывается только для объектов которые выгружаются непосредственно, а не при выгрузке объекта по ссылке." Необходимо чтобы префикс добавлялся и к справочникам, которые выгружаются по ссылке.
В итоге пришлось прописывать ПКС (код->код) всех справочников.
В итоге пришлось прописывать ПКС (код->код) всех справочников.
(4) insurgut, а как записать реквизит приемника в этом обработчике? В хелпе написано, что данный обработчик полностью аналогичен обработчику "Перед выгрузкой" ПКО. В параметрах "Перед выгрузкой" присутствует параметр:
Приемник - Строка. Строковое представление объекта приемника. Может использоваться для тех правил, у которых приемник является значением примитивного типа (Строка, Число, Булево, Дата) или если при помощи правила предполагается идентифицировать по имени предопреденные значения какого-либо ссылочного типа.
Но как понимаю, он мне не подойдет.
Приемник - Строка. Строковое представление объекта приемника. Может использоваться для тех правил, у которых приемник является значением примитивного типа (Строка, Число, Булево, Дата) или если при помощи правила предполагается идентифицировать по имени предопреденные значения какого-либо ссылочного типа.
Но как понимаю, он мне не подойдет.
В обработчике "Перед конвертацией объекта" написал следующее:
В отладчике убедился, что код отрабатывает, но в файл код выгружается без префикса. Можно конечно ИсточникОбъект записать, но добавлять префиксы в базе источника мне не нужно :)
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник)) Тогда
Если Источник.Метаданные().ДлинаКода > 0 Тогда
ИсточникОбъект = Источник.ПолучитьОбъект();
ИсточникОбъект.Код = Параметры.Префикс + Прав(ИсточникОбъект.Код, СтрДлина(ИсточникОбъект.Код) - СтрДлина(Параметры.Префикс));
КонецЕсли;
КонецЕсли;
В отладчике убедился, что код отрабатывает, но в файл код выгружается без префикса. Можно конечно ИсточникОбъект записать, но добавлять префиксы в базе источника мне не нужно :)
Вот так будет работать:
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник)) Тогда
Если Источник.Метаданные().Реквизиты.Найти("Код") <> Неопределено Тогда
Источник.Код = Параметры.Префикс + Прав(Источник.Код, СтрДлина(Источник.Код) - СтрДлина(Параметры.Префикс));
КонецЕсли;
КонецЕсли;
Да, действительно, так не получится. Могу предложить вариант (самому стало интересно, проверил все на работоспособность).
В Конвертации для события "Перед конвертацией объекта":
Ну и далее, для каждого ПКО справочника для реквизита Код надо лишь установить галочку "Получить из входящий данных".
Хоть и приходится как то настраивать сами ПКО, но все равно доработка алгоритма формирования кода в одном месте.
В Конвертации для события "Перед конвертацией объекта":
Если Лев(ПКО.Приемник, 10) = "Справочник" Тогда
Если Источник.ПолучитьОбъект().Метаданные().ДлинаКода > СтрДлина(Параметры.Префикс) Тогда
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Код", Параметры.Префикс + Прав(Источник.Код, СтрДлина(Источник.Код) - СтрДлина(Параметры.Префикс)));
КонецЕсли;
КонецЕсли;
Ну и далее, для каждого ПКО справочника для реквизита Код надо лишь установить галочку "Получить из входящий данных".
Хоть и приходится как то настраивать сами ПКО, но все равно доработка алгоритма формирования кода в одном месте.
Выдает ошибку
шибка получения свойства объекта из входящих данных
ПКО = ППИ (Документ: Платежное поручение исходящее)
ПКС = 35 (--> Номер)
Объект = Платежное поручение исходящее УСО00000002 от 10.11.2015 16:16:05 (Платежное поручение исходящее)
СвойствоПриемника = Номер (Строка)
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8282)
КодСообщения = 68
Ошибка при выгрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1693)}: Ошибка получения свойства объекта из входящих данных
ПКО = ППИ (Документ: Платежное поручение исходящее)
ПКС = 35 (--> Номер)
Объект = Платежное поручение исходящее УСО00000002 от 10.11.2015 16:16:05 (Платежное поручение исходящее)
СвойствоПриемника = Номер (Строка)
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8282)
КодСообщения = 68
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот