Имя: Пароль:
1C
 
Организация прикрепленного окна
0 YauheniL
 
13.08.08
18:33
Пытаюсь написать обработку, которая выполняет 2 функции:
а) является отчетом (без печ. формы)
б) является обработкой подбора.

С первой задачей я все-таки справился. А вот, со второй пока не смог. Проблема вот в чем: хочется при открытии обработки в качестве обработки подбора сделать так, чтобы она вела себя так как обработка подбора: был а прикрепленной к правой части рабочего стола. У меня получается, что она появляется где-то правее родительского окна, но имеет свободное положение.

И, еще одно, это окно может быть открыто неограниченное количество раз. Как это можно побороть.

Прилагаю код:

Если ЗначениеНеЗаполнено(КлючУникальности) Тогда
       КлючУникальности = Новый УникальныйИдентификатор;
       
   КонецЕсли;
   
   ФормаПодбораИмпорт = ОбработкаПодбораИмпорт.ПолучитьФорму("ФормаПодбора", ЭтаФорма, КлючУникальности);
   Если Не ФормаПодбораИмпорт.Открыта() Тогда
       
       ФормаПодбораИмпорт.ПоложениеОкна = ВариантПоложенияОкна.НеПерекрыватьВладельца;
       
       ФормаПодбораИмпорт.РазрешитьСоединятьОкно = Истина;
       ФормаПодбораИмпорт.СоединяемоеОкно = Истина;
       
       //ФормаПодбораИмпорт.РазрешитьСостояниеОбычное = Ложь;
       ФормаПодбораИмпорт.РазрешитьСостояниеПрячущееся = Ложь;
       ФормаПодбораИмпорт.РазрешитьСостояниеСвободное  = Ложь;
       
       ФормаПодбораИмпорт.РазрешитьСостояниеПрикрепленное = Истина;
       ФормаПодбораИмпорт.СостояниеОкна = ВариантСостоянияОкна.Прикрепленное;
       ФормаПодбораИмпорт.ПоложениеПрикрепленногоОкна = ВариантПрикрепленияОкна.Право;
       
       ФормаПодбораИмпорт.Открыть();
       
   КонецЕсли;
1 kosts
 
14.08.08
07:02
Что бы было прикрепленным смотри свойства Формы
Состояние окна - Прикрепленное
Положение прикрепленного окна - Право
Изменять способ отображения окна - Запретить

Так вроде.

Если окно создается каждый раз новое
Может быть КлючУникальности создается каждый раз новый?
А может быть хранить ФормаПодбораИмпорт, и не создавать формукаждый раз?
2 YauheniL
 
14.08.08
10:10
(1) Ключ уникальности создается только единожды (при самом первом вызове: параметр КлючУникальности = Неопределено; соответственно, он переопределяется один раз и все. Проверял в отладчике)...
3 kosts
 
14.08.08
10:33
Попробуй вместо "КлючУникальности" использовать "ЕщеКлючУникальности"
4 kosts
 
14.08.08
10:35
Покажи ЗначениеНеЗаполнено()
5 kosts
 
14.08.08
10:49
При таком выводе оно прикрепленное справа

Если Не ФормаПодбораИмпорт.Открыта() Тогда
       
       ФормаПодбораИмпорт.РазрешитьСостояниеПрикрепленное = Истина;    
       ФормаПодбораИмпорт.РазрешитьСоединятьОкно = Истина;
       ФормаПодбораИмпорт.СоединяемоеОкно = Истина;
       ФормаПодбораИмпорт.СостояниеОкна = ВариантСостоянияОкна.Прикрепленное;
       
       ФормаПодбораИмпорт.РазрешитьСостояниеОбычное = Ложь;
       
       ФормаПодбораИмпорт.ПоложениеПрикрепленногоОкна = ВариантПрикрепленияОкна.Право;
       ФормаПодбораИмпорт.ИзменятьСпособОтображенияОкна = ИзменениеСпособаОтображенияОкна.Запретить;
       
       ФормаПодбораИмпорт.Открыть();
       
   КонецЕсли;
6 YauheniL
 
14.08.08
10:53
(3) Для открытия использовал вот такую штуку:

Если мЮИ_КлючУникальности = Неопределено Тогда
   //КлючУникальности = Ссылка.УникальныйИдентификатор();
   мЮИ_КлючУникальности = Ссылка.УникальныйИдентификатор();
       
КонецЕсли;
   
ФормаПодбораИмпорт = ОбработкаПодбораИмпорт.ПолучитьФорму("ФормаПодбора", ЭтаФорма, мЮИ_КлючУникальности);

(4) Ниже:

Функция ЗначениеНеЗаполнено(Значение) Экспорт

   Результат   = Ложь;
   ТипЗначения = ТипЗнч(Значение);

   // Сначала примитивные типы
   Если Значение = Неопределено Тогда
       Результат = Истина;

   ИначеЕсли Значение = NULL Тогда
       Результат = Истина;

   ИначеЕсли ТипЗначения = Тип("Строка") Тогда
       Если СокрЛП(Значение) = "" Тогда
           Результат = Истина;
       КонецЕсли;

   ИначеЕсли ТипЗначения = Тип("Число") Тогда
       Если Значение = 0 Тогда
           Результат = Истина;
       КонецЕсли;

   ИначеЕсли ТипЗначения = Тип("Дата") Тогда
       Если Значение = Дата('00010101') Тогда
           Результат = Истина;
       КонецЕсли;

   ИначеЕсли ТипЗначения = Тип("Булево") Тогда
       Результат = Ложь; // Булево будем считать не пустым

       //Отдельное определение, так как конструкторов данного типа не существует    
   ИначеЕсли ТипЗначения = Тип("РежимПроведенияДокумента") Тогда

       Если Значение = РежимПроведенияДокумента.Неоперативный или Значение = РежимПроведенияДокумента.Оперативный тогда
           Результат = Ложь;
       КонецЕсли;

       // Для остальных будем считать значение пустым, если оно равно
       // дефолтному значению своего типа

   Иначе

       Если Значение = Новый(ТипЗначения) Тогда
           Результат = Истина;
       КонецЕсли;

   КонецЕсли;

   Возврат Результат;

КонецФункции // ЗначениеНеЗаполнено()
7 YauheniL
 
14.08.08
11:31
В общем, разрешил я обе проблемы. Прилагаю код:

Перем мЮИ_ФормаПодбораИмпорт;

...
...
...

ОбработкаПодбораИмпорт = Обработки.ЮИ_ПодборИмпортныхТоваров.Создать();
   ОбработкаПодбораИмпорт.СтруктураПараметров = СтруктураПараметров;
       
   Если мЮИ_ФормаПодбораИмпорт = Неопределено Тогда
       мЮИ_ФормаПодбораИмпорт = ОбработкаПодбораИмпорт.ПолучитьФорму("ФормаПодбора", ЭтаФорма, Ссылка.УникальныйИдентификатор() );
       
   КонецЕсли;
   
   Если (ТипЗнч(мЮИ_ФормаПодбораИмпорт) = Тип("Форма")) И (Не мЮИ_ФормаПодбораИмпорт.Открыта()) Тогда
       мЮИ_ФормаПодбораИмпорт.ИзменятьСпособОтображенияОкна = ИзменениеСпособаОтображенияОкна.Разрешить;
       мЮИ_ФормаПодбораИмпорт.ПоложениеОкна = ВариантПоложенияОкна.НеПерекрыватьВладельца;
       мЮИ_ФормаПодбораИмпорт.РазрешитьСоединятьОкно = Истина;
       мЮИ_ФормаПодбораИмпорт.СоединяемоеОкно = Истина;
       мЮИ_ФормаПодбораИмпорт.РазрешитьСостояниеПрячущееся = Ложь;
       мЮИ_ФормаПодбораИмпорт.РазрешитьСостояниеСвободное  = Ложь;
       мЮИ_ФормаПодбораИмпорт.РазрешитьСостояниеПрикрепленное = Истина;
       мЮИ_ФормаПодбораИмпорт.СостояниеОкна = ВариантСостоянияОкна.Прикрепленное;
       мЮИ_ФормаПодбораИмпорт.ПоложениеПрикрепленногоОкна = ВариантПрикрепленияОкна.Право;
       мЮИ_ФормаПодбораИмпорт.Обновить();
       мЮИ_ФормаПодбораИмпорт.Открыть();
       
   КонецЕсли;
8 YauheniL
 
14.08.08
11:32
В этом случае можно обойтись и без ключа уникальности: форма постоянно храниться в глобальной переменной формы. Не очень понятно, зачем, в таком случае, этот параметр нужен вообще...

Тему можно считать закрытой.
9 YauheniL
 
14.08.08
16:21
В общем, переоткрываю тему по следующему поводу: форма подбора самопроизвольно закрывается. Подскажите, при что я снова забыл?

При выборе строки выполняется обработчик:
Процедура ОстаткиИмпортныхТоваровВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
   
   // Действие верно только для режима подбора
   Если ВладелецФормы = Неопределено Тогда
       Возврат;
       
   КонецЕсли;
   
   ТекСтрокаДереваЗначений = ЭлементыФормы.ОстаткиИмпортныхТоваров.ТекущиеДанные;
   Если ТекСтрокаДереваЗначений.Строки.Количество() = 0 Тогда
       // подготовим структуру подбора для заполнения
       РезультатПодбора = Новый Структура("Организация, Номенклатура, СтранаПроисхождения, ПартияПоступления, НомерГТД, ПаспортСделки, СМР, Инвойс, ТранспортныйИнвойс, Валюта, КоличествоОстаток, ЦенаРублевая, ЦенаВалютная");
       
       Если ЗапрашиватьКоличество Тогда
           // Если количество запрашивается, тогда запросим количество у пользователя
           ИскомоеКоличество = 0;
           ЧислоВведено = Ложь;
           Пока (Не ВвестиЧисло(ИскомоеКоличество, "Введите необходимое количество", 15, 0) ) ИЛИ (ИскомоеКоличество = 0) Цикл
           КонецЦикла;
           
           ЗаполнитьЗначенияСвойств(РезультатПодбора, ТекСтрокаДереваЗначений, ,"КоличествоОстаток");
           РезультатПодбора.Вставить("КоличествоОстаток", ИскомоеКоличество);
           
       Иначе
           // В противном случае, подставим все, что есть
           ЗаполнитьЗначенияСвойств(РезультатПодбора, ТекСтрокаДереваЗначений);
           
       КонецЕсли;
       РезультатПодбора.Вставить("ЮИ_ЭтоПодборИмпортныхТоваров", Истина);
       ОповеститьОВыборе(РезультатПодбора);
       
   КонецЕсли;
   
КонецПроцедуры

В документе-приемнике выполняется вот такой код:

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

   // Рассчитываем реквизиты табличной части.
   РассчитатьСуммуТабЧасти(НоваяСтрокаТовары, ЭтотОбъект);
   РассчитатьСуммуНДСТабЧасти(НоваяСтрокаТовары, ЭтотОбъект);

   ЗаполнитьСчетаУчетаВСтрокеТабЧастиРегл(НоваяСтрокаТовары, "Оборудование", Истина, ОтражатьВНалоговомУчете);
   
КонецПроцедуры