Как организовать глобальные функции в 1С:Предприятии 7.7 и разгрузить глобальный модуль

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При активной разработке в системе 1С:Предприятие 7.7 программисты часто сталкиваются с проблемой чрезмерного разрастания Глобального модуля. Огромный объем кода (десятки тысяч строк) не только затрудняет навигацию и поддержку, но и может негативно сказываться на стабильности работы конфигуратора. В данной статье мы подробно разберем, как эффективно выносить функции за пределы Глобального модуля, используя как стандартные средства платформы, так и возможности внешних расширений.

Метод 1: Структурирование Глобального модуля через секции

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

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


// =============================================================================
// СЕКЦИЯ: РАБОТА СО СТРОКАМИ И ЧИСЛАМИ
//
// Глобальная функция для удаления лишних пробелов
Функция глОчиститьСтроку(Текст) Экспорт
    Возврат СокрЛП(Текст);
КонецФункции

// =============================================================================
// СЕКЦИЯ: БУХГАЛТЕРСКИЕ РАСЧЕТЫ
//
// Вычисление НДС по ставке
Процедура глРассчитатьНДС(Сумма, Ставка, СуммаНДС) Экспорт
    // Логика расчета
КонецПроцедуры

Важный момент: Всегда добавляйте подробные комментарии перед каждой процедурой, описывая входные параметры и возвращаемое значение. Это значительно упрощает поиск через глобальный поиск по конфигурации.

Метод 2: Использование внешних обработок как библиотек функций

Одним из распространенных способов выноса кода является создание специальной обработки (например, Библиотека.ert), в которой описываются необходимые алгоритмы. Разберем по шагам, как вызвать функцию из такой обработки.

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

Пример вызова функции из внешней обработки через передачу параметров:


// В вызывающем модуле (например, в форме документа):
Перем КонтекстБиблиотеки;
СписокПараметров = СоздатьОбъект("СписокЗначений");
СписокПараметров.ДобавитьЗначение("ВыполнитьРасчет");
СписокПараметров.ДобавитьЗначение(Параметр1);
СписокПараметров.ДобавитьЗначение(Параметр2);

// Открываем форму обработки и передаем список параметров
ОткрытьФорму("Отчет", СписокПараметров, КаталогИБ() + "ExtForms\Library.ert");
// Результат можно забрать из списка параметров, если передавать его по ссылке

В самой обработке в процедуре ПриОткрытии() мы анализируем входящий параметр и выполняем соответствующее действие. Однако стоит помнить, что этот метод работает медленнее, так как 1С требуется время на чтение файла с диска и инициализацию объекта формы.

Метод 3: Модули «технических» справочников

Более быстрым вариантом по сравнению с внешними обработками является использование модулей справочников. Мы можем создать в метаданных справочник БиблиотекаФункций. Его преимущество в том, что нам не нужно открывать визуальную форму.

Проанализируем ситуацию: мы создаем объект справочника в памяти, и пока на него есть ссылка, мы можем обращаться к его методам (если они определены в модуле справочника и помечены ключевым словом Экспорт).


// В глобальном модуле или форме:
Библиотека = СоздатьОбъект("Справочник.БиблиотекаФункций");
Результат = Библиотека.МояСуперФункция(Аргумент);

Примечание: Этот метод работает значительно быстрее, чем ОткрытьФорму, так как объект создается в оперативной памяти без отрисовки интерфейса.

Метод 4: Расширение возможностей через FormEx

Если вы готовы использовать внешние компоненты, обратите внимание на FormEx. Эта компонента позволяет создавать дополнительные глобальные модули. Рассмотрим подробнее, как это работает: вы можете зарегистрировать любое количество текстовых файлов как дополнительные глобальные модули системы.

Это полностью решает проблему «раздутого» основного модуля, позволяя разложить код по разным файлам (например: Global_Strings.txt, Global_Database.txt, Global_UI.txt). При запуске системы компонента загружает их, и функции становятся доступны во всем приложении.

Метод 5: Использование классов 1С++

Самым современным и архитектурно правильным решением для 1С 7.7 является использование расширения 1С++ и механизмов объектно-ориентированного программирования (ООП). Мы можем создавать классы, которые будут выступать в роли сервисов.

Разберем пример создания простого класса-сервиса:

  1. Создаем текстовый файл в папке Classes с описанием методов.
  2. Регистрируем класс в файле defcls.prm.
  3. Инициализируем объект класса один раз в ПриНачалеРаботыСистемы и сохраняем его в глобальную переменную.

Пример обращения к такому сервису:


// В глобальном модуле:
Перем глСервисЛогистики Экспорт;

Процедура ПриНачалеРаботыСистемы()
    ЗагрузитьВнешнююКомпоненту("1cpp.dll");
    глСервисЛогистики = СоздатьОбъект("Класс.СервисЛогистики");
КонецПроцедуры

// В любом месте программы:
глСервисЛогистики.РассчитатьМаршрут(ТочкаА, ТочкаБ);

Метод 6: Динамическое выполнение кода через «Шаблон»

Существует еще один малоизвестный прием — использование встроенной функции Шаблон(). Рассмотрим подробнее: эта функция позволяет вычислить выражение, переданное в виде строки. Мы можем хранить программный код даже в текстовых константах или справочниках.


// Пример динамического вызова
ИмяФункции = "глМояФункция";
Значение = Шаблон("[" + ИмяФункции + "(Параметр)]");

Этот способ позволяет реализовать гибкую логику, которую можно менять без внесения правок в конфигурацию, но он требует осторожности при отладке.

Метод 7: Вынос логики на сторону SQL

Для баз данных, работающих на MS SQL Server, часть глобальных функций, связанных с обработкой массивов данных, целесообразно выносить в хранимые процедуры. Это позволяет не только разгрузить код 1С, но и получить колоссальный прирост производительности.

Вызов таких процедур осуществляется через объект ODBCRecordset компоненты 1С++. Таким образом, вместо огромного цикла обхода документов в 1С, вы отправляете одну команду серверу, который выполняет расчет на своей стороне.

Подведение итогов

Выбор способа организации кода зависит от ваших задач и готовности использовать сторонние библиотеки:

Помните, что чистота кода напрямую влияет на количество ошибок и скорость их исправления. Выбирайте тот метод, который наиболее понятен вашей команде и обеспечивает необходимую производительность системы.

← На главную