Вход | Регистрация


1С:Предприятие ::

Метки:документы

Как добавить строки в многострочную часть документа из другого документа?

Я
   Ars
 
31.05.04 - 11:46
Суть проблемы:
Есть документ, который при расчете формирует несколько других документов
на основе собственных вычислений, в том числе их табличную часть. Вот код:
 ОткрытьФорму("Документ.НарядБригадный#qq", NewFrmHandle);//Открываем новую форму

 NewFrmHandle.Приработок=Приработок;//Заполняем реквизиты шапки <---это работает

 ...
//Заполнение табличной части

 for i=1 to grid_Бригада.КоличествоСтрок() do //grid_Бригада - исходная таблица

  NewFrmHandle.НоваяСтрока(); <-----А ВОТ ЭТО УЖЕ НЕ РАБОТАЕТ
  NewFrmHandle.Сотрудник=grid_Бригада.ПолучитьЗначение(i, "Сотрудник");
 endDo;

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

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

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

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

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

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

А вообще, почему ж так сделано-то, что строки нельзя добавлять, когда все остальное можно менять?
   Рупор абсурда
 
12 - 31.05.04 - 12:25
(10) Со звездой чушь пороть нехорошо ...
   Композитор
 
13 - 31.05.04 - 12:26
(11) Дыры будут.
   Asmody
 
14 - 31.05.04 - 12:27
(11) а куда добавлять строки? ИМХО, у тебя получается переменная типа "Контекст формы" читай "ссылка на объект форма" (грубо). А в форме у тебя неявно присутствует ссылка на объект типа "Документ". Кстати, в v8 эти понятия развели, чем очень облегчили понимание...
   lexa
 
15 - 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%.
   SnarkHunter
 
17 - 31.05.04 - 12:34
(15)Ты фишку не просек...
   Композитор
 
18 - 31.05.04 - 12:34
(15) Зачем в ветки кидать большие куски кода из типовых конфигураций?
   Asmody
 
19 - 31.05.04 - 12:35
(15) мля... только не надо на форуме куски из типовых публиковать. тошнить начинает...
   Рупор абсурда
 
20 - 31.05.04 - 12:37
(17) На фиг ему фишка со звездой то? ...
Кстати, поздравляю вас обоих :))
   spock
 
21 - 31.05.04 - 12:38
2(15)Так, ты читать умеешь?
В примере из торговли используется технология заполнения ТЧ документ через СоздатьОбъект()...
А (0) делает через ОткрытьФорму().
Разницу чувствуем?

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

 enddo;

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

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


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

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

Если это записанные доки - их можно открыть много... а НОВЫЙ НЕЗАПИСАННЫЙ - ОДИН.
 
  Рекламное место пустует
   Орк
 
34 - 04.07.04 - 21:32
То 0.
//

ОткрытьФорму("Документ.НарядБригадный#qq", NewFrmHandle);

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

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

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

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

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

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

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



Список тем форума
Рекламное место пустует  
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует