Изменение документа через команду: различия между версиями

Материал из system.c
Перейти к навигации Перейти к поиску
 
(не показаны 3 промежуточные версии этого же участника)
Строка 1: Строка 1:
 
Иногда требуется произвести изменения данных документа какой либо обработкой, но из самой формы документа. В качестве примера можно использовать заполнение табличной части документа внешней обработкой (здесь имеется ввиду код, а не объект).<br>
 
Иногда требуется произвести изменения данных документа какой либо обработкой, но из самой формы документа. В качестве примера можно использовать заполнение табличной части документа внешней обработкой (здесь имеется ввиду код, а не объект).<br>
В начале все тривиально. В объекте метаданных типа "документ" создаем команду. В ее свойствах определяем группу "Командная панель формы.Важное" - это позволит не менять саму форму, команда на форме будет видна как кнопка на командной панели. Обязательно ставим флажок "Изменяет данные" - помним, мы собираемся менять данные объекта (не формы!). После выполнения процедура "ОбработкаКоманды" форма автоматически перечитает данные.<br>
+
В начале все тривиально. В объекте метаданных типа "документ" создаем команду. В ее свойствах определяем группу "Командная панель формы.Важное" - это позволит не менять саму форму, команда на форме будет видна как кнопка на командной панели. После выполнения процедуры "ОбработкаКоманды" форма автоматически перечитает данные.<br>
 
Далее пишем собственно процедуру:
 
Далее пишем собственно процедуру:
  
Строка 28: Строка 28:
 
Идем по порядку:
 
Идем по порядку:
 
# мы вызвали процедуру "ОбработкаКоманды" нажав на кнопку,
 
# мы вызвали процедуру "ОбработкаКоманды" нажав на кнопку,
# процедура открыла форму выбора диалога ''и ждет когда мы выберем период'',
+
# процедура открыла форму выбора диалога '''и ждет когда мы выберем период'''
 
# процедура "ОбработкаКоманды" завершилась,
 
# процедура "ОбработкаКоманды" завершилась,
 
# форма перечитала данные, '''но мы то еще период не выбрали, и процедура обработки данных не выполнялась!'''
 
# форма перечитала данные, '''но мы то еще период не выбрали, и процедура обработки данных не выполнялась!'''
  
Здесь нам на помощь приходит параметр "ПараметрыВыполненияКоманды" - это структура, один из значений которой ("Источник") как раз ссылка на форму из которой вызвана команда. Наш код можно модифицировать следующим образом:
+
Здесь нам на помощь приходит параметр "ПараметрыВыполненияКоманды" - это структура, один из значений которой ("Источник") как раз ссылка на форму из которой вызвана команда. Наш код можно модифицировать следующим образом (изменения выделены жирным):
  
 
   &НаКлиенте
 
   &НаКлиенте
Строка 38: Строка 38:
 
     Если НЕ Период = Неопределено Тогда
 
     Если НЕ Период = Неопределено Тогда
 
       //Здесь тот самый код, который что-то делает.
 
       //Здесь тот самый код, который что-то делает.
       '''ДопПараметры.Форма.Прочитать();'''
+
       '''ДополнительныеПараметры.Форма.Прочитать();'''
 
     КонецЕсли;
 
     КонецЕсли;
 
   КонецПроцедуры
 
   КонецПроцедуры
Строка 44: Строка 44:
 
   &НаКлиенте
 
   &НаКлиенте
 
   Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
 
   Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
     ДопПараметры = Новый Структура("Форма", ПараметрыВыполненияКоманды.Источник);
+
     '''ДопПараметры = Новый Структура("Форма", ПараметрыВыполненияКоманды.Источник);'''
     Оповещение = Новый ОписаниеОповещения("ПериодВыбран", ЭтотОбъект, ДопПараметры);
+
     Оповещение = Новый ОписаниеОповещения("ПериодВыбран", ЭтотОбъект''', ДопПараметры''');
 
     Период = Новый ДиалогРедактированияСтандартногоПериода();
 
     Период = Новый ДиалогРедактированияСтандартногоПериода();
 
     Период.Период.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;
 
     Период.Период.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;
 
     Период.Показать(Оповещение);
 
     Период.Показать(Оповещение);
 
   КонецПроцедуры
 
   КонецПроцедуры

Текущая версия на 13:58, 11 июня 2024

Иногда требуется произвести изменения данных документа какой либо обработкой, но из самой формы документа. В качестве примера можно использовать заполнение табличной части документа внешней обработкой (здесь имеется ввиду код, а не объект).
В начале все тривиально. В объекте метаданных типа "документ" создаем команду. В ее свойствах определяем группу "Командная панель формы.Важное" - это позволит не менять саму форму, команда на форме будет видна как кнопка на командной панели. После выполнения процедуры "ОбработкаКоманды" форма автоматически перечитает данные.
Далее пишем собственно процедуру:

 &НаКлиенте
 Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
   //Здесь у нас кактой-то код. Скорее всего вызов серверной процедуры из общего модуля.
 КонецПроцедуры

Все просто! Но ситуация заметно усложняется если в процедуре "ОбработкаКоманды" мы захотим, например, выбрать период. Пишем код:

 &НаКлиенте
 Процедура ПериодВыбран(Период, ДополнительныеПараметры) Экспорт
   Если НЕ Период = Неопределено Тогда
     //Здесь тот самый код, который что-то делает.
   КонецЕсли;
 КонецПроцедуры
 &НаКлиенте
 Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
   Оповещение = Новый ОписаниеОповещения("ПериодВыбран", ЭтотОбъект);
   Период = Новый ДиалогРедактированияСтандартногоПериода();
   Период.Период.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;
   Период.Показать(Оповещение);
 КонецПроцедуры

И да! Форма не обновляется! О нежно любимый асинхронный режим!
Идем по порядку:

  1. мы вызвали процедуру "ОбработкаКоманды" нажав на кнопку,
  2. процедура открыла форму выбора диалога и ждет когда мы выберем период
  3. процедура "ОбработкаКоманды" завершилась,
  4. форма перечитала данные, но мы то еще период не выбрали, и процедура обработки данных не выполнялась!

Здесь нам на помощь приходит параметр "ПараметрыВыполненияКоманды" - это структура, один из значений которой ("Источник") как раз ссылка на форму из которой вызвана команда. Наш код можно модифицировать следующим образом (изменения выделены жирным):

 &НаКлиенте
 Процедура ПериодВыбран(Период, ДополнительныеПараметры) Экспорт
   Если НЕ Период = Неопределено Тогда
     //Здесь тот самый код, который что-то делает.
     ДополнительныеПараметры.Форма.Прочитать();
   КонецЕсли;
 КонецПроцедуры
 &НаКлиенте
 Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
   ДопПараметры = Новый Структура("Форма", ПараметрыВыполненияКоманды.Источник);
   Оповещение = Новый ОписаниеОповещения("ПериодВыбран", ЭтотОбъект, ДопПараметры);
   Период = Новый ДиалогРедактированияСтандартногоПериода();
   Период.Период.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;
   Период.Показать(Оповещение);
 КонецПроцедуры