Имя: Пароль:
1C
 
Как работать с табличной частью открытой программно формы?
Ø (gr13 29.03.2004 11:20)
0 Мученик
 
25.03.04
12:15
Совсем замучился: нужно из документа Док1 открыть Док2 и программно создать строки в табличной части Док2. Форма.Док2 имеет две закладки и слои.
Делаю так:
    Конт=0;
    ОткрытьФорму("Документ.Док2",Конт,);
    Если ТипЗначения(Конт)=100 Тогда
        Конт.ДатаДок=ДатаДок;
        Конт.Фирма=Фирма;
        Конт.Контрагент=Контрагент;
        Конт.Проект=Проект;
        Конт.Форма.Закладки.ТекущаяСтрока(2);
        Конт.Форма.ИспользоватьСлой("Шапка,ТабличнаяЧасть,Подвал");
        Конт.НоваяСтрока();
        Конт.Содержание="Текст";
        Конт.Форма.Обновить(1);
    КонецЕсли;
Все получается, кроме создания строки и присвоения значений атрибутам сторки - не работает метод НоваяСтрока(); ПОСОВЕТУЙТЕ, ЧТО ДЕЛАТЬ????
1 dvk
 
25.03.04
12:20
Попробуй
Док1.ВыгрузитьТабличнуюЧасть(ТаблЗнач);
ЗагрузитьТабличнуюЧасть(ТаблЗнач);
2 GrayT
 
25.03.04
12:21
Или ПолучитьСтрокуПоНомеру()
3 Рупор абсурда
 
25.03.04
12:54
Док = СоздатьОбъект("Документ.Док2");
Док.Новый();
Док.ДатаДок=ДатаДок;
...
Док.Записать();
ОткрытьФорму(Док,Конт);
4 327
 
25.03.04
12:59
(3) Некрасиво ....
5 Рупор абсурда
 
25.03.04
13:04
(4) Красиво ...
6 It is me
 
25.03.04
13:14
Рабби, что хорошего в обрезании?
Во-первых, это красиво...
7 Мученик
 
25.03.04
13:21
В том-то и дело, что в Док1 нет табличной части, поэтому не могу
  Док1.ВыгрузитьТабличнуюЧасть(ТаблЗнач);
  ЗагрузитьТабличнуюЧасть(ТаблЗнач);

и не нужно мне записывать док2 - это должен решить юзер в диалоге!
сейчас попробую через ТЗ
8 Рупор абсурда
 
25.03.04
13:27
(7) Штатными средствами пока этого никто сделать не смог ...
9 327
 
25.03.04
14:25
(7) Легко делается.... Причем штатными средствами .... И с табличной частью.... и без табличной части .... И юзер решает, что делать с этим доком ....
10 327
 
25.03.04
14:25
тьфу.... (9) - это к (8)
11 Рупор абсурда
 
25.03.04
14:27
(9) Гон!
12 Кое-кто@где-то.там
 
25.03.04
14:38
Присоединяюсь к 11.
Уточню: никто, средствами языка, не смог открытьформу незаписанного документа (созданного ч/з СоздатьОбъект) или заполнить табличную часть открытой формы незаписанного документа ...
13 327
 
25.03.04
14:43
Хи-Хи.....
Вся задача (0) решается через  ОткрытьФорму.......

с параметрами.... И небольшим дописыванием
либо ПриОткрытии
либо ВоодНаосновании... смотря что нравится.....


лично мне нравится Ввод На основаниии
14 Кое-кто@где-то.там
 
25.03.04
14:44
Забыл добавить:
"... не изменяя модуля формы самого документа"
15 327
 
25.03.04
14:51
(12)
"заполнить табличную часть открытой формы незаписанного документа ... " --- ласково его надо ..... ласково ... за вымя...

Он же только родился... а ты его грязными руками....

Будь проще .... и документ к тебе потянется ....
16 327
 
25.03.04
14:52
(14) ....
"... не изменяя модуля формы самого документа"

Вроде и это через шаблон раскручивал кто то.... но мне шаблон не нравится.... так что не подскажу как... но решение было ....
17 Кое-кто@где-то.там
 
25.03.04
14:53
(15) представил описанную картину. содрогнулся ... :)
18 327
 
25.03.04
14:56
А коньяк то пьшь? .... так вот знай - его гонят из коровы ....
19 Рупор абсурда
 
25.03.04
14:58
Я понял ..., pit сегодня чем-то возбуждён ...
20 gr13
 
25.03.04
15:09
послушайте а нельзя так:
Док1 = создатьОбъект("Документы.НекийДокумент1");
Док1.Новый();
....

//присваиваем нужные атрибуты шапки

....
ТаблицаЗаказа.ВыбратьСтроки();
Пока ТаблицаЗаказа.ПолучитьСтроку() = 1 Цикл
Док1.НоваяСтрока();
Док1.Артикул = ТаблицаЗаказа.Товар.Артикул;
Док1.Товар = ТаблицаЗаказа.Товар;
Док1.Единица = ТаблицаЗаказа.Товар.ЕдиницаПоУмолчанию;
Док1.Количество = ТаблицаЗаказа.Кол;
Док1.Коэффициент = 1;
Док1.Цена = ТаблицаЗаказа.Цена;
Док1.Сумма = ТаблицаЗаказа.Сумма;
КонецЦикла;
Док1.Записать();

соответственно последнюю строку можно сделать через попрос пользователю
21 Рупор абсурда
 
25.03.04
15:12
(20) Смело! ... Глупо, но смело! ...
22 327
 
25.03.04
15:25
Да напишу я последовательность действий для (0)

Попозже..... сейчас курицу жарить надо... кусать хоцетеся ....
23 gr13
 
25.03.04
15:27
(21) Рупор, я понимаю, что не большой спец по программированию в 1с, мне интересно в таком случае как это сделать не глупо? данный алгоритм у меня уже работает.А как по другому, более просто- пока не знаю.
24 Рупор абсурда
 
25.03.04
15:29
(23) Не обижайся ...
25 gr13
 
25.03.04
15:31
(24) я не обижаюсь- на обиженных воду возят, мне интересно КАК?
26 Рупор абсурда
 
25.03.04
15:34
(25) Когда никто не знает ответа на вопрос, очень уместным будет, задать его Рупору ...
27 Рупор абсурда
 
25.03.04
15:35
(26)+ Ты (8) видел?
28 gr13
 
25.03.04
15:35
(26) а что Рупор тоже не знает?...
29 gr13
 
25.03.04
15:36
(27) видел, но 327 говорил, что можно вот и интересно, да и почему глупо то что я написал? Неужели надо делать как-то по другому?
30 Рупор абсурда
 
25.03.04
15:36
(28) Невероятно, правда?
31 Рупор абсурда
 
25.03.04
15:38
(29) 327 любит растопыренными пальцами покрутить ...
И это у него хорошо получается ...
32 gr13
 
25.03.04
15:38
(30) все мы люди...
33 gr13
 
25.03.04
15:39
(31) но ты написал, что глупо почему? как это сделать по другому мне действительно интересно
34 Дмитрий
 
25.03.04
15:46
(23) Твой пример правильный. Только здесь немножко не о том. (Это на правах апа, чтобы Некоторые после курицы не забыли об обещанном :)
35 Рупор абсурда
 
25.03.04
15:47
(33) Глупо, потому, что это вовсе не ответ на вопрос ...
А смело, потому, что я то тут и молчание не входит в список моих привычек ... :))
36 gr13
 
25.03.04
15:49
(35) спасибо, улыбнулся хоть, но во всяком случае хотел как лучше, а получилось как всегда
37 Рупор абсурда
 
25.03.04
16:03
(36) Если ты сможешь сделать сабж, я первый скажу, что ты монстр! ...
Никто ещё этого не сделал, равно как никто и не доказал, что сделать этого невозможно ...
38 Мученик
 
25.03.04
16:30
Рупор, по-моему, совершенно прав. Без записи дока не удается работать с его табличной частью...Убедился. Поскольку задача стояла управлять формой (заполить реквизиты шапки и табл.) дока, но сам док не менять, то ПриОткрытии() и ВводНаОсновании() не хотелось бы модифицировать... Тем не менее, если 327 напишет последовательность действий - буду рад!
39 Рупор абсурда
 
25.03.04
16:33
(38) Я знаю 2 способа, как это можно сделать ...
Оба они внештатные ...
Один очень внештатный, но зато очень простой ...
Второй не очень внештатный, но зато очень извращённый ...
40 Мученик
 
25.03.04
16:39
Рупор, эти способы - очень секретные?
41 Рупор абсурда
 
25.03.04
16:41
(40) Нет, не секретные ... Обычные ...
42 Z1
 
25.03.04
16:45
(0) pit прав. Читай его внимательно и все получиться.
43 Мученик
 
25.03.04
16:46
Почему-бы не опубликовать?
44 Дмитрий
 
25.03.04
17:07
В принципе, если использовать ПриОткрытии, то можно заполнять табличную часть при помощи глобальных переменных. Одна из них флаг Заполнять/Не заполнять, другая таблица значений, из которой берутся данные табличной части.
45 327
 
25.03.04
17:11
Обработка

//*******************************************
Процедура Сформировать()  
   
   // делаем нужные дела по добыванию из базы
   // нужной инфы
   
   // затем формируем данные для передачи в документ
   
   
   сз=CreateObject(\"ValueList\");            
   тз = CreateObject(\"ValueTable\");        
   
   // загоняем в СЗ нужные значения реквизитов шапки
   
   СЗ.Set (\"ИмяПараметра\", ЗначениеПараметра);  
   СЗ.Set (\"Контрагент\", ВыбКонтрагент);
   .......
   остальные параметры
   
   // в ТЗ по результатам запроса или иных действий
   // формируем табличную часть будущего дока
   // то, что там нужно...
     
   
   // загоняем ТЗ в параметры            
   СЗ.Set (\"ТЗ\", ТЗ);
   
   // открываем новый документ
   // ОБРАТИТЬ ВНИМАНИЕ НА ПЕРВЫЙ ПАРАМЕТР
   // в ОткрытьФорму
   
   
   OpenForm(\"Document.РасходнаяНакладная\",СЗ);
   
   // закроем форму обработки
   Form.Close(0);
КонецПроцедуры                                      

=====================================================

в доке в предопределенной процедуре InputNew
пишем

if ValueTypeStr(Form.Parameter) =\"СписокЗначений\" then
   // достаем из СЗ все туда уложенное
   
   // т.е. параметры зависят от документа
   
   Контрагент=Form.Parameter.Get(\"Контрагент\");
   Договор   =Form.Parameter.Get(\"Документ\");
                             
   // достаем ТЗ
   ТЗ= Form.Parameter.Get(\"ТЗ\");

   // из полученной ТЗ - заполняем табл часть
   
   //-----------------------------------------
   for Индекс = 1 to ТЗ.LinesCnt() do
       ТЗ.GetLineByNumber(Индекс);    
       
       NewLine();
       ...............
       заполнение новой строки по ТЗ
       ...............
           
   endDo;  
   
   // завершающие действия -
   // по смыслу дока
   // т.е. многое можно взять из того, что делается
   // при интерактивном вводе...
   //-----------------------------------------  
else  
   // здесь - действия, которые отрабатываются при
   // интерактивном вводе нового дока
   
endIf;


Документ открыт и не записан... но заполнен
46 327
 
25.03.04
17:19
Хрня какая то.... Обратные косые я не писал ....

чой то не то скрипт творит.....
47 Рупор абсурда
 
25.03.04
17:20
(42) В чём он прав?
(43) А тебе какой больше нравится?
(45) Серёжка Осипов отдыхает!
48 327
 
25.03.04
17:22
да... можно как вариант попробовать воткнуться в процедуру глобальника, которая отрабатывает в при открытии.. (в бухии это глПроверкаРазрешенияРедактирования)

и попробовать сделать то, что в ПриОткрытии в ней ... тогда доки править не надо....

Но в любом случае надо менять (дописываать) конфу ...
49 Дмитрий
 
25.03.04
17:25
(45) Круто. Ничего не скажешь.
50 327
 
25.03.04
17:29
Как вариант - можно разделить действия на 2 пинка ...

Первым открыть форму нового дока
Вторым - заполнить форму нового дока...

Но зачем ненужный геморой ....
51 327
 
25.03.04
17:30
(49) - чего здесь крутого? Последовательное использование стандартных методов .... и процедур ....
52 Мученик
 
25.03.04
17:32
(45)327 - спасибо, попробую, я все мучился с управлением из открывающего дока, действительно можно передать все в открываемый и там обработать. Единственно, придется подправить модуль формы стандарного дока конфы, не хотел я его трогать...
(41)Рупор, все же, если знаешь изящный способ - не томи!
53 Рупор абсурда
 
25.03.04
17:34
(52) Их два, оба я знаю! Скажу больше, один из них мой! Тебе какой нравится?
54 Мученик
 
25.03.04
17:37
(53) На твой выбор: какой больше по душе
55 Дмитрий
 
25.03.04
17:39
(51) Ну, до такой последовательности пусть и стандартных методов и процедур еще додуматься надо. Только не думая, что я подлизываюсь ))
56 327
 
25.03.04
17:41
(53) Методика с RollBack.....  не очень нравится ....
57 Рупор абсурда
 
25.03.04
17:45
(54) Лучше не мой, мой сложный очень ...
Ладно, устал я тебя мучить ...
Колюсь :))
Есть компонента от АЛьФ'а FormEx называется
http://consult.legion.ru/alf/formex.shtml
Очень классная вещичка, рекомендую ...
Так вот: для решения твоей задачки её всего лишь загрузить надо ...
ЗагрузитьВнешнююКомпоненту()
После этого, все что не получалось, само собой получится ...
Это не шутка!
Всего одна строчка, и твой код из (0) заработает сам собой ...
58 Рупор абсурда
 
25.03.04
17:48
(56) "не очень нравится ...", это потому, наверно, что нерабочая она ...
Ты же не думаешь, что я буду нерабочий метод предлагать? ...
59 Композитор
 
25.03.04
17:49
(55) ... еще додуматься надо. Только не думая...
60 327
 
25.03.04
17:50
(58) Да работает она.... но иногда непонятки...

Альфовская компонента - хорошо... но я уже налетел на какой то версии винды.... падала одноЭсина....

P.S. ты еще TurboBl вспомни....
61 Рупор абсурда
 
25.03.04
17:51
А что 327 с подлизами делает? Подлизываться к нему, ващще, стоит или нет?
62 Рупор абсурда
 
25.03.04
17:53
(60) Да, Да ... Она работает ... Круто работает ... Пока юзер вдруг док записать не захочет ...
63 327
 
25.03.04
17:55
стОит  или стоИт ?
64 Мученик
 
25.03.04
17:57
(57) Спасибо, Рупор! А ты ее часто используешь?
Спасибо ака АЛьФ!!!
Буду ее пробовать уже завтра...
65 Дмитрий
 
25.03.04
17:57
(61) Он их в погребе закапывает, а потом лампу ультрафиолетовую от УПСа включает. Горит 40 минут.
66 Рупор абсурда
 
25.03.04
18:09
(64) Со всей ответственностью заявляю, я не АЛьФ!
(65) Тогда не буду подлизываться! Тем более, что обидел он меня когда-то очень-очень ...
67 Мученик
 
25.03.04
18:44
(66) Я просто поблагодарил АЛьФа отдельно
68 Рупор абсурда
 
25.03.04
19:00
(67) Меня там смутило "ака" ...
69 Рупор абсурда
 
25.03.04
19:01
(67) Хорошо, что ты не выбрал второй геморройный способ без использования ВК ...
70 Мученик
 
25.03.04
19:12
(69) А способ с ВК FormEx -  первый геморройный?
71 Рупор абсурда
 
25.03.04
19:55
(70) :))
72 Дмитрий
 
26.03.04
09:29
(56) Так? И почему не нравится? Зато не надо в модуль формы документа лезть. И всякие компоненты подключать
       НачатьТранзакцию();
       Док=СоздатьОбъект("Документ.<>");
       Док.Новый();
       Док.ДатаДок=РабочаяДата();
       Док.УстановитьНовыйНомер();
//Заполняем документ как угодно, например так...
       Док.НоваяСтрока();
       Док.НоваяСтрока();
       Док.Записать();                          
       Конт=0;  
       ОткрытьФорму(Док.ТекущийДокумент(),Конт);
       ОтменитьТранзакцию();
73 327
 
26.03.04
13:32
А если в документе юзерь нажмет кнопочку ОК..... то все так ХХХХХХХХХ .... мало не покажется ....

Без хитрого финта эта методика не работает ...
74 Рупор абсурда
 
26.03.04
13:39
(73) "Хитрый финт" отменяет запись, создаёт и записывает копию дока ... и подсовывает глупому юзеру уже его форму?
75 Дмитрий
 
26.03.04
15:01
(73) Возможно. счас попробую ОК нажать ))
76 Рупор абсурда
 
26.03.04
15:04
(75) Не на рабочей конфе только пробуй ...
77 Дмитрий
 
26.03.04
15:05
Да. Не пашет )) А так все классно было ))
78 327
 
26.03.04
17:48
(77) Обломался? А ведь можно..... Но геморойно ...
79 Рупор абсурда
 
26.03.04
17:58
(78) Опять звездишь? Без переделок в конфигурашке - нельзя!
80 Рупор абсурда
 
26.03.04
17:59
(79) Т.е. не так ..., не "нельзя", а нету такого решения пока ...
... и у тебя тоже ...
81 Рупор абсурда
 
26.03.04
18:02
(80)+ Штатный ввод на основании я не учитываю, как частный тривиальный случай ...
82 327
 
26.03.04
18:05
Даже подключение альфовской компоненты - уже переделка ....

Кстати, ты не пробовал TurboBl?  Весьма рекомендую.... Особенно нравится ее управление ....
83 Рупор абсурда
 
26.03.04
18:06
Ещё я знаю, как можно штатно заполнить одну строку в ТЧ ..., только одну ...
84 Рупор абсурда
 
26.03.04
18:06
(82) Почему переделка? Я могу подгрузить её из внешнего отчёта ...
85 327
 
26.03.04
18:28
Уговорил, уговорил...

Да, без переделки кода некоторые вещи сделать нельзя...
С переделкой - можно ....
Имеются в виду именно штатные возможности...

С формЭксом и дурак сумеет....
86 Рупор абсурда
 
26.03.04
18:32
(85) Хе ... :))
Я делал это и без ФормЭкса ...
87 327
 
26.03.04
18:44
БПр......
88 327
 
26.03.04
18:44
Но лучше ну ее ХХХХХХХ
89 Рупор абсурда
 
26.03.04
18:49
(87) Я не знаю (не понял), что это ...
Я делал с использованием скриптов (WSH), если если интересно, могу намылить ссылочку ...
90 327
 
26.03.04
19:27
Быстрая Продажа
91 327
 
26.03.04
19:28
А WSH - зависимость от среды исполнения.... Охота париться ?
92 Рупор абсурда
 
26.03.04
19:37
(91) Не, не охота ... Гемор ещё тот ...
Пусть уж лучше АЛьФ в таких случаях потрудится :))
93 skunk
 
27.03.04
01:39
(89)интересно... намыль...
(91)а под чем работает 1с, где нету wsh?
94 spock
 
27.03.04
12:39
А мне вот как-то захотелось сделать такую фишку:
В документе Инвентаризация сделать кнопку "Заполнить" - заполнение таб. части.
По нажатию этой кнопки должна открываться обработка (НЕ МОНОПОЛЬНО), в которой выполнялся множественный подбор ТМЦ в список на форме. Потом нажав кнопку выполнить, обработка делала запрос на остаток по подобранным товарам и переносила в документ.
Сначала бился в лоб....что зря.
Потом выяснилось, что делается элементарно.
Смысл:
Обработка сделав запрос, делала открытие того самого документа

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

А в документе дописываем предопределенную процедуру ПриПовторномОткрытии()

Процедура ПриПовторномОткрытии()
 Если ТипЗначенияСтр(глТаблицаДляПодбора) = "ТаблицаЗначений" Тогда
   Если глТаблицаДляПодбора.КоличествоСтрок() > 0 Тогда
     ЗагрузитьТабличнуюЧасть(глТаблицаДляПодбора); // загрузили в док. строки
     глТаблицаДляПодбора.УдалитьСтроки(); // очистили глоб. ТЗ, так пров. на                                              // кол. строк (см. выше)КонецПроцедуры

ВСЕ!!!
А теперь почему я использовал глоб. ТЗ?
Потому как мне нужен был контекст докуента в обработке, на случай, если документ закроют, пока открыта обработка. Иначе получается некрасивая ошибка, кто знает поймет :-)
95 GrayT
 
27.03.04
12:55
А что ОбработкойПодбора воспользоваться нельзя было? Или внешняя обработка ?
96 spock
 
27.03.04
13:01
Ну можно было весь справочник загнать в документ, потом по кнопке удалить товары с остатком = 0. Но хотелось изящного решения.
97 327
 
27.03.04
13:11
Накручено то....
Можно было воспользоваться либо формой списка в справочнике
Либо через подбор (форма списка или обработка в конфе)...
Либо затолкать запрос прямо в форму дока...
98 romix
 
27.03.04
13:16
Решения, как минимум, три:
1) Ввод на основании.
2) Записать текущий документ - создать новый - открыть форму нового.
3) ОткрытьФорму("Документ.ХХХХХ", Контекст); Контекст - это ключевое слово, см. книжки; этот способ позволяет не сохранять документы.
99 spock
 
27.03.04
13:22
2(pit)Ну вот нужна была мне конфетка :-)
Чета давно не ходишь на тяпницы...
100 327
 
27.03.04
13:23
Холодно
101 327
 
27.03.04
13:24
Ну ни себе.... на этом печальном форуме сотку словил ....
102 327
 
27.03.04
13:25
(98) а ты читать умеешь? Ну и прочитай внимательно сабж... Все высказано...
103 Дмитрий
 
27.03.04
18:32
(78) В принципе предполагаю как. Например специальный обработчик кнопки ОК. Но делать не буду, пока не припрет )
104 gr13
 
29.03.04
09:45
(0) Начни новую ветку. Насколько помню, основание для закрытия и переноса обсуждения в другую ветку:
1. Автор оставляет ссылку на новую ветку
2. В новой ветке есть ссылка на эту.

З.ы. посмотри сколько постов, по мойму лучше перенести обсуждение в другую ветку, где будет ссылка на эту и будет быстрее открываться
105 Мученик
 
29.03.04
10:49
(104) Помогите чайнику на вашем форуме! Не могу я закрыть ветку: открыл без регистрации, а теперь не могу зарегистрироваться с ником Мученик. Что делать?
106 Композитор
 
29.03.04
10:51
(105) Мучаться.
107 Мученик
 
29.03.04
10:55
(106)Ладно, пусть будет открыта ветка и растет до бесконечности...
108 Композитор
 
29.03.04
10:57
+(106) А может мучИться. :)
109 gr13
 
29.03.04
11:09
(105) я уже объяснил в 104
110 Мученик
 
29.03.04
11:19
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший