Книга знаний

Рекламное место пустует
1С:Предприятие / v8 / Общие вопросы

v8: Элегантный перевод конфигурации с 77 на 80 с минимумом программирования

Я предлагаю метод, с помощью которого переход с 77 на 80 на 80% быстрее и легче, при этом в базе существует старый код 77, который постепенно можно переписывать на 80, при этом на рабочей базе! Суть его заключается не в переписывании кода всех модулей 77, а в эмуляции объектов 77. Конечно, лучше поздно, чем никогда, не знаю, есть ли еще граждане, которые не перешли с 80 на 77. Но в любом случае такой переход будет более быстрым, прозрачным и простым.Автор статьи: Гений 1С | Редакторы: Волшебник
Последняя редакция №4 от 05.10.06 | История
URL: http://kb.mista.ru/article.php?id=377

Ключевые слова: переход,обратная совместимость


Если захотите меня отблагодарить материально, знаете, где меня искать!

Технология перевода кода 77 на 80.


К сожалению, разработчики не пошли по пути обратной совместимости (хотя и могли бы). Поэтому этим путем пойдем мы! ;-)

1С позволяет только сконвертировать конфигурацию 77 на 80, при этом переносятся данные базы, формы, макеты, прикладные объекты, но не конвертируется код модулей, потому что он несовместим.

1С могла бы поддерживать старый и новый код, чтобы можно было постепенно переписывать важные участки на 80, оставляя старые и непринципиальные на 77. Но, увы.

К счастью, в беседе с Анатолием Федьковым мне пришла спасительная для кодеров 77 идея, которой я и делюсь с вами.

Она заключается в эмуляции кода 77 встроенными средствами 80.  К счастью, 1С в основном оперирует с объектами, поэтому существует очень простой способ перехода с 77 на 80, о котором мало кто задумывался.  Этот способ поможет вам без дополнительного кодирования сделать 80% конвертации кода.

Эмуляция объектов



Нужно заменить  все создаваемые объекты 77 объектами-эмуляторами, эмулирующими работу 77. В таком случае изменения в конфигурацию минимальны.

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

Суть в том, что объекты 77 заменяются соответствующими обработками.
Например объект «БухгалтерскиеИтоги» 77 заменяется на объект Обработка.БухгалтерскиеИтоги77.

К счастью, функция «СоздатьОбъект» в 80 не занята, поэтому можно поставить на нее перехватчики, который будет вместо объекта создавать соответствующий ему объект-эмулятор:

Функция СоздатьОбъект(ТипОбъекта) Экспорт
    Если Лев(«ТипОбъекта»,10)=«Справочник» Тогда
        Обработки.Справочник.Создать(ТипОбъекта);
    ИначеЕсли Лев(«ТипОбъекта»,8)=«Документ» Тогда
        Обработки.Документ.Создать(ТипОбъекта);
    Иначе
        Возврат Обработки[ТипОбъекта].Создать();    
    КонецЕсли;
КонецФункции


Возможно, удобнее эмулировать объекты 77 не обработками, а формами, но это помешает нам воспользоваться преимуществами трехзвенной архитектуры, зато у форм есть ОбработчикИзмененияДанных, реагирующий на изменение данных формы и скорее всего можно динамически управлять составом форм. Этот вопрос нужно исследовать.

Возможно, более удобно эмулировать объекты 77 через ОЛЕ-объект, который будет содержать нужную обработку-эмулятор, написанную на языке 77, и дополнительно отлавливать изменение и чтение свойств, а также динамически изменять состав свойств объектов.

Но пока в нашем распоряжении только обработки.

Эмуляторы прикладных объектов



Лучше конечно, создавать объект-эмулятор для каждого типа прикладного объекта, чем внедрять весь функционал 77 в каждый вид прикладного объекта 80.
Т.е. например лучше создать обработку, содержащую реквизит «НомерДок», чем у каждого документа создавать реквизит «НомерДок».

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

В таком случае объект-эмулятор должен содержать всевозможные свойства всех объектов.

О другом способе эмуляции читайте в разделе «Умная точка».

Умная точка


Некоторые недостатки эмуляторов можно разрешить, если грамотно обработать исходный код 77 с помощью регулярных выражений. Как вы знаете, в 80 можно выгрузить все модули в файлы, обработать их, а затем загрузить обратно.
Лучше всего пометить каждую строку 77 комментарием //77 в конце, чтобы не путать с переписанным на 80 кодом. Тогда обработки кода можно выполнять многократно.

Итак, «умная точка». Суть в том, чтобы найти все обращения к свойствам объекта через точку и заменить их на вызов метода ПолучитьАтрибут/УстановитьАтрибут, который должен установить свойство.

Выражение замены для чтения свойства:
Точка, за которой следует идентификатор, после которого стоит не знак «равно» - заменить точку и идентификатор на .ПолучитьАтрибут(Идентификатор);

Выражение замены для установки свойства:
Точка, за которой следует идентификатор, после которого стоит знак «равно» и далее идет некоторое выражение, заканчивающееся точкой с запятой, словами «КонецЕсли», «КонецЦикла», «КонецФункции», «КонецПроцедуры» и т.п. - заменить точку, идентификатор, знак равно и выражение на .УстановитьАтрибут(Идентификатор, Выражение).

В таком случае доступ к свойствам эмулируемого объекта будет осуществляться только через вызовы методов ПолучитьАтрибут/УстановитьАтрибут, что позволит гибко управлять чтением свойств объектов.

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

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


О развитии способа



В конце статьи в разделе «Эмуляторы основных объектов 1С» будет приведен код эмуляторов объектов 1С 77. Если вы напишите эмулятор какого-либо объекта, вставляйте туда.

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

Со временем, когда конфигурация, переведенная подобным способом с 77 на 80,  заработает, можно по частям переводить ее с объектов-эмуляторов на объекты 80, уже по ходу работы.

Контексты


Стоит обратить внимание, что при выводе секции отчета (а также вычислении функции Шаблон) доступны все переменные, видимые в контексте выполнения. Для 80 их нужно загонять в параметры, лучше всего в структуру.

Формы


В формах 77 можно было содержать вычислимые поля для надписей и ячеек таблиц значения.
В формах 80 все эти вычисления нужно перенести в событие ОбновлениеОтображения.

Периодические реквизиты справочников


Для простоты периодические реквизиты можно хранить в одном регистре сведений с периодичностью до даты и структурой измерений Справочник (ссылка на справочник), Реквизит (идентификатор или значение перечисления (лучше)) и ресурсом Значение произвольного типа.
Учитывая, что документы могут устанавливать реквизиты периодических реквизитов справочника и при снятии с проведения эти реквизиты могут удаляться, лучше завести регистр, не подчиненный регистратору, и реквизит этого регистра «Документ». При снятии с проведения документа удалять все записи в этом регистре, где реквизит «Документ» указывает на этот документ.

Константы


Самый простой способ – создать по одному регистру сведений на каждую константу с заданной периодичностью.
В таком случае возможна универсальная обработка для переноса констант на заданную дату в соответствующий регистр сведений.
Ключевое слово Константа. нужно заменить на вызов СоздатьОбъект(«Константа»).
А уж реализация класса Константа в обработке Константа77 – на ваше усмотрение.
Пример:
//Исходный код:
Константа.ОсновнойСклад
Константа.Руководитель.Получить(’12.10.1980’);
//Меняем на:
СоздатьОбъект(«Константа»).Получить(«ОсновнойСклад») ;
СоздатьОбъект(«Константа»). Получить(«Руководитель», ’19801012’);



Эмуляторы основных объектов 1С 77


Здесь будет размещен код эмуляции основных объектов 77.


Обсуждение здесь:
v8: Мой гений дарит вам простой переход с 77 на 80, КПД=80%
Закладка

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2021 | Mista.ru

Яндекс.Метрика