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