|   |   | 
| 
 | v7: Как открыть не сохраненный но заполненный новый документ | ☑ | ||
|---|---|---|---|---|
| 0
    
        picom 03.09.11✎ 07:24 | 
        Не понимаю как это сделать в семерке:
  Нужно открыть программно новый документы с предзаполненными из обработки данными. ОткрытьФорму(НовДок.ТекущийДокумент()) ведь работает если документ записан. А мне его запись не нужна, только открытие с заполненными данными | |||
| 1
    
        МастерВопросов 03.09.11✎ 07:41 | 
        стандартно  никак, это старый баян. Либо заполнять данными из модуля самой формы, куда передавать данные из обработки, либо Формекс.     | |||
| 2
    
        1Сергей 03.09.11✎ 07:42 | 
        Конт="";
  ОткрытьФорму("Документ.Накладная",Конт); Конт.НоваяСтрока(); ... | |||
| 3
    
        Рэйв 03.09.11✎ 07:42 | 
        >>новый документы 
  .. Ты свой "новый документы " запиши перед отурытием..а то ссылки не будет | |||
| 4
    
        picom 03.09.11✎ 07:45 | 
        (3) не могу записать
  этот документ носит информативный зарактер и как только он зареган в базе тут-же начинается движуха например отправка писем или смс надо открывать его без записи | |||
| 5
    
        Рэйв 03.09.11✎ 07:46 | 
        (4)Тогда ->(2)     | |||
| 6
    
        skunk 03.09.11✎ 07:46 | 
        открыть можно ... даже можно заполнить после открытия все кроме табличной части     | |||
| 7
    
        picom 03.09.11✎ 07:47 | 
        (2) не понятно     | |||
| 8
    
        Рэйв 03.09.11✎ 07:47 | 
        Открытие формы нового документа
  ОткрытьФорму(<ОписательОбъекта>, <КонтекстФормы>, <ДокументОснование>) <ОписательОбъекта> Строковое выражение."Документ.ХХХХХ", где ХХХХХ — идентификатор вида документа; <ДокументОснование> Необязательный параметр. Выражение типа «документ», задающий документ-основание для открытия формы ввода нового документа в режиме ввода на основании. | |||
| 9
    
        Рэйв 03.09.11✎ 07:48 | 
        (7)СП купишь по сходной цене?     | |||
| 10
    
        picom 03.09.11✎ 07:49 | 
        (6) жаль, а таб часть ой как надо заполнить
  хотя ее то можно и заполнить как раз в форме документа при открытии | |||
| 11
    
        МастерВопросов 03.09.11✎ 07:49 | 
        (4) передавай параметры при ОткрытьФорму , а в модуле формы документа в процедуре ПриОткрытии пиши заполнение полей формы данными из параметра.     | |||
| 12
    
        Dump 03.09.11✎ 08:09 | 
        А не проще сделать, чтобы "движуха" начиналась не когда документ "зареган в базе", а при его проведении? Кучу проблем зараз решишь     | |||
| 13
    
        picom 03.09.11✎ 08:14 | 
        (12) Примерно так и сделал, добавил галку, не начинать движуху)     | |||
| 14
    
        mishaPH 03.09.11✎ 08:15 | 
        (12) + 100. или по флагу некому "ДвижухаПошла". 
  Вот придумают себе проблем. Завел бы 1 технический док себе и грузил его. | |||
| 15
    
        mishaPH 03.09.11✎ 08:15 | 
        (13) бугагашечка     | |||
| 16
    
        zak555 03.09.11✎ 08:22 | 
        записать в транзакции, заполнить, отменить транзакцию =)     | |||
| 17
    
        Рэйв 03.09.11✎ 08:26 | 
        Я так понял (8) опять никто не читал.     | |||
| 18
    
        Banned 03.09.11✎ 08:28 | 
        (17) а кому оно надо? Читать СП - удел задротов и ботанов....     | |||
| 19
    
        picom 03.09.11✎ 08:43 | 
        (17) СП не всегда понятен, объясните своими словами, возможно ваше решение и будет самым правильным     | |||
| 20
    
        Хряк 03.09.11✎ 09:03 | 
        самое правильное добавить строку загрузки формэкс и продолжать работать как ни в чём не бывало     | |||
| 21
    
        Мимохожий Однако 03.09.11✎ 09:18 | 
        А еще можно сделать обработку с реквизитами документа. Закрыл - не сохранилось. ОК - записал и провел документ.     | |||
| 22
    
        GreyK 03.09.11✎ 12:00 | 
        //******************************************************************************
  Процедура МояПроцедура() Перем Докум; ОткрытьФорму("Документ.ПоступлениеТМЦ",Докум); ; Докум.ОткрытьПодбор("Обработка.МояОбработкаЗаполнения",,Докум); КонецПроцедуры | |||
| 23
    
        МастерВопросов 03.09.11✎ 12:06 | 
        (19) видимо он тебе рекомендует открывать форму в режиме ввода на основании. Но почему бы просто параметры не передать в открываемую форму.     | |||
| 24
    
        Torquader 03.09.11✎ 22:50 | 
        (23) Для передачи параметров форму нужно модифицировать, а вот для ввода на основании всё уже написано.     | |||
| 25
    
        Torquader 03.09.11✎ 23:11 | 
        Для (16):
  // здесь мы бдуем создавать документ с табличной частью // будем использовать метод "Транзакция" d=CreateObject("Document.Создаваемый"); d.New(); d.ЗагРек1="Уст.Загол."; d.NewLine(); d.СтрРек1="Стр1"; d.СтрРек2="Уст1"; d.NewLine(); d.СтрРек1="Стр2"; d.СтрРек2="Уст2"; // теперь выполняем сохранение в транзакции BeginTransaction(); d.Write(); OpenForm(d.CurrentDocument()); // отменяем транзакцию RollBackTransaction(); // и о чудо - мы видим на экране заполненный документ // а в журнале его нет, то есть он не сохранён. Однако, так делать нельзя ни в коем случае!!! Почему ? Во-первых, мы видим документ, у которого нет пометки изменения, то есть по мнению системы он не только сохранён, но ещё и не изменён. Первое, к чему это приводит - это то, что при закрытии документа пользователь не получает сообщения о том, что документ нужно сохранить - 1С считает, что мы его уже сохранили. Во-вторых, если мы вызовем у этого документа функцию Selected (Выбран), то мы получим возвращаемое значение 1, хотя должно быть ноль. Но это не самое страшное. Самое страшное в том, что у этого документа есть внутренний идентификатор (можно спросить ValueToStringInternal(CurrentDocument()) и увидеть его. Более того, при нескольких несохранениях мы получаем одинаковый идентификатор, что говорит о том, что он присвоился, но счётчик идентификаторов не увеличивается. И основное: Теперь пробуем создать новы документ любого типа - ему присвоится тот же самый идентификатор и при сохранении система скажет, что "Запись заблокирована" - и слава богу - иначе - задвоение идентификатора нам бы было обеспечено. (Если, конечно, какой-то документ удастся сохранить, то будет печально). То есть решение через транзакцию - это однозначная порча информации в базе данных. | |||
| 26
    
        Torquader 03.09.11✎ 23:15 | 
        +(25) После экспериментов с сохранением был потерян номер документа (то есть в тестовой  базе создавался только один документ номер 1 и не сохранялся в транзакции, а потом оказалось, что нумерация идёт с номера 2).     | |||
| 27
    
        Torquader 03.09.11✎ 23:24 | 
        (23) Ваш способ - ввод на основании:
  // создаём документ и заполняем его d=CreateObject("Document.Создаваемый"); d.New(); d.ЗагРек1="Уст.Загол."; d.NewLine(); d.СтрРек1="Стр1"; d.СтрРек2="Уст1"; d.NewLine(); d.СтрРек1="Стр2"; d.СтрРек2="Уст2"; // открываем форму нового документа и передаём в качестве // параметра сформированный нами документ OpenForm("Document.Создаваемый",,d); // форма открылась, но нас подстерегает сюрприз В форме документа в процедуре InputNew(ВводНового) есть флаг признака копирования - он не установился в 1, а процедура InputCausedBy(ВводНаОсновании) вообще не вызвалась То есть в качестве основания нужно передавать сохранённый документ - вот тут-то мы и вспоминаем про транзакцию (то есть про то, что мы делали до этого) | |||
| 28
    
        Torquader 03.09.11✎ 23:34 | 
        Собмещаем:
  // то есть делаем и транзакцию и ввод на основании d=CreateObject("Document.Создаваемый"); d.New(); d.ЗагРек1="Уст.Загол."; d.NewLine(); d.СтрРек1="Стр1"; d.СтрРек2="Уст1"; d.NewLine(); d.СтрРек1="Стр2"; d.СтрРек2="Уст2"; // открываем транзакцию BeginTransaction(); // записываем документ d.Write(); // передаём его в форму // она отработает создание нового документа на основании // переданного ей значения сохранённого документа // который какое-то время существует OpenForm("Document.Создаваемый",,d.CurrentDocument()); // после отработки создания документа его форма ещё // не открыта, а ссылка на переданный параметр // уже использована и больше она не нужна // теперь мы отменяем транзакцию и наш "фиктивный" документ // разрушается и система больше не знает о том // что он вообще существовал RollBackTransaction(); Такой способ позволяет избежать проблем, так как пользователь видит новый документ, и для 1С он тоже новый Единственная проблема в том, что в модуле формы документа должна быть описана процедура ввода на основании другого документа такого же вида. Если этого нет, то все наши старания были бессмысленны. | |||
| 29
    
        Cthulhu 03.09.11✎ 23:54 | 
        (28): а вот вопрос. по реинжинирингу. м.б. сможешь попробовать как-то отловить - что и как вызывается при F9 в форме журнала, ммм?.. я не компетентен ни полраза именно в этом, но может быть как-то хитро можно инициировать открытие формы нового документа таким образом, чтобы она "подумала" что выполняется копирование (с "подсовыванием" флага копирования и ссылки на копируемый документ)?..     | |||
| 30
    
        Torquader 04.09.11✎ 00:09 | 
        Дело в том, что "умная" 1С при копировании выполняет загрузку в память выбранного объекта и вытирание у него идентификатора, а потом для полученного объекта открывает форму с вызовом функции копирования, но при вызове процедуры копирования объект уже заполнен скопированными данными.
  Имитацию копирования сделать сложнее, так как новый документ должен появится в журнале, а для этого откаченной транзакции недостаточно. А F9 смело можно через SendKey "нажать". | |||
| 31
    
        Cthulhu 04.09.11✎ 00:24 | 
        (30): а чем инициируется весь этот процесс... вот про то я. м.б. можно какую-то байду вызвать с передачей в ней ИД копируемого объекта данных - и там уже пойдет молотить все ч то ты сказал... никак?..
  (а сендкей и ф9 - некомильфо, в терминале у меня, например, далеко не обязательно всх в службах сессии будет запущен, например; да и гарантировано открыть журнал спозиционироваться на том что надо потом закрыть журнал и т.п. - ой как муторно на самом деле) | |||
| 32
    
        Torquader 04.09.11✎ 00:48 | 
        (31) В меню этот пункт называется копирование.
  При вызове меню система получает идентификатор активной формы (в данном случае журнал документов) и в нём находит активный документ, то есть то, что возвращает CurrentDocument в журнале. Кроме того, в процедуре InputNew во втором параметре мы получаем значение спозиционированного документа (ValueToStringInternal показывает нам именно ссылку, а не объект документ), то есть если даже мы научимся выполнять копирование, то у нас будут опять проблемы с тем, как сделать ссылку на то, чего в системе нет. | |||
| 33
    
        Torquader 04.09.11✎ 00:56 | 
        Интересно ещё то, что в случае нового документа в процедуру InputNew передаётся ссылка на пустой документ, как ни странно.
  То есть ссылка есть всегда, а первый флаг, видимо, это есть Selected от этой ссылки. | |||
| 34
    
        Torquader 04.09.11✎ 01:03 | 
        А через SendKey можно спокойно вводить строки и задавать значения, только для этого приходится использовать Form.IdleProcessing, чтобы дождаться обработки клавиши именно тогда, когда это нужно - но такой способ разумным назвать сложно.
  При открытии формы мы можем получить от неё контекст, но это будет контекст формы, через который можно вызывать какие-то функции модуля формы и иметь доступ к части реквизитов - например, установить значения реквизитов табличной части для активной строки можно, но создать или поменять активную строку - нет. | |||
| 35
    
        Cthulhu 04.09.11✎ 01:42 | 
        и никак не подсунуть во ВводНового ссылку?.. ВК-шку на крайняк слепить?..     | |||
| 36
    
        Voronve 04.09.11✎ 08:11 | 
        (0) Чего паримся ? Делаем все проще, например, в ТиС, во многих документах есть код вида:
  [code] Парам = Форма.Параметр; Если ТипЗначенияСтр(Парам)="СписокЗначений" Тогда Если ПустоеЗначение(Парам.Получить("Команда"))=1 Тогда Сообщить("В форму документа "+Вид()+" передан неверный параметр!","I"); СтатусВозврата(0);Возврат; КонецЕсли; Если Парам.Получить("Команда") = "ПечатьНаПринтер" Тогда КолЭкз = Макс(Число(Парам.Получить("КолЭкз")),1); ПоКнопкеПечать(1,КолЭкз); СтатусВозврата(0);Возврат; ИначеЕсли Парам.Получить("Команда") = "ПечатьНаЭкран" Тогда ПоКнопкеПечать(0); СтатусВозврата(0);Возврат; Иначе Сообщить("В форму документа "+Вид()+" передана неверная команда "+Парам.Получить("Команда")+"!","I"); СтатусВозврата(0);Возврат; КонецЕсли; КонецЕсли; [/code] В эту мешанину добавляем: [code] ИначеЕсли Парам.Получить("Команда") = "ЗаполнитьИзОбработки" Тогда ОткрытьФорму("Обработка.МояОбработкаПоЗаполнению", Контекст); [/code] Документ открываем так: [code] спПараметры = СоздатьОбъект("СписокЗначений"); спПараметры.Установить("Команда", "ЗаполнитьИзОбработки"); ОткрытьФорму("Документ.Реализация", спПараметры); [/code] Имеем заполненную как надо, открытую, но не записанную форму документа. | |||
| 37
    
        Voronve 04.09.11✎ 08:27 | 
        +
  Вот так вызываемся если нужно показать юзеру два и более открытых документа одного вида [code] спПараметры = СоздатьОбъект("СписокЗначений"); спПараметры.Установить("Команда", "ЗаполнитьИзОбработки"); ОткрытьФорму("Документ.Реализация#" + ИмяПользователя() + "_" + ТекущееВремя(), спПараметры); [/code] | |||
| 38
    
        МастерВопросов 04.09.11✎ 15:32 | 
        (36) можно и не дописывать ничего в эту мешанину, просто " МояОбработкаПоЗаполнению" сделать в виде внешней формы и подключить к документу как печатную форму.     | |||
| 39
    
        Torquader 04.09.11✎ 21:53 | 
        Ребята!
  Разговор шёл о том, что делать, если: 1) Конфигурация написана неизвестно кем и заказчик не даёт разрешение на её изменение. 2) В родной конфигурации в модуле формы документа нет ни обработки переданных параметров ни обработки подбора. 3) Нельзя подключать внешние компоненты. И нужно из внешней обработки создать и заполнить документ, который будет отображён пользователю, чтобы у него был шанс его или сохранить или не сохранить. Понятно, что если мы можем открыть обработку подбора, то потом из неё можно вызывать ВыполнитьВыбор (MakeChoice). | |||
| 40
    
        Кукуев 05.09.11✎ 06:51 | 
        Делал через контекст, как (2) советовал...
  Процедура Сформировать() Перем Парам; Если ПустоеЗначение(ВыбДок) = 1 Тогда Предупреждение("Не выбран документ!!!", 3); Возврат; КонецЕсли; ДокОтчет = СоздатьОбъект("Документ.ОтчетКомиссионера"); ДокБухСпр = СоздатьОбъект("Документ.БухгалтерскаяСправка"); ТЗДвижения = СоздатьОбъект("ТаблицаЗначений"); ТЗДвижения.Очистить(); ТЗДвижения.НоваяКолонка("Номенклатура", "Справочник.Номенклатура"); ТЗДвижения.НоваяКолонка("Комиссионер", "Справочник.Контрагенты"); ТЗДвижения.НоваяКолонка("Себестоимость", "Число"); ТЗДвижения.НоваяКолонка("ПродСтоимость", "Число"); ТЗДвижения.НоваяКолонка("Количество", "Число"); Парам = глВзятьКонтекст(Контекст); ОткрытьФорму("Документ.БухгалтерскаяСправка", Парам); ДокОтчет.НайтиДокумент(ВыбДок); РегПродажи = СоздатьОбъект("Регистр.Продажи"); РегПродажи.ВыбратьДвиженияДокумента(ДокОтчет); Пока РегПродажи.ПолучитьДвижение() = 1 Цикл ТЗДвижения.НоваяСтрока(); ..... ..... КонецЦикла; //Заполняем шапку документа Парам.ДатаДок = ДокОтчет.ДатаДок; Парам.Автор = глПользователь; ..... ..... Парам.Форма.Обновить(); ТЗДвижения.ВыбратьСтроки(); Пока ТЗДвижения.ПолучитьСтроку() = 1 Цикл Парам.НоваяСтрока(); //Заполняем табличную часть документа ..... ..... КонецЦикла; КонецПроцедуры И табличная часть заполняется :) | |||
| 41
    
        Torquader 06.09.11✎ 23:31 | 
        У меня (40) не работает (платформа 27).
  Если вместо Конт.НоваяСтрока() вставить Конт.Записать, то "умная" система выдаёт ошибку "Данная команда не может выполняться в формуле элемента диалога!" - собственно, по этой причине строки и не создаются. (А формула элемента диалога, видимо, зависит от типа документа и от вида элементов управления на форме документа). | |||
| 42
    
        Cthulhu 06.09.11✎ 23:38 | 
        (40): а теперь попробуй без ВК.
  (41): ряд ВК автоматом подключают возможность добавления новых строк в документ через контекст. | |||
| 43
    
        SiAl-chel 07.09.11✎ 03:02 | 
        (11) А зачем в ПриОткрытии?() Можено же через КонтекстФормы заполнять.     | |||
| 44
    
        skunk 07.09.11✎ 03:03 | 
        пробуй     | |||
| 45
    
        Кукуев 07.09.11✎ 08:58 | 
        (42)Ну да, ВК-шками не брезгую, есть кое-чего  :)
  Подозревал, что ВК "оказывает помощь" в этом, но, честно говоря, какая именно - не интересовался. Бум знать, спасибо... | |||
| 46
    
        Ёпрст гуру 07.09.11✎ 09:05 | 
        (45) только одна - формекс.     | |||
| 47
    
        Кукуев 07.09.11✎ 10:15 | 
        (46)Спасиб, запомню :)     | |||
| 48
    
        Cthulhu 07.09.11✎ 13:52 | 
        (46): а 1с++ ???     | |||
| 49
    
        Ёпрст гуру 07.09.11✎ 13:57 | 
        (48) нет. Только первые версии, где был встроен формекс.     | |||
| 50
    
        Cthulhu 07.09.11✎ 16:43 | 
        (49): вспомнил: ещё turbobl (и вроде даже давнее других).     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |