Дополнительные реквизиты 1с конвертация в справочник

Пример написания правил обмена (КД 2.0) для переноса дополнительных реквизитов справочника «Номенклатура», в том числе перенос ПВХ с разными типами значений.

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

Задача: с помощью правил обмена перенести Дополнительные реквизиты номенклатуры из «старой торговой программы» в УНФ. В обеих конфигурациях дополнительные реквизиты хранятся в табличной части справочника «Номенклатура» и используется план видов характеристик «ДополнительныеРеквизитыИСведения» и справочник «НаборыДополнительныхРеквизитовИСведений». В принципе это все, что для нас важно.

     Шаг 1. Создаем правило обмена для справочника «НаборыДополнительныхРеквизитовИСведений». Он нам понадобится, чтобы потом создать правило обмена для ПВХ.

(скрин 1)

    Шаг 2. Создаем правило обмена для ПВХ «ДополнительныеРеквизитыИСведения». Для каждого элемента пвх нужно указать тип значения. ТипЗначения — это стандартный реквизит ПВХ, но в конвертации он не отображается как реквизит и его нельзя выбрать в качестве приемника. Так что для передачи типа значения будем использовать параметры объекта. Создаем для плана видов характеристик новый ПКС: указываем «Передать данные в параметр», источник — пустой, приемник — «Типы». 

(скрин 2)

Дальше есть два способа — для обмена между идентичными конфигурациями (попроще) и для всех остальных.

Шаг 2 способ №1. Если у вас обмен между двумя одинаковыми конфигурациями, то вы можете использовать функцию ЗначениеВСтрокуВнутр /ЗначениеИзСтрокиВнутр. В созданном ПКС добавляем следующий код «перед загрузкой»:

ТипыСвойства = Источник.ТипЗначения.Типы();
Значение = ЗначениеВСтрокуВнутр(ТипыСвойства);

В ПКО плана видов характеристик добавляем процедуру «После выгрузки»:

Типы = ЗначениеИзСтрокиВнутр(ПараметрыОбъекта.Получить("Типы"));
Объект.ТипЗначения = Новый ОписаниеТипов(Типы );

Готово.

Шаг 2 способ №2. Если конфигурации не одинаковые, то предыдущий способ работать не будет. При вызове функции ЗначениеИзСтрокиВнутр тип значения не будет определен (будет Неопределено). Мой вариант — записать типы значений в строку, а затем расшифровать ее на стороне приемника.

ПКС «Типы» «перед загрузкой»:

ТипыСвойства = Источник.ТипЗначения.Типы();

МассивТиповСтроками = "";

Для Каждого ТипСвойства Из ТипыСвойства Цикл
МассивТиповСтроками = МассивТиповСтроками+ нрег(СтрЗаменить(Строка(ТипСвойства)," ","")) + ";";
КонецЦикла;

Значение = МассивТиповСтроками;

ПКО плана видов характеристик «после выгрузки»:

ТипыСтрокой = ПараметрыОбъекта.Получить("Типы");

МассивТиповСтрокой = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТипыСтрокой, ";");
МассивТипов = Новый Массив;

Для Каждого ТипСтрокой Из МассивТиповСтрокой Цикл

Если ТипСтрокой = "дополнительноезначение" Тогда
МассивТипов.Добавить(Тип("СправочникСсылка.ЗначенияСвойствОбъектов"));
ИначеЕсли ТипСтрокой = "контрагент" Тогда
МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
//ИначеЕсли ...
КонецЕсли;
КонецЦикла;

Объект.ТипЗначения = Новый ОписаниеТипов(МассивТипов);

Готово.

    Шаг 3. В ПКО справочника «Номенклатура» создаем стандартным способом ПКС для табличной части «Дополнительные реквизиты» и ее реквизитов (скрин 7)

Для ПКС реквизита «Значение» пишем в «перед выгрузкой»:

Если ТипЗнч(ОбъектКоллекции.Значение) = Тип("СправочникСсылка.Контрагенты") Тогда
ИмяПКО = "Контрагенты";
ИначеЕсли ТипЗнч(ОбъектКоллекции.Значение) = Тип("СправочникСсылка.ЗначенияСвойствОбъектов") Тогда
ИмяПКО = "ЗначенияСвойствОбъектов";
// ИначеЕсли...
КонецЕсли;

Теперь все готово. Можно пробовать выгружать.

Конвертация данных. Перенос дополнительных реквизитов.

Я
   yegorka

19.02.14 — 22:10

Здравствуйте,

Перенос элементов справочника Номенклатура между БД одинаковой конфигурации (БП 2). Необходимо для выгружаемой Номенклатуры перенести дополнительные реквизиты (значения из РС ЗначенияСвойствОбъектов).

Реквизиты переносятся, но в БД приемнике оказываются не типизированными.

Может есть добрые люди с примером корректного переноса доп. реквизитов между одинаковыми конфигурациями. Поделитесь, плиз.

  

Партнерская программа EFSOL Oblako

   Aleksey

1 — 19.02.14 — 22:37

это же обычный РС, что там переносить то?

   yegorka

2 — 19.02.14 — 22:41

Ну вот бьюсь сегодня весь день. Не могу корректно перенести.

Учитывай, что мне весь РС не нужен, а только по той номенклатуре, которая выгружается (по ссылкам).

   ЧашкаЧая

3 — 19.02.14 — 22:55

((1) Не скажите. Там значения составного типа и более того планы видов характеристик. Для правильного создания последних нужно передавать типы значений.

   Aleksey

4 — 19.02.14 — 22:56

(2) ВыгрузитьПоПравилу() после выгрузки

   yegorka

5 — 19.02.14 — 22:58

(3) Да, такое ощущение, что нужно, но куда не понятно.

(4) Так и делаю, выборкой получаю значения и в цикле их выгружаюпоправилу.

   yegorka

6 — 19.02.14 — 22:58

(3) Самое интересное, что даже простые типы Дата, Строка не проходят.

   ЧашкаЧая

7 — 19.02.14 — 23:04

(6) Для ПВХ в параметрах нужно передавать типы значений этого ПВХ. Завтра с работы кину пример, если будет необходимость.

   yegorka

8 — 19.02.14 — 23:06

(7) Да есть необходимость, даже острая :-)

Очень буду благодарен.

   ilyavorobyev

9 — 19.02.14 — 23:07

Делал так, в ПКС добавил табличную часть дополнительные реквизиты и для нее получить из входящих данных, и написал такое в пко в перед выгрузкой

СтрокаВходДанных = ВходящиеДанные.ДополнительныеРеквизиты.Добавить();

СтрокаВходДанных.Значение = Источник.КорпоративныйКлиент;

СтрокаВходДанных.ТекстоваяСтрока = «»;

   yegorka

10 — 19.02.14 — 23:13

Я делаю вот так:

            Запрос = Новый Запрос;

            Запрос.Текст =

                «ВЫБРАТЬ

                |    ЗначенияСвойствОбъектов.Объект,

                |   ЗначенияСвойствОбъектов.Свойство,

                |    ЗначенияСвойствОбъектов.Значение

                |ИЗ

                |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов

                |ГДЕ

                |    ЗначенияСвойствОбъектов.Объект = &Объект»;

            Запрос.УстановитьПараметр(«Объект», Объект.Ссылка);

            РезультатЗапроса = Запрос.Выполнить();

            ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

                Данные = Новый Структура;

                Данные.Вставить («Объект», ВыборкаДетальныеЗаписи.Объект);

                Данные.Вставить («Свойство», ВыборкаДетальныеЗаписи.Свойство);

                Данные.Вставить («Значение», ВыборкаДетальныеЗаписи.Значение);

                ВыгрузитьПоПравилу(,,Данные,, «ЗначенияСвойствОбъектов»);

            КонецЦикла;

ПКО ЗначенияСвойствОбъектов получает данные из входящих данных. Его и руками создавал и конструктором, результат одни в БД приемнике значения реквизитов НЕ ТИПИЗИРОВАНЫ

Не знаю на сколько корректно, вот здесь сегодня обсуждал эту проблему http://1c-pro.ru/threads/perenos-dopolnitelnyx-svojstv-dokumenta-mezhdu-odinakovymi-bd.74/

Там есть и картинки и правила обмена, можно лучше понять суть проблемы

   ilyavorobyev

11 — 19.02.14 — 23:59

(10) а что в пко?табличная часть доп реквизиты?

   ЧашкаЧая

12 — 20.02.14 — 09:57

В продолжении (7)

1. Для ПКО плана видов характеристик добавить параметр в котором передаются типы значений ПВХ

http://screencast.com/t/bLSycOR8pObV

2. В самом ПКО плана видов характеристик

http://screencast.com/t/STwohHaSrH

   yegorka

13 — 20.02.14 — 11:21

(12) по картинкам не совсем понятно, может сбросите кусок правил на почту?

  

yegorka

14 — 20.02.14 — 12:08

(12) Разобрался, спасибо огромное, все работает!!!

Показывать по
10
20
40
сообщений

Новая тема

Ответить

Алексей Великий

Дата регистрации: 24.07.2012
Сообщений: 226

«Добрый день. Помогите, пожалуйста, разобраться в следующей проблеме. <br><br>У меня есть самописная конфигурация — источник, из справочника «Контрагенты» которой необходимо выгрузить данные в аналогичный справочник конфигурации «Управление торговлей ред. 11». Все бы ничего, но часть данных должна выгружаться в дополнительные реквизиты конфигурации-приемника (т.е. используется стандартный типовой механизм дополнительных реквизитов и сведений). <br><br>Как я пишу правила конвертации для переноса данных в дополнительные реквизиты: <br><br>Т.к. доп. реквизиты в конфигурации УТ 11 хранятся в табличных частях справочников, то для ПКО «Контрагенты» я делаю сначала ПКГС (Правило конвертации группы свойств) без указания источника, но с указанием приемника — ДополнительныеРеквизиты. В событии ПКГС «ПередОбработкой» пишу следующий код: <br><br>КоллекцияОбъектов = Новый ТаблицаЗначений;<br>КоллекцияОбъектов.Колонки.Добавить(«Свойство»);<br>КоллекцияОбъектов.Колонки.Добавить(«Значение»);<br>Строка = КоллекцияОбъектов.Добавить(); <br><br>Далее в самих ПКГС для кадого реквизитов «Свойство» и «Значение» табличной части «ДополнительныеРеквизиты» делаю соответствующие ПКС (правила конвертации свойств) без указания источника, но с указанием приемника и для каждого приемника программно указываю, какие значения они должны принимать. Значения реквизитов указываю правильно. <br><br>После выгрузки-загрузки проверяю, все ли загрузилось в конфигурацию-приемник и вижу, что в форме элемента справочника «Контрагенты» дополнительные реквизиты не заполнены, хотя в табличную часть «ДополнительныеРеквизиты» этого справочника они добавились (посмотрел с помощью консоли запросов). В чем моя ошибка?»

ZhAmAn

Дата регистрации: 23.12.2010
Сообщений: 1333

А в УТ включены доп.реквизиты?Состав настроен?

Алексей Великий

Дата регистрации: 24.07.2012
Сообщений: 226

Доп. реквизиты включены, состав настроен — на форме элемента справочника «Контрагенты» элементы форм для заполнения доп. реквизитов есть, но они ничем не заполнены, хотя в табличной части «ДополнительныеРеквизиты» они заполнены.

Денис (САМАРА)

Дата регистрации: 09.04.2008
Сообщений: 8351

«Копайте» в направлении заполнения поля «Свойство» доп.реквизитов — возможно определены для справочника «Контрагенты» одни свойства, а в ТЧ заполняются другие. Во вложении пример заполнения доп.сведений и доп.реквизитов для справочника «Номенклатура» (я делал выгрузку из «самописки» 7.7 в УТ 11 версии 1.4). Там обработчиках для «Правил конвертации» выполняется алгоритм, который корректирует какие-либо ошибки если произошла путаница при заполнении (как подстраховка).

Показывать по
10
20
40
сообщений

В данной заметке хотелось бы рассмотреть вопрос: Как загрузить дополнительные реквизиты номенклатуры при помощи обработки с диска ИТС «Загрузка данных из табличного документа (управляемые формы)»?

В качестве примера, будем использовать конфигурацию 1С:ERP Управление предприятием 2, аналогичным смособом можно будет загрузить в Управление торговлей 11 или любую другую, подобную конфигурацию.

Дополнительные реквизиты хранятся в табличной части «ДополнительныеРеквизиты» справочника «Номенклатура». Из обработки «Загрузка данных из табличного документа» можно добраться только к табличной части одной, выбранной номенклатуре, через тип данных «Позиция номенклатуры».

Позиция номенклатуры

Но такой способ нам не подходит, т.к. мы будем загружать дополнительные реквизиты для списка номенклатуры. Для примера загрузим одну номенклатуру и два ее дополнительных реквизита: «Формат» и «Толщина».

Загрузка из табличного документа

Настроим поиск номенклатуры по наименованию из колонки с номером один.

Настройка загрузки реквизитов

Теперь немного займемся программированием. Откроем событие «При записи объекта» и добавим туда следующий программный код:

Объект.ДополнительныеРеквизиты.Очистить(); // Предварительно удаляем все доп. реквизиты. Если не нужно — закомментировать.ДопСвойства = Новый Соответствие;
ДопСвойства.Вставить(«11», 91); // Наименование свойства, номер ячейки
ДопСвойства.Вставить(«АКЦИЯ», 92);
ДопСвойства.Вставить(«Размер,мм», 93);
ДопСвойства.Вставить(«Формат», 94);
ДопСвойства.Вставить(«Номер цвета», 95);
ДопСвойства.Вставить(«Цвет», 96);
ДопСвойства.Вставить(«шт./м2», 97);
ДопСвойства.Вставить(«шт. / палетта», 98);
ДопСвойства.Вставить(«вес, кг/шт.», 99);

Для Каждого

ЭлементДопСвойства Из ДопСвойства ЦиклТекСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ЭлементДопСвойства.Ключ + » (» + Объект.ВидНоменклатуры + «)», Ложь);
   
ТекЗначение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(ТекстыЯчеек[ЭлементДопСвойства.Значение], Ложь);
    Если Не
ЗначениеЗаполнено(ТекСвойство) Тогда
       
Сообщить(«Не удалось найти свойство: «»» + ЭлементДопСвойства.Ключ + » (» + Объект.ВидНоменклатуры + «)»»»);
        Продолжить;
    КонецЕсли;
    Если Не
ЗначениеЗаполнено(ТекЗначение) Тогда
       
Сообщить(«Создаем новое значение «»» + ТекстыЯчеек[ЭлементДопСвойства.Значение] + «»» для свойства «»» + ТекСвойство + «»»»);
       
НовоеЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
       
НовоеЗначение.Владелец = ТекСвойство;
       
НовоеЗначение.Наименование = ТекстыЯчеек[ЭлементДопСвойства.Значение];
       
НовоеЗначение.Записать();
       
ТекЗначение = НовоеЗначение.Ссылка;
    КонецЕсли;
МассивСтрок = Объект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура(«Свойство», ТекСвойство));
    Если
МассивСтрок.Количество() = 0 Тогда
       
ДопРеквизит = Объект.ДополнительныеРеквизиты.Добавить();
    Иначе
       
ДопРеквизит = МассивСтрок[0];
    КонецЕсли;
   
ДопРеквизит.Свойство = ТекСвойство;
   
ДопРеквизит.Значение = ТекЗначение;

КонецЦикла;

Объект.Записать();

В соответствие «ДопСвойста» нужно вставить столько записей, сколько требуется загрузить дополнительных реквизитов. В качестве ключа указываем текстовое наименование дополнительного реквизита, а в качестве значения — номе строки табличного документа, где это значение храниться.

Понравилась статья? Поделить с друзьями:
  • Дополнительные сведения или реквизиты характеристики
  • Дополнительный отопитель салона газель бизнес купить
  • Дополнительный реквизит пользователя тег 1084 пример
  • Допуск управляющей компании к общедомовому имуществу
  • Допустимое отклонение показателя бизнес процесса это