Имя: Пароль:
1C
1С v8
Программное открытие формы. Упр. формы.
0 unknown181538
 
25.03.13
06:04
"Умельцы" из 1С сделали, что документ "Установка цен" при вводе на основании поступления заполняется в процедуре ПриСозданииНаСервере();
Мне же нужно ввести обработкой установку цен на основании множества поступлений.
Получается, что мне нужно получить форму документа, как бы вводимого на основании, и выполнить запись в этой форме.
Пытаюсь получитьФорму на сервере, но не понятно, как передать туда в параметр документ основание.
Помогите советом.
1 Wobland
 
25.03.13
06:06
делать то, что в ПриСозданииНаСервере, без формы не предлагать?
2 Cube
 
25.03.13
06:41
(0) "заполняется в процедуре ПриСозданииНаСервере()" - сможешь сделать иначе создание документа, его заполнение и открытие его формы БЕЗ ЗАПИСИ В ИБ - получишь медаль...
3 el-gamberro
 
25.03.13
07:43
НЕльзя получать форму на сервере.
4 el-gamberro
 
25.03.13
07:44
(2) В 8.2 запросто
5 cw014
 
25.03.13
07:54
А чем тебе "обработкаЗаполнения" не нравится?
6 el-gamberro
 
25.03.13
07:56
(5) наверное код типовой менять не хочет
7 Cube
 
25.03.13
08:01
(4) До 8.2 УФ и не было. Ну, ежели "запросто", давай, блесни...
8 el-gamberro
 
25.03.13
08:11
(7) Пишешь что нужно в реквизиты формы и все.
9 Cube
 
25.03.13
08:30
(8) Ясно, теоретик... :)
10 DosBot
 
25.03.13
08:34
(0) подписка на событие "ОбработкаЗаполнения" и ОткрытьФорму(<ПутьКФорме>, СтруктураЗаполнения), где в структуре заполнения указывать ДокументОснование. не?
11 DosBot
 
25.03.13
08:42
+(10) при ОткрытьФорму процедура ОработкаЗаполнения как бы выполняется ;)
12 el-gamberro
 
25.03.13
08:56
(9) Сам ты теоретик по видимому.
Вот простой пример:

&НаСервереБезКонтекста
Функция ПолучитьСтруктуруСоответ()
   струк = Новый Структура("Важность",Перечисления.ВажностьЗаявки.Несрочно);
   Возврат струк;
КонецФункции

&НаКлиенте
Процедура СоздатьДок(Команда)
   ФормаДок = ПолучитьФорму("Документ.Заявка.ФормаОбъекта");
   струк = ПолучитьСтруктуруСоответ();
   ФормаДок.Открыть();
   ФормаДок.Объект.Важность = струк.Важность;
КонецПроцедуры
13 Cube
 
25.03.13
09:29
(12) Хм, что-то я протупил. Была какая-то загвоздка, точно помню....
14 unknown181538
 
26.03.13
05:04
(1) Очень там заморочено с вызовом кучи процедур и т.п...
(5) В ней нету заполнения - в 1с дятлы сидят.
(12) ПриСозданииНаСервере() ничего не заполнит, т.к. документОснование еще не заполнен... хотя если поменять руками строки... надо попробовать.
15 el-gamberro
 
26.03.13
05:22
(14) Надо задачу более расширенно посмотреть. Что требуется то в итоге? Получить форму документа заполненного, но без записи в БД? Или просто цены установить?
16 unknown181538
 
26.03.13
23:00
(15) По сути нужно просто заполнитьд документ на основании, но заполнение в этой гребаной ут не в ОбработкеЗаполнения происходит, а в ПриСозданииНаСервере().
И алгоритмы показались мне не простыми, т.к. типы цен разные. И возможно даже заполнение с помощью схемы компоновки...
17 unknown181538
 
26.03.13
23:11
(12) ПриСозданииНаСервере похоже вызывается при получении формы. Т.е. документ основание будто бы надо передать параметрами в ПолучитьФорму(). Но я не вижу такой возможности.
18 unknown181538
 
26.03.13
23:25
Дело еще хуже: сначала надо обработку заполнения вызвать, потом форму получить, да еще не сохранив документ до этого...
19 unknown181538
 
27.03.13
03:51
Короче добавил реквизит в форму, подправил ее, чтобы заполняла не только не записанные:


&НаСервере
Функция ПолучитьМассивДокументов()
   
   масс = новый Массив;

   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ПоступлениеТоваровУслуг.Ссылка,
       |    ПоступлениеТоваровУслуг.Дата,
       |    УстановкаЦенНоменклатуры.Ссылка КАК Ссылка1
       |ИЗ
       |    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
       |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.УстановкаЦенНоменклатуры КАК УстановкаЦенНоменклатуры
       |        ПО (УстановкаЦенНоменклатуры.ДокументОснование = ПоступлениеТоваровУслуг.Ссылка)
       |ГДЕ
       |    УстановкаЦенНоменклатуры.Ссылка ЕСТЬ NULL
       |    //И ПоступлениеТоваровУслуг.Дата >= &НачДата
       |    И ПоступлениеТоваровУслуг.Дата <= &КонДата";

   Запрос.УстановитьПараметр("КонДата", '20130101');
   Запрос.УстановитьПараметр("НачДата", '20130101');

   Результат = Запрос.Выполнить();

   Выборка = Результат.Выбрать();

   Пока Выборка.Следующий() Цикл
       //Масс.Добавить(Выборка.Ссылка);
       //Продолжить;
       Об = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
       Об.ДокументОснование = Выборка.Ссылка;
       Об.Заполнить(Выборка.Ссылка);
       Об.Дата = Выборка.Дата;
       Об.Записать();
       Масс.Добавить(Об.Ссылка);
   КонецЦикла;
   Возврат масс;
   
КонецФункции


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



Никому не советую идти этим путем.
20 el-gamberro
 
27.03.13
05:19
(16) если нужно создать документ, заполнить его, но не обязательно показывать пользователю, то нет смысла заморачиваться с получением формы, а значит и ПриСозданииНаСервере() и прочим
21 unknown181538
 
28.03.13
01:34
(20) т.е. нужно заморочиться с тем, чтобы переписать все заполнение?) Там одним простым циклом неотделаться.