Занятие № 04. Курс «1С:Конвертация данных 2.1 – Профессиональная настройка правил обмена и типовые сценарии переноса данных»

Преобразования при переносе данных

Изучите теорию модуля № 1:

  • Глава 5. Перенос разнотипных данных

Выполните практические задания:

Отчеты по домашним заданиям размещайте по ссылкам, указанным выше. Отчеты, опубликованные на этой странице, удаляются без предупреждения.

Ваши вопросы по материалам данного занятия задавайте в комментарии ниже.
Общие вопросы по курсу, не связанные с конкретным занятием, задавайте на странице: http://kursy-po-1c.ru/data-conv/all-hw/convdata-common-qa/

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (184):

  1. Алексей

    Добрый день, скажите, а можно ли настроить, чтобы пользователь перед загрузкой на форме обработки интерактивно указывал параметр, например, организация по умолчанию, которая будет использоваться по умолчанию, а в правилах прописать заполнение соответствующего реквизита из этого параметра. И как это сделать (я имею ввиду добавить возможность указания параметра)?

    • AlexeyDubrovin

      Посмотрите урок 2.2.4. Подключаемые обработки. Там подобное рассматривается

  2. SinO

    Добрый день! Подскажите пожалуйста, решаю такую задачу:
    Есть две базы УТ 11.4, из Источника передается документ “Заказ на перемещение” в Приемник должен заходить как “Перемещение товаров”, но табличная часть перемещения в Приемнике должна заполнятся по существующим остаткам склада отправителя т.е.

    В заказе имеем Т1 5шт;Т2 5шт;Т3 10шт, а на остатках в Приемнике Т1 2шт;Т2 1шт;Т3 0шт соответственно в документе Перемещение товаров табличная часть заполняется вот так Т1 2шт;Т2 1шт как можно реализовать такой перенос?

    Сделал так создал ПКО и ПКС, в обработчике ПКО после загрузки написал запрос который проверяет остатки и при помощи выборки заполняю Объект.Товары, но ничего не получается.

    Правила прилагаю

          • Ольга Кузнецова

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

            • AlexeyDubrovin

              Добрый день. У меня Ваше правило отработало через универсальный обмен данными в формате xml

              • SinO

                Добрый день! У меня не отрабатывает. Хотелось бы узнать я правильно делаю? Или нет? Сам механизм, можете проверить? Какую последовательность соблюдать, схему можете подсказать? Просто есть сомнения по поводу моих правил. И они все же не отрабатывают, товарный состав переносится один к одному, опишу еще раз ситуацию:
                В базе Источнике в заказе на перемещение присутствуют товары: Т1-5шт;Т2-5шт;Т3-10шт нужно, что бы при загрузке или после выгрузки в базе Приемнике табличная часть документа перемещения товаров корректировалась (пере заполнялась) в соответствии с остатками базы т.е. в базе приемнике на остатке есть:
                Т1-2шт;Т2-1шт;Т3-0шт соответственно в документ перемещения должен попасть вот такой товарный состав: Т1-2шт;Т2-1шт, а у меня ничего не пере заполняется, переносится один к одному товарный состав.

                • Ольга Кузнецова

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

  3. armik89

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

    Пытался повторить перенос в реквизит составного типа из урока 1.5.5. Все переносится, но отображается не синоним, а программное имя. В чем может быть причина?

    • Ольга Кузнецова

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

  4. Тимур

    Здравствуйте. В 1 модуле 5 главы 4 урока, рассматривается конвертация справочник – перечисление, но во всем занятии рассматривается только случай, если переносятся предопределенные элементы справочника и ни слова не сказано как быть в случае если нужно переносить не предопределенные элементы справочника ?

    • Ольга Кузнецова

      Добрый день

      Разница будет только в проверке на соответствие элементов справочника. То есть если элемент предопределенный, Вы можете написать

      Если Источник.СтатусДокумента = Справочники.СтатусыДокументов.ВПроцессе Тогда

      А если не предопределенный, придется писать что-то вроде

      Если Источник.СтатусДокумента.Наименование = "В процессе" Тогда

      Или по какому-то другому принципу сопоставлять элементы справочника значениям перечисления, по значению какого-то реквизита, например. Здесь все будет зависеть от задачи

      • Тимур

        Да вроде так и делал, но все равно не получается, видимо в другом месте ошибка.

        • Ольга Кузнецова

          Пустое свойство в итоге? Или ошибку выдает?

          Можно посмотреть в файл данных, есть ли там в свойстве строка с именем элемента перечисления. Если есть, возможно, в ней опечатка, и элемент перечисления не находится. Если нет – проблема на стороне выгрузки. Возможно, опечатка в наименовании элемента справочника.

  5. Алексей

    Добрый день!
    Помогите, пожалуйста, разобраться. Не удается воспроизвести пример (глава 5, урок 6) “Перенос в реквизит составного типа данных”. Повторяю все действия тренера (создаю ПКС ПричинаУвольнения, пишу код обработчика Перед выгрузкой как в видео, где задается значение параметра ТипПриемника). Однако значение переносится как строка – в приемнике в нее записывается идентификатор значения перечисления, а не ссылка. В файле данных для свойства ПричинаУвольнения ни указывается его тип (например, для работника Абрамов).
    Использую версию Конвертации данных 2.1.8.2, платформа 8.3.10.2651. Правила обмена и файл с данными прилагаю.

    • Ольга Кузнецова

      Добрый день!

      Попробуйте перед выгрузкой в обработке Универсальный обмен на закладке “Дополнительные настройки” отключить флажок “Использовать оптимизированный формат”.
      Этот флажок отключают, если нужно записывать в узлы типы данных. Когда он включен, все типы выгружаются в начале файла данных, а все типы, которые встречаются в узлах, игнорируются

  6. Светлана

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

    Возникла ошибка при загрузке правил обмена “{Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(724)}: Конструктор не обнаружен
    Возврат Новый(Тип);

    Что делать??

    • Ольга Кузнецова

      Добрый день.
      Возможно, в правилах пустое ПКС где-то оказалось. Если не найдете ошибку, прикрепите к комментарию правила в zip или rar – архиве

  7. Grigoriy99

    Добрый день. Переношу справочник “Договоры контрагентов” БП2.0-БП3.0. В БП2.0 добавлен новый реквизит типа перечисление “ПроектДоговора”. В БП 3.0 это реализовано через “Дополнительные реквизиты” с типом значения Дополнительное значение с указанием ограниченного перечня выбираемых значений.
    Создал ПКО для справочника Договора контрагентов, в процедуре “После загрузки” указал следующий код

    ТЗСвойства = Новый ТаблицаЗначений;
    ТЗСвойства.Колонки.Добавить("Свойство");
    ТЗСвойства.Колонки.Добавить("Значение");

    Строка = ТЗСвойства.Добавить();
    //Указываем свойство
    Строка.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ПроектДоговора");
    //Значение свойства
    Строка.Значение = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Проект1");
    //Записываем значение свойства в договор
    УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Объект.Ссылка, ТЗСвойства);

    Процедура экспортная, при загрузке ругается. И второй вопрос, значение свойства должно устанавливаться на основании реквизита у договора у базы источника

    • Ольга Кузнецова

      Ошибка возникает в процедуре из общего модуля? Это нужно смотреть, как она работает, и в каком случае выдает ошибку, здесь лучше в отладчике посмотреть.

      А значение из источника лучше всего передать через параметры объекта. Создайте ПКС с видом “Передавать значение в параметр”. Задайте имя параметра, например, “ПроектДоговора”. Перед выгрузкой нужно будет получить в параметр Значение строковое имя элемента перечисления, по которому нужно будет искать элемент в приемнике.

      В событии ПКО После загрузки это строковое значение можно будет получить из соответствия ПараметрыОбъекта:

      ПараметрыОбъекта[“ПроектДоговора”]

      • Grigoriy99

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

  8. Florio

    Здравствуйте! Прошу помочь с пониманием настроек конвертации на конкретном примере.
    Видео из Модуля 1, главы 5, 1.5.4. Конвертация “справочник – перечисление”, скриншот на 07:21.
    Здесь приведено ПКС, в котором программно устанавливается реквизит «СостояниеДокумента». Вопрос: насколько понимаю, реквизит ПКС Источник заполняется в случае явного сопоставления реквизитов Источника и Приемника. В данном же случае, при обращении из ПКС к реквизиту ПКО через точку: «Источник.СтатусДокумента = …», заполнять поле ПКС Источник не требуется, поле лучше было оставить пустым. Прав ли я?

    • Ольга Кузнецова

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

      Да, в этом случае ПКС настроено так, что стандартное получение значения свойства не нужно. В таких случаях можно не указывать Источник у ПКС. Но можно и указать, он ничем не мешает. Только с точки зрения читаемости правил. Поскольку если в каком-то случае все-таки будет происходить стандартное получение значения, а источник в ПКС не указан, то может возникнуть ошибка

  9. vishnyakov

    Хотелось бы уточнить в чем разница при выгрузке примитивного типа данных и ссылочного? Для примитивного выгружается непосредственно значение, а для ссылочного ссылка и все связанные данные?

    • Ольга Кузнецова

      Примитивный тип данных представляет из себя одно значение. С точки зрения обменов, это значение может быть просто выгружено в файл xml без изменений.

      Ссылочный тип данных – это ссылка на объект. Понятно, что выгружать просто адрес ссылки не нужно, в базе-приемнике он может не совпадать с тем, что в базе-источнике. Ссылочный тип нужно выгружать либо так, чтобы можно было найти ссылку на аналогичный объект в базе-приемнике, либо так, чтобы можно было загрузить этот объект в базу-приемник целиком. Для этого нужно выгрузить значения свойств этого объекта, определить, как выполнять поиск аналогичного объекта в приемнике, указать, нужно ли загружать новый объект, если он не будет найден, и так далее. Для этого создается ПКО, в котором все это явно указывается. Без ПКО значение ссылочного типа просто не будет выгружено.

      • vishnyakov

        А как происходит передача значения из ПКС в ПКО? Что передается и в каком виде? Опять же какая разница будет между примитивным типом данных и ссылочным? И как в этом участвует параметр “Значение”, он нужен только для разработчика или значение “Значения” всегда чем-то заполняется?

        • Ольга Кузнецова

          В ПКС значение свойства-источника записывается в параметр Значение. Если в ПКС указано ПКО, то это значение будет передано в это ПКО для конвертации. В этом ПКО значение свойства уже окажется в параметре Источник. Передача в ПКО – это по сути вызов функции ВыгрузитьПоПравилу(), где первым параметром указывается Значение, а внутри этой функции первый параметр – Источник. И дальше выгружается уже этот Источник.

          Если это было свойство ссылочного типа, то в Источнике оказывается ссылка на объект. Происходит выгрузка этого объекта, обработка ПКС, получение значений его свойств, их выгрузка и так далее.

          Если это было значение примитивного типа, значит в Источнике окажется это значение. Тогда ПКО должно быть такое, чтобы это значение нормально выгрузилось. В каждом его ПКС должно быть описано, откуда взять значение для выгрузки. Иначе будет произведена попытка получить свойство от значения примитивного типа, и эта попытка вызовет ошибку.

  10. Владимир Бычков

    Добрый день. Вопрос по ДЗ 1.4.2, подзадание 2. В решении преподавателя в ПКО РеализацияТоваровУслуг в ПКС для Организация обработчик ПередВыгрузкой получает значение константы

    Значение = Константы.Организация.Получить();

    далее управление передаётся в служебное ПКО Организации, где в ПКС Наименование в обработчике ПередВыгрузкой следующий код:

    Значение = Источник;

    непонятен его смысл, разве это не дублирование стардартного поведения системы?

    • Ольга Кузнецова

      Здравствуйте!
      Нет, если не написать этот обработчик, при выгрузке будет возникать ошибка.
      Когда мы получаем значение константы Организация, оно имеет тип Строка. Эта строка передается в ПКО Организации в качестве Источника, а там настроено ПКС Наименование. Вот чтобы программа не пыталась получить свойство Наименование от Источника, который представляет собой строку, мы пишем в обработчике собственное получение значения этого свойства

      • Владимир Бычков

        да, понял в чем дело. Изначально прописал получение значения константы в 2-х местах, в ПКС Организация ПКО РТУ и в ПКС Наименование ПКО Организация. В таком состоянии выгрузка-загрузка естественно прошла успешно, потом когда убрал дублирование перед загрузкой не удалил данные, в результате показалось, что отработало и так :) Но при выгрузке ошибки нет

        • Ольга Кузнецова

          Да, если в конфигурации Организация в константе, то логично сделать ПКО, в котором будет ее получение и выгрузка, и подставлять это ПКО во все ПКС, где в приемнике нужна организация

  11. b0nd

    Добрый день.
    Лекция 1.5.2.
    Перенос строки КодаФилиала Работника в Справочник Организации, где код филиала является кодом объекта Организация. Версия КД 2.1.8.2. Версия обработки УОД 2.1.8. Для того, чтобы работало ПКС КодФилиала->Организация не пришлось поставить флаг поиска, иначе ПКС просто не отрабатывалось.
    Лекция 1.5.5
    ТипПриемника не переносится. “Использовать оптимизированный формат…” перед выгрузкой снимаю. В файле выгрузки тип данных указан, в конечной базе требует выбрать тип при попытке редактирования реквизита сотрудника… Или я неверно трактую системное сообщение? Когда открывается окно для выбора типа данных – строка с типом данных, которая подсвечена и является типом данных, который соответствует подставленному в данный момент значению? Или для перечисления должен сразу открываться список значений перечислений?

    • Ольга Кузнецова

      1.5.2
      Это ПКС должно работать и без флага поиска. Флаг поиска нужен у ПКС Код, по этому ПКС сопоставляются загружаемые организации. Посмотрите в файл данных, заполнены ли там в элементах справочника Работники свойства Организация?

      1.5.5
      Может быть, что и не значения перечисления выпадают при попытке выбора значения. Определить, какой тип свойства в результате загрузился можно, например, с помощью консоли запросов. Там выбрать значения этих свойств и посмотреть, какой у них в итоге тип.

  12. Александр

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

    • Ольга Кузнецова

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

      • Александр

        *мИриться*, ошибся в тексте вопроса.
        Спасибо, Ольга.
        Т.е. без дополнительных настроек правил конвертации отбирать можно только в режиме обычного приложения? Там фильтры доступны по умолчанию.

        • Ольга Кузнецова

          Да, в управляемую форму не добавили эти отборы. Там только через заранее определенные параметры можно влиять на состав выгружаемых данных. А в обычной форме они остались и работают. Это в обработке V8Exchan82, а в V8Exchan83 уже нет обычной формы.

  13. Марк

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

    У меня такая задача. Необходимо перенести документ. В источнике нет табличной части, а в приемнике есть. Мне нужно добавить одну строку в табличную часть. Как мне это лучше сделать? Правильно ли будет если я пойду таким способом:
    в ПКО документа в обработчике “После загрузки” написать код

    НоваяСтрока = Объект.ПродажиВНТТ.Добавить();
    НоваяСтрока.Сумма = Объект.СуммаДокумента;

    Или есть какой то более правильный и оптимальный способ?

    • Ольга Кузнецова

      Здравствуйте!
      Если в табличную часть нужно добавить строку, в которой будет только сумма документа, то Вы выбрали оптимальный способ. Так не переносится никакая лишняя информация и не выполняется лишний код

  14. lasysh

    1. Тип клиента >> Вид клиента
    Создаем ПКО для данного переноса
    ПКС: в качестве приемника: Наименование, в Обработчике “Передвыгрузкой”:”Значение=Строка(Источник);”
    Создаем ПКС Типклиента >> Видклиента в ПКО Контрагенты
    2. Юридическое лицо >> Юридическое физическое лицо.
    Создаем ПКС Юридическоелицо>> Юридическоефизическоелицо в ПКО Контрагенты
    в Обработчике “Передвыгрузкой”:

    Если Источник.ЮридическоеЛицо=Истина Тогда
        Значение="ЮридическоеЛицо";
    Иначе
        Значение="ФизическоеЛицо";
    КонецЕсли;
    >
    • Татьяна Гужавина

      Доброго дня!
      На текущей странице принимаются только вопросы по занятию.
      Отчет по заданию нужно оставить на странице с самим заданием.

  15. Виталий Тарасов

    В уроках не первый раз используется прием, когда в обработчике ПКО ПослеЗагрузки проверяется объект на модифицированность, или что реквизит действительно изменился. А как быть с константами, если они все разом переносятся в ПКО КонстантыНабор? Пример. Необходимо объединить несколько баз в одну, константы везде идентичны, но значения могут различаться. Допустим, что все константы булево. Как сделать, что если в итоговой базе константа имеет значение Истина, а у очередной передаваемой – Ложь. Как указать, что если уже есть Истина, то на Ложь менять нельзя? Что вообще является Объектом в обработчике ПослеЗагрузки – массив констант?

    • Ольга Кузнецова

      Здравствуйте!
      В обработчиках на стороне загрузки в ПКО для Констант Объект имеет тип КонстантыНабор.
      А много констант нужно переносить? Не нашла лазейку, где можно проверить и значение константы в базе, и загружаемое значение. Возможно, эту задачу лучше решить через параметры – выгрузить значение каждой константы как параметр конвертации. А при получении тогда можно создать свой собственный алгоритм заполнения значений

  16. JaneSv

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

    Вопрос по ситуации, аналогично описанной LeonidPS от 01.09.2016г
    При разборе урока 1.5.05 не получается перенести информацию в реквизит составного типа.
    Данные переносятся как строка. Выполняю все, как на видео в уроке, но все равно получается
    только строка (д.б. перечисление)

    Если Найти(нрег(Источник.ПричинаУвольнения),"прогул") тогда
        Значение="ЗаПрогул";
         ТипПриемника="ПеречислениеСсылка.ПричиныУвольнения";
         Сообщить(Значение + "_" + ТипПриемника);
    ИначеЕсли Найти(нрег(Источник.ПричинаУвольнения),"собствен") тогда
        Значение="ПоСобственномуЖеланию";
         ТипПриемника="ПеречислениеСсылка.ПричиныУвольнения";
         Сообщить(Значение + "_" + ТипПриемника);
    КонецЕсли;

    Но в файл с данными тип не заполнен, хотя в Сообщить выдает тип правильно.
    Ваш совет снять флажок Использовать оптимизированный формат … на закладке
    Доп. настройки при загрузке результата не дал.
    Что еще надо исправить или проверить?

    • Ольга Кузнецова

      Здравствуйте!
      Флажок “Использовать оптимизированный формат” нужно снимать именно вперед выгрузкой. Если посмотреть в файл данных, то там после узла ПравилаОбмена есть узел ИнформацияОТипахДанных. Это результат выгрузки в оптимизированном формате. Если флажок снять и выполнить выгрузку, то этого узла не будет. Тогда в файле данных для свойства Причина увольнения будет указан тип приемника.

Комментарии закрыты