Вопрос по конвертации данных 1с
Добрый день!
Конвертирую документ из базы УПП 1.3 с подсистемой ТОиР в ТОиР 2.0
Документ "ВЫявленные дефекты". У него есть табличная часть СписокДефектов. В ней в каждой строке есть 2 реквизита: РодительскийЭлемент и ДочернийЭлемент (названия другие, но суть не в этом), оба типа Справочник.ОбъектыРемонта.
Задача: надо перенести только те документы, объекты ремонта которых которые уже есть в ТОиР 2.0. В УПП 1.3 каждому объекту ремонта в специальный реквизит "КодВТоиР20" прописан код, если не прописан, значит этот объект не переносился. Переносить надо следующим образом:
1. Код проставлен для РодительскогоЭлемента и для ДочернегоЭлемента - переносим документ.
2. Код проставлен для РодительскогоЭлемента и не проставлен для ДочернегоЭлемента - переносим документ, но вместо ДочернегоЭлемента подставляем Родительский, т.е. дублируем в одной строке значение в двух реквизитах.
3. Код не проставлен для РодительскогоЭлемента и проставлен для ДочернегоЭлемента - переносим документ. При этом в базе-приемнике, запросом ищем родителя для этого дочернего элемента и подставляем найденный в РодительскийЭлемент. Если не нашли - документ не переносим
4. Код не проставлен для РодительскогоЭлемента и не проставлен для ДочернегоЭлемента - не переносим документ.
Логика выглядит примерно следующим образом:
Да, сами объекты ремонта мы не грузим, т.к. они уже есть в базе, а ищем по реквизиту.
Код, написанный выше, разумеется не работает, это модель, т.к. вставить его некуда: ПередЗагрузкой и далее в ПКО мы не можем обратиться к Источнику по точке, а в событиях выгрузки нам не доступен приёмник, чтобы искать в нём. При конвертации свойств, мы не можем отказаться от записи объекта в целом при невыполнении каких-либо условий.
Как можно с наименьшей болью выйти из ситуации? Пока на ум приходит только в базе-источнике подгрузить в ещё один реквизит родителей и обработкой в документах поменять. А потом уже грузить готовые документы. С конвертацией знакома мало, к сожалению(
Конвертирую документ из базы УПП 1.3 с подсистемой ТОиР в ТОиР 2.0
Документ "ВЫявленные дефекты". У него есть табличная часть СписокДефектов. В ней в каждой строке есть 2 реквизита: РодительскийЭлемент и ДочернийЭлемент (названия другие, но суть не в этом), оба типа Справочник.ОбъектыРемонта.
Задача: надо перенести только те документы, объекты ремонта которых которые уже есть в ТОиР 2.0. В УПП 1.3 каждому объекту ремонта в специальный реквизит "КодВТоиР20" прописан код, если не прописан, значит этот объект не переносился. Переносить надо следующим образом:
1. Код проставлен для РодительскогоЭлемента и для ДочернегоЭлемента - переносим документ.
2. Код проставлен для РодительскогоЭлемента и не проставлен для ДочернегоЭлемента - переносим документ, но вместо ДочернегоЭлемента подставляем Родительский, т.е. дублируем в одной строке значение в двух реквизитах.
3. Код не проставлен для РодительскогоЭлемента и проставлен для ДочернегоЭлемента - переносим документ. При этом в базе-приемнике, запросом ищем родителя для этого дочернего элемента и подставляем найденный в РодительскийЭлемент. Если не нашли - документ не переносим
4. Код не проставлен для РодительскогоЭлемента и не проставлен для ДочернегоЭлемента - не переносим документ.
Логика выглядит примерно следующим образом:
Для Каждого ОР Из Источник.СписокДефектов Цикл
Если НЕ ЗначениеЗаполнено(ОР.ОбъектРемонта.КодВТОиР20) Тогда//не заполнен родитель
Если ЗначениеЗаполнено(ОР.ОтказавшийЭлемент.КодВТОиР20) Тогда// заполнен подчиненный
ОР.ОтказавшийЭлемент = Справочники.торо_ОбъектыРемонта.НайтиПоРеквизиту("ТехНомер", ОР.ОтказавшийЭлемент.КодВТОиР20);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| торо_ИерархическиеСтруктурыОР.РодительИерархии КАК РодительОбъекта
|ИЗ
| РегистрСведений.торо_ОбъектыРемонтаГруппы КАК торо_ОбъектыРемонтаГруппы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.торо_ИерархическиеСтруктурыОР КАК торо_ИерархическиеСтруктурыОР
| ПО торо_ОбъектыРемонтаГруппы.ОбъектИерархии = торо_ИерархическиеСтруктурыОР.РодительИерархии
| И торо_ОбъектыРемонтаГруппы.СтруктураИерархии = торо_ИерархическиеСтруктурыОР.СтруктураИерархии
|ГДЕ
| торо_ИерархическиеСтруктурыОР.ОбъектИерархии = &ОбъектРемонта";
Запрос.УстановитьПараметр("ОбъектРемонта", ОР.ОтказавшийЭлемент);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий Тогда
//ОбъектРемонта = Выборка.РодительОбъекта
ОР.ОбъектРемонта = Выборка.РодительОбъекта;
Иначе
Отказ = Истина;
Прервать;
КонецЕсли;
//ОбъектРемонта = Родитель по запросу
Иначе
Отказ = Истина;// ничего не заполнено, документ не грузим
Прервать;
КонецЕсли;
Иначе//заполнен родитель
ОР.ОбъектРемонта = Справочники.торо_ОбъектыРемонта.НайтиПоРеквизиту("ТехНомер", ОР.ОбъектРемонта.КодВТОиР20);
Если НЕ ЗначениеЗаполнено(ОР.ОтказавшийЭлемент.КодВТОиР20) Тогда// не заполнен подчинённый
// ОтказавшийЭлемент = ОбъектРемонта
ОР.ОтказавшийЭлемент = ОР.ОбъектРемонта;
Иначе
ОР.ОтказавшийЭлемент = Справочники.торо_ОбъектыРемонта.НайтиПоРеквизиту("ТехНомер", ОР.ОтказавшийЭлемент.КодВТОиР20);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПоказатьДа, сами объекты ремонта мы не грузим, т.к. они уже есть в базе, а ищем по реквизиту.
Код, написанный выше, разумеется не работает, это модель, т.к. вставить его некуда: ПередЗагрузкой и далее в ПКО мы не можем обратиться к Источнику по точке, а в событиях выгрузки нам не доступен приёмник, чтобы искать в нём. При конвертации свойств, мы не можем отказаться от записи объекта в целом при невыполнении каких-либо условий.
Как можно с наименьшей болью выйти из ситуации? Пока на ум приходит только в базе-источнике подгрузить в ещё один реквизит родителей и обработкой в документах поменять. А потом уже грузить готовые документы. С конвертацией знакома мало, к сожалению(
По теме из базы знаний
- 1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена)
- Перенос данных из 1С:Бухгалтерия 7.7 в БП 3.0. Переносятся остатки, документы и справочники
- Универсальный обмен XML (КД 2) + RabbitMQ – простая и комфортная работа вместе
- Как использовать конвертер для переноса данных из 1С:ITIL в 1С:ITILIUM
- Database Compression Tool: Инструмент для свертки и сжатия баз данных 1С
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Есть один момент: если строк несколько, то мы для каждой проверяем условие и либо грузим её либо нет. А потом в "послезагрузки" проверяем если табличная часть не пустая, то грузим документ, а если пустая, то нет. Пока буду пробовать разделять проверки по событиям и в ПКС прописывать. А потом после загрузки смотреть количество строк.
Вот пример
//ТЧ Товары - заполним таб часть товары
Если ПараметрыОбъекта <> Неопределено тогда
ТаблицаПараметровТЧ = ПараметрыОбъекта["ТоварыТабличнаяЧасть"];
НомерСтроки = -1;
Если ТаблицаПараметровТЧ <> Неопределено Тогда
Для Каждого СтрокаПараметров Из ТаблицаПараметровТЧ Цикл
НомерСтроки = НомерСтроки + 1;
СтрокаТЧ = Объект.Товары.Получить(НомерСтроки);
Параметр = СтрокаПараметров.ВашПараметр;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Показать
Добрый день!
Решение в итоге такое:
В табличной части документа добавила 2 ПКС для родителя и подчинённого примерно следующего вида:
В ПКО в событии ПослеЗагрузки обрабатываю:
Комментарии "Сообщить" оставила для себя.
Решение в итоге такое:
В табличной части документа добавила 2 ПКС для родителя и подчинённого примерно следующего вида:
СтруктураПараметров = Новый Структура("ИД, КодРодителя");
СтруктураПараметров.ИД = ОбъектКоллекции.ID;
СтруктураПараметров.КодРодителя = ОбъектКоллекции.ОбъектРемонта.РАЦ_КодВТОиР20;
Значение = ЗначениеВСтрокуВнутр(СтруктураПараметров);
В ПКО в событии ПослеЗагрузки обрабатываю:
ТЧСписокДефектовПараметры = ПараметрыОбъекта["СписокДефектовТабличнаяЧасть"];
Если Не ТЧСписокДефектовПараметры = Неопределено Тогда
МассивКУдалению = Новый Массив;
//ИндексСтроки = 0;
Для Каждого Стр Из ТЧСписокДефектовПараметры Цикл
СтруктураПараметровРодителя = ЗначениеИзСтрокиВнутр(Стр.КодРодителяСтруктура);
СтруктураПараметровПодчиненного = ЗначениеИзСтрокиВнутр(Стр.КодЭлементаСтруктура);
//Найдем строку в загруженном документе
СтрокаДефектов = Объект.СписокДефектов.Найти(СтруктураПараметровРодителя.ИД, "ID");
//СтрокаДефектов = Объект.СписокДефектов[ИндексСтроки]; //Можно было отказаться от структуры и искать строку через индекс, т.к. обработчик перебирает их подряд
Если СтрокаДефектов = Неопределено Тогда Отказ = Истина; Продолжить; КонецЕсли;
//Если в строке условие удаления, то добавим строку в массив к удалению
Если НЕ ЗначениеЗаполнено(СтруктураПараметровРодителя.КодРодителя) Тогда// родитель не заполнен
Если ЗначениеЗаполнено(СтруктураПараметровПодчиненного.КодЭлемента) Тогда// заполнен подчиненный
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| торо_ИерархическиеСтруктурыОР.РодительИерархии КАК РодительОбъекта
|ИЗ
| РегистрСведений.торо_ОбъектыРемонтаГруппы КАК торо_ОбъектыРемонтаГруппы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.торо_ИерархическиеСтруктурыОР КАК торо_ИерархическиеСтруктурыОР
| ПО (торо_ОбъектыРемонтаГруппы.ОбъектИерархии = торо_ИерархическиеСтруктурыОР.РодительИерархии)
| И (торо_ОбъектыРемонтаГруппы.СтруктураИерархии = торо_ИерархическиеСтруктурыОР.СтруктураИерархии)
|ГДЕ
| торо_ИерархическиеСтруктурыОР.ОбъектИерархии = &ОбъектРемонта";
Запрос.УстановитьПараметр("ОбъектРемонта", СтрокаДефектов.ОтказавшийЭлемент);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
СтрокаДефектов.ОбъектРемонта = Выборка.РодительОбъекта;
//Сообщить("Не заполнен родитель, найден по подчинённому");
Иначе
//Сообщить("Не заполнен родитель, не найден по подчинённому");
МассивКУдалению.Добавить(СтрокаДефектов);
КонецЕсли;
Иначе
//Сообщить("Не заполнен родитель, не заполнен подчинённый");
МассивКУдалению.Добавить(СтрокаДефектов);
КонецЕсли;
Иначе//заполнен родитель
Если НЕ ЗначениеЗаполнено(СтруктураПараметровПодчиненного.КодЭлемента) Тогда// не заполнен подчинённый
//Сообщить("Заполнен родитель, не заполнен подчинённый");
СтрокаДефектов.ОтказавшийЭлемент = СтрокаДефектов.ОбъектРемонта;
Иначе
//Сообщить("Заполнен родитель, заполнен подчинённый");
КонецЕсли;
КонецЕсли;
//ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;
Для Каждого Стр Из МассивКУдалению Цикл
Объект.СписокДефектов.Удалить(Стр);
КонецЦикла;
КонецЕсли;
Если Объект.СписокДефектов.Количество() = 0 Тогда
Сообщить("Не грузим документ");
Отказ = Истина;
КонецЕсли;
ПоказатьКомментарии "Сообщить" оставила для себя.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот