Ситуация, когда внедренцы или штатные разработчики «зашивают» фамилии сотрудников, адреса электронной почты или пути к сетевым папкам прямо в макеты или программный код, является классическим примером технического долга. В краткосрочной перспективе это позволяет быстро сдать задачу, но в долгосрочной — превращает поддержку системы в кошмар, особенно в крупных холдингах, где ротация кадров и изменение ИТ-инфраструктуры происходят постоянно. Разберем детально, как перевести такие «статичные» данные на динамические рельсы.
Проанализируем сначала самый частый запрос: вывод дополнительных подписей в печатные формы. Если нам нужно, чтобы в документе расписывался не только директор, но и главный инженер, юрист или начальник участка, не стоит вписывать их ФИО в макет. Рассмотрим использование регистра сведений ОтветственныеЛицаОрганизаций (или его аналогов в разных конфигурациях).
Для добавления новых типов подписантов выполним следующие шаги:
ОтветственныеЛица (или создадим свое), добавив туда нужные роли: ГлавныйИнженер, НачальникОхраны и т.д.Рассмотрим пример кода для получения ответственного лица на конкретную дату:
Функция ПолучитьПодписанта(Организация, Роль, Дата)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтветственныеЛицаОрганизацийСрезПоследних.ФизическоеЛицо.Наименование КАК ФИО,
| ОтветственныеЛицаОрганизацийСрезПоследних.Должность.Наименование КАК Должность
|ИЗ
| РегистрСведений.ОтветственныеЛицаОрганизаций.СрезПоследних(&Дата, СтруктурнаяЕдиница = &Организация И ОтветственноеЛицо = &Роль) КАК ОтветственныеЛицаОрганизацийСрезПоследних";
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Роль", Роль);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Должность + " " + Выборка.ФИО;
КонецЕсли;
Возврат "";
КонецФункции
Проблема «зашитых» e-mail, IP-адресов и путей к папкам решается созданием специализированного хранилища. Мы рекомендуем создать универсальный регистр сведений ОбщиеНастройкиСистемы. Структура регистра может быть следующей:
КлючНастройки (Тип: Строка или специально созданное перечисление).ЗначениеНастройки (Тип: Любая ссылка, Строка, Число).Выясним, как это упрощает жизнь: вместо того чтобы искать по всей конфигурации строку "192.168.1.100", мы один раз прописываем в коде обращение к ключу "СерверОбменаДанными". Если сервер изменится, администратор просто поправит значение в регистре через интерфейс «1С:Предприятие», не заходя в конфигуратор.
Если конфигурация построена на базе БСП (Библиотека стандартных подсистем), проанализируем возможность использования механизма «Дополнительные реквизиты и сведения». Это идеальный вариант, когда нужно добавить подписанта конкретному объекту (например, конкретному складу или подразделению), не меняя структуру метаданных.
Мы можем добавить объекту Склады доп. реквизит ОтветственныйЗаОтгрузку. В программном коде печатной формы мы будем считывать это значение динамически:
ЗначениеПодписанта = УправлениеСвойствами.ЗначениеСвойства(ОбъектПечати.Склад, "ОтветственныйЗаОтгрузку");
Если ЗначениеЗаполнено(ЗначениеПодписанта) Тогда
ОбластьМакета.Параметры.ФИОПодписанта = ФизическиеЛица.ФамилияИнициалыФизЛица(ЗначениеПодписанта);
КонецЕсли;
Для ситуации, описанной автором темы (множество разных баз: БП, УПП, специализированные конфигурации), разберем продвинутое решение. Создание отдельной «базы настроек» или использование существующей центральной базы в качестве мастер-системы.
Посмотрим на алгоритм работы через HTTP-сервис:
Это позволяет централизованно управлять всеми «связями» во всем холдинге из одного окна. Если увольняется главный бухгалтер, изменения вносятся в одном месте, и они моментально подтягиваются во все 12 баз компании.
Иногда возникают ситуации, когда макет типовой и его не хочется снимать с поддержки. Рассмотрим способ программной правки уже сформированного ТабличногоДокумента. Мы можем найти ячейку по тексту-маркеру и заменить её содержание.
// Пример поиска и замены текста в сформированном документе
Область = ТабДок.НайтиТекст("Директор");
Если Область <> Неопределено Тогда
// Получаем ячейку правее или ниже и заполняем её
ТабДок.Область(Область.Верх, Область.Лево + 1).Текст = "Новая Фамилия И.О.";
КонецЕсли;
Подводя итог, отметим: избавление от хардкода — это не просто прихоть программиста, а залог выживаемости системы. Мы рекомендуем комбинировать методы: использовать штатные регистры для ответственных лиц, дополнительные реквизиты для специфических условий и универсальные регистры «Ключ-Значение» для технических параметров инфраструктуры.