среда, 31 октября 2018 г.

Преобразование прикладных объектов (СправочникСсылка, ДокументОбъект) в данные управляемой формы (ДанныеФормыСтруктура, ДанныеФормыКоллекция) и наоборот (Толстый клиент, тонкий клиент)

Назначение: в управляемой форме в качестве реквизитов могут быть следующие типы: примитивные (дата, число, строка, булево) и ссылки (СправочникСсылка.Контрагенты, ДокументСсылка.ЗаказПокупателя и т.д.).
Прикладные объекты (СправочникОбъект, ДокументОбъект и т.д.) храниться в управляемой форме не могут. Поэтому для управляемых форм созданы аналогичные специальные типы значений (ДанныеФормыСтруктура, ДанныеФормыКоллекция и т.д). На форме эти типы обозначаются в скобках, причем в скобках указываются не сами типы, а соответствующие им прикладные объекты:



В работе часто требуется преобразовать такие типы значений управляемой формы в прикладной объект и наоборот. Для этого созданы специальные операторы (показаны ниже в коде). Важно, что:
- с их помощью можно преобразовывать только «специальные» типы значений (ДанныеФормыСтруктура, ДанныеФормыКоллекция и т.д). Для ссылок и примитивных типов преобразование не требуется;
- по синтакс-помощнику нужно смотреть, где эти операторы доступны (какие на клиенте, какие на сервере).
Источник: 
Номенклатура объектов: модуль формы объекта (справочника, документа и т.д).


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


Проверка, что документ уже проведен (Толстый клиент, тонкий клиент)

Назначение: чтобы при повторном проведении не повторялось то, что не должно повторяться.
Источник:
Номенклатура объектов: модуль объекта документа.

Перем флПроведен Экспорт;
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
 флПроведен = Проведен;
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
 Если Не Отказ И Не флПроведен Тогда
    ... // вносим то, что должно произойти при первом проведении
 КонецЕсли;
КонецПроцедуры


Сортировка по измерению или ресурсу в регистре сведений (Толстый клиент).

Назначение: возможность сортировки по измерению в форме списка в регистре сведений. В управляемых формах такая возможность присутствует автоматически, код нужен для обычных форм.

Процедура ПриОткрытии()
   // пример:
//ЭлементыФормы.РаботникиОрганизации.НастройкаПорядка.ПодразделениеОрганизации.Доступность = Истина;
ЭлементыФормы.[ИмяРегистраСведений].НастройкаПорядка.[Измерение].Доступность = Истина;
КонецПроцедуры

Создание в управляемой форме реквизита с типом динамический список с отбором по владельцу формы (Толстый клиент, тонкий клиент)


Назначение: создание на управляемой форме динамического списка с отбором по владельцу формы.
Номенклатура объектов: документ «Электронное письмо», реквизит «Вложения письма» (динамический список). В этот реквизит должны входить все вложения, относящиеся к данному электронному письму.
Разработка на форме:
1.Добавляем реквизит «ВложенияПисьма».




2.Свойства реквизита «ВложенияПисьма» заполняем как на рисунке



3.Нажимаем на «Настройка списка Открыть» из рис. 2 и на вкладке «Запрос» вводим код:
//-----------------------------------
ВЫБРАТЬ
ВложенияЭлектронныхПисем.Наименование,
ВложенияЭлектронныхПисем.ИмяФайла
ИЗ
Справочник.ВложенияЭлектронныхПисем КАК ВложенияЭлектронныхПисем
ГДЕ
ВложенияЭлектронныхПисем.ПометкаУдаления = ЛОЖЬ
И ВложенияЭлектронныхПисем.Объект = &Объект
//-----------------------------------

4.Перетаскиваем реквизит «ВложенияПисьма» на форму, так чтобы появилась вкладка, как на рисунке.



5.Чтобы подставить значение параметра "Объект" (который в запросе), делаем следующее: у Формы создаем событие "ПриСозданииНаСервере" (как на рисунке), в отладчике заходим в "параметры" (пкм - вычислить выражение - в поле пишем "параметры"), там находим ссылку на владельца формы (например, "СсылкаНаОбъект = Параметры.Ключ;"), далее присваиваем владельца параметру в запросе.






// код в модуле формы
//-----------------------------------
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 СсылкаНаОбъект = Параметры.Ключ;
ВложенияПисьма.Параметры.УстановитьЗначениеПараметра("Объект",СсылкаНаОбъект);
КонецПроцедуры
//-----------------------------------

Создание документа на основании другого документа (Толстый клиент, тонкий клиент)

Назначение: создание документа на основании другого документа.
Номенклатура объектов: документ «Корректировка долга» вводится на основании «Возврат товаров от покупателя».
Разработка на форме:
1.
 
2.Если использовать Конструктор ввода на основании, то процедура «обработка заполнения» будет замещена. Чтобы этого не произошло, изменения в процедуру «обработка заполнения» нужно добавить вручную.

3.


Процедура ОбработкаЗаполнения(Основание)
Если ТипЗнч(Основание) = Тип("ДокументСсылка.ВозвратТоваровОтПокупателя") Тогда
   Организация = Основание.Организация;
   КонтрагентДебитор = Основание.Контрагент;
   КонтрагентКредитор = Основание.Контрагент;
   ОснованиеОбъект = Основание.ПолучитьОбъект();
   ТЗ = ОснованиеОбъект.Товары;
   ТЗ.Свернуть("ДокументПартии,ИРВ_Проект","Сумма");
   Для Каждого Стр из ТЗ Цикл
      нСтр = СуммыДолга.Добавить();
 нСтр.ВидЗадолженности = Перечисления.ВидыЗадолженности.Дебиторская;
 нСтр.ДоговорКонтрагента = Основание.ДоговорКонтрагента;
 нСтр.Сделка = Основание.Сделка;
 нСтр.ДокументРасчетовСКонтрагентом = Стр.ДокументПартии;
 нСтр.Сумма = Стр.Сумма;
 нСтр.СуммаРегл = Стр.Сумма;
 нСтр.КурсВзаиморасчетов = 1;
 нСтр.ИРВ_Проект = Стр.ИРВ_Проект; 
 ИРВ_ЗаполнитьСчетаУчетаВСтроке(нСтр, Истина);//Добавил чтобы Заполнялись счета 
 Нстр2 = СуммыДолга.Добавить();
 Нстр2.ВидЗадолженности = Перечисления.ВидыЗадолженности.Кредиторская;
 Нстр2.ДоговорКонтрагента = Основание.ДоговорКонтрагента;
 Нстр2.Сделка = Основание.Сделка;
 Нстр2.ДокументРасчетовСКонтрагентом = Основание;
 Нстр2.Сумма = Стр.Сумма;
 Нстр2.СуммаРегл = Стр.Сумма;
 Нстр2.КурсВзаиморасчетов = 1;
 Нстр2.ИРВ_Проект = Стр.ИРВ_Проект; 
 ИРВ_ЗаполнитьСчетаУчетаВСтроке(Нстр2, Истина);//Добавил чтобы Заполнялись счета    
   КонецЦикла;
КонецЕсли;
 
КонецПроцедуры 



Пояснения:
Если требуется программно поймать момент, когда создается новый документ на основании (например, чтобы в этот момент вывести какое-нибудь сообщение), то этот момент отслеживается в процедуре «обработка заполнения» создаваемого на основании документа.

Программный вызов ВНЕШНЕГО отчета (обработки) из обычной формы (Толстый клиент)

Назначение: программный вызов внешнего отчета или обработки из обычной формы. ВНИМАНИЕ: Получение управляемой формы внешней обработки/отчета для обычного режима работы приложения не поддерживается.
Номенклатура объектов:  обычная форма документа «Заказ покупателя», внешний отчет «Журнал уведомлений».
Разработка на форме:
1.На обычной форме документа «Заказ покупателя» создаем кнопку «Журнал уведомлений».


2.В свойствах кнопки в разделе «Основные» создаем действие «ДействияФормыоЖурналУведомлений".


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


Программный вызов ВНЕШНЕГО отчета (обработки) из управляемой формы (Тонкий клиент)

Назначение: программный вызов внешнего отчета или обработки из управляемой формы. ВНИМАНИЕ: Получение управляемой формы внешней обработки/отчета для обычного режима работы приложения не поддерживается.
Номенклатура объектов:  управляемая форма документа оЗаявкаНаЛогистику, внешний отчет «Журнал уведомлений».
Разработка на форме:
1.На управляемой форме документа «оЗаявкаНаЛогистику» создаем команду (кнопку) «Журнал уведомлений».


2.В свойствах команды в разделе «Основные» создаем действие «Журнал уведомлений"


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

&НаСервере
Функция ЖурналУведомленийНаСервере()
   ОтчетЖурналУведомлений = Справочники.ВнешниеОбработки.НайтиПоКоду("000000247");
   ДвоичныеДанные = ОтчетЖурналУведомлений.ХранилищеВнешнейОбработки.Получить();
   АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
   ИмяФайла = ВнешниеОтчеты.Подключить(АдресВХранилище,,Ложь);
   Возврат ИмяФайла;
КонецФункции