Разработчики, работающие с крупными решениями на платформе 1С:Предприятие 8.3, такими как ERP Управление предприятием 2, Управление торговлей 11 или Комплексная автоматизация, часто сталкиваются с феноменом, который вызывает недоумение: наличие функций с тысячами строк однотипного «хардкода». Особенно ярко это проявляется в справочнике УпаковкиЕдиницыИзмерения. Рассмотрим причины такого архитектурного решения, разберем его плюсы и минусы, а также выясним, стоит ли использовать подобные приемы в собственной практике.
Если мы откроем модуль менеджера справочника УпаковкиЕдиницыИзмерения в одной из современных типовых конфигураций, то обнаружим экспортную функцию ПолучитьДанныеКлассификатора(). В некоторых релизах ее объем превышает 5000 строк. Содержимое функции представляет собой последовательное заполнение структур или таблиц данными Общероссийского классификатора единиц измерения (ОКЕИ).
Проанализируем пример кода, который часто встречается в подобных модулях:
Функция ПолучитьДанныеКлассификатора() Экспорт
Данные = Новый ТаблицаЗначений;
Данные.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(3)));
Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(50)));
// ... еще десятки колонок
НоваяСтрока = Данные.Добавить();
НоваяСтрока.Код = "003";
НоваяСтрока.Наименование = "Миллиметр";
// ... и так тысячи раз
Возврат Данные;
КонецФункции
На первый взгляд, такой подход кажется нарушением всех правил «чистого кода». Однако за этим решением стоят конкретные технические и методологические соображения команды разработки фирмы «1С».
Традиционно для хранения статических данных классификаторов используются Макеты (в формате XML, MXL или JSON). Рассмотрим, почему в «тяжелых» конфигурациях предпочтение отдается программному наполнению:
ПолучитьДанныеКлассификатора уже находится в оперативной памяти сервера приложений. Вызов такой функции происходит практически мгновенно, в то время как чтение макета требует обращения к метаданным, извлечения двоичных данных, их парсинга (десериализации) и преобразования в объекты 1С.XLS или XML) в готовые листинги на языке 1С. Это исключает человеческий фактор при набивке данных.Рассмотрим, как эти данные используются на практике. Выясним, действительно ли система постоянно обращается к этим 5000 строкам. Проанализируем цепочку вызовов в типовом решении:
// В обработке подбора или при заполнении документа
ДанныеКлассификатора = Справочники.УпаковкиЕдиницыИзмерения.ЗаполнитьЕдиницыИзмеренияИзКлассификатора("796");
// Внутри модуля менеджера
Функция ЗаполнитьЕдиницыИзмеренияИзКлассификатора(Код) Экспорт
ВсеДанные = ПолучитьДанныеКлассификатора(); // Тот самый гигантский вызов
СтрокаКлассификатора = ВсеДанные.Найти(Код, "Код");
// ... логика по созданию или обновлению элемента справочника
КонецФункции
Как мы видим, функция служит источником эталонных данных для сопоставления. Это особенно важно для работы Электронного документооборота (ЭДО). Когда в систему поступает входящий XML-файл (например, УПД), программа должна мгновенно определить, какой единице измерения соответствует код из файла. Наличие полного классификатора «под рукой» в коде гарантирует корректную работу сопоставления даже в абсолютно пустой базе.
Несмотря на преимущества, разберем и негативные стороны такого подхода, о которых должен знать каждый программист:
УпаковкиЕдиницыИзмерения, он вынужден загружать и компилировать весь модуль целиком, включая эти 5000 строк. Это увеличивает потребление памяти процессом rphost..cf файлом.Проанализируем, стоит ли повторять этот опыт в своих разработках. Если перед вами стоит задача создать собственный классификатор (например, специфических отраслевых стандартов), придерживайтесь следующих правил:
JSON или CSV будет оптимальным по балансу производительности и удобства поддержки.#Область ОбновлениеИнформационнойБазы для выделения такого кода, чтобы другие разработчики понимали назначение этого блока и не пытались рефакторить его вручную.Вывод: Увидев подобный код в типовой конфигурации, не стоит спешить с критикой. Это осознанный компромисс между «красотой» кода и техническими требованиями к крупным корпоративным системам, обеспечивающий максимальную скорость первичной обработки данных и независимость от внешних ресурсов.