Обновление нетиповых конфигураций, или как убрать надоевший //{{MRG







Методика обновления нетиповых конфигураций позволяющая существенно сократить трудозатраты Или как убрать кучу лишних комментариев в коде (//{{MRG … )

Заранее извеняюсь за то что получилось много буковок.  Для тех кто в курсе вкрадце скажу  обработк позволяет удалять //{{MRG Комментарии из текста.   Далее идет пособие по обновление нетиповой конфигурации 1C 8.


Начну пожалуй с того как я учился обновлять нетиповые конфигурации и к чему меня все это привело. 

Начал обновлять 1с еще со времен 1с 77. 

Механизм обновления в 7-ке был предельно прост. Создаем 3 базы :  1 -рабочая база, 2ая  — копия рабочей базы, 3я — пустая типовая база того же релиза.

1ую сравниваем новым релизом. 2ую с типовым релизом. 3ю с новым релизом.   

Итого в о 2ом окне сравнения мы видим все «доработки» в 3ем видим все  изменения релиза , а в основной решаем что оставляем, а что берем из нового релиза. 

После обновления проверка:  рабочая, обновленная база сравнивается с типовым релизом. Список изменений должен быть идентичен второй базе.  Если это так, то обновление сделано верно. 

 

 


 

 

 

В 8ке же все кардинально изменилось.

Начиная с того что в одной базе храниться 3 и более конфигураций. 

1 — Основная конфигурация  — Та с которой непосредственно работает программист.

2 — Конфигурация базы данных — Эта та конфигурация, на которой работает в данный момент база данных.  (т.е если вы написали пару строк в конфигураторе, то  это означает что во первых основная конфигурация и конфигурация базы данных стали не идентичны,  во вторых ) 

3 — Конфигурация поставщика — это по сути типовой релиз.

4..n конфигураций поставщика может быть много, но это тема уже совсем другой статьи. 

Этот факт позволил разработчикам в одной базе реализовать кучу вкусностей. О них конкретнее: 

п.1. — При обновлении в одной базе можно увидеть все 3 различия как в 3ех базах 77, о которых говорилось выше. (Отличие типовой базы от нового релиза, «Доработки программистов» — отличия основной конфигурации от конфигурации поставщика,  и отличие основной конфигурации от нового релиза ).

п.2. — Чисто теоретически  при обновлении может возникнуть 3 случая 

1 случай — объект изменен только в базе, а в релизе не было изменений данного объекта 

2 случай — объект изменен только в релизе, а в базе он не отличается от конфигурации поставщика 

3 случай — объект изменен и там и там.

 так вот в 8 ке 1ый и 2ой случай платформа обрабатывает автоматически. (Принимает решение из какой конфигурации взять код)

 

 

Рассмотрим 3ий случай подробнее.  По каждому объекту программисту надо читать код, и принимать решение, оставлять свой код, или взять код разработчика.  Для этих целей созданы 2 механизма: 

1 объединение с приоритетом основной конфигурации — (важнее то что сделано программистами)

2 объединение с приоритетом новой конфигурации поставщика — (важнее то что сделано в релизе) 

 После обновление в режиме объединение в коде остается куча записей взятых в тег //{{MRG ..Код с которым возникли коллизии..//}}MRG   Вот пример куска кода из Авансового отчета.

 Если ЗначениеЗаполнено(Подразделение) Тогда

//{{MRG[  ]
ПредставлениеПодразделения = СокрЛП(Подразделение.Наименование);
//}}MRG[  ]
//{{MRG[  ]
//   ПредставлениеПодразделения = Подразделение.Наименование;
//}}MRG[  ]
ОбластьМакета.Параметры.ПредставлениеПодразделения         = ПредставлениеПодразделения;
ОбластьМакета.Параметры.КодПодразделения                   = Подразделение.Код;
КонецЕсли;
ОбластьМакета.Параметры.ПредставлениеПодотчетногоЛица          = ПодотчетноеЛицо;
ОбластьМакета.Параметры.ПредставлениеПодотчетногоЛицаОт        = ПодотчетноеЛицоОт;
ОбластьМакета.Параметры.ТабельныйНомер                         = ТабельныйНомер;
//{{MRG[  ]
// //Изм АФМ
// ОбластьМакета.Параметры.ДолжностьПодотчетногоЛицаПредставление = Шапка.Должность;
// ОбластьМакета.Параметры.ПредставлениеПодразделения = Шапка.Подразделение;
// //Конец
//}}MRG[  ]
ОбластьМакета.Параметры.ДолжностьПодотчетногоЛицаПредставление = Должность;
ОбластьМакета.Параметры.НомерДокумента                         = ОбщегоНазначения.ПолучитьНомерНаПечать(ЭтотОбъект);
ОбластьМакета.Параметры.ПолученоИзКассы                        = ПолученоИзКассы;
ОбластьМакета.Параметры.ПолученоИзКассыПоКартам                = ПолученоИзКассыПоКартам;

 

Например в этом месте кода понятно что в релизе был добавлен метод СокрЛП();

//{{MRG[  ]
ПредставлениеПодразделения = СокрЛП(Подразделение.Наименование);
//}}MRG[  ]
//{{MRG[  ]
//   ПредставлениеПодразделения = Подразделение.Наименование;
//}}MRG[  ]

  А в этом месте кода  были доработки какого-то АФМ ( Андропова Федора Михалыча, или еще кого-то)

//{{MRG[  ]
// //Изм АФМ
// ОбластьМакета.Параметры.ДолжностьПодотчетногоЛицаПредставление = Шапка.Должность;
// ОбластьМакета.Параметры.ПредставлениеПодразделения = Шапка.Подразделение;
// //Конец
//}}MRG[  ]
   
 Подведем черту:

 
 
Итак задача сводиться к тому чтобы после объеденения вычистить код от ненужных коментариев, а доработки некого АФМ оставить.
Делаем глобальный поиск по конфигурации ищем АФМ - оставляем либо адаптируем весь его текс, а для того чтобы удалить остатки я придумаю обработку по очистке тегов MRG
Довели модуль до рабочего состояния Найдя все изменения программиста, который подписался как АФМ,
        //Изм АФМ
ОбластьМакета.Параметры.ДолжностьПодотчетногоЛицаПредставление = Шапка.Должность;
ОбластьМакета.Параметры.ПредставлениеПодразделения = Шапка.Подразделение;
//Конец

         

проверили синтаксис помошником, выделили весь модуль скопировали текст в буфер и вставили его в мою обработку - нажали 
"Убрать MRG" - все ненужные комментарии ушли. осталось только то что надо :
 
    Если ЗначениеЗаполнено(Подразделение) Тогда
ПредставлениеПодразделения = СокрЛП(Подразделение.Наименование);
ОбластьМакета.Параметры.ПредставлениеПодразделения         = ПредставлениеПодразделения;
ОбластьМакета.Параметры.КодПодразделения                   = Подразделение.Код;
КонецЕсли;

ОбластьМакета.Параметры.ПредставлениеПодотчетногоЛица          = ПодотчетноеЛицо;
ОбластьМакета.Параметры.ПредставлениеПодотчетногоЛицаОт        = ПодотчетноеЛицоОт;
ОбластьМакета.Параметры.ТабельныйНомер                         = ТабельныйНомер;
//Изм АФМ
ОбластьМакета.Параметры.ДолжностьПодотчетногоЛицаПредставление = Шапка.Должность;
ОбластьМакета.Параметры.ПредставлениеПодразделения = Шапка.Подразделение;
//Конец
ОбластьМакета.Параметры.ДолжностьПодотчетногоЛицаПредставление = Должность;
ОбластьМакета.Параметры.НомерДокумента                         = ОбщегоНазначения.ПолучитьНомерНаПечать(ЭтотОбъект);
ОбластьМакета.Параметры.ПолученоИзКассы                        = ПолученоИзКассы;
ОбластьМакета.Параметры.ПолученоИзКассыПоКартам                = ПолученоИзКассыПоКартам;
 
Все обновление нетиповых превратилось только в анализ кода и в Ctrl+С, Ctrl+V.

 

С вопросами милости прошу: www.1carhipov.ru

21 Comments

  1. anig99

    оформление статьи «поползло». Читать нельзя.

    Reply ↓
  2. bashinsky

    А почему бы не выгружать файлы конфигурации в определенную папку, а обработкой брать из этой папки файлы, анализировать их и потом грузить их обратно?

    Reply ↓
  3. Maddy18

    (2) bashinsky,1) не знаю как файлы конфигурации выгружать. 2) не знаю как обработанные файлы загружать обратно.

    Reply ↓
  4. Maddy18

    (1) anig99, появиться время сделаю оформление читаемым.

    Reply ↓
  5. for-elenak

    Так и не поняла, что делает сия обработка…С любым вариантом объединения требуется проанализировать, что изменить и что оставить. Не думаю, что можно обойтись без интеллектуального вмешательства программиста…ИМХО..

    Reply ↓
  6. DAnry

    Спасибо за статью. Обновлял я, конечно, нетиповые или «допиленные» конфигурации множество раз, а вот с //{{MRG сталкивался крайне редко (раза два наверное) и то в этих случаях конфигурации доставались мне «по наследству». Теперь буду знать причину появления сего странного кода. Хотя, по большому счету, ситуацию это существенно не меняет.

    Reply ↓
  7. popro

    Можно заменить глобальной заменой во всей конфигурации после обновления, чем выигрывает ваш способ?

    Reply ↓
  8. Maddy18

    (7) popro, Если заменить глобальный заменой, то останется закомментированный старый код, который нужен как коню пятая нога.

    Reply ↓
  9. EvilDoc

    чаще всего нужно оставить и то и то. А обработка вычистит что-либо в зависимости от режима объединения. Тч проще записывать дважды измененные процедуры в тетрадку а потом ручками добавлять необходимое. Но чаще сталкиваюсь с изменениями в разных процедурах поэтому обновляю их выборочно. Тч за обновление среднедоработанной УПП таких вот «записей в тетрадке» и ручного внесения доработок +- 10 штук) Плюс подхода — видишь результат а не доверяешь тому как обновит платформа и что вычистит обработка

    Reply ↓
  10. EvilDoc

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

    Reply ↓
  11. ZhokhovM

    (3) легко! Нужно сделать следующее:

    1.через меню Конфигурация — Выгрузить файлы конфигурации

    2.через меню Конфигурация — Загрузить файлы конфигурации

    Если их нет, то перетащить их самостоятельно из меню Сервис — Настройка, далее на закладке Команды выбираем слева категорию «Конфигурация», а справа выделить и перетащить их обратно в меню.

    Reply ↓
  12. Maddy18

    (11) ZhokhovM,

    Вау! Сколько лет занимаю 1С, про этот способ не знал. Спасибо за наводку.

    Reply ↓
  13. ZhokhovM

    (12) ага, пожалуйста!

    Reply ↓
  14. Dr_DelProg

    Задумка хорошая. Судя по тому, что написано в описании — как раз то, что искал. Жалко в закрытом доступе — скачать нельзя.

    Reply ↓
  15. Dr_DelProg

    Написал такую же, короче.

    Теперь можно сколько угодно большие изменения в обновлении делать без потери собственного кода. Мануалка на форме обработки. Сделано под УФ 8.3.

    Reply ↓
  16. Dr_DelProg

    Не даёт в личку ответить. Скинь на dr_delprog-цобакен-мэйл.ru.

    Спасибо.

    Reply ↓
  17. Dr_DelProg

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

    Reply ↓
  18. TVA_11

    1С:Предприятие 8.2 (8.2.19.83)

    Обновляю не типовую конфигурацию.

    В результате, не дает править результат объединения. Ранее было 3 окна, старая, новая конфигурация и Результат.

    Так, вот результат было можно править. А теперь не дает.

    Подскажите, как победить?

    Reply ↓
  19. Maddy18

    (18)Насколько я понял это стандартный механизм платформы.

    Объедени как есть,затем правь то что получилось в модулях. Найти все объединения можно глобальным поиском «MRG»

    Reply ↓
  20. fzt

    (18) Чтобы «дало». Поставить галочку на объекте (модуле) «взять из файла». В таблице объединения появится шестеренка. При нажатии на неё откроет те самые 3 окна.

    Reply ↓
  21. TVA_11

    (20) это под 8.3.работает.

    А под 8.2. нет.

    Reply ↓

Leave a Comment

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