Консультация № 160589
16.02.2009, 09:24
0.00 руб.
0 8 3
[b]Как передать значение в форму открытого документа[/b]
Здравструйте!Такая проблема.
Создана обработка для считывания штрих кода с платежного поручения.Считанный штрих код попадает в нужные графы в платежке.Все вроде хорошо...
НО допустим открыли обработку,считали штрих код,штрих код попал в нужные поля в платежке...НО я передумала сохранять документ,а документ как на зло все равно сохраняется не зависимо от того какую кнопку нажал на платежном поручении(Да/Нет). Если без сканера заполняешь Да/Нет норм работает.Как только со сканером считаешь сразу что Да,что Нет документ по любому сохраняется...Может надо что-то дописать в обработке или в платежке на случай если передумал документ сохранять.


Приложение:
Обработка:
Процедура Сформировать()
//распределяем штрих код по реквизитам
Сообщить(СтрокаИдент);
КодНИ=Сред(СтрокаИдент,0,5);
Почтамт=Сред(СтрокаИдент,6,2);
ХЗ=Сред(СтрокаИдент,8,9);
КБК=Сред(СтрокаИдент,17,20);
ОКАТО=Сред(СтрокаИдент,37,11);
СуммаРуб=Сред(СтрокаИдент,48,7);
СуммаКоп=Сред(СтрокаИдент,55,2);
СуммаСтр=СуммаРуб+"."+СуммаКоп;
Сумма=Число(СуммаСтр);
СпрСчет=СоздатьОбъект("Справочник.РасчетныеСчета");
СпрСчет.ИспользоватьВладельца (СпрКонт.ТекущийЭлемент());
СпрСчет.НайтиПоНаименованию("Основной");
СпрНДС=СоздатьОбъект("Справочник.СтавкиНДС");
Код=1;
СпрНДС.НайтиПоКоду(Код,0);

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

//может надо в модуле формы документа "Платёжное поручение" написать процедуру....

Обсуждение

Неизвестный
16.02.2009, 09:30
общий
Конечно, документ будет сохраняться автоматически - Вы это в тексте правильно определили.
на первый взгляд я вижу, что перед записью документа нужно задать вопрос о сохранении:
Код:
Если Вопрос("Сохранить новый документ? ("+Док+")", "Да+Нет") = "Да" Тогда
Док.Сохранить();
КонецЕсли;
Неизвестный
16.02.2009, 09:33
общий
это ответ
Здравствуйте, Шилова Юлия Валерьевна!

Если выполнили Док.Записать() то документ уже записан, еще до открытия формы.

Выход - передавайте строку "СтрокаИдент" в качестве параметра при открытии формы:
ОткрытьФормуМодально(Док.ТекущийДокумент(),СтрокаИдент,0);
После этого в модуле формы в процедуре ПриОткрытии() анализируйте значение Форма.Параметр и заполняйте документ переданными значениями.
Неизвестный
16.02.2009, 09:34
общий
Работаю в 1С бухгалтерии v7.7
Неизвестный
16.02.2009, 09:45
общий
Но вообще-то этот вопрос лучше задавать ДО создания документа:

Код:
Процедура Сформировать()
//распределяем штрих код по реквизитам
Сообщить(СтрокаИдент);
КодНИ=Сред(СтрокаИдент,0,5);
Почтамт=Сред(СтрокаИдент,6,2);
ХЗ=Сред(СтрокаИдент,8,9);
КБК=Сред(СтрокаИдент,17,20);
ОКАТО=Сред(СтрокаИдент,37,11);
СуммаРуб=Сред(СтрокаИдент,48,7);
СуммаКоп=Сред(СтрокаИдент,55,2);
СуммаСтр=СуммаРуб+"."+СуммаКоп;
Сумма=Число(СуммаСтр);
СпрСчет=СоздатьОбъект("Справочник.РасчетныеСчета");
СпрСчет.ИспользоватьВладельца (СпрКонт.ТекущийЭлемент());
СпрСчет.НайтиПоНаименованию("Основной");
СпрНДС=СоздатьОбъект("Справочник.СтавкиНДС");
Код=1;
СпрНДС.НайтиПоКоду(Код,0);

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


А все распознанные реквизиты документа можно вывести на форму самой обработки в виде текстовых меток. Тогда такой вариант:

1. Обработка распознает штрих-код.
2. Выводит все переменные (можно текстовыми метками, можно опереатором Сообщить() и т.д., хоть таблицу - здесь на Ваше усмотрение).
3. Кнопочкой "Сформировать документ" по желанию формирует и записвает документ.

Итак, получилось 2 процедуры:
Код:
Процедура Сформировать()
//распределяем штрих код по реквизитам
Сообщить(СтрокаИдент);
КодНИ=Сред(СтрокаИдент,0,5);
Почтамт=Сред(СтрокаИдент,6,2);
ХЗ=Сред(СтрокаИдент,8,9);
КБК=Сред(СтрокаИдент,17,20);
ОКАТО=Сред(СтрокаИдент,37,11);
СуммаРуб=Сред(СтрокаИдент,48,7);
СуммаКоп=Сред(СтрокаИдент,55,2);
СуммаСтр=СуммаРуб+"."+СуммаКоп;
Сумма=Число(СуммаСтр);
СпрСчет=СоздатьОбъект("Справочник.РасчетныеСчета");
СпрСчет.ИспользоватьВладельца (СпрКонт.ТекущийЭлемент());
СпрСчет.НайтиПоНаименованию("Основной");
СпрНДС=СоздатьОбъект("Справочник.СтавкиНДС");
Код=1;
СпрНДС.НайтиПоКоду(Код,0);
КонецПроцедуры //Сформировать

Процедура СформироватьДокумент() // по кнопке
//начинаем создавать новый документ и заполнять
Док=СоздатьОбъект("Документ.ПлатежноеПоручение3");
Док.Новый();
Док.СтатусСоставителяПлДок="03";
Док.РасчетныйСчет=СпрБанк.ТекущийЭлемент();
Док.Контрагент=СпрКонт.ТекущийЭлемент();
Док.СтавкаНДС=СпрНДС.ТекущийЭлемент();
Док.СчетКонтрагента=СпрСчет.ТекущийЭлемент();
Док.Сумма=Сумма;
Док.НДС=0;
Док.ВидПлатежа=Перечисление.ВидыПлатежа.Электронно;
Док.СрокПлатежа="";
Док.Очередность="6";
Док.Содержание= Строка(ДатаОпл);
Док.КППплательщика=КПП;
Док.КППплательщика="290231001";
Док.ПеречислениеНалога=1;
Док.КодБК=КБК;
Док.КодОКАТО=ОКАТО;
Док.ПоказательТипа="";
Док.ПоказательОснования="";
Док.ПеречислениеНалога=1;
Док.Записать();
СтрокаИдент="";
КонецПроцедуры
Неизвестный
16.02.2009, 09:49
общий
Метод ОткрытьФорму (ОткрытьФормуМодально) работет только с уже созданным документом. Так что, если передумали сохранять открытый и изхмененный документ, воспользуйтес моим первым примером с вопросом перед записью документа. Если не нужно вообще создавать ненужные документы - то действуйте вторым способом, с явным указанием создания документа.
Неизвестный
16.02.2009, 15:08
общий
это ответ
Здравствуйте, Yla!

В Вашей процедуре документ создается, заполняется, потом записывается и показывается форма.
На первый взгляд я вижу, что перед записью документа нужно задать вопрос о сохранении:
Код:
Если Вопрос("Сохранить новый документ? ("+Док+")", "Да+Нет") = "Да" Тогда
Док.Сохранить();
КонецЕсли;

Но вообще-то этот вопрос лучше задавать ДО создания документа - тогда экономятся системные ресурсы и не делается ненужная запись в БД. Как это сделать - вопросом или по кнопке определите сами. В моем Приложении Ваша процедура разбита на две - распознавание штрих-кода и запись документа.

Я предлагаю такую схему:
1. Обработка распознает штрих-код.
2. Выводит все переменные (можно текстовыми метками, можно опереатором Сообщить() и т.д., хоть в таблицу - здесь на Ваше усмотрение).
3. Пользователь кнопочкой "Сформировать документ" по желанию формирует и записывает документ.

Успехов!
С уважением, Владимир.

Приложение:
Процедура Сформировать()
//распределяем штрих код по реквизитам
Сообщить(СтрокаИдент);
КодНИ=Сред(СтрокаИдент,0,5);
Почтамт=Сред(СтрокаИдент,6,2);
ХЗ=Сред(СтрокаИдент,8,9);
КБК=Сред(СтрокаИдент,17,20);
ОКАТО=Сред(СтрокаИдент,37,11);
СуммаРуб=Сред(СтрокаИдент,48,7);
СуммаКоп=Сред(СтрокаИдент,55,2);
СуммаСтр=СуммаРуб+"."+СуммаКоп;
Сумма=Число(СуммаСтр);
СпрСчет=СоздатьОбъект("Справочник.РасчетныеСчета");
СпрСчет.ИспользоватьВладельца (СпрКонт.ТекущийЭлемент());
СпрСчет.НайтиПоНаименованию("Основной");
СпрНДС=СоздатьОбъект("Справочник.СтавкиНДС");
Код=1;
СпрНДС.НайтиПоКоду(Код,0);
КонецПроцедуры //Сформировать

Процедура СформироватьДокумент() // по кнопке
//начинаем создавать новый документ и заполнять
Док=СоздатьОбъект("Документ.ПлатежноеПоручение3");
Док.Новый();
Док.СтатусСоставителяПлДок="03";
Док.РасчетныйСчет=СпрБанк.ТекущийЭлемент();
Док.Контрагент=СпрКонт.ТекущийЭлемент();
Док.СтавкаНДС=СпрНДС.ТекущийЭлемент();
Док.СчетКонтрагента=СпрСчет.ТекущийЭлемент();
Док.Сумма=Сумма;
Док.НДС=0;
Док.ВидПлатежа=Перечисление.ВидыПлатежа.Электронно;
Док.СрокПлатежа="";
Док.Очередность="6";
Док.Содержание= Строка(ДатаОпл);
Док.КППплательщика=КПП;
Док.КППплательщика="290231001";
Док.ПеречислениеНалога=1;
Док.КодБК=КБК;
Док.КодОКАТО=ОКАТО;
Док.ПоказательТипа="";
Док.ПоказательОснования="";
Док.ПеречислениеНалога=1;
Док.Записать();
СтрокаИдент="";
КонецПроцедуры
Неизвестный
16.02.2009, 20:12
общий
это ответ
Здравствуйте, Yla!
Вариант1 - документ без табличной части
Вырезка из моей работающей базы:
Процедура орлорлорп()
Конт="";
ОткрытьФорму("Документ.ПлатежноеПоручение3",Конт)Открыли форму нового документа, но не записали его.
Форма открылась, заполняем поля:
Конт.СтатусСоставителяПлДок="03";
КонецПроцедуры
Вариант 2 - документ с табличной частью
Подготавливаем данные табличной части
ТЗ=СодатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("ТМЦ","Справочник.Номенклатура");
ТЗ.НоваяСтрока();
ТЗ.ТМЦ=Мопгро;
Подготавливаем данные документа
Сп=СоздатьОбъект("СписокЗначений");
Сп.Установить("Сигнатура","ВованМолодецКакойКодПридумал");
Сп.Установить("СтатусСоставителяПлДок","03");
Сп.Установить("Данные",ТЗ);
ОткрытьФорму("Документ.ПлатежноеПоручение3",Сп)Открыли форму нового документа, но не записали его, и передали ему данные.
КонецПроцедуры
Теперь внутри документа нужно, используя данные, построить документ
Процедура ВводНового()
Сп=Форма.Параметр;
Если ТипЗначенияСтр(Сп)="СписокЗначений" Тогда
Если Сп.Получить("Сигнатура")="ВованМолодецКакойКодПридумал" Тогда
СтатусСоставителяПлДок=Сп.Получить("СтатусСоставителяПлДок");Шапка
ТЗ=Сп.Получить("Данные");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
НоваяСтрока();Табличная часть
ТМЦ=ТЗ.ТМЦ
Документ сформирован и показан на экране, но записан будет только по интерактивному нажатию кнопки ОК (с записью в журнале регистрации)
Если мой ответ Вам помог, то поблагодарите меня, пожалуйста.
Неизвестный
24.02.2009, 20:06
общий
Неа, метод ОткрытьФорму работает также и с несозданным документом.
ОткрытьФорму("Документ.ПлатежноеПоручение3",Конт) откроет форму нового, незаписанного документа.
После комманды КонецПроцедуры форма откроется, и в ней вызовутся, как и положено, сначала операторы которые идут после процедур, потом ВводНового, потом ПриОткрытии. Если эту форму закрыть крестиком и ответить "Не сохранять" то и следа в базе о документе не будет окромя записи в журнале регистрации "Документ не записан"
Форма ответа