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

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()
 

См. также

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

Переносится из типовой конфигурации «Торговля и Склад», реакции 9.2 платформы «1С:Предприятие 7.7» в типовую конфигурацию «Бухгалтерия предприятия», редакции 3.0 платформы «1С: Предприятие 8.3» следующие документы и их операции (с соблюдением всех соответствующих проводок): Поступления товаров и услуг (в т.ч. комиссия), Реализации товаров и услуг (в т.ч. комиссия), ПКО и РКО, выписки банка, счета фактуры (выданные и полученный), Возвраты от покупателей и поставщику, Заявка Покупателя, Инвентаризация и другие (всего 28 видов документов, смотрите описание, приложенное к обработке)

13188 руб.

30.06.2014    65927    109    107    

117

Перенос данных 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    24044    70    39    

43

Файловый обмен (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    9566    63    Kuzya_brаtsk    8    

11

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

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

8400 руб.

17.03.2021    16130    5    13    

6

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

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

18000 руб.

29.09.2020    13958    2    0    

5

SALE! 10%

Файловый обмен (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 | Перенос из 7.7 является сложным, и на рынке сложно найти специалистов 1С по "семерке" - сотрудники помогут вам выполнить переход в рамках техподдержки предлагаемого переноса данных!

55778 50200 руб.

26.05.2020    35436    10    75    

16

Перенос данных 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    15678    ksnik    0    

16

Загрузка и выгрузка в Excel Перенос данных 1C Программист Пользователь Платформа 1С v7.7 Платформа 1С v8.3 1C:Бухгалтерия 1C77 1С:ERP Управление предприятием 2 Абонемент ($m)

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

1 стартмани

16.08.2019    19794    19    ksnik    12    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Ольга_tmp 72 20.04.16 12:00 Сейчас в теме
судя по последней процедуре, подойдет для V7->V8?
2. Kvitka_ru 19.07.18 18:25 Сейчас в теме
Аллелуя, дружище, спасибо!! Все получилось
3. user624087_karabov108 05.06.24 13:36 Сейчас в теме
Здравствуйте!
Например для выгрузки справочника "Цены", имеющего периодические реквизиты "Цена",
Валюта" "и "Единица" укажу только те, которые понадобятся при загрузке:
это где прописывать?
4. lvictor58 138 11.10.24 16:57 Сейчас в теме
Да вроде все расписано:
задаете
параметр "Периодика" и в общем (глобальном) обработчике "Перед выгрузкой данных" присвоил ему тип "Список значений"
Далее работаете со справочником "Цены" как описано в п. 3
Оставьте свое сообщение