gifts2017

Эмулятор 1с7 в 1с8

Опубликовал Осипов Сергей (fixin) в раздел Программирование - Практика программирования

Данная статья носит скорее теоретический характер, чем практический.
Она описывает метод, который мог бы сработать, если бы о нем задумалась 1С7 или навалились 1С-ники коллективно.
Но, думаю, время упущено и количество переходов на 1С7 уже не так много, как раньше.
Технология перевода кода 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), чтобы потом было легче переходить.

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


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

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

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

Контексты

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

Формы

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


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

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


Константы

Самый простой способ – создать по одному регистру сведений на каждую константу с заданной периодичностью.
В таком случае возможна универсальная обработка для переноса констант на заданную дату в соответствующий регистр сведений.
Ключевое слово Константа. нужно заменить на вызов СоздатьОбъект(«Константа»).
А уж реализация класса Константа в обработке Константа77 – на ваше усмотрение.

Пример:

//Исходный код:

Константа.ОсновнойСклад

Константа.Руководитель.Получить(’12.10.1980’);

//Меняем на:

СоздатьОбъект(«Константа»).Получить(«ОсновнойСклад») ;

СоздатьОбъект(«Константа»). Получить(«Руководитель», ’19801012’);

 

Ограничения

В обработках 1С8 нельзя использовать функцию с именем Выполнить, поэтому перед запуском эмуля нужно будет выполнить глобальную замену .Выполнить на ._Выполнить.
Но по-моему в 1С7 нет объектов с методом Выполнить. ;-)


Еще один хитрый метод
П
ока писалась статья, я придумал еще один хитрый метод борьбы с ограничениями 1С. Чтобы не приходилось выискивать точки в коде, можно поступить по другому.
Рассмотрим на примере констант.
Допустим список семерочных констант хранится в массиве в глобальной переменной
глКонстанты77.
Допустим эмулятор константы с методами Получить и Установить у нас находится в обработке Эмулятор77_Константа.
Тогда мы создаем глобальную переменную Константа.
Далее:

Константа = Новый Структура();

Для Каждого Эл Из лКонстанты77 Цикл

Константа.Вставить(Эл, Обработки.Эмулятор77_Константа.Создать());

КонецЦикла;

Все, никакого изменения кода. Исходный код констант работает.
Аналогично будет работать и код справочников и документов без точек.
Достаточно только на каждый реквизит повесить обработчик.
Хороший подход, по сути, исходный код вообще не меняется.


Ссылки

Обсуждение можно почитать здесь:
http://www.forum.mista.ru/topic.php?id=218854
http://www.forum.mista.ru/topic.php?id=371983
http://www.forum.mista.ru/topic.php?id=372222

 

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Serj (Serj1C) 19.01.12 12:43
> К сожалению, разработчики не пошли по пути обратной совместимости (хотя и могли бы)
Слава тебе яйца, что не пошли! Хоть ближе к ООП стали..
2. dka80 ~ (dka80) 20.01.12 09:05
Если бы разработчики пошли по пути обратной совместимости, то нашлись бы люди, которые и в 2020 году сказали, что отменять совместимость рано и мы не успели перейти. В целом материал интересный, но тянуть кота за хвост...
3. dka80 ~ (dka80) 20.01.12 09:07
И в добавок: тема в мисте обсуждалась в 2008 году, а сейчас уже 2012.
4. Станислав Шепталов (sCHTASS) 20.01.12 10:29
(0) Плюсанул за оригинальность. Но, ИМХО, переносить функционал 1С77 на 1С8х как есть - некомильфо. Иначе какой смысл перехода?
(3) Статья достойна для публикации. Мне, как новичку в 1с8, полезно было узнать об этом.
5. Осипов Сергей (fixin) 20.01.12 10:48
(4) Объясняю популярно - нельзя переписать конфу с 1с7 на 1с8 единовременно. Было бы удобно запустить конфу 1с7 на движке 1с8 и потиху переписывать. Кстати, слухи о более продвинутом функционале 1с8 сильно преувеличены. Да, программисту удобнее и больше событий можно обрабатывать, налицо движение к Аспектно-Ориентированному программированию. Но не более того.
7. Осипов Сергей (fixin) 20.01.12 11:29
(6) удобнее чем? в 1с8 есть СКД и вывод любого списка. Пользователю удобнее на порядок.

Про программиста я вообще молчу - ему на порядок круче вещи доступны.
8. Юрий Н (graphbuh) 20.01.12 11:36
С одной стороны сейчас надо думать о переписывании текущих конфигураций на 8 для веб приложений и управляемого приложения, с другой - cуществуют нетленки типа конфигурации финансового планирования на 7.7, вспоминая которые, хочется конвертнуть их несмотря ни на что.
9. Мубаракшин Рамиль (magican) 25.01.12 01:27
Очень улыбнуло. Хотя хочется забыть о старом 77. Правда заказчики тянут назад. Часто приходится юзать коверторы подобный способ весьма интересен.
10. Алексей Сергеев (students) 25.01.12 13:21
Лучше с нуля написать обработку на 8-ку. А все это для еретиков
11. Осипов Сергей (fixin) 25.01.12 13:57
(10) если речь идет о сотнях объектов, ничуть не лучше. речь о целых конфах, а не об отдельных обработках.
Один отчет конечно на коленке можно переписать.
12. bulpi bulpi (bulpi) 25.01.12 15:36
Красивая идея, поэтому + . Но абсолютно бесполезная. На платформе 8 нужно писАть новые конфигурации, а не переводить работающие с 77.
13. Осипов Сергей (fixin) 25.01.12 16:35
(12) не согласен. Перевод конфы через эмулятор более плавный. Если бы скооперировались, могли бы эмуль написать...
14. oleg asanidze (logoped99) 25.01.12 16:40
А зачем начинать все с начала?
15. Олег Олег (ЯпонаХата) 23.04.12 19:52
готов купить/принять участие в разработке.
у меня есть кому такое поставить.
16. Осипов Сергей (fixin) 03.05.12 10:50
(15) дык я не веду разработку. Но если хотите, напишите эмулятор. Народ, который переходит с 1с7 будет вам благодарен.
17. Евгений Стоянов (quick) 22.08.14 13:45
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа