![]() |
![]() |
![]() |
|
Как добавить строки в многострочную часть документа из другого документа? | ☑ | ||
---|---|---|---|---|
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 никто ничего не придумал. Опять же, с ее помощью можно все сделать достаточно красиво. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |