1С Дополнительные реквизиты на форме при помощи расширения
В своей работе с 1С стараюсь сделать так, чтобы обновления проходили максимально безболезненно. Для этого нужно сохранять не изменяемость конфигурации. В настоящий момент, при помощи «расширений» конфигурации, многие вещи достаточно легко сделать основную конфигурацию не трогая вообще. Ниже рассмотрю, как я сделал задачу по добавлению значения «Покупка с сайта» в документе «Реализация товаров».
1) Выносим в расширение документ документ «Реализация товаров и добавляем реквизит «ПокупкаССайта» в реквизиты формы. Да! именно в реквизиты формы, а не документа. В настоящий момент платформа 1С не дает добавлять в расширения реквизиты документа (но обещают). Перетаскиваем реквизит в элементы и обязательно ставим галочку на «АктивизироватьПоУмолчанию» — иначе на форме при запуске не отобразится:
2) Следующая задача — сделать сохранение значения данного реквизита с привязкой к документы. Самое удобное — хранить значение в специально предназначенном для этого регистре ДополнительныеРеквизитыИСведения. В нём два измерения: обьект и Свойство. Обьект в нашем случае — это документ Реализации, а свойство нужно задать в ПланеВидовХарактеристик.ДополнительныеРеквизитыИСведения. Например так:
И далее создадим обработчики открытия формы и закрытия в которых реализуем чтение из регистра и запись в этот регистр:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
&НаСервере Функция ЗаписатьЗначениеПокупкиССайта(параметр) МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Объект = объект.Ссылка; МенеджерЗаписи.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Продажа с сайта"); МенеджерЗаписи.Значение=параметр; МенеджерЗаписи.Записать(); конецфункции &НаСервере Функция ПолучитьЗначениеГалочки(); зн=РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей(); отбор=зн.Отбор; отбор.Объект.Установить(объект.Ссылка); отбор.Свойство.Установить(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Продажа с сайта")); зн.Прочитать(); галочка=ложь; для каждого стр из зн цикл галочка=стр.Значение; конеццикла; возврат галочка; КонецФункции &НаКлиенте Процедура Расш1_ПровестиИзФормыПосле(Команда) ЗаписатьЗначениеПокупкиССайта(этаформа.ПокупкаССайта); КонецПроцедуры &НаКлиенте Процедура Расш1_ПровестиИЗакрытьИзФормыПосле(Команда) Расш1_ПровестиИзФормыПосле(Команда); КонецПроцедуры &НаКлиенте Процедура Расш1_ПриОткрытииПосле(Отказ) этаформа.ПокупкаССайта=ПолучитьЗначениеГалочки(); КонецПроцедуры |
Слегка поправлю. В целом идея хорошая. Пригодилась. Легче чем внедрять БСП. Подсистема Свойства
// Процедуры, для которых нужно делать привязку обработчиков формы расширения:
// ПриОткрытии
// ПослеЗаписиНаСервере
// ОперацияДокументаПриИзменении
#Область ДопРеквизиты
&НаСервере
Функция ЗаписатьЗначениеОперацииДокумента(параметр)
МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = Объект.Ссылка;
МенеджерЗаписи.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту(«Имя», «ОперацияДокументаОРП»);
Если ЗначениеЗаполнено(параметр) Тогда
МенеджерЗаписи.Значение=параметр;
МенеджерЗаписи.Записать();
Иначе
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Удалить();
КонецЕсли;
КонецЕсли;
конецфункции
&НаСервере
Функция ПолучитьЗначениеОперации();
зн=РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
отбор=зн.Отбор;
отбор.Объект.Установить(объект.Ссылка);
отбор.Свойство.Установить(ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту(«Имя», «ОперацияДокументаОРП»));
зн.Прочитать();
ОперацияДокумента = Неопределено;
для каждого стр из зн цикл
ОперацияДокумента = стр.Значение;
конеццикла;
возврат ОперацияДокумента;
КонецФункции
&НаКлиенте
Процедура Расш1_ПровестиИзФормыПосле(Команда)
ЗаписатьЗначениеОперацииДокумента(этаформа.ОперацияДокумента);
КонецПроцедуры
&НаКлиенте
Процедура Расш1_ПровестиИЗакрытьИзФормыПосле(Команда)
Расш1_ПровестиИзФормыПосле(Команда);
КонецПроцедуры
&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
этаформа.ОперацияДокумента=ПолучитьЗначениеОперации();
КонецПроцедуры
&НаСервере
Процедура Расш1_ПослеЗаписиНаСервереПосле(ТекущийОбъект, ПараметрыЗаписи)
ЗаписатьЗначениеОперацииДокумента(этаформа.ОперацияДокумента);
КонецПроцедуры
&НаКлиенте
Процедура Расш1_ОперацияДокументаПриИзмененииПосле(Элемент)
ЭтаФорма.Модифицированность = истина;
КонецПроцедуры
#КонецОбласти