Как правильно доработать справочник "Документы предприятия" в 1С:Документооборот?

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

При внедрении и сопровождении системы 1С:Документооборот мы часто сталкиваемся с необходимостью изменения карточки основного справочника системы. Возникает закономерный вопрос: как правильно формировать формы для разных видов документов? Стоит ли добавлять новые реквизиты в конфигураторе, изменять форму объекта или создавать новые отдельные формы? Разберем по шагам все доступные варианты и выясним причину выбора того или иного подхода.

Особенности архитектуры 1С:Документооборот 3.0

В третьей редакции программы входящие, исходящие и внутренние документы были объединены в единый справочник ДокументыПредприятия. Из-за этого основная карточка документа стала универсальной, и управление видимостью элементов в зависимости от вида документа приобрело критическое значение. Рассмотрим подробнее два основных подхода к доработке.

Подход 1: Использование механизма дополнительных реквизитов (БСП)

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

  1. Гибкость настройки: Дополнительные реквизиты создаются для каждого вида документа отдельно. Это позволяет не перегружать общую таблицу базы данных тысячами неиспользуемых полей.
  2. Размещение на форме: В новых версиях программы появилась возможность выводить дополнительные реквизиты в любом месте карточки документа. Достаточно в настройках реквизита указать группу элементов формы, и реквизит гармонично встроится в нужный блок.
  3. Интеграция с логикой: Маршруты бизнес-процессов и автозаполнение шаблонов файлов (Word) легко настраиваются на основании значений доп. реквизитов без программирования.

Однако механизм имеет свои ограничения. В высоконагруженных базах данных с миллионами документов использование множества дополнительных реквизитов может стать причиной падения производительности, так как на уровне СУБД они хранятся в подчиненной табличной части.

Подход 2: Добавление физических реквизитов через расширения

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

  1. Сохранение поддержки: Конфигурация остается "на замке", а все доработки хранятся в расширении.
  2. Производительность и поиск: Появляется возможность индексирования полей, что ускоряет полнотекстовый поиск и работу сложных отчетов.
  3. Настройка прав (RLS): На физические реквизиты можно накладывать сложные ограничения доступа на уровне записей.
  4. Пользовательские табличные части: Типовой механизм БСП ограничен в имитации табличных данных, поэтому произвольные табличные части лучше создавать именно в расширении.

Для отображения таких реквизитов в 1С:ДО формы лучше оставлять типовыми и через расширения править HTML-представление, которое уже имеет интеграции во все нужные элементы интерфейса.

Программная работа с дополнительными реквизитами: примеры кода

Если вы выбрали путь использования типовых дополнительных реквизитов, вам часто потребуется читать и записывать их значения программно. Рассмотрим полезные функции, которые можно вынести в отдельный общий модуль расширения для удобного вызова из алгоритмов.

1. Получение значения дополнительного реквизита:


Функция ПолучитьЗначениеДополнительногоРеквизита(ОбъектСсылка, ИдентификаторДляФормул) Экспорт
    Значение = Неопределено;
    Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", ИдентификаторДляФормул);
    
    Если ЗначениеЗаполнено(Свойство) Тогда
        ЭтоОбъект = Ложь;
        Если ОбъектСсылка <> Неопределено И XMLТипЗнч(ОбъектСсылка) <> Неопределено Тогда
            ТипЗначенияСтрокой = XMLТипЗнч(ОбъектСсылка).ИмяТипа;
            ЭтоОбъект = (СтрНайти(ТипЗначенияСтрокой, "Object.") > 0) ИЛИ (СтрНайти(ТипЗначенияСтрокой, "CatalogRef.") > 0);
        КонецЕсли;
        
        Если ЭтоОбъект Тогда
            мСтрока = ОбъектСсылка.ДополнительныеРеквизиты.Найти(Свойство, "Свойство");
            Если мСтрока <> Неопределено Тогда
                Значение = мСтрока.Значение;
            КонецЕсли;
        Иначе
            Значение = УправлениеСвойствами.ЗначениеСвойства(ОбъектСсылка, Свойство);
        КонецЕсли;
    КонецЕсли;
    
    Возврат Значение;
КонецФункции

2. Установка значения дополнительного реквизита в объекте:


Функция УстановитьЗначениеДополнительногоРеквизита(Объект, ИдентификаторДляФормул, Значение) Экспорт
    Результат = Ложь;
    Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", ИдентификаторДляФормул);
    
    Если ЗначениеЗаполнено(Свойство) Тогда
        НадоДобавить = Истина;
        Для Каждого эл из Объект.ДополнительныеРеквизиты Цикл
            Если эл.Свойство = Свойство Тогда
                Если эл.Значение <> Значение Тогда
                    эл.Значение = Значение;
                    эл.ТекстоваяСтрока = СокрЛП(Значение);
                    Результат = Истина;
                КонецЕсли;
                НадоДобавить = Ложь;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        Если НадоДобавить Тогда
            НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
            НоваяСтрока.Свойство = Свойство;
            НоваяСтрока.Значение = Значение;
            НоваяСтрока.ТекстоваяСтрока = СокрЛП(Значение);
            Результат = Истина;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

3. Поиск элемента управления на форме:

Если вам необходимо программно скрыть элемент дополнительного реквизита или изменить его доступность на управляемой форме, воспользуйтесь следующей функцией:


Функция НайтиЭлементДополнительногоРеквизита(Форма, ИдентификаторДляФормул) Экспорт
    Результат = Неопределено;
    Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
    Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", ИдентификаторДляФормул);
    ИмяРеквизита = "";
    
    Если ЗначениеЗаполнено(Свойство) Тогда
        НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
        Если НайденныеСтроки.Количество() > 0 Тогда
            ИмяРеквизита = НайденныеСтроки[0].ИмяРеквизитаЗначение;
        КонецЕсли;
    КонецЕсли;
    
    Если ЗначениеЗаполнено(ИмяРеквизита) Тогда
        Результат = Форма.Элементы.Найти(ИмяРеквизита);
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Внедряйте эти функции в свои алгоритмы обработки документов, это существенно упростит программную логику и сделает код чище. Выбирайте подход (БСП или расширения) в зависимости от объема базы данных и специфики требуемых полей.

← На главную