Как избавиться от жестко заданных фамилий и технических данных в печатных формах и коде 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Ситуация, когда внедренцы или штатные разработчики «зашивают» фамилии сотрудников, адреса электронной почты или пути к сетевым папкам прямо в макеты или программный код, является классическим примером технического долга. В краткосрочной перспективе это позволяет быстро сдать задачу, но в долгосрочной — превращает поддержку системы в кошмар, особенно в крупных холдингах, где ротация кадров и изменение ИТ-инфраструктуры происходят постоянно. Разберем детально, как перевести такие «статичные» данные на динамические рельсы.

Использование штатных механизмов хранения ответственных лиц

Проанализируем сначала самый частый запрос: вывод дополнительных подписей в печатные формы. Если нам нужно, чтобы в документе расписывался не только директор, но и главный инженер, юрист или начальник участка, не стоит вписывать их ФИО в макет. Рассмотрим использование регистра сведений ОтветственныеЛицаОрганизаций (или его аналогов в разных конфигурациях).

Для добавления новых типов подписантов выполним следующие шаги:

  1. Расширим перечисление ОтветственныеЛица (или создадим свое), добавив туда нужные роли: ГлавныйИнженер, НачальникОхраны и т.д.
  2. В коде формирования печатной формы заменим текстовые константы на запрос к этому регистру.

Рассмотрим пример кода для получения ответственного лица на конкретную дату:


Функция ПолучитьПодписанта(Организация, Роль, Дата)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ОтветственныеЛицаОрганизацийСрезПоследних.ФизическоеЛицо.Наименование КАК ФИО,
    |	ОтветственныеЛицаОрганизацийСрезПоследних.Должность.Наименование КАК Должность
    |ИЗ
    |	РегистрСведений.ОтветственныеЛицаОрганизаций.СрезПоследних(&Дата, СтруктурнаяЕдиница = &Организация И ОтветственноеЛицо = &Роль) КАК ОтветственныеЛицаОрганизацийСрезПоследних";
    
    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("Роль", Роль);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Должность + " " + Выборка.ФИО;
    КонецЕсли;
    Возврат "";
КонецФункции

Универсальный регистр настроек для технических данных

Проблема «зашитых» e-mail, IP-адресов и путей к папкам решается созданием специализированного хранилища. Мы рекомендуем создать универсальный регистр сведений ОбщиеНастройкиСистемы. Структура регистра может быть следующей:

Выясним, как это упрощает жизнь: вместо того чтобы искать по всей конфигурации строку "192.168.1.100", мы один раз прописываем в коде обращение к ключу "СерверОбменаДанными". Если сервер изменится, администратор просто поправит значение в регистре через интерфейс «1С:Предприятие», не заходя в конфигуратор.

Реализация динамических подписей через дополнительные реквизиты

Если конфигурация построена на базе БСП (Библиотека стандартных подсистем), проанализируем возможность использования механизма «Дополнительные реквизиты и сведения». Это идеальный вариант, когда нужно добавить подписанта конкретному объекту (например, конкретному складу или подразделению), не меняя структуру метаданных.

Мы можем добавить объекту Склады доп. реквизит ОтветственныйЗаОтгрузку. В программном коде печатной формы мы будем считывать это значение динамически:


ЗначениеПодписанта = УправлениеСвойствами.ЗначениеСвойства(ОбъектПечати.Склад, "ОтветственныйЗаОтгрузку");
Если ЗначениеЗаполнено(ЗначениеПодписанта) Тогда
    ОбластьМакета.Параметры.ФИОПодписанта = ФизическиеЛица.ФамилияИнициалыФизЛица(ЗначениеПодписанта);
КонецЕсли;

Подход для распределенных систем (Микро-MDM)

Для ситуации, описанной автором темы (множество разных баз: БП, УПП, специализированные конфигурации), разберем продвинутое решение. Создание отдельной «базы настроек» или использование существующей центральной базы в качестве мастер-системы.

Посмотрим на алгоритм работы через HTTP-сервис:

  1. В центральной базе создается HTTP-сервис, который по запросу (передаем ID организации и имя настройки) отдает актуальное значение.
  2. В каждой периферийной базе создается общая функция, которая кэширует эти данные (чтобы не перегружать сеть при каждой печати) и возвращает их в макет.

Это позволяет централизованно управлять всеми «связями» во всем холдинге из одного окна. Если увольняется главный бухгалтер, изменения вносятся в одном месте, и они моментально подтягиваются во все 12 баз компании.

Программная модификация макета (без изменения шаблона)

Иногда возникают ситуации, когда макет типовой и его не хочется снимать с поддержки. Рассмотрим способ программной правки уже сформированного ТабличногоДокумента. Мы можем найти ячейку по тексту-маркеру и заменить её содержание.


// Пример поиска и замены текста в сформированном документе
Область = ТабДок.НайтиТекст("Директор");
Если Область <> Неопределено Тогда
    // Получаем ячейку правее или ниже и заполняем её
    ТабДок.Область(Область.Верх, Область.Лево + 1).Текст = "Новая Фамилия И.О.";
КонецЕсли;

Подводя итог, отметим: избавление от хардкода — это не просто прихоть программиста, а залог выживаемости системы. Мы рекомендуем комбинировать методы: использовать штатные регистры для ответственных лиц, дополнительные реквизиты для специфических условий и универсальные регистры «Ключ-Значение» для технических параметров инфраструктуры.

← На главную