| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > Внешний отчет и создание документа |
| Автор: ukrop 20.6.2010, 00:30 |
| Здравствуйте. Пытаюсь во внешней обработке создать документ 1с (версия 8.1 предприятие). После записи документа и закрытия его в процедуре не происходит записи всех атрибутов в базу. У меня во внешней обработке есть одна форма с одной кнопкой, которая вызывает при нажатии процедуру: Процедура СоздатьНажатие(Элемент) док = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент (); // Тут я записываю номер-дату, они дальше остаются правильными, номерация и время соответствуют. док.Дата = ТекущаяДата (); док.УстановитьВремя( РежимАвтоВремя.ТекущееИлиПоследним ); док.УстановитьНовыйНомер(); док.ВидОперации = Перечисления.ВидыОперацийПКО.РасчетыПоКредитамИЗаймамСКонтрагентами; // Это, насколько я нагуглил, нужно для того, чтобы начали действовать обработки событий ф = док.ПолучитьФорму( "ФормаДокумента", ЭтаФорма ); ф.Открыть (); // Вот эта строчки срабатывает полностью. ф.Организация = Справочники.Организации.НайтиПоКоду( "000000001" ); // Эти строчки хотя-бы остаются в документе после записи. ф.ОтражатьВНалоговомУчете = ЛОЖЬ; ф.Контрагент = Справочники.Контрагенты.НайтиПоКоду( "000000001" ); // Эти уже совсем не работают. В дебуггере происходит изменение как в "ф", так и в "док", а документе после повторного открытия ничего нет. ф.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС; ф.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду( "643" ). ф.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.КассаОрганизации; док.Записать (); // форма.Закрыть(); КонецПроцедуры Для проверки я во все события, которые должны происходить, я вставил текст вида Сообщить( "ПКО::ОрганизацияПриВыборе" ); И также по всем остальным событиями, которые по логике должны вызываться. Если я щелкаю мышкой и клавиатурой, то события происходят в нужное время, пересчитывают все, что нужно, сообщения пишутся. А в том коде, кторый я привел, происходит только "ОрганизаяПриВыборе" и "ПриЗаписи". Между ними по логике должно быть "ОтражатьВНалоговомУчетеПриИзменении", "КонтрагентПриИзменении", "СтавкаНДСПриИзменении" и дальше. Ничего не происходит. Насколько я сейчас понимаю, я создаю наверное не обьект, а копию, что-ле. Поэтому критичные поля типо даты-времени-ид и организации (она индексируема) пишутся быстро и напрямую в базу, вызываются события. А остальные поля не критичны и не происходит ничего. Это максимум, до чего я дошел. Помогите пожалуйста написать эту обработку |
| Автор: Zero 20.6.2010, 08:21 | ||
| Не записываются потому что ты изменения вносишь в форме документа, а не в объекте. А записываешь потом сам объект в котором как не было изменений, так и нету. В твоём случае форму получать вообще ненужно. А вторая ошибка это то, что ты не проверил данные. Там есть как реквизиты шапки и есть табличная часть. Те данные которые относятся к табличной части, нужно вносить по особенному
|
| Автор: ukrop 20.6.2010, 10:12 | ||||||
| В этом документе нет табличной части. Вернее в дизайнере если посмотреть на форму, видно, что есть как табличная часть, так и просто несколько полей (если считается одна строка) на разных панелях. Если я вношу документ руками и мышкой, то мне видны именно поля для ввода, а не табличная часть. В дебуггере в этих, вручную заполненных полях появляются все данные.
Если не создававь форму, то не идут события вида ПриИзменении, то есть к примеру при внесении контрагента должно самостоятельно выбираться поле Договор (там событие есть) и оно не происходит. Как я выше писал, должны были пройти несколько событий "ПриИзменении". А происходит только одно "ОрганизаяПриВыборе".
В независимости от того, куда я вношу данные, в "Ф" или в "док", данные все равно наполовину не сохраняются, так что разницы нету. Сейчас поменял "ф" на "док" и проверил. Нет разницы Вот мой текущий код:
|
| Автор: ukrop 20.6.2010, 10:50 | ||||
| Ура, я понял, как заносить реквизиты в табличную часть. Вы были правы, надо было вносить ее именно туда В том коде, который я прислал последним, надо заменить
На
Случайно заметил, что ПриОткрытии создает одну строчку А про события все равно не понятно - почему ПриИзменении идет только на поле Организация, а на остальыне нет. Не хочется переписывать (копипастить) весь код событий. Единственная разница это то, что организация индексируема. Больше вроде никакой разницы нет. |
| Автор: Zero 20.6.2010, 11:04 | ||||
Это в случае, если строка заранее каким-то образом уже добавлена. По умолчанию новые документы её не имеют.
Посмотри обработчик события документа "ВводНового", возможно там указан вызов процедуры ЗаполнениеШапки. Быть может от туда он и заполняет организацию |
| Автор: ukrop 20.6.2010, 11:25 | ||||
Тут я теперь проверяю на количество. Если ноль - создать, иначе получить первую строку. В конструкторе так-же происходит.
Я не нашел его. Событие ОрганизацияПриИзменении и впрямь вызывается не за счет смены поля, а в конструкторе формы. Мдя. По ходу придется делать маленький копипаст для всех обработчиков. Спасиба за помощь |
| Автор: Zero 20.6.2010, 11:50 | ||
Обычно стандартные процедуры связанные с заполнением "стандартных" реквизитов документов находятся в общих модулях в виде процедур. Им в качестве параметров передаётся контекст объекта и таким образом наборы одинаковых строк текста писать не приходится. Ну если у тебя своеобразная задача связанная с заполнением реквизитов документа, тогда можешь их заполнить по своему. |
| Автор: ukrop 21.6.2010, 14:47 |
| К сожалению, большая часть методов тут описаны в локальной форме. Так что только большой копипаст (хотя буду смотреть, может обработчик ничего и не делает с документом). Все равно - спасибо за помощь |