Продолжаем цикл статей по докладу Александра Кириллова, руководителя группы разработки компании «ИТ-Экспертиза», с которым он выступил на конференции INFOSTART TECH EVENT 2024. В первой статье обсудили особенности работы информационных систем 1С под управлением Linux. Во второй части поговорим об особенностях анализа конфигурации 1С на наличие платформеннозависимого кода.
Итак, после того, как мы определили критерии, по которым можно найти потенциально проблемные места в коде, кажется, что достаточно выполнить поиск по конфигурации и выявить объекты, требующие рефакторинга. Звучит легко и просто, но только в теории.
На практике это займет много времени; кроме того, не позволит повторно использовать результаты анализа. Поэтому нужны инструменты, с помощью которых можно оперативно анализировать и проверять соответствие конкретной конфигурации тем или иным требованиям.
В первую очередь на ум приходит «Автоматизированная проверка конфигураций» (АПК). Мы не стали изобретать велосипед и просто реализовали для АПК свои правила, ниже приводим полный список.
Правила проверки конфигураций на наличие платформеннозависимого кода
- в зависимости от варианта исполнения внешний компонент может быть COM или Native. При этом, компонент на Native API должен быть рассчитан на работу в Linux
-
в операционной системе Linux метод УстановитьНевидимость не работает
-
в операционной системе Linux метод УстановитьНевидимостьАсинх не работает
- запускаемое приложение должно быть адаптировано к использованию Linux
- ИзвлечениеТекста используется только для операционных систем MS Windows NT 4.0, 2000, XP, Vista, 7 и выше
- Полный список см. Приложение 1
Однако функциональности АПК нам оказалось недостаточно. В процессе анализа выяснилось, что могут случаться ложные срабатывания, либо, по договоренности с заказчиком, не нужно выполнять рефакторинг части подсистем. Поэтому в дополнение к автоматизированному анализу добавили сущность «Рекомендация»; с ее помощью можно конкретизировать место обнаружения ошибки и в дальнейшем выполнять по ней фильтрацию.
Доработки АПК: конкретизация найденной проблемы с помощью «Рекомендации»
- вместо COM-объекта v83.ComConnector следует использовать сервер администрирования (ras) и утилиту администрирования (rac)
- для работы с буфером обмена использовать механизмы встроенного языка платформы 1С
- использовать функцию ПолучитьМаскуВсеФайлы()
- при использовании ЗапуститьПриложение, НачатьЗапускПриложения убедиться, что запускаемое приложение адаптировано под ОС Linux
- Полный список см. Приложение 2
Поскольку нам было важно понимать, как выполняется платформеннозависимый код – на клиенте или на сервере, мы добавили директивы компиляции, которые показывают контекст выполнения программного кода:
- Сервер
- ВызовСервера
- КлиентОбычноеПриложение
- КлиентУправляемоеПриложение
Добавленные поля были выведены в отчет «Найденные ошибки», после чего аудит конфигурации разделился на 2 этапа:
- автоматизированная проверка АПК
- ручная проверка и простановка рекомендаций разработчиками
Результатом аудита является отчет по конфигурации с проставленными рекомендациями. Пример такого отчета представлен на изображении ниже.
Поскольку количество проектов и баз, требующих аудита, стало расти очень быстро и имеющейся функциональности было недостаточно, нам потребовались дополнительные инструменты. Потребность была вызвана следующими причинами:
- необходимость анализировать несколько конфигураций в рамках одного проекта и хранить историю рекомендаций
- большое количество мест обнаружения в конфигурации (в среднем около 1000), каждое из которых требовало внимания разработчика
- большая «повторяемость» конфигураций (большинство написано на базе БСП, количество типовых конфигураций невелико)
- необходимость анализа контекста вызова, т.к. потенциально платформеннозависимый код мог уже находиться в условном блоке с проверкой на ОС
- необходимость анализа стека вызовов, т.к. условный блок с проверкой на ОС мог находиться выше по стеку вызовов.
Напрашивался инструмент, позволяющий сравнивать конфигурации и переносить уже проставленные рекомендации в новую конфигурацию в случае 100% совпадения места обнаружения. Это позволило бы ускорить процесс аудита и исключить человеческий фактор.
В связи с этим мы реализовали на базе БСП собственное решение, которое позволяет непосредственно сравнивать между собой модули и переносить уже проставленные рекомендации в новую конфигурацию в случае 100% совпадения места обнаружения. Такой подход позволил бы ускорить процесс аудита и исключить человеческий фактор.
Мы планируем развивать это решение и уже наметили следующие доработки:
- хэширование методов модулей и их быстрый анализ. То есть, если хэши совпадают, то можно не анализировать места обнаружения и строчки кода, а считать прежние рекомендации актуальными
- улучшение анализа стеков, чтобы ускорить аудит и принятие решения о необходимости рефакторинга
- простановка версии платформы, требуемой для выполнения рекомендации. Это связано с тем, что версии бывают разные и не все рекомендации, подходящие для одной версии, будут актуальны для предыдущей версии продукта
- генерация готового пакета документов для передачи заказчику.
В следующей статье этого цикла поговорим о рефакторинге платформеннозависимого кода и его подходах.
* * *
Приложение 1. Полный список правил проверки конфигураций на наличие платформеннозависимого кода
-
в зависимости от варианта исполнения внешний компонент может быть COM или Native. При этом, компонент на Native API должен быть рассчитан на работу в Linux
-
в операционной системе Linux метод УстановитьНевидимость не работает
-
в операционной системе Linux метод УстановитьНевидимостьАсинх не работает
-
запускаемое приложение должно быть адаптировано к использованию Linux
-
ИзвлечениеТекста используется только для операционных систем MS Windows NT 4.0, 2000, XP, Vista, 7 и выше
-
использование COMОбъекта должно быть с учетом используемой ОС
-
использование Почта должно быть с учетом используемой ОС
-
использование СертификатКлиентаMacOS
-
использование СертификатКлиентаWindows
-
использование СертификатыУдостоверяющихЦентровMacOS
-
использование СертификатыУдостоверяющихЦентровWindows
-
КаталогВременныхФайлов
-
КаталогДокументов
-
КаталогПрограммы
-
маска всех файлов указана вручную (необходимо использовать метод «ПолучитьМаскуВсеФайлы()»)
-
метод ИнтернетСоединение доступен только на компьютерах с установленным Internet Explorer версии 5.0 или выше
-
методы модуля криптографии используют параметры, которые зависят от ОС
-
не поддерживается работа с Xbase в 64-разрядной операционной системе Linux
-
ПолучитьОтображениеЗаголовкаОС для Windows возвращает, отображается ли заголовок ОС в главном окне. Для остальных возвращает Неопределено
-
при использовании «СоздатьФайл», «СоздатьИндексныйФайл» объекта XBase под ОС Linux могут быть проблемы с регистром пути к файлу
-
при использовании свойства ПолеHTMLДокумента.Документ следует использовать только те свойства и методы, которые доступны во всех веб-браузерах
-
РабочийКаталогДанныхПользователя
-
Разделитель пути файла указан вручную (необходимо использовать метод «ПолучитьРазделительПути()»)
-
УстановитьОтображениеЗаголовкаОС для Windows устанавливает отображение заголовка ОС в главном окне. Для остальных вызов метода игнорируется
-
функциональность МенеджерПанелиЗадачОС работает под ОС Windows 7 и выше, и Ubuntu Unity. Под неподдерживаемыми операционными системами не производит никаких действий
- это расширение исполняемого файла Windows. В зависимости от ОС нужно использовать валидные файлы для данной ОС
* * *
Приложение 2. Полный список доработок АПК
-
вместо COM-объекта v83.ComConnector следует использовать сервер администрирования (ras) и утилиту администрирования (rac)
-
для работы с буфером обмена использовать механизмы встроенного языка платформы 1С
-
использовать функцию ПолучитьМаскуВсеФайлы()
-
при использовании «ЗапуститьПриложение», «НачатьЗапускПриложения» убедиться, что запускаемое приложение адаптировано под ОС Linux
-
ложное срабатывание
-
не используется
-
вместо Файл.НачатьИнициализацию() рекомендуется использование конструктора объекта «Файл» по имени файла (начиная с версии платформы 8.3.6.2076)
-
для задержки при выполнении кода рекомендуется использовать внешний компонент «Корпоративный инструментальный пакет» или процедуру «Пауза» общего модуля «ОбщегоНазначенияБТС»
-
формирование таблиц реализовать с помощью объекта ТабличныйДокумент и методов встроенного языка. Для записи книги Excel, состоящей из нескольких листов, рассмотреть возможность использования объекта ПакетОтображаемыхДокументов (доступен начиная с версии платформы 8.3.3)
-
для изменения имени каталога необходимо воспользоваться процедурой «ПеренестиСодержимоеРабочегоКаталога» общего модуля «РаботаСФайламиСлужебныйКлиент» вместо работы с COMОбъект(«Scripting.FileSystemObject»)
-
для изменения имени каталога необходимо воспользоваться командой системы ОС Linux «mv старое_имя новое_имя» вместо работы с COMОбъект(«Scripting.FileSystemObject»)
-
для корректной работы внешний компонент на Native API должен быть рассчитан на работу в ОС Linux. Компоненты можно подключать не только в клиентских приложениях, но и на сервере приложений «1С:Предприятия»
-
для получения текста из файла TXT необходимо воспользоваться объектом «ЧтениеТекста»
-
для работы с электронными таблицами рекомендуется инициализировать табличный документ и воспользоваться методом «Прочитать()», который доступен начиная с версии платформы 8.0. Затем для работы с табличным документом использовать методы встроенного языка 1С
-
для ОС Linux добавить условный оператор с проверкой на тип платформы (функции БСП «ОбщийМодуль.ОбщегоНазначения.ЭтоLinuxСервер()», «ОбщийМодуль.ОбщегоНазначенияКлиент.ЭтоLinuxКлиент()»). Создать и заполнить табличный документ необходимыми данными. Если есть макет для заполнения, то необходимо программно заполнить табличный документ на основании макета. После заполнения табличного документа вызвать платформенную процедуру табличного документа «Записать» с типом файла таблицы «xlsx». Полученный файл «*.xlsx» необходимо разархивировать в файлы «xml» и подменять текст ячейки на необходимую формулу
-
для ОС Linux добавить условный оператор с проверкой на тип платформы (функции БСП «ОбщийМодуль.ОбщегоНазначения.ЭтоLinuxСервер()», «ОбщийМодуль.ОбщегоНазначенияКлиент.ЭтоLinuxКлиент()»). Создать и заполнить табличный документ необходимыми данными. Если есть макет для заполнения, то необходимо программно заполнить табличный документ на основании макета. После заполнения табличного документа вызвать платформенную процедуру табличного документа «Записать». Для записи книги Excel, состоящей из нескольких листов, рассмотреть возможность использования объекта ПакетОтображаемыхДокументов (доступен начиная с версии платформы 8.3.3)
-
для ОС Linux добавить условный оператор с проверкой на тип платформы (функции БСП «ОбщийМодуль.ОбщегоНазначения.ЭтоLinuxСервер()», «ОбщийМодуль.ОбщегоНазначенияКлиент.ЭтоLinuxКлиент()»). Создавать или редактировать файл формата «xlsx» используя механизмы Office Open XML
-
добавить условный оператор с проверкой на тип платформы (функции БСП «ОбщийМодуль.ОбщегоНазначения.ЭтоLinuxСервер()», «ОбщийМодуль.ОбщегоНазначенияКлиент.ЭтоLinuxКлиент()»). Для печати файлов под ОС Linux необходимо вызвать процедуру БСП «НапечататьФайлы» общего модуля «РаботаСФайламиКлиент»
-
добавить условный оператор с проверкой на тип платформы (функции БСП «ОбщийМодуль.ОбщегоНазначения.ЭтоLinuxСервер()», «ОбщийМодуль.ОбщегоНазначенияКлиент.ЭтоLinuxКлиент()»). Для работы с «КриптоПРО» под ОС Linux использовать команды системы
-
добавить условный оператор с проверкой на тип платформы (функции БСП «ОбщийМодуль.ОбщегоНазначения.ЭтоLinuxСервер()», «ОбщийМодуль.ОбщегоНазначенияКлиент.ЭтоLinuxКлиент()»). Использовать сертификаты клиентов и удостоверяющих центров ОС Linux.
-
При использовании «ЗащищенноеСоединениеOpenSSL» для ОС Linux необходимо:
1. В качестве сертификата клиента, начиная с версии платформы 8.3.21, необходимо передавать одноименный объект клиентского сертификата OpenSSL «СертификатКлиентаLinux»
2. В качестве сертификата удостоверяющих центров, начиная с версии платформы 8.3.8, необходимо передавать одноименный объект сертификатов удостоверяющих центров OpenSSL «СертификатыУдостоверяющихЦентровLinux»
-
произвести ограничение использования файлов формата *.doc в случае работы под управлением ОС Linux с выводом соответствующего уведомления пользователю и регистрацией факта обращения к файлу формата *.doc в журнале регистраций. Рекомендация аналитику: для работы в ОС Linux необходимо использовать файлы с расширением *.docx (и возможно *.odt), вместо *.doc. Требуется произвести анализ используемых шаблонов и конвертировать файлы формата *.doc в *.docx. Функционал автозаполнения при работе с форматами *.docx и *.odt адаптирован для работы с ОС Linux и не требует корректировки
-
для корректной работы внешний компонент на Native API должен быть рассчитан на работу в ОС Linux. Компоненты можно подключать не только в клиентских приложениях, но и на сервере приложений «1С:Предприятия»
-
для получения идентификатора текущего процесса необходимо с помощью процедуры «КомандыСистемы» выполнить следующие действия:
1. Создать фоновый процесс из платформы
2. Получить PID нового фонового процесса
3. Получить родителя запущенного процесса, это и будет идентификатор текущего процесса
4. Завершить фоновый процесс
Пример команды: #!/bin/bash sleep 30 & process_id=$! wait process_id ps -o ppid= -p process_id kill -STOP process_id
-
для работы с документом DOM, рекомендуется инициализировать «ДокументDOM» и использовать функционал встроенного языка. Объект «ДокументDOM» доступен, начиная с версии платформы 8.1
-
при работе с внешними источниками необходимо создавать и использовать объект конфигурации «Внешний источник данных»
-
программное обеспечение, совместимое только с ОС семейства Windows, необходимо запускать на клиенте под этой ОС
-
для работы с регулярными выражениями необходимо выполнить один из вариантов доработок:
1. Для доработок использовать методы встроенного языка, доступные, начиная с версии 8.3.23 (данный вариант проще, чем второй)
2. Использовать внешний компонент Native API для выполнения регулярных выражений на платформе 1С:Предприятие 8 «RegEx1CAddin»
- не следует указывать разделитель пути файла вручную (например, «/»); для этого необходимо использовать в зависимости от контекста:
- функцию БСП ДобавитьКонечныйРазделительПути() общего модуля ОбщегоНазначенияКлиентСервер
- функцию БСП ПолучитьПолноеИмяФайла() общего модуля ОбщегоНазначенияКлиентСервер
- функции ПолучитьРазделительПути(), ПолучитьРазделительПутиКлиента() или ПолучитьРазделительПутиСервера()
-
следует использовать функцию БСП РазложитьПолноеИмяФайла() общего модуля ОбщегоНазначенияКлиентСервер для получения имени файла или пути к нему
-
не следует указывать маску всех файлов вручную (например, «*.*»); для этого необходимо использовать функцию ПолучитьМаскуВсеФайлы()
-
для работы с электронными таблицами рекомендуется инициализировать табличный документ и воспользоваться методом «Прочитать()», который доступен, начиная с версии платформы 8.0. Затем для работы с табличным документом использовать методы встроенного языка 1С
-
для программной конвертации документа в pdf для ОС Linux рекомендуется воспользоваться LibreOffice и консольной командой «soffice --headless --convert-to pdf file_name»
-
реализована поддержка работы с объектом XBase при функционировании под управлением 64-разрядной ОС Linux в версии 8.3.3;
-
не рекомендуется использовать строковые константы для путей к файлам. По возможности, следует выносить такие данные в константы (объект конфигурации), хранилища настроек, использовать стандартные каталоги (например, КаталогВременныхФайлов(), КаталогДокументов()...) и т. п.
-
для преобразования xls в csv для ОС Linux необходимо воспользоваться одним из вариантов решения:
1. Из данных xls или табличного документа, путем построчного считывания данных и добавления разделителя между строками, создать текстовую переменную, которую в дальнейшем записать в файл формата «csv» с помощью объекта «ЗаписьТекста»
2. Добавить условный оператор с проверкой на тип платформы (функции БСП «ОбщийМодуль.ОбщегоНазначения.ЭтоLinuxСервер()», «ОбщийМодуль.ОбщегоНазначенияКлиент.ЭтоLinuxКлиент()») и выводить предупреждение о том, что загрузка из файла ««.XLS»« недоступна при работе в Linux
- при использовании процедуры «ЗапуститьПриложение», «НачатьЗапускПриложения», необходимо:
1. Для запускаемого приложения убедиться, что оно адаптировано под ОС Linux
2. Для файла – проконтролировать наличие ассоциированного с файлом приложения
3. В случае неудачного запуска приложения / файла необходимо зафиксировать ошибку в журнал регистрации
-
при использовании процедуры «НачатьПолучениеИнформацииМодуляКриптографии» менеджера средства криптографии под ОС Linux, необходимо передавать параметр «ПутьМодуляКриптографии»
-
файл, созданный методами «СоздатьФайл» или «СоздатьИндексныйФайл», будет иметь расширение «DBF» (в верхнем регистре), независимо от используемой операционной системы. Так как ОС Linux чувствительна к регистру, необходимо в переданном пути также указывать расширение в верхнем регистре.
Первая статья доступна по ссылке Особенности работы информационных систем 1С под управлением Linux