Имя: Пароль:
1C
 
Как добавить строки в многострочную часть документа из другого документа?
0 Ars
 
31.05.04
11:46
Суть проблемы:
Есть документ, который при расчете формирует несколько других документов
на основе собственных вычислений, в том числе их табличную часть. Вот код:
ОткрытьФорму("Документ.НарядБригадный#qq", NewFrmHandle); //Открываем новую форму
NewFrmHandle.Приработок=Приработок; //Заполняем реквизиты шапки <---это работает
...
//Заполнение табличной части
for i=1 to grid_Бригада.КоличествоСтрок() do  //grid_Бригада - исходная таблица
 NewFrmHandle.НоваяСтрока(); <-----А ВОТ ЭТО УЖЕ НЕ РАБОТАЕТ
 NewFrmHandle.Сотрудник=grid_Бригада.ПолучитьЗначение(i, "Сотрудник");
endDo;

При выполнении метода НоваяСтрока() не происходит ровным счетом ничего.

Это происходит очевидно из-за того, что имена реквизитов шапки соответствуют их полям ввода,
поэтому проблемы с ними нет, НО КАК ДОБРАТЬСЯ ДО ТАБЛИЧНОЙ ЧАСТИ ДОКУМЕНТА если я знаю только
идентификатор формы (NewFrmHandle)
1 SnarkHunter
 
31.05.04
11:49
Документ сначала нужно записать, после этого доберешься...
2 spock
 
31.05.04
11:52
Даже если документ будет записан добавить новые строки через контекст не выйдет... таким способом.
3 Stan from Piter
 
31.05.04
11:52
Заполнить, записать, открыть ...
4 spock
 
31.05.04
11:54
5 Композитор
 
31.05.04
11:56
Пытаюсь придумать ситуацию, когда было бы необходимо программно работать с открытой формой документа.
6 Ars
 
31.05.04
12:05
>Заполнить, записать, открыть

Может возникнуть ситуация, что созданный таким образом документ будет не нужен в дальнейшем, т.е. его нужно будет только просмотреть. Поэтому и необходимо через контекст.

Т.е. что, через контекст формы нельзя получить контекст документа???
7 spock
 
31.05.04
12:08
2(6)Контекст документа получить можно, а вот добавлять строки нельзя... ну и некоторые другие действия подобного вида.
А вот если ты откроешь документ модально, то сможешь добавить новые строки.
8 Asmody
 
31.05.04
12:12
А если вообще другим путем пойти? Передать в форму нового документа параметр, и обработать его в процедуре ВводНового()?
9 Композитор
 
31.05.04
12:19
(6) Зачем создавать и заполнять ненужный в будущем документ, если есть такая штука, как обработка?
10 lexa
 
31.05.04
12:20
Попробуй ЗагрузитьТабличнуюЧасть(). В типовой ТиС посмотри документ быстрая продажа.
11 Ars
 
31.05.04
12:24
>spock
Модально к сожалению не подходит, т.к. документов формируется сразу несколько.

>Композитор
Ну, равновероятно он может оказаться и нужным :)

>Asmody
Да, это идея. Наверное так и придется делать.

А вообще, почему ж так сделано-то, что строки нельзя добавлять, когда все остальное можно менять?
12 Рупор абсурда
 
31.05.04
12:25
(10) Со звездой чушь пороть нехорошо ...
13 Композитор
 
31.05.04
12:26
(11) Дыры будут.
14 Asmody
 
31.05.04
12:27
(11) а куда добавлять строки? ИМХО, у тебя получается переменная типа "Контекст формы" читай "ссылка на объект форма" (грубо). А в форме у тебя неявно присутствует ссылка на объект типа "Документ". Кстати, в v8 эти понятия развели, чем очень облегчили понимание...
15 lexa
 
31.05.04
12:31
(12) Торговля+Склад, редакция 9.2
Модуль формы документа "Быстрая продажа"
Процедура БыстраяПродажа()      
   
   Если СокрЛП(ВидОперации) = "Продажа собственной фирме" Тогда
       // проверим, чтобы в документе не было услуг
       ВыбратьСтроки();
       
       Пока ПолучитьСтроку() = 1 Цикл
           Если (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
            или (Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа) Тогда
               Предупреждение("В составе обнаружены услуги или работы.
                              |Продавать услуги и работы собственной фирме нельзя!");
               Возврат;
           КонецЕсли;
       КонецЦикла;

       Перемещение();  
       Возврат;
   КонецЕсли;
   
   Если КоличествоСтрок() = 0 Тогда
       Предупреждение("Документ пуст! Проведение быстрой продажи не выполнено!",60);
       Возврат;
   КонецЕсли;          
   
   Если (БП_ЕстьПКО = 1)  
      и (ПустоеЗначение(глЗначениеПоУмолчанию("ОсновнаяКасса")) = 1) Тогда
       Предупреждение("У текущего пользователя не выбрана касса по умолчанию.
                       |Проведение быстрой продажи не выполнено!",60);
       Возврат;
   КонецЕсли;
   
   // Проверка заполненности обязательных реквизитов.
     Если глВсеРеквизитыДокументаЗаполнены(Контекст,
       "Фирма,Склад,Валюта,Контрагент,Договор")=0 Тогда
       Возврат;
   КонецЕсли;            
   
   Если глМожноЗаписатьДокумент(Контекст)=0 Тогда
       Возврат;
   КонецЕсли;                                                              
   
   СохранитьЗначение("БП_ПечатьРеализация",БП_ПечатьРеализация);
   СохранитьЗначение("БП_ЕстьЗаявка",      БП_ЕстьЗаявка  );
   СохранитьЗначение("БП_ПечатьЗаявка",    БП_ПечатьЗаявка);
   СохранитьЗначение("БП_ЕстьПКО",         БП_ЕстьПКО     );
   СохранитьЗначение("БП_ПечатьПКО",       БП_ПечатьПКО   );
   СохранитьЗначение("БП_ЕстьСФ",          БП_ЕстьСФ      );
   СохранитьЗначение("БП_ПечатьСФ",        БП_ПечатьСФ    );
   СохранитьЗначение("БПСпособПечати",     БПСпособПечати );
       
   СтрокаКомментария = "Оформлен операцией ""Быстрая продажа""";

   ТаблицаДокумента = СоздатьОбъект("ТаблицаЗначений");
   ВыгрузитьТабличнуюЧасть(ТаблицаДокумента);
   
   Попытка
       
       НачатьТранзакцию();
       
       Если БП_ЕстьЗаявка = 1 Тогда
           ДокЗаявка = СоздатьОбъект("Документ.ЗаявкаПокупателя");
           ДокЗаявка.Новый();    
           ДокЗаявка.ДатаДок = ДатаДок;
           ДокЗаявка.АвтоВремяТекущее();
           // идентичные реквизиты шапки
           СкопироватьРеквизитыШапки(Контекст, ДокЗаявка);
           // уникальные реквизиты шапки
           ДокЗаявка.ВидОперации    = Перечисление.ВидыОперацийЗаявок.Неподтвержденная;
           ДокЗаявка.ДатаОтгрузки   = ДатаДок;
           ДокЗаявка.ДатаОплаты     = ДатаДок;
           ДокЗаявка.БанковскийСчет = Фирма.ОсновнойСчет;

           // табличная часть
           ДокЗаявка.ЗагрузитьТабличнуюЧасть(ТаблицаДокумента);
           
           ДокЗаявка.Комментарий = СтрокаКомментария;
           ДокЗаявка.Записать();
           ДокЗаявка.Провести(1);
           Если ДокЗаявка.Проведен() = 0 Тогда
               ОтменитьТранзакцию();
               Возврат;
           КонецЕсли;
       КонецЕсли;
       Если БП_ЕстьРеализация = 1 Тогда
           ДокРеализация = СоздатьОбъект("Документ.Реализация");
           ДокРеализация.Новый();      
           ДокРеализация.ДатаДок = ДатаДок;
           ДокРеализация.АвтоВремяТекущее();
           // идентичные реквизиты шапки
           СкопироватьРеквизитыШапки(Контекст, ДокРеализация);
           // уникальные реквизиты шапки
           ДокРеализация.КодОперации = глКО.Продажа;
           ДокРеализация.ДатаОплаты   = ДатаДок;
           Если БП_ЕстьЗаявка = 1 Тогда
               ДокРеализация.ДокОснование = ДокЗаявка.ТекущийДокумент();
           КонецЕсли;
           // табличная часть
           ДокРеализация.ЗагрузитьТабличнуюЧасть(ТаблицаДокумента);
                                   
           ДокРеализация.Комментарий = СтрокаКомментария;
           ДокРеализация.Записать();
           Если БП_ЕстьПКО = 1 Тогда
               // для того, чтобы не ругалась на превышение кредита, отключим контроль
               // на время проведения документа
               СпрДоговор = СоздатьОбъект("Справочник.Договоры");
               СпрДоговор.НайтиЭлемент(Договор);    
               СтарыйНеКонтролироватьКредит = СпрДоговор.НеКонтролироватьКредит;
               СпрДоговор.НеКонтролироватьКредит = 1;
               СпрДоговор.Записать();
           КонецЕсли;
           
           ДокРеализация.Провести(1);
                                   
           Если БП_ЕстьПКО = 1 Тогда
               СпрДоговор.НеКонтролироватьКредит = СтарыйНеКонтролироватьКредит;
               СпрДоговор.Записать();
           КонецЕсли;
           
           Если ДокРеализация.Проведен() = 0 Тогда
               ОтменитьТранзакцию();
               Возврат;
           КонецЕсли;                    
       КонецЕсли;


       Если БП_ЕстьПКО = 1 Тогда
           ДокПКО = СоздатьОбъект("Документ.ПКО");
           ДокПКО.Новый();        
           ДокПКО.ДатаДок = ДатаДок;
           ДокПКО.АвтоВремяТекущее();
           // идентичные реквизиты шапки
           СкопироватьРеквизитыШапки(Контекст, ДокПКО);
           // уникальные реквизиты шапки
           ДокПКО.ДокОснование = ДокРеализация.ТекущийДокумент();
           ДокПКО.Касса        = глЗначениеПоУмолчанию("ОсновнаяКасса");
           ДокПКО.КодОперации  = глКО.ОплатаОтПокупателя;
           ДокПКО.ОблагаетсяНП = УчитыватьНП;
           
           ДокПКО.Сумма        = Итог("Сумма");
           Если СуммаВклНП = 0 Тогда
               ДокПКО.Сумма = ДокПКО.Сумма + Итог("СуммаНП");
           КонецЕсли;
           Если СуммаВклНДС = 0 Тогда
               ДокПКО.Сумма = ДокПКО.Сумма + Итог("СуммаНДС");
           КонецЕсли;

           Если Контрагент.ЮрФизЛицо.Выбран() = 1 Тогда
               ДокПКО.ПринятоОт = Контрагент.ЮрФизЛицо.ПолнНаименование;
           КонецЕсли;

           глПриВыбореБухСчета(ДокПКО,0);

           // табличная часть
           // ------ нет ее --------------
           
           ДокПКО.Комментарий = СтрокаКомментария;
           ДокПКО.Записать();
           ДокПКО.Провести(1);
           Если ДокПКО.Проведен() = 0 Тогда
               ОтменитьТранзакцию();
               Возврат;
           КонецЕсли;
       КонецЕсли;
       
       Если БП_ЕстьСФ = 1 Тогда
           ДокСФ = СоздатьОбъект("Документ.СчетФактураВыданный");
           ДокСФ.Новый();                  
           ДокСФ.ДатаДок = ДатаДок;
           ДокСФ.АвтоВремяТекущее();
           // идентичные реквизиты шапки
           СкопироватьРеквизитыШапки(Контекст, ДокСФ);
           // уникальные реквизиты шапки
           ДокСФ.АвтоКнигаПродаж = 1;
           ДокСФ.ДокОснование    = ДокРеализация.ТекущийДокумент();
           // табличная часть
           // ------ нет ее --------------
           
           ДокСФ.Комментарий = СтрокаКомментария;
           ДокСФ.Записать();
           ДокСФ.Провести(1);
           Если ДокСФ.Проведен() = 0 Тогда
               ОтменитьТранзакцию();
               Возврат;
           КонецЕсли;
       КонецЕсли;

       // фиксируем все изменения
       ЗафиксироватьТранзакцию();
       
   Исключение
       
       // при возникновении ошибки отменяем все изменения
       // здесь можно выдать сообщение об ошибке
       ОтменитьТранзакцию();
       Сообщить(ОписаниеОшибки(),"!");
       Возврат;
       
   КонецПопытки;
                     
   // далее - напечатаем созданные документы
   СписокПараметров = СоздатьОбъект("СписокЗначений");
   Если БПСпособПечати = 1 Тогда
       СписокПараметров.Установить("Команда","ПечатьНаЭкран");
   Иначе
       СписокПараметров.Установить("Команда","ПечатьНаПринтер");    
   КонецЕсли;
   
   Если (БП_ЕстьЗаявка = 1)
   и    (БП_ПечатьЗаявка > 0)
   Тогда
       СписокПараметров.Установить("КолЭкз",БП_ПечатьЗаявка);    
       ОткрытьФорму(ДокЗаявка.ТекущийДокумент(),СписокПараметров);
   КонецЕсли;

   Если (БП_ЕстьРеализация = 1)
   и    (БП_ПечатьРеализация > 0)
   Тогда
       СписокПараметров.Установить("КолЭкз",БП_ПечатьРеализация);    
       ОткрытьФорму(ДокРеализация.ТекущийДокумент(),СписокПараметров);
   КонецЕсли;
               
   Если (БП_ЕстьСФ = 1)
   и    (БП_ПечатьСФ > 0)
   Тогда
       СписокПараметров.Установить("КолЭкз",БП_ПечатьСФ);    
       ОткрытьФорму(ДокСФ.ТекущийДокумент(),СписокПараметров);
   КонецЕсли;
   
   Если (БП_ЕстьПКО = 1)
   и    (БП_ПечатьПКО > 0)
   Тогда
       СписокПараметров.Установить("КолЭкз",БП_ПечатьПКО);    
       ОткрытьФорму(ДокПКО.ТекущийДокумент(),СписокПараметров);
   КонецЕсли;
   ВопросОформитьНовую();
КонецПроцедуры // БыстраяПродажа()
------------------------------------    
Так что, век живи - век учись
16 Композитор
 
31.05.04
12:32
+(11) если документ создается программно, он должен быть нужным на 100%.
17 SnarkHunter
 
31.05.04
12:34
(15)Ты фишку не просек...
18 Композитор
 
31.05.04
12:34
(15) Зачем в ветки кидать большие куски кода из типовых конфигураций?
19 Asmody
 
31.05.04
12:35
(15) мля... только не надо на форуме куски из типовых публиковать. тошнить начинает...
20 Рупор абсурда
 
31.05.04
12:37
(17) На фиг ему фишка со звездой то? ...
Кстати, поздравляю вас обоих :))
21 spock
 
31.05.04
12:38
2(15)Так, ты читать умеешь?
В примере из торговли используется технология заполнения ТЧ документ через СоздатьОбъект()...
А (0) делает через ОткрытьФорму().
Разницу чувствуем?

Согласен с (12) на 100%.
22 SnarkHunter
 
31.05.04
12:39
(20)Спасибо... (Шаркнув ножкой...)
23 lexa
 
31.05.04
12:44
Да прошу прощения не въехал. Кстати я сам с подобным недавно мучился (мне то же самое pit советовал и то же не в тему). Тогда надо сформировать таблицу значений, аналогичную табличной части документа и передавать ее в качестве параметра (или элемента списка параметров) в ОткрытьФорму("Документ.НужныйДокумент", ТЗ) или ОткрытьФорму("Документ.НужныйДокумент", СписокПараметров), а модуле формы нужного документа в процедуре ВводНового()
ЗагрузитьТабличнуюЧасть(ТЗ)
24 lexa
 
31.05.04
13:10
Кстати в глобальном модуле ТиС есть процедуры, которые заполняют табличную часть документа через контекст формы.
25 Ars
 
31.05.04
15:32
Извиняюсь, но ещё почти по теме вопрос назрел.
А как открыть несколько экземпляров документов (форм) одновременно. Т.е. если я делаю это в цикле:
for i=1 to КоличествоСтрок() do
   ОткрытьФорму("Документ.НарядБригадный#new"+строка(i), Frmdle);
enddo;

Активизируется один и тот же документ. КАК сделать, чтобы каждый новый док открывался в отдельном окне?
26 lexa
 
31.05.04
15:40
попробуй
индформы = "new"+строка(i)
for i=1 to КоличествоСтрок() do
  ОткрытьФорму("Документ.НарядБригадный#индформы, Frmdle);
enddo;
27 Ars
 
31.05.04
15:52
Не хочу вас обидеть, но... хм, вы наверное имели в виду так?
for i=1 to КоличествоСтрок() do
 индформы = "new"+строка(i)
 ОткрытьФорму("Документ.НарядБригадный#индформы, Frmdle);
enddo;

И все равно не работает :((((((((
28 lexa
 
31.05.04
15:57
(27) насчет (26) ты прав, честно говоря не уверен, что это возможно - открыть несколько форм для нового документа, скорей всего их надо вначале записать
29 Композитор
 
31.05.04
18:08
Не могу придумать ситуацию, когда было бы необходимо программно открывать несколько документов.
30 lexa
 
31.05.04
18:11
(29) ну типа открыл кучу заполненных нвых доков. а юзер решает сохранять их или нет
31 Композитор
 
31.05.04
18:13
(30) Это не ответ.
32 Klepa
 
04.07.04
21:14
Вы пробуете создавать новый документ коммандой ОткрытьФорму.
А попробуйте создать документ коммандой Новый, заполнить его все реквизиты в том числе и многострочную часть, записать и только тогда ОткрытьФорму. Думаю, все получится.
33 427
 
04.07.04
21:29
(32) Читать умеешь?
Им надо открыть заполненный док и ЮЗЕР РЕШАЕТ, ЗАПИСЫВАТЬ ЕГО ИЛИ НЕТ.
А ты советуешь ЗАПИСАТЬ... А если он не нужен?


Кстати (лениво все перечитывать)....

Новый незаписанный док м.б. ОТКРЫТ ТОЛЬКО ОДИН.....
Учитывайте это...
Фича такая... в 1с

Если это записанные доки - их можно открыть много... а НОВЫЙ НЕЗАПИСАННЫЙ - ОДИН.
34 Орк
 
04.07.04
21:32
То 0.
//
ОткрытьФорму("Документ.НарядБригадный#qq", NewFrmHandle);

(получаем NewFrmHandle - контекст формы документа вида НарядБригадный)

NewFrmHandle.Приработок=Приработок;

(срабатывает поскольку на форме размещен реквизит ФОРМЫ Приработок)

NewFrmHandle.НоваяСтрока(); <-----А ВОТ ЭТО УЖЕ НЕ РАБОТАЕТ
(поскольку пытаемся строку добавить не к документу а к его ФОРМЕ)

см. 32
35 427
 
04.07.04
21:42
(34) А подергать новую уже открытую форму через ПовторноеОткрытие уже вера не позволяет? Тогда юзай FormEx.....
36 Орк
 
04.07.04
21:52
То 35.
Вопрос не в открытии новой формы.
Вопрос в том, что (0) пытается строки добавлять не в документ,
а к ФОРМЕ
Для примера попробуй в нормально записанном документе, открытом интерактивно
пользователем сл. код:

Форма.НоваяСтрока();

Получишь а-я-я-я-я-й.
тоже самое (0) притается проделать с контекстом "неродной" формы.
37 Asmody
 
04.07.04
22:37
ой не пойму я чего вы спорите! ИМХО, дергать форму "за усы" (т.е. лезть в нее из-вне) - не совсем корректно, ну уж во всяком случае, красоты коду не прибавляет. делать это надо в исключительных случаях. Опять же, ИМХО, правильнее будет свернуть все, что надо в СЗ, передать в форму, а в ней уже "разруливать фишку".
Если же нетерпиться над формой поиздеваться, то (опять ИМХО) лучше FormEx'a никто ничего не придумал. Опять же, с ее помощью можно все сделать достаточно красиво.