При активной разработке в системе 1С:Предприятие 7.7 программисты часто сталкиваются с проблемой чрезмерного разрастания Глобального модуля. Огромный объем кода (десятки тысяч строк) не только затрудняет навигацию и поддержку, но и может негативно сказываться на стабильности работы конфигуратора. В данной статье мы подробно разберем, как эффективно выносить функции за пределы Глобального модуля, используя как стандартные средства платформы, так и возможности внешних расширений.
Если «вера не позволяет» использовать сторонние компоненты, а объем кода еще позволяет работать в рамках одного файла, первым шагом должна стать жесткая структуризация. Рассмотрим, как правильно организовать код внутри Глобального модуля, чтобы он не превратился в «помойку».
Проанализируем подход с использованием логических секций. Каждая группа функций должна иметь четкие границы. Это позволяет использовать стандартный список процедур и функций в конфигураторе более эффективно.
// =============================================================================
// СЕКЦИЯ: РАБОТА СО СТРОКАМИ И ЧИСЛАМИ
//
// Глобальная функция для удаления лишних пробелов
Функция глОчиститьСтроку(Текст) Экспорт
Возврат СокрЛП(Текст);
КонецФункции
// =============================================================================
// СЕКЦИЯ: БУХГАЛТЕРСКИЕ РАСЧЕТЫ
//
// Вычисление НДС по ставке
Процедура глРассчитатьНДС(Сумма, Ставка, СуммаНДС) Экспорт
// Логика расчета
КонецПроцедуры
Важный момент: Всегда добавляйте подробные комментарии перед каждой процедурой, описывая входные параметры и возвращаемое значение. Это значительно упрощает поиск через глобальный поиск по конфигурации.
Одним из распространенных способов выноса кода является создание специальной обработки (например, Библиотека.ert), в которой описываются необходимые алгоритмы. Разберем по шагам, как вызвать функцию из такой обработки.
Для реализации этого метода мы будем использовать механизм передачи контекста или параметров при открытии формы. Выясним причину популярности этого метода: он позволяет обновлять логику обработки без монопольного выгона пользователей из базы.
Пример вызова функции из внешней обработки через передачу параметров:
// В вызывающем модуле (например, в форме документа):
Перем КонтекстБиблиотеки;
СписокПараметров = СоздатьОбъект("СписокЗначений");
СписокПараметров.ДобавитьЗначение("ВыполнитьРасчет");
СписокПараметров.ДобавитьЗначение(Параметр1);
СписокПараметров.ДобавитьЗначение(Параметр2);
// Открываем форму обработки и передаем список параметров
ОткрытьФорму("Отчет", СписокПараметров, КаталогИБ() + "ExtForms\Library.ert");
// Результат можно забрать из списка параметров, если передавать его по ссылке
В самой обработке в процедуре ПриОткрытии() мы анализируем входящий параметр и выполняем соответствующее действие. Однако стоит помнить, что этот метод работает медленнее, так как 1С требуется время на чтение файла с диска и инициализацию объекта формы.
Более быстрым вариантом по сравнению с внешними обработками является использование модулей справочников. Мы можем создать в метаданных справочник БиблиотекаФункций. Его преимущество в том, что нам не нужно открывать визуальную форму.
Проанализируем ситуацию: мы создаем объект справочника в памяти, и пока на него есть ссылка, мы можем обращаться к его методам (если они определены в модуле справочника и помечены ключевым словом Экспорт).
// В глобальном модуле или форме:
Библиотека = СоздатьОбъект("Справочник.БиблиотекаФункций");
Результат = Библиотека.МояСуперФункция(Аргумент);
Примечание: Этот метод работает значительно быстрее, чем ОткрытьФорму, так как объект создается в оперативной памяти без отрисовки интерфейса.
Если вы готовы использовать внешние компоненты, обратите внимание на FormEx. Эта компонента позволяет создавать дополнительные глобальные модули. Рассмотрим подробнее, как это работает: вы можете зарегистрировать любое количество текстовых файлов как дополнительные глобальные модули системы.
Это полностью решает проблему «раздутого» основного модуля, позволяя разложить код по разным файлам (например: Global_Strings.txt, Global_Database.txt, Global_UI.txt). При запуске системы компонента загружает их, и функции становятся доступны во всем приложении.
Самым современным и архитектурно правильным решением для 1С 7.7 является использование расширения 1С++ и механизмов объектно-ориентированного программирования (ООП). Мы можем создавать классы, которые будут выступать в роли сервисов.
Разберем пример создания простого класса-сервиса:
Classes с описанием методов.defcls.prm.ПриНачалеРаботыСистемы и сохраняем его в глобальную переменную.Пример обращения к такому сервису:
// В глобальном модуле:
Перем глСервисЛогистики Экспорт;
Процедура ПриНачалеРаботыСистемы()
ЗагрузитьВнешнююКомпоненту("1cpp.dll");
глСервисЛогистики = СоздатьОбъект("Класс.СервисЛогистики");
КонецПроцедуры
// В любом месте программы:
глСервисЛогистики.РассчитатьМаршрут(ТочкаА, ТочкаБ);
Существует еще один малоизвестный прием — использование встроенной функции Шаблон(). Рассмотрим подробнее: эта функция позволяет вычислить выражение, переданное в виде строки. Мы можем хранить программный код даже в текстовых константах или справочниках.
// Пример динамического вызова
ИмяФункции = "глМояФункция";
Значение = Шаблон("[" + ИмяФункции + "(Параметр)]");
Этот способ позволяет реализовать гибкую логику, которую можно менять без внесения правок в конфигурацию, но он требует осторожности при отладке.
Для баз данных, работающих на MS SQL Server, часть глобальных функций, связанных с обработкой массивов данных, целесообразно выносить в хранимые процедуры. Это позволяет не только разгрузить код 1С, но и получить колоссальный прирост производительности.
Вызов таких процедур осуществляется через объект ODBCRecordset компоненты 1С++. Таким образом, вместо огромного цикла обхода документов в 1С, вы отправляете одну команду серверу, который выполняет расчет на своей стороне.
Выбор способа организации кода зависит от ваших задач и готовности использовать сторонние библиотеки:
Помните, что чистота кода напрямую влияет на количество ошибок и скорость их исправления. Выбирайте тот метод, который наиболее понятен вашей команде и обеспечивает необходимую производительность системы.