Конвертация прериодических реквизитов справочников

29.04.11

Интеграция - Обмен между базами 1C

Активно работаю с конфигурацией "Конвертация" версии 2.0, но возникают ситуации,
когда необходимо написать правила обмена между базами данных 1С:Предприятие. Когда
и источник и приемник имеют версию 7.7. И камень преткновения - выгрузка периодических
реквизитов справочников.

Мне удалось с этим справиться следующим образом.

ВЫГРУЗКА ПЕР. РЕКВИЗИТОВ:
1). Для возможности  отбора (ограничения) реквизитов, для которых необходимо
выгружать всю историю изменения их значений добавил
параметр "Периодика" и в обработчике "Перед выгрузкой данных" присвоил ему тип
"Список значений"

Параметры.Периодика = СоздатьОбъект("СписокЗначений");
практческий смысл его использования покажу на примере:
Например для выгрузки справочника "Цены", имеющего периодические реквизиты "Цена",
Валюта" "и "Единица" укажу только те, которые понадобятся при загрузке:
ВыгрРеквЦены = СоздатьОбъект("СписокЗначений");
ВыгрРеквЦены.ДобавитьЗначение("Единица");
ВыгрРеквЦены.ДобавитьЗначение("Цена");
Параметры.Периодика.Установить("Цены", ВыгрРеквЦены);
2). создал алгоритм  "ВыгрузитьПериодическиеРеквизиты"
//*********************************************************
Проверять = 0;  ВыгруженоЗаписей = 0;
СписокПерРекв = Параметры.Периодика.Получить(Источник.Вид());
Если ТипЗначенияСтр(СписокПерРекв) = "СписокЗначений" Тогда 
 Если СписокПерРекв.РазмерСписка() > 0 Тогда Проверять = 1; КонецЕсли;
КонецЕсли;
Информация = СоздатьУзел("ПериодическиеРеквизиты");
СпрМД = Метаданные.Справочник(Источник.Вид());
НеИспользуется = ?(Источник.ЭтоГруппа()=1, "ДляЭлемента", "ДляГруппы");
П = СоздатьОбъект("Периодический");
ДатаНач = ДатаНачала; ДатаКон = ДатаОкончания;
Если ДатаНач = Дата(0) Тогда ДатаНач = РабочаяДата(); КонецЕсли;
Если ДатаКон = Дата(0) Тогда ДатаКон = РабочаяДата(); КонецЕсли;
Для Инд = 1 По СпрМД.Реквизит() Цикл  
 // Заполняем список периодических реквизитов выбранного справочника
 Если (СпрМД.Реквизит(Инд).Периодический = 1) Тогда
  РеквМД = СпрМД.Реквизит(Инд);
  ИмяРеквизита = РеквМД.Идентификатор;
  Если РеквМД.Использование = НеИспользуется Тогда Продолжить; КонецЕсли;
  Если Проверять = 1 Тогда
   Если СписокПерРекв.НайтиЗначение(ИмяРеквизита) = 0 Тогда Продолжить; КонецЕсли;
  КонецЕсли;
  П.ИспользоватьОбъект(ИмяРеквизита, Источник);
  //Сообщить("  Оборабатывается реквизит "+ИмяРеквизита);
  СтароеЗнач = 0; СчПП = 0;
  П.ВыбратьЗначения(ДатаНач, ДатаКон); 
  Пока П.ПолучитьЗначение() > 0 Цикл
   ТекДок = П.ТекущийДокумент();
   Если ПустоеЗначение(ТекДок) = 0 Тогда
    Если ТекДок.ДатаДок > ДатаКон Тогда Продолжить; КонецЕсли;
   КонецЕсли;
   ТекущееЗнач = П.Значение;
   ТипРекв = ТипЗначенияСтр(ТекущееЗнач);
   Если ПустоеЗначение(ТекущееЗнач) = 1 Тогда 
    Если ТипРекв = "Число" Тогда // 0 тоже может быть
    ИначеЕсли ТипРекв = "Строка" Тогда // пустая строка тоже может быть
    Иначе
     Продолжить; 
    КонецЕсли; 
   КонецЕсли; 
   Если ТекущееЗнач <> СтароеЗнач Тогда
    СчПП = СчПП + 1;
    УзелСвойства = СоздатьУзел("Свойство");  
    УстановитьАтрибут(УзелСвойства, "Имя", ИмяРеквизита);
    ТипИВидРекв = ТипРекв;
    Если (ТипРекв = "Документ") ИЛИ (ТипРекв = "Справочник") ИЛИ (ТипРекв = "Перечисление") Тогда
     ТипИВидРекв = ТипРекв+"Ссылка."+ТекущееЗнач.Вид();
    КонецЕсли;
    УстановитьАтрибут(УзелСвойства, "Тип", ТипИВидРекв);
    УстановитьАтрибут(УзелСвойства, "ДатаЗнач", ПолучитьДатуV8(П.ДатаЗнач));
    Если (ТипРекв = "Документ") ИЛИ (ТипРекв = "Справочник") Тогда
     //УзелСсылки = СоздатьУзел("Ссылка");
     УзелСсылки = ВыгрузитьПоПравилу(ТекущееЗнач, , , , ТекущееЗнач.Вид()); // , УзелСсылки
     ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
    ИначеЕсли (ТипРекв = "Перечисление") Тогда
     ЗаписатьЭлемент(УзелСвойства, "Значение", ТекущееЗнач.Идентификатор());
    Иначе
     ЗаписатьЭлемент(УзелСвойства, "Значение", ТекущееЗнач); 
    КонецЕсли;
    
    ДобавитьПодчиненный(Информация, УзелСвойства);
    СтароеЗнач = ТекущееЗнач; ВыгруженоЗаписей = ВыгруженоЗаписей + 1;
   КонецЕсли;
  КонецЦикла;
  
  Если СчПП = 0 Тогда // запишем хоть что-нибудь
   ТекущееЗнач = П.ЗначениеНаДату(ДатаНач);
   ТипРекв = ТипЗначенияСтр(ТекущееЗнач);
   Если ПустоеЗначение(ТекущееЗнач) = 1 Тогда 
    //Если ТипРекв = "Число" Тогда // 0 тоже может быть (на Ваше усмотрение) !!!
    //ИначеЕсли ТипРекв = "Строка" Тогда // пустая строка тоже может быть
    //Иначе
     Продолжить; 
    //КонецЕсли; 
   КонецЕсли; 
   УзелСвойства = DOMDocument.createNode(1, "Свойство", "");  
   УстановитьАтрибут(УзелСвойства, "Имя", ИмяРеквизита);
   ТипИВидРекв = ТипРекв;
   Если (ТипРекв = "Документ") ИЛИ (ТипРекв = "Справочник") ИЛИ (ТипРекв = "Перечисление") Тогда
    ТипИВидРекв = ТипРекв+"Ссылка."+ТекущееЗнач.Вид();
   КонецЕсли;
   УстановитьАтрибут(УзелСвойства, "Тип", ТипИВидРекв);
   УстановитьАтрибут(УзелСвойства, "ДатаЗнач", ПолучитьДатуV8(ДатаНач));
   Если (ТипРекв = "Документ") ИЛИ (ТипРекв = "Справочник") Тогда
    УзелСсылки = ВыгрузитьПоПравилу(ТекущееЗнач, , , , ТекущееЗнач.Вид()); // , УзелСсылки
    ДобавитьПодчиненный(УзелСвойства, УзелСсылки.cloneNode(1));
   ИначеЕсли (ТипРекв = "Перечисление") Тогда
    ЗаписатьЭлемент(УзелСвойства, "Значение", ТекущееЗнач.Идентификатор());
   Иначе
    ЗаписатьЭлемент(УзелСвойства, "Значение", ТекущееЗнач); 
   КонецЕсли;
   
   ДобавитьПодчиненный(Информация, УзелСвойства);
   ВыгруженоЗаписей = ВыгруженоЗаписей + 1;
  КонецЕсли;
 КонецЕсли;
КонецЦикла;
ДобавитьПодчиненный(Приемник, Информация);
//**********************************************
3). Для справочников, периодические раевизиты которых вы хотите выгружать
в обработчике "После выгрузки" правил конвертации следует прописать указанную выше
процедуру ВыгрузитьПериодическиеРеквизиты();
ЗАГРУЗКА ДАННЫХ:
Для загруки можно прописать в обработке загрузки (и каждый раз при
ее обновлении не забывать вновь вносить корректировки) или внести изменения
в базе "Конвертация" через конфигуратор:
Обработка "Выгрузка крнвертации", макет "ПроцедурыИФункцииМодуляЗагрузки"
Добавил процедуру и ссылки на нее:
//--------------------------------------------------------------------------------------------------
Процедура ЗагрузитьПериодичРеквизиты(Объект, Элемент, Вид, ОбъектМД)
 //левченко  периодические реквизиты
 Значения = Объект.ВыбратьУзел("ПериодическиеРеквизиты"); 
 Если ПустоеЗначение(Значения) = 0 Тогда  
  Пер=СоздатьОбъект("Периодический");
   
  Реквизиты = Значения.ВыбратьУзлы("Свойство");
  Для Сч = 0 По Реквизиты.КоличествоУзлов() - 1 Цикл
   Реквизит     = Реквизиты.ПолучитьУзел(Сч);
   ИдРеквизита     = Реквизит.ПолучитьАтрибут("Имя");
   НеЗамещатьРеквизит   = Реквизит.ПолучитьАтрибут("НеЗамещать");
   Значение     = УстановитьРеквизитV8(Реквизит, "Справочник", Вид, ИдРеквизита);
   ДатаЗначения = ДатаИзXML(Реквизит.ПолучитьАтрибут("ДатаЗнач"));  
   
   Пер.ИспользоватьОбъект(ИдРеквизита, Элемент);
   Если Пер.ЗначениеНаДату(ДатаЗначения) = Значение Тогда продолжить КонецЕсли;
   
   Если Значение = "#НеУстановлен" Тогда
    ЗаписатьОшибку("Не установлен реквизит.  Справочник." + Вид + ":  Реквизит: " + ИдРеквизита);
    Продолжить;
   КонецЕсли;
 
   Если ИдРеквизита = "ПометкаУдаления" Тогда
    ПометкаУдаления = Значение;
   Иначе
    Если Найти("Код,Наименование,Родитель,Владелец", ИдРеквизита) = 0 Тогда
     РеквМД      = ОбъектМД.Реквизит(ИдРеквизита);
     ПредставлениеРеквизита  = " (Справочник." + Вид + "." + ИдРеквизита + ")";
     Если РеквМД.Выбран()  = 0 Тогда ЗаписатьОшибку("Неверное имя реквизита:" + ПредставлениеРеквизита); Продолжить;     КонецЕсли;
     
     Если РеквМД.Тип="Неопределенный" Тогда
      ТипЗнач = ОпределитьСтроковыйТип(Реквизит.ПолучитьАтрибут("Тип"));
      Точность  = 0;
      Если ТипЗнач = "Число" Тогда
       СтрТочность = Значение;
       Точность = СтрДлина( ОтделитьРазделителем(СтрТочность, ".") );
      КонецЕсли;
      Пер.НазначитьТип(ТипЗнач, СтрДлина(Значение) + 10, Точность);
     КонецЕсли; 
    КонецЕсли; 
                         
    // Это помогает при отладке
    Если ФормФлРежимОтладки = 0 Тогда
     Пер.ДатаЗнач = ДатаЗначения;
     Пер.Значение = Значение;
     Пер.Записать();
    Иначе
     Попытка   
      Пер.ДатаЗнач = ДатаЗначения;
      Пер.Значение = Значение;
      Пер.Записать();
     Исключение
      ЗаписатьОшибку("Неудачная попытка установки значения периодического реквизита "+ИдРеквизита+" объекта: " + Элемент + " - " + ОписаниеОшибки());
     КонецПопытки;
    КонецЕсли;
    
   КонецЕсли;
   
  КонецЦикла;
  
 КонецЕсли;                                                                     
КонецПроцедуры
//--------------------------------------------------------------------------------------------------
Процедура ЗагрузитьОбъектСправочникаV8(Объект, Вид, ИмяПравила)
...................
   Если ПустоеЗначение(СозданНовыйОбъект) = 1 Тогда
    Если ПустоеЗначение(НеЗамещатьНайденные) = 0 Тогда
     Если ТекущийОбъект.ПометкаУдаления() = 0 Тогда // этот объект не создан по ссылке из реквизитов других объектов
      ЗагрузитьПериодичРеквизиты(Объект, ТекущийОбъект, Вид, ОбъектМД);  // левченко
      Возврат; // найденные не замещаем
     КонецЕсли;
    КонецЕсли;
   КонецЕсли;
   ОбъектБД.НайтиЭлемент(ТекущийОбъект);
  КонецЕсли;
  
 Иначе // Ссылки нет
..................
 
 ЗагрузитьПериодичРеквизиты(Объект, ОбъектБД, Вид, ОбъектМД); //левченко
 
КонецПроцедуры  // ЗагрузитьОбъектСправочникаV8()
 

См. также

SALE! 10%

Перенос данных из 1С:Бухгалтерия 7.7 в БП 3.0. Переносятся остатки, документы и справочники

Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v7.7 Платформа 1С v8.3 1С:Бухгалтерия 7.7 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Бухгалтерия 7.7 в БП 3.0 | Продукт является развитием и исправлением ошибок стандартной обработки для выгрузки данных из 1С Бухгалтерии 7.7 в Бухгалтерию 3.0 | Предоставляем техподдержку | Обновляем на новые релизы 1С | Перенос из 7.7 является сложным, и на рынке сложно найти специалистов 1С по "семерке" - наши сотрудники помогут вам выполнить переход в рамках техподдержки предлагаемого переноса данных!

50722 45650 руб.

26.05.2020    34141    10    67    

16

Конфигурация "Информационный киоск". Обработки выгрузки товаров для ТиС 9.2, УТ 10.3, УТ 11 (обмен данными с любой конфигурацией 1С 7.7, 8.х)

Оптовая торговля Розничная торговля Обмен между базами 1C Сканер штрих-кода Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Управленческий учет Платные (руб)

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

1800 руб.

21.12.2014    59353    8    21    

20

Выгрузка из 1С ТиС 9.2 в 1С БП 3.0 с дополнительными фильтрами по Фирме, Складу, Контрагенту, Проекту, Автору и Юрлицу

Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Оперативный учет 7.7 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 Бухгалтерский учет Управленческий учет Абонемент ($m)

Обработка и правила обмена данными для выгрузки документов и всех связанных с ними справочников из 1С7.7 ТиС 9.2 в 1С8.3 БП 3.0 через файл XML. В типовых конфигурациях уже есть такое решение. Это немного доработанные правила и сама обработка выгрузки, добавлена возможность устанавливать отбор по выгружаемым документам по Фирме, Контрагенту, Складу, Проекту, Автору, ЮрЛицу. А также это внешняя обработка, что даёт возможность адаптировать её под нетиповую ТиС. Обработка и правила тестировались на платформах: 1С: Предприятие 7.7 и 1С: Предприятие 8.3.18.1334. На типовых конфигурациях: «Торговля + склад», редакция 9.2 (7.70 1004) и «Бухгалтерия предприятия» редакция 3.0 (3.0.96.30).

1 стартмани

13.08.2021    8456    52    Kuzya_brаtsk    8    

11

Переход с 1С:Комплексной 7.7 на 1С:УТ 10.3

Обмен между базами 1C Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 1С:Управление торговлей 10 1С:Комплексная 7.7 Россия Управленческий учет Платные (руб)

Начните вести учет в УТ 10.3! Перенесите все свои данные в УТ 10.3 в любом месяце года и продолжите вести учет! Программа перенесёт любое количество баз с документами и остатками в больших количествах. Обработка выгрузки выполнит проверку исходных данных и сформирует отчет о найденных ошибках в справочниках и документах. Партии переносятся с себестоимостью. Штрихкоды номенклатуры загружаются. Цена переносится. Автор консультирует.

8400 руб.

17.03.2021    15577    5    13    

6

Обмен данными ЗУП 3.1 - Бухгалтерия 7.7

Зарплата Обмен между базами 1C Бухгалтерский учет 7.7 Сложные периодические расчеты 1С:Бухгалтерия 7.7 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Как известно, Бухгалтерия 7.7 не имеет штатной возможности для обмена с ЗУП 3.1. Данная разработка пригодится тем, кто перешел с ЗиК 2.3 на ЗУП 3.1, но вынужден по каким-то своим причинам оставаться на Бухгалтерии 7.7.

18000 руб.

29.09.2020    13605    2    0    

5

Выгрузка данных из 1С 7.7. в формате EnterpriseData 1.6 (универсальный формат обмена) в конфигурации 8.3

Обмен между базами 1C Платформа 1С v7.7 Платформа 1С v8.3 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обработка позволяет выгружать данные из ТиС 7.7 в конфигурации 8.3 для сдачи отчетности, для переноса данных при переходе на 8.3, для организации обмена внутри компании при использовании разных версий 1С в структурных подразделениях или формирования отгрузочных накладных для клиентов.

6000 руб.

18.05.2020    22831    59    39    

36

Конвертация данных из 1С 8.3 в 7.7 (версия КД 2.1). Перенос данных из 8.3 в 7.7. Создание в современной 1С 8.3 XML в формате КД2. Инструкции и примеры переноса данных из любой современной 1С 8.3 в устаревшую конфигурацию 1С 7.7, через Конвертацию данных 2

Обмен между базами 1C Платформа 1С v7.7 Платформа 1С v8.3 1С:Конвертация данных Бесплатно (free)

При переходе на новую версию 1С в период параллельной эксплуатации может возникнуть необходимость обратной конвертации данных (по правилам КД версии 2.1) из 1С:Предприятие 8.3 в 1С:Предприятие 7.7 для переноса данных из 1С:Предприятие 8.3 в 7.7. Сделать это поможет следующая инструкция по КД2 о том, как создать новую конвертацию из 8.3 в 7.7, сохранить модуль и правила загрузки данных, сделать загрузку данных. КД2.

17.10.2019    14173    ksnik    0    

15

Загрузка адресов произвольного формата (КЛАДР и нестандартных "грязных" адресов) в ФИАС современных конфигураций из 1С 7.7

Загрузка и выгрузка в Excel Обмен между базами 1C Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 1С:ERP Управление предприятием 2 Абонемент ($m)

Описание технологии загрузки любых адресов из 1С 7.7 с разложением по ФИАС в современные конфигурации 1C 8.3 на примере ERP. Предлагаемый способ просто чудо, он гарантирует результат, он очень простой и качественный! Моя обработка является синтаксическим анализатором, который подставляет в строку грязного адреса выражение "Дом №" и "Корпус", благодаря чему грязные адреса 7.7 сами очень хорошо раскладываются по значимым полям ФИАС - заполняется область, город, улица, дом, корпус.. все раскладывается само с помощью встроенного механизма современных конфигураций 1С 8.3, который написали сами сотрудники фирмы 1С!

1 стартмани

16.08.2019    19296    17    ksnik    12    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Ольга_tmp 71 20.04.16 12:00 Сейчас в теме
судя по последней процедуре, подойдет для V7->V8?
2. Kvitka_ru 19.07.18 18:25 Сейчас в теме
Аллелуя, дружище, спасибо!! Все получилось
Оставьте свое сообщение