При внедрении и сопровождении системы 1С:Документооборот мы часто сталкиваемся с необходимостью изменения карточки основного справочника системы. Возникает закономерный вопрос: как правильно формировать формы для разных видов документов? Стоит ли добавлять новые реквизиты в конфигураторе, изменять форму объекта или создавать новые отдельные формы? Разберем по шагам все доступные варианты и выясним причину выбора того или иного подхода.
В третьей редакции программы входящие, исходящие и внутренние документы были объединены в единый справочник ДокументыПредприятия. Из-за этого основная карточка документа стала универсальной, и управление видимостью элементов в зависимости от вида документа приобрело критическое значение. Рассмотрим подробнее два основных подхода к доработке.
Штатный механизм Библиотеки стандартных подсистем (БСП) позволяет добавлять реквизиты в режиме предприятия. Проанализируем ситуацию: у вас может быть более 50 видов документов, и для каждого требуются свои специфические поля.
Однако механизм имеет свои ограничения. В высоконагруженных базах данных с миллионами документов использование множества дополнительных реквизитов может стать причиной падения производительности, так как на уровне СУБД они хранятся в подчиненной табличной части.
Если реквизит является сквозным (нужен для большинства видов документов), требует сложной программной проверки или участвует в тяжелых запросах, лучше использовать механизм расширений конфигурации. Посмотрим на плюсы такого подхода:
Для отображения таких реквизитов в 1С:ДО формы лучше оставлять типовыми и через расширения править HTML-представление, которое уже имеет интеграции во все нужные элементы интерфейса.
Если вы выбрали путь использования типовых дополнительных реквизитов, вам часто потребуется читать и записывать их значения программно. Рассмотрим полезные функции, которые можно вынести в отдельный общий модуль расширения для удобного вызова из алгоритмов.
1. Получение значения дополнительного реквизита:
Функция ПолучитьЗначениеДополнительногоРеквизита(ОбъектСсылка, ИдентификаторДляФормул) Экспорт
Значение = Неопределено;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", ИдентификаторДляФормул);
Если ЗначениеЗаполнено(Свойство) Тогда
ЭтоОбъект = Ложь;
Если ОбъектСсылка <> Неопределено И XMLТипЗнч(ОбъектСсылка) <> Неопределено Тогда
ТипЗначенияСтрокой = XMLТипЗнч(ОбъектСсылка).ИмяТипа;
ЭтоОбъект = (СтрНайти(ТипЗначенияСтрокой, "Object.") > 0) ИЛИ (СтрНайти(ТипЗначенияСтрокой, "CatalogRef.") > 0);
КонецЕсли;
Если ЭтоОбъект Тогда
мСтрока = ОбъектСсылка.ДополнительныеРеквизиты.Найти(Свойство, "Свойство");
Если мСтрока <> Неопределено Тогда
Значение = мСтрока.Значение;
КонецЕсли;
Иначе
Значение = УправлениеСвойствами.ЗначениеСвойства(ОбъектСсылка, Свойство);
КонецЕсли;
КонецЕсли;
Возврат Значение;
КонецФункции
2. Установка значения дополнительного реквизита в объекте:
Функция УстановитьЗначениеДополнительногоРеквизита(Объект, ИдентификаторДляФормул, Значение) Экспорт
Результат = Ложь;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", ИдентификаторДляФормул);
Если ЗначениеЗаполнено(Свойство) Тогда
НадоДобавить = Истина;
Для Каждого эл из Объект.ДополнительныеРеквизиты Цикл
Если эл.Свойство = Свойство Тогда
Если эл.Значение <> Значение Тогда
эл.Значение = Значение;
эл.ТекстоваяСтрока = СокрЛП(Значение);
Результат = Истина;
КонецЕсли;
НадоДобавить = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если НадоДобавить Тогда
НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = Свойство;
НоваяСтрока.Значение = Значение;
НоваяСтрока.ТекстоваяСтрока = СокрЛП(Значение);
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
3. Поиск элемента управления на форме:
Если вам необходимо программно скрыть элемент дополнительного реквизита или изменить его доступность на управляемой форме, воспользуйтесь следующей функцией:
Функция НайтиЭлементДополнительногоРеквизита(Форма, ИдентификаторДляФормул) Экспорт
Результат = Неопределено;
Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", ИдентификаторДляФормул);
ИмяРеквизита = "";
Если ЗначениеЗаполнено(Свойство) Тогда
НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
Если НайденныеСтроки.Количество() > 0 Тогда
ИмяРеквизита = НайденныеСтроки[0].ИмяРеквизитаЗначение;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ИмяРеквизита) Тогда
Результат = Форма.Элементы.Найти(ИмяРеквизита);
КонецЕсли;
Возврат Результат;
КонецФункции
Внедряйте эти функции в свои алгоритмы обработки документов, это существенно упростит программную логику и сделает код чище. Выбирайте подход (БСП или расширения) в зависимости от объема базы данных и специфики требуемых полей.