Пример правила конвертации объектов. Как найти ошибку при переносе данных Обработчики событий для правил конвертации группы свойств

Учебник по 1С Конвертации данных (редакция 2) Правила конвертации объектов

Как мы уже знаем, правила конвертации объектов используются для сопоставления объектов в конфигурациях источнике и приемнике. Естественно, что в правиле задается объект источник данных (то есть откуда брать данные) и объект - приемник данных (то есть куда переносить или записывать данные).

Кроме них имеется еще ряд свойств смысл которых постараемся раскрыть.

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

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

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

Не создавать новый объект в приемнике, если он НЕ найден * - флаг определяет нужно ли создавать новый объект в информационной базе - приемнике, если он не был найден по уникальному идентификатору или по полям поиска.

При переносе объекта по ссылке НЕ создавать новый объект, а только переносить ссылку - флаг определяет нужно ли создавать новый объект в информационной базе - приемнике, если он не был найден по уникальному идентификатору или по полям поиска в том случае если объект переносится по ссылке. Если объект не находится и у него установлен поиск по уникальносу идентификатору то будет перенесена только ссылка на объект (без полей поиска - одна ссылка). Если же объект выгружается непосредственно (то есть выгружается не только ссылка на объект, но и все его реквизиты), то флаг ни на что не влияет.

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

Не запоминать выгруженные объекты - флаг определяет нужно ли системе при выгрузке КЭШировать последние выгруженные объекты. КЭШирование позволяет ускорить процесс выгрузки и загрузки данных.

Использовать быстрый поиск объекта при выгрузке и загрузке - флаг определяет использовать ли быстрый поиск объектов для выгрузки. Имеет смысл применять для небольших по количеству записей справочников (Количество записей не более 1000 элементов). Эффект достигается в том случае, если у многих объектов установлен флаг Не выгружать объекты свойств по ссылкам. При такой схеме выгрузки и загрузке данных скорость возрастает в несколько раз.

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

On-line обмен

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

  1. По правилам выгрузки если объект уже выгружался, то выгружаем его как есть
  2. По правилам выгрузки если объект не выгружался, то не выгружаем
  3. При выгрузке по ссылке на объект выгружаем целиком

Например, если нужно переносить не всю номенклатуру из одной ИБ в другую, а только ту, на которую есть ссылки, то флажок подойдет.

Не замещать объект созданный в информационной базе приемнике при загрузке - настройка определяет нужно ли (обратно) переносить объект, который был создан в информационной базе, с которой организован обмен. То есть, если документ создан в информационной базе 1, при помощи обмена поступил в информационную базу 2, то стоит ли его при изменении в базе 2 переносить в базу 1. Настройка позволяет указать приоритет объекта при обмене по месту его создания. То есть изменения в информационной базе, где был создан объект распространяются везде, а изменения в других базах не влияют на этот объект в базе 1.

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

Варианты настроек полей поиска - таблица с возможными вариантами настроек полей поиска для пользователя. Разработчик правил определяет возможные комбинации полей поиска, которые пользователь может выбирать при настройке обмена. Все настройки указанные разработчиком правил должны быть отработаны в коде обработчика "Поля поиска". Переменная НастройкаПоиска в обработчике определяет выбранный пользователем вариант сопоставления (ИмяНастройкиДляАлгоритма из соответствующей строки таблицы). Если пользователь не выбрал ни один вариант сопоставления, или ему ни один вариант не был предложен, то НастройкаПоиска - пустая строка.

На закладке "Дополнительно" можно редактировать наименование правила, вхождение его в определенную группу а так же описание правила.

Доброго времени суток, уважаемые читатели блога . Раньше на этом сайте уже была опубликована статья о конвертации
, в этой статье было показано,
как можно настроить обмен, используя конструкторы, с помощью которых создаются правила обмена.
Этот способ можно используется при конвертации баз из 1С версии 7.7 в 8.2.
Сейчас мы поговорим, как переносить данные между конфигурациями 1С 8.2, которые несколько отличаются друг от друга.

Основное внимание в этой статье будет уделено конвертации табличной части документа, а это значит, что
мы будем работать с правилами конвертации группы свойств — ПКГС .

Подготовка к настройке ПКГС — правил конвертации группы свойств

Мы будем переносить документ «ПоступлениеТоваровУслуг», который имеет отличия в реквизите СтавкаНДС табличной части «Товары»
в базе источнике и приёмнике. В базе источнике этот реквизит имеет тип «СправочникСсылка.СтавкиНДС»,
а в базе приёмнике — тип «ПеречислениеСсылка.СтавкиНДС».

Кстати, для удобства можно определить

Кроме того, в базе приёмнике нам необходимо заполнять реквизит «СчетУчетаБУ», который также находится
в табличной части «Товары» документа «ПоступлениеТоваровУслуг». Данные для заполнения мы возьмём из реквизита «СчетУчетаБУ»
справочника «Номенклатура» базы приёмника.

Ситуация осложняется тем, что мы будем работать с табличной частью, поэтому нужно настраивать
правила конвертации группы свойств — ПКГС . Нам нужно будет обращаться к текущей строке табличной части.

Создание правил конвертации группы свойств 1С

У нас уже разработаны правила конвертации для документа «ПоступлениеТоваровУслуг».

Но для табличной части «Товары» нет правила конвертации свойства «СтавкиНДС».
Нужно добавить новое правило конвертации свойств, нажав на кнопку «Синхронизация свойств…».

Появится диалог «Настройка правил конвертации свойств (ПоступлениеТоваровУслуг)».

Нужно повторить то, что сделано на изображении и нажать кнопку «ОК».

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

Обработчики событий для правил конвертации группы свойств

Чтобы настроить конвертацию свойства правильно, нужно создать новое правило конвертации объектов.

В появившемся диалоге указываем, что справочник «СтавкиНДС» конвертируется в перечисление с таким же названием.

Никаких правил конвертаций свойств для этого правила не будет.
Поэтому при сохранении этого правила, в появившемся диалоге выберем «Нет».

В диалоге с вопросом «Создать правила выгрузки данных?» тоже выберем «Нет».

Двойным нажатием откроем диалог с настройкой правила конвертации объекта (ПКО) «СтавкиНДС».
Здесь на закладке «Обработчики событий» выберем событие «При выгрузке» и определим «Источник» и
«УзелСсылки», то есть то, что будет переносится.

Если Источник. Ставка = 0 Тогда
УзелСсылки = «Ставка0» ;
ИначеЕсли Источник. Ставка = 12 Тогда
УзелСсылки = «Ставка12» ;
ИначеЕсли Источник. Наименование = «без НДС» Тогда
УзелСсылки = «БезНДС» ;
КонецЕсли ;

После написания обработчика нажимаем кнопку «ОК».

В информации по обработчикам:

Источник — Произвольный — выгружаемый объект источник (ссылка или произвольные данные).
УзелСсылки — инициализированный xml-узел ссылки. Может использоваться,
например, для инициализации свойств других объектов.

Теперь явно укажем использование этого правила конвертации объекта при выгрузке реквизита «СтавкаНДС».
Преходим на закладку «Конвертация свойств (*)» документа «ПоступлениеТоваровУслуг» и открываем конвертацию
группы свойств «Товары», два раза щёлкаем на свойстве «СтавкиНДС» и в открывшемся диалоге, в поле «Правило»
выбираем правило конвертации объекта «СтавкаНДС».

Нажимаем кнопку «ОК».

Теперь нам осталось установить счета учёта в соответствии с теми значениями, которые определены для номенклатуры.
Перейдём на закладку «Правила конвертации объектов», найдём объект «ПоступлениеТоваровУслуг» и
двойным нажатием на нём откроем диалог правил конвертации объектов (ПКО).
Перейдём на закладку «Обработчики событий» на событие «После загрузки» и напишем следующее:

Для каждого СтрокаТЧ Из Объект. Товары Цикл
СтрокаТЧ. СчетУчетаБУ = СтрокаТЧ. Номенклатура. СчетУчетаБУ;
КонецЦикла ;

Теперь загрузим эти правила в источнике, используя внешнюю обработку «Универсальный обмен данными в формате XML» — «V8Exchan82.epf».
Выгрузим данные в xml-файл. Затем, откроем эту же обработку в базе приёмнике и выберем xml-файл выгрузки и загрузим данные.

Кстати, обработку «Универсальный обмен данными в формате XML» можно открыть через пункт меню
«Сервис» | «Прочие обмены данными» | «Универсальный обмен данными в формате XML». Об этом было немного написано в заметке о .

Печать (Ctrl+P)

Обработчик Перед Записью Полученных Данных

Процедура ПКО_<ИмяПКО>_ПередЗаписьюПолученныхДанных в общем модуле МенеджерОбменаЧерезУниверсальныйФормат содержит текст обработчика ПередЗаписьюПолученныхДанных для конкретного ПКО. Текст обработчика может быть пустым. Однако, на практике всегда используется при загрузке данных для реализации дополнительной логики, которую необходимо выполнить перед записью объекта в информационную базу. Например, нужно ли загрузить изменения в существующие данные ИБ либо следует загрузить их как новые данные.

Обработчик содержит следующие параметры;

  1. ДанныеИБ – Тип –СправочникОбъект, ДокументОбъект. Элемент данных информационной базы, соответствующий полученным данным. Если соответствующие данные не найдены, то этот параметр имеет значение Неопределено .
  2. ПолученныеДанные – Тип –СправочникОбъект или ДокументОбъект. Элемент данных, сформированный путем конвертации данных XDTO. Записывается в случае, если эти данные являются для информационной базы новыми (параметр ДанныеИБ содержит значение Неопределено ). В противном случае ПолученныеДанные замещают собой ДанныеИБ (все свойства из ПолученныеДанные переносятся в ДанныеИБ ). Если стандартное замещение данных ИБ полученными данными не требуется, следует прописать свою логику переноса, после чего установить ПолученныеДанные значение Неопределено
  3. КонвертацияСвойств . Тип –Таблица значений . Содержит правила конвертации свойств текущего объекта, инициализированные в рамках выполнения сеанса обмена.
  4. КомпонентыОбмена . Структура, которая содержит компоненты обмена: правила обмена и параметры обмена. Процедура инициализации компонентов обмена находится в модуле ОбменДаннымиXDTOСервер

Рассмотрим некоторые практические примеры, которые я решал в расширенной конфигурации, чтобы не менять основную конфигурацию типовых прикладных решений 1С.

Не замещать найденные объекты при загрузке

В правилах конвертации объектов редакции 3.0 в отличии от редакции 2.0 отсутствует свойство “Не замещать найденные объекты при загрузке” благодаря которому, найденные объекты в информационной базе приемника по значению синхронизирующих полей не будут изменяться.

В правилах конвертации объектов редакции 3.0 параметр ДанныеИБ имеет значение неопреднлено если обеъект не найден. Кроме того, если параметр ПолученныеДанные имеет занчение неопреднлено, то при выъоде из обработчика м не будут заменены.

Работадатель попросил, чтобы я изменил правила конвертации между типовыми конфигурациями УТ 11 и БП 3.0 таким образом, чтобы данные справочника организаций и складов в бухгалтерии не проподали при обмене с УТ. Особенно проподали дополнительные реквизиты этих справочников в бухгалтерри, каждый раз когда когда в УТ элементы этих справочников зарегистрировались для отправки в бухгалтерю.

Эту задачу я выполнил в расширении конфигурации бухгалтерии, чтобы не менять основную конфигурацию. Решение показано на рис. 1 . Если элемент справочника существует (найден в источнике) , то параметр ДанныеИБ определено и чтобы все свойства из ПолученныеДанные НЕ переносились в ДанныеИБ следует установить ПолученныеДанные значение Неопределено

Рис 3 Фрагмент программного кода в расширении конфигурации

Если объект справочника не найден, то параметр ДанныеИБ имеет значениеНеопределено и тогда я вызываю процедуру ПродолжитьВызов для продолжения вызова обработчика события из расширяемой конфигурации

Не отражать документы в регламентированном учете

Меня попросили, чтобы была возможность не отражать в бухгалтерии 3.0 некоторые документы отгрузки, которые создаются в управлении торговлей 11. С этой целю я ввел дополнительный реквизит документа реализации «Не отражать документы в регламентированном учете». Если флаг установлен, то этот документ дожжен быть помечен на удаление в базе приемника (БП 3.0). Сложность этой задачи заключается в том, что в бухгалтерии предприятия у документов нет дополнительных реквизитов. Я решил использовать поле комментарии. При отправке на стороне источника (УТ 11) я заполняю реквизит комментарии с соответствующей надписью, а на приемнике (БП) , в обработчике перед запиью полученных данных я устанавливаю пометку на удаление как показано на рис 2

Задача этого правила обмена перенести остатки по взаиморасчетам из БП 2 в УТ11.

Поэтапное создание правила обмена с помощью конфигурации "Конвертация данных"(метаданные должны быть загружены):

1) Создаем правило выгрузки объекта для этого переходим на закладку "Правила выгрузки данных", жмем добавить. В появившемся окне выбираем объект выборки у нас это будет хозрасчетный регистр. Способ выборки меняем на произвольный алгоритм.

2) Переходим к написанию самого кода т.к. в УТ нет хозрасчетного регистра то мы должны его преобразовать. Сначала нам нужен запрос который по нашим параметрам будет возвращать остатки по взаиморасчетам. В обработчике события "Перед обработкой" пишем следующий запрос:

ТекстЗапроса = " ВЫБРАТЬ
| ХозрасчетныйОстатки.Счет,
| ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
| ЕСТЬNULL(СУММА(ХозрасчетныйОстатки.СуммаОстатокДт),0) КАК СуммаОстатокДт,
| ЕСТЬNULL(СУММА(ХозрасчетныйОстатки.СуммаОстатокКт),0) КАК СуммаОстатокКт,
| МАКСИМУМ(ХозрасчетныйОстатки.Субконто2.Дата) КАК ДатаРасчетногоДокумента,
| МАКСИМУМ(ХозрасчетныйОстатки.Субконто2.Номер) КАК НомерРасчетногоДокумента
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет = &счет,) КАК ХозрасчетныйОстатки
|ГДЕ
<> &группа и
| ХозрасчетныйОстатки.Субконто1.Родитель <> &группа1
|СГРУППИРОВАТЬ ПО
| ХозрасчетныйОстатки.Счет,
| ХозрасчетныйОстатки.Субконто1,
| ХозрасчетныйОстатки.Субконто2
|УПОРЯДОЧИТЬ ПО
| Субконто1
|АВТОУПОРЯДОЧИВАНИЕ";

В моей задача стояли ограничения на группы контрагентов по которым выгружаются взаиморасчеты.

Определяем значения переменных которые будут использоваться в дальнейшем.

НаДату = дата("20130101");
ТД = ТекущаяДата();
группа = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели");
группа1 = Справочники.Контрагенты.НайтиПоНаименованию("Возвраты от ФИЗЛИЦ");

Создаем таблицу которую в последствии будем передавать в правило конвертации значений.

ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("Контрагент");
ТЗ.Колонки.Добавить("Сумма");
ТЗ.Колонки.Добавить("СуммаРЕГЛ");
ТЗ.Колонки.Добавить("РасчетныйДокумент");
ТЗ.Колонки.Добавить("ДатаРасчетногоДокумента");
ТЗ.Колонки.Добавить("НомерРасчетногоДокумента");
ТЗ.Колонки.Добавить("Партнер");
ТЗ.Колонки.Добавить("ВалютаВзаиморасчетов");
ТЗ.Колонки.Добавить("ДатаПлатежа");

Устанавливаем параметры, вызываем запрос, заполняем таблицу вызываем правило конвертации.

запрос = новый запрос(ТекстЗапроса);
запрос.УстановитьПараметр("группа",группа);запрос.УстановитьПараметр("группа1",группа1);
запрос.УстановитьПараметр("НаДату",НаДату);
запрос.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПоставщикамиИПодрядчиками);//76.05
Выборка = запрос.Выполнить().Выбрать();
ТЗ.очистить();
Пока Выборка.Следующий() Цикл
если Выборка.СуммаОстатокКТ = 0 или Выборка.СуммаОстатокКТ = "" тогда
продолжить;
конецесли;
если Выборка.СуммаОстатокКТ < 0тогда
сообщить(""+Выборка.Субконто1+" отрицательное значение "+Выборка.СуммаОстатокКТ);
конецесли;
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Контрагент = Выборка.Субконто1;
СтрокаТЗ.сумма = Выборка.СуммаОстатокКТ;//Выборка.СуммаОстатокКт;
СтрокаТЗ.суммаРегл = Выборка.СуммаОстатокКТ;//Выборка.СуммаОстатокКт;
СтрокаТЗ.ДатаРасчетногоДокумента =Выборка.ДатаРасчетногоДокумента;
СтрокаТЗ.НомерРасчетногоДокумента = Выборка.НомерРасчетногоДокумента;
СтрокаТЗ.ДатаПлатежа = ТД;
КонецЦикла;
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("Дата", ТекущаяДата());
ИсходящиеДанные.Вставить("РасчетыСПартнерами", ТЗ);
ИсходящиеДанные.Вставить("ТипОперации", "ОстаткиЗадолженностиПередПоставщиками");
ИсходящиеДанные.Вставить("Комментарий", "Сформировано по кредиту счета 76.05");
сообщить("76.05 КРЕДИТ начало");
ВыгрузитьПоПравилу(, ИсходящиеДанные, "ВводОстатковПоВзаиморасчетам_7605Кредит");

Аналогично проделываем ту же операцию и для остальных необходимых счетов(их описание как и готовое правило имеется во вложении).

3) Переходим к созданию правил конвертации объектов, для этого открываем закладку "Правила конвертации объектов". Добавим туда новое правило с именем "ВводОстатковПоВзаиморасчетам_7605Кредит" , объект источник оставим пустым, объект приемник установим документ "Ввод остатков", на вкладке настройки уберем флаг "Искать объект приемника по внутреннему идентификатору объекта источника".

В обработчике события "Перед загрузкой" напишем следующий код:

ГенерироватьНовыйНомерИлиКодЕслиНеУказан = истина;

В обработчике события "После загрузки" напишем:

выполнить(алгоритмы.ПослеЗагрузкиВводаОстатков);

он выполнит алгоритм со следующим содержанием:

валюта = Константы.ВалютаРегламентированногоУчета.Получить();
объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
объект.организация=параметры.порганизация;
для каждого стр из объект.расчетыспартнерами цикл
Стр.РасчетныйДокумент = Справочники.ДоговорыКонтрагентов.пустаяссылка();
Стр.ВалютаВзаиморасчетов = валюта;
если ЗначениеЗаполнено(стр.контрагент.партнер) тогда
стр.партнер = стр.контрагент.партнер;
иначе
парт = Справочники.Партнеры.НайтиПоНаименованию(стр.контрагент.Наименование);
если парт <> Неопределено и парт <> Справочники.Партнеры.пустаяссылка() тогда
стр.партнер = парт;

объект2.Партнер = парт;
объект2.Записать();
иначе
выполнить(алгоритмы.ДобавитьПартнера);
конецесли;

конецесли;

конеццикла;

Этот алгоритм будет исполнен на стороне приемника(БП). Кроме переноса остатков по взаиморасчетам стоит задача переноса контрагентов, но в УТ используются партнеры поэтому после формирования документа мы проверяем все ли контрагенты и партнеры имеются в базе приемнике, если по какой то причине их нет то мы их добавляем.

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

Для партнеров был создан алгоритм который выполняется на стороне приемника.

Для того чтобы выполнить алгоритм на стороне приемника, надо в правом верхнем углу окна алгоритма(при его редактировании) проставить флаг "Используется при загрузке".

Ниже приведен код алгоритма "Добавить партнера":

нПартнер = Справочники.Партнеры.СоздатьЭлемент();
нПартнер.Наименование =стр.контрагент.наименование;
нПартнер.Комментарий = "Создан при загрузке из БП";
нПартнер.НаименованиеПолное =стр.контрагент.НаименованиеПолное;
нПартнер.Поставщик = ?(найти(стр.контрагент.ДополнительнаяИнформация,"Поставщик")>0,истина,ложь);
нПартнер.Клиент = ?(найти(стр.контрагент.ДополнительнаяИнформация,"Клиент")>0,истина,ложь);
ПрочиеОтношения = ?(найти(стр.контрагент.ДополнительнаяИнформация,"Прочее")>0,истина,ложь);
нпартнер.Записать();
стр.партнер = нпартнер.ссылка;
контрагент = Справочники.Контрагенты.НайтиПоНаименованию(стр.контрагент.Наименование);
объект2 = контрагент.ПолучитьОбъект();
объект2.Партнер = нпартнер.ссылка;
объект2.Записать();

Возвращаемся обратно к правилу конвертации объекта. Теперь нам надо установить соответствия полей источника и приемника, это можно было сделать непосредственно перед написанием кода. Для того чтобы сопоставить поля в нижней табличной части имеется кнопка вызова мастера "Синхронизация свойств". В этом мастере мы можем либо сопоставить поля, либо оставить как без источника, так и без приемника. В нашем случае все поля и ТЧ мы оставляем без источника.

После того как необходимы поля были выбраны в нижней ТЧ для каждого поля выставляем флаг в колонке "Получить из входящих данных". Этот флаг говорит о том, что система будет искать это поле во входящих данных. Важно чтобы имя поля совпадало с именем во входящих данных, иначе будет выведено сообщение о том, что поле не найдено.

Текстом описаны не все нюансы процесса.