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