В процессе разработки и доработки конфигураций 1С регулярно возникает потребность в хранении вспомогательных служебных данных: даты включения новой бизнес-логики, версий алгоритмов проведения документов, технических флагов или значений подстановки. При этом важно выбрать механизм, который обеспечит удобство сопровождения, универсальность и минимальную нагрузку на СУБД при частых вызовах.
Разберем основные архитектурные варианты решения этой задачи, их плюсы, минусы и особенности реализации на платформе 1С:Предприятие 8.3.
Самый простой и производительный способ — фиксация даты или версии алгоритма прямо в общем модуле. Данный подход исключает любые обращения к базе данных и СУБД, что критически важно при массовом проведении документов или выполнении высоконагруженных регламентных заданий.
Посмотрим на пример вынесения логики выбора алгоритма в специализированный общий модуль:
Функция ПолучитьВерсиюАлгоритма(МетаданныеОбъекта, ДатаДокумента) Экспорт
Если ДатаДокумента >= '20240101' Тогда
Возврат 2; // Новый алгоритм с 2024 года
Иначе
Возврат 1; // Устаревший алгоритм
КонецЕсли;
КонецФункции
В модуле объекта или менеджера вызов будет выглядеть компактно:
ВерсияАлгоритма = ОбщегоНазначенияКлиентСервер.ПолучитьВерсиюАлгоритма(ЭтотОбъект.Метаданные(), ЭтотОбъект.Дата);
Если ВерсияАлгоритма = 2 Тогда
ВыполнитьПроведениеПоНовойСхеме();
Иначе
ВыполнитьПроведениеПоСтаройСхеме();
КонецЕсли;
Плюсы: максимальное быстродействие, отсутствие лишних объектов метаданных, простота чтения истории изменений в хранилище конфигурации.
Минусы: для корректировки даты или флага требуется обновление конфигурации (внесение изменений в метаданные).
Если требуется дать возможность администратору или разработчику изменять даты включения механизмов в пользовательском режиме без внесения изменений в конфигурацию, создают отдельный справочник.
Разберем по шагам правильную организацию этого механизма:
ДополнительныеНастройкиРазработчика с реквизитом ДатаНачалаДействия (тип Дата) и строковым кодом/наименованием.НовыйРасчетСебестоимости).Пример кэширующей функции в общем модуле с повторным использованием:
Функция АлгоритмАктивен(ИмяПредопределенногоЭлемента, ДатаПроверки) Экспорт
ЭлементНастройки = Справочники.ДополнительныеНастройкиРазработчика[ИмяПредопределенногоЭлемента];
Если Не ЗначениеЗаполнено(ЭлементНастройки) Тогда
Возврат Ложь;
КонецЕсли;
ДатаНачала = ЭлементНастройки.ДатаНачалаДействия;
Возврат (ДатаПроверки >= ДатаНачала);
КонецФункции
Важная деталь: кэш повторного использования сохраняет полученные значения в памяти сеанса. Если значение даты в справочнике было изменено в режиме «1С:Предприятие», для немедленного применения изменений в текущем сеансе потребуется вызов метода ОчиститьЗначенияПовторногоИспользования().
Для глобальных переключателей механизмов платформа 1С предоставляет механизм констант и функциональных опций:
ДатаНачалаДействияНовогоУчета (тип Дата) или ИспользоватьНовуюСхемуУчета (тип Булево).ФункциональнаяОпция), что позволяет централизованно управлять видимостью реквизитов на формах и поведением логики.Когда требуется хранить сложные, разнородные и периодические параметры (например, параметры учетной политики или алгоритмов), используют связку План видов характеристик (ПВХ) и Регистр сведений.
Проанализируем структуру такого решения:
Ограничение производительности: не рекомендуется создавать реквизиты справочников или ресурсы регистров с составным типом «Все ссылки» (любая ссылка на справочник, документ, перечисление и примитивные типы). В физической таблице СУБД для каждого возможного типа создается отдельная колонка, что приводит к разрастанию таблиц и деградации скорости выполнения запросов. При необходимости хранить произвольные данные лучше использовать сериализацию в строку/JSON или тип ХранилищеЗначения.
Если мы хотим избежать создания новых объектов метаданных, рассмотрим альтернативные системные способы:
ХранилищеОбщихНастроек.Сохранить() и ХранилищеОбщихНастроек.Загрузить().ВерсииПодсистем и штатные обработчики обновления библиотеки стандартных подсистем вместо ручных проверок дат.Для выбора оптимального решения проанализируем условия задачи: