|
Заполнение Документа на основании табличной части из формы | ☑ | ||
---|---|---|---|---|
0
Accountantrf
28.05.12
✎
16:08
|
Добрый день!
Решил попытаться автоматизировать свой труд, но возник вопросо, на которые не могу найти ответа в интернете. Описание проблеммы: Организация ежемесячно оказывает одинаковые услуги контрагентам. При этом контрагентов больше 100 и ежемесячное нажатие на кнопку "вставить копированием" существенно портит мою нервную систему. Описание обработки: Формирование списка документов ОказаниеУслуг за период - предыдущий месяц. Пользователь проставляет флажки напротив документов, которые надо скопировать в этом месяце. При нажатии на кнопку "Любую" создаются копированием выделенные документы. Вопрос возникшие на данный момент: Выгрузку необходимых данных в табличную часть формы я организовал, но теперь не под каким предлогом не могу заполнить документ, пробовал массу способов, найденных в интернете ни один не смог реализовать. Ниже приведен мой код. В части заполнения документа он не рабочий. Подскажиет пожалуйста в чем ошибка. Я только учусь =). &НаКлиенте Процедура Выгрузить(Команда) ОтборИнформации() КонецПроцедуры Процедура ОтборИнформации() Экспорт Запрос = Новый Запрос(); // КДС Запроос данных из формы Документы.ОказаниеУслуг Запрос.Текст = "ВЫБРАТЬ |Ссылка.Контрагент.Наименование КАК Контрагент, |Ссылка.Дата, |Ссылка.СуммаДокумента КАК Сумма, |Ссылка.ВидВзаиморасчетов, |Ссылка.Номенклатура, |Ссылка.СтавкаНДС, |Ссылка.СуммаВключаетНДС, |Контрагент.Наименование, |ДоговорКонтрагента.Наименование, |Количество, |Цена, |СчетУчетаРасчетовСКонтрагентом, |СчетУчетаРасчетовПоАвансам, |ВыданСФ, |Ссылка.Субконто КАК Тест |ИЗ |Документ.ОказаниеУслуг.Контрагенты |"; // КДС Получение Данных из Документы.ОказаниеУслуг их выгрузка //в таблицу значений Результат = Запрос.Выполнить().Выгрузить(); // КДС Загрузка в табличную часть формы Таблица.Загрузить(Результат); //Пока Результат.Следующий() Цикл // Сообщить(Результат.Наименование); //КонецЦикла КонецПроцедуры &НаКлиенте Процедура СформироватьАкты(Команда) ФормированиеАктов() КонецПроцедуры Процедура ФормированиеАктов() Экспорт Для Каждого Строка из Таблица Цикл НовыйДокумент = Документы.ОказаниеУслуг.СоздатьДокумент(); НовыйДокумент.Дата = КонецМесяца(ТекущаяДата()); НовыйДокумент.Контрагент = Таблица.Контрагент; НовыйДокумент.Записать(); КонецЦикла КонецПроцедуры |
|||
1
Maxus43
28.05.12
✎
16:09
|
&НаСервере надо документы создавать-заполнять
|
|||
2
Accountantrf
29.05.12
✎
08:20
|
&НаСервере так же не дало результатов. Может быть я использую неправильный код. Подскажите пожалуйста или сдайте ссылку где пример почитать.
|
|||
3
chelentano
29.05.12
✎
08:34
|
(0) наверное, не НовыйДокумент.Контрагент = Таблица.Контрагент, а НовыйДокумент.Контрагент = Строка.Контрагент; ?
|
|||
4
chelentano
29.05.12
✎
08:35
|
да и строку в таблицу добавить не мешало бы
|
|||
5
Accountantrf
29.05.12
✎
08:59
|
Форма имеет Таблицу значений как Таблица и колоники, указанной таблицы: Контрагент, сумма, дата, и пр... реквизиты для заполнения документа, в эти строки выгружаются запросом требуемые данные, после чего идет код на формирование нового документа и его заполнение:
&НаСервере Процедура ФормированиеАктов() Экспорт Для Каждого Строка из Таблица Цикл; НовыйДокумент = Документы.ОказаниеУслуг.СоздатьДокумент(); НовыйДокумент.Дата = КонецМесяца(ТекущаяДата()); НовыйДокумент.Контрагент = Строка.Контрагент; НовыйДокумент.Записать(); КонецЦикла КонецПроцедуры При таком варианте кода не происходи ровном счетом ничего, не выдает никаких ошибок и заодно не формирует документ. Если использовать такой код: &НаСервере Процедура ФормированиеАктов() Экспорт Для Каждого Строка из Таблица Цикл; НовыйДокумент = Документы.ОказаниеУслуг.СоздатьДокумент(); НовыйДокумент.Дата = КонецМесяца(ТекущаяДата()); ФормаДокумента = НовыйДокумент.ПолучитьФорму("ФормаДокумента"); ФормаДокумента.Контрагент = Строка.Контрагент; НовыйДокумент.Записать(); КонецЦикла КонецПроцедуры появляется сообщение при запусе обработки ошибка при вызове метода контекста: ФормаДокумента = НовыйДокумент.ПолучитьФорму("ФормаДокумента"); по причине Интерактивные операции недоступны. Если же использовать следующий код: &НаСервере Процедура ФормированиеАктов() Экспорт Для Каждого Строка из Таблица Цикл; НовыйДокумент = Документы.ОказаниеУслуг.СоздатьДокумент(); НовыйДокумент.Дата = КонецМесяца(ТекущаяДата()); НовыйДокумент.Заполнить(Таблица); НовыйДокумент.Записать(); КонецЦикла КонецПроцедуры То создаются документы, но в них заполнены поля Организация и Дата, при этом Контрагент и прочие поля упорно не заполняются. Перепробовав эти способы зашел в тупик, прошу вашей помощи. =) |
|||
6
PuhUfa
29.05.12
✎
09:04
|
>>Пользователь проставляет флажки напротив документов, которые надо скопировать в этом месяце
Ну тогда и копируй их просто. ДокументСсылка.<Имя документа> (DocumentRef.<Имя документа>) Скопировать (Copy) Синтаксис: Скопировать() Возвращаемое значение: Тип: ДокументОбъект. Описание: Создает новый документ копированием существующего. Доступность: Сервер, толстый клиент, внешнее соединение. Примечание: Использование метода не приводит к записи созданного объекта в базу данных. Пример: Объект = ВыбДокумент.Скопировать(); |
|||
7
Accountantrf
29.05.12
✎
10:29
|
Пытаясь обработать документ командой Скопировать()
Пишу: &НаСервере Процедура ФормированиеАктов() Экспорт ОказанеиУслуг = Новый(Тип("ДокументСсылка.ОказаниеУслуг")); ОказаниеУслуг.Скопировать(); КонецПроцедуры Выдает ошибку :Ошибка при вызове метода контекста (Скопировать) по причине Элемент не выбран! В моей внешней обработке выгружаются реквизиты документа, а как применить метод Скопировать() не очень мне понятно, подскажите пожалуйста, как привязать таблицу с реквизитами к документам и на основании этого скопировать документ или все-таки как правильно заполнять документ на основании полученных данных... |
|||
8
Ц_У
29.05.12
✎
10:37
|
(7) ОказанеиУслуг и ОказаниеУслуг найди 1 отличие
|
|||
9
Accountantrf
29.05.12
✎
10:42
|
Просто руками писал код на форум, допустил опечатку, в программе конечно
Процедура ФормированиеАктов() Экспорт ОказаниеУслуг = Новый(Тип("ДокументСсылка.ОказаниеУслуг")); ОказаниеУслуг.Скопировать(); КонецПроцедуры это к сожалению не корень моей проблеммы =( |
|||
10
PuhUfa
29.05.12
✎
10:50
|
(9) прочитай еще раз СП
|
|||
11
Accountantrf
29.05.12
✎
10:59
|
Что есть СП? И все-таки копированием не хотелось бы создавать документ. Может кто подскажет каким образом из имеющейся таблицы в форме перенести реквизит в документ, а я бы уж дальше сам разобрался. На просторах интернета не могу найти подходящий код.
|
|||
12
PuhUfa
29.05.12
✎
11:06
|
(11)
>>Что есть СП http://v8.1c.ru/overview/DeveloperTools3Sintax.htm >>И все-таки копированием не хотелось бы создавать документ Почему? Религия не позволяет? >>На просторах интернета не могу найти подходящий код. http://www.google.ru/search?client=opera&rls=ru&q=v8+программное+заполнение+документа&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest |
|||
13
Accountantrf
29.05.12
✎
12:16
|
Пересмотрел СП. Ничего нового для себя не вынес, буду еще смотреть.
Религия позволяет, но я же выгружаю запросом все реквизиты не для того что бы скопировать документ, поэтому метод заполнения мне более симпотичен и более гибок. Да оказалось гугл нашел больше полезной информации нежели яндекс =). И вот поизучав ее я осознал, что у меня проблема гораздо глубже, чем казалась на первый взгляд... Часть кода Процедура ОтборИнформации() Экспорт выгружает в таблицу формы все необходимые реквизиты, при попытке получить из этой таблицы необходимые значения выдает ошибку. Код: Процедура ФормированиеАктов() Экспорт Контрагент = Таблица.Контрагент; Сообщить (Контрагент); КонецПроцедуры Сообщает, что поле объекта контрагент не обнаружил, хотя в самой форме данный реквизит присутствует и корректно заполняется... |
|||
14
КонецЕсли
29.05.12
✎
12:33
|
1. НовыйОбъект = СуществующийОбъект.Скопировать();
НовыйОбъект.записать(); 2. Контрагент = Таблица.Контрагент Таблица - это что? Таблица? Контрагент это что? Колонка таблицы? Чтож ты хочешь от колонки всей таблицы? Таблица[0].Контрагент - значение из первой строки таблицы Таблица[1].Контрагент - значение из второй строки таблицы ... |
|||
15
Accountantrf
29.05.12
✎
13:18
|
Таблица - Реквизит Формы тип(ТаблицаЗначений).Контрагент - колонка.
КонецЕсли - ты обсалютно прав, если использовать Таблица[0].Контрагент то сообщает значение!А еще для каждой строки можно написать Цикл. Для Каждого Стр ИЗ Таблица Цикл; Сообщить(Стр.Контрагент); КонецЦикла А вот с копированием не могу разобраться. У меня есть 20 строк в таблице Формы, но там не хранится СуществующийОбъект, там только его реквизиты, которые нужно перенести в НовыйОбъект, чем сейчас и озадачен. |
|||
16
КонецЕсли
29.05.12
✎
13:35
|
Чем озадачен то?
НовыйДокумент= Документы.ОказаниеУслуг.СоздатьОбъект(); НовыйДокумент.реквизит1=Значение1; НовыйДокумент.реквизит2=Значение2; ... Для каждого СтрокаТЧ из ИмеющаясяТабЧасть Цикл НоваяСтрокаТЧНовогоДокумента=НовыйДокумент.ТабЧасть.Добавить(); НоваяСтрокаТЧНовогоДокумента.реквизит1=СтрокаТЧ.Значение1; НоваяСтрокаТЧНовогоДокумента.реквизит2=СтрокаТЧ.Значение2; ... КонецЦикла; НовыйДокумент.Записать(); |
|||
17
Accountantrf
29.05.12
✎
13:50
|
Да вот в этом вся и суть вопроса.
НовыйДокумент= Документы.ОказаниеУслуг.СоздатьОбъект(); Создает документ, без проблем. НовыйДокумент.реквизит1=Значение1; допустим НовыйДокумент.Дата=ТекущаяДата(); Дату устанавливает без проблем, а вот дальше ничего не подставляет в значение реквизитов и не могу от него добиться =(. Допустим НовыйДокумент.Организация = Стр.Организация; Остается обсалютно без результата. При этом если ставлю Сообщить(Стр.Организация); Сообщает все как надо, уже весь мозг сломал, как реквизиты заполнять. НовыйДокумент.Записать(); Ну и сохраняет докумен корректно |
|||
18
tashi_ork
29.05.12
✎
13:59
|
Дай текущий код обработки. В первоначальном варианте у тебя не запрос не выбирал организацию.
Контрагент у тебя не заполняется потому, что ты в запросе получаешь строку с наименованием контрагента и пытаешься записать ее в реквизит ссылочного типа. Т.е. проще говоря - в запросе замени "Ссылка.Контрагент.Наименование" на "Ссылка.Контрагент". И не вижу никаких условий в запросе. Ты что, получаешь список всех документов? |
|||
19
Accountantrf
29.05.12
✎
14:06
|
&НаКлиенте
Процедура Выгрузить(Команда) ОтборИнформации() КонецПроцедуры &НаСервере Процедура ОтборИнформации() Экспорт Запрос = Новый Запрос(); // КДС Запроос данных из формы Документы.ОказаниеУслуг Запрос.Текст = "ВЫБРАТЬ |Ссылка.Контрагент.Наименование КАК Контрагент, |Ссылка.Организация.Наименование КАК Организация, |Ссылка.Дата, |Ссылка.СуммаДокумента КАК Сумма, |Ссылка.ВидВзаиморасчетов, |Ссылка.Номенклатура, |Ссылка.СтавкаНДС, |Ссылка.СуммаВключаетНДС, |Контрагент.Наименование, |ДоговорКонтрагента.Наименование, |Количество, |Цена, |СчетУчетаРасчетовСКонтрагентом, |СчетУчетаРасчетовПоАвансам, |ВыданСФ, |Ссылка.Субконто |ИЗ |Документ.ОказаниеУслуг.Контрагенты |"; // КДС Получение Данных из Документы.ОказаниеУслуг их выгрузка //в таблицу значений Результат = Запрос.Выполнить().Выгрузить(); // КДС Загрузка в табличную часть формы Таблица.Загрузить(Результат); //Пока Результат.Следующий() Цикл // Сообщить(Результат.Наименование); //КонецЦикла КонецПроцедуры &НаКлиенте Процедура СформироватьАкты(Команда) ФормированиеАктов() КонецПроцедуры &НаСервере Процедура ФормированиеАктов() Экспорт Для каждого Стр из Таблица Цикл ОказаниеУслуг = Документы.ОказаниеУслуг.СоздатьДокумент(); ОказаниеУслуг.Дата = КонецМесяца(ТекущаяДата()); ОказаниеУслуг.Организация = Стр.Организация; Сообщить(Стр.Организация); ОказаниеУслуг.Записать(); КонецЦикла //ОказаниеУслуг = Новый(Тип("ДокументСсылка.ОказаниеУслуг")); //ОказаниеУслуг.Скопировать(Выборка); //Контрагент = Строка.Контрагент; //НовыйДокумент = Документы.ОказаниеУслуг.СоздатьДокумент(); //НовыйДокумент.Дата = КонецМесяца(ТекущаяДата()); //НовыйДокумент.Контрагент = Строка.Контрагент; //НовыйДокумент.Контрагент = Контрагент; //ФормаДокумента = НовыйДокумент.ПолучитьФорму("ФормаДокумента"); //ФормаДокумента.Контрагент = Строка.Контрагент; //НовыйДокумент.Контрагент = Таблица.Контрагент; //Сообщить(ТекущаяДата()); //НовыйДокумент.Записать(); //Возврат НовыйДокумент.Ссылка; //КонецЦикла КонецПроцедуры Условия прикручу позже (пока весь список), оно будет не сложное, сейчас же дело за заполнением реквизита, а по контрагенту сейчас попробую заменить... |
|||
20
Accountantrf
29.05.12
✎
14:10
|
Ну с организаций тоже самое получается, значет мне нужно получить ссылку вместо наименований и тогда их можно будет приделать к новому документу?
|
|||
21
hhhh
29.05.12
✎
14:11
|
(19) там у тебя наименований немеряно. Все выкидывай. И напиши у себя на ладони где-нибудь: "НЕ писать наименование, НЕ писать наименование, не писать наименование...".
|
|||
22
Accountantrf
29.05.12
✎
14:18
|
Ну наименование я везде исключил у себя, но при этом он все равно не заполняет реквизит формы.
|
|||
23
Accountantrf
29.05.12
✎
14:24
|
Все, разобрался, тип у реквизитов формы был выбран не правильно! ВСЕМ СПАСИБО ОГРОМНОЕ!, а то и не знал чего делать!
|
|||
24
tashi_ork
29.05.12
✎
14:26
|
Используй процедуру "ЗаполнитьЗначенияСвойств". Сильно сократит количество кода.
Только учти, что имена реквизитов должны совпадать. |
|||
25
Accountantrf
31.05.12
✎
11:09
|
Обработка выгружает данные в таблицу формы, на основании полученных данных создает акты, но возникла новая проблемма, когда руками проделываешь процедуру записис акта, то автоматически формируется счет-фактура под акт, при програмном заполнение и сохранение, конечно не срабатывают процедуры, предусмотренные в модуле формы ОказаниеУслуги и С/Ф не формируется, для этого надо руками заходить в каждый документ и пересохранять. При попытке перенести код из модуля формы в мою обработку ничего не получается, т.к. используется ТекущийОбъект, он как я понимаю срабатывает только при открытой форме. Хотел спросить можно ли програмно с эмитировать открытие заполненой формы и проведени ее или из обработки запустить процесс формы документа. Или какие-нибудь альтернативные варианты, если кто-то уже сталкивался с такой проблеммой?
&НаКлиенте Процедура Выгрузить(Команда) ОтборИнформации() КонецПроцедуры &НаСервере Процедура ОтборИнформации() Экспорт Запрос = Новый Запрос(); // КДС Запроос данных из формы Документы.ОказаниеУслуг Запрос.Текст = "ВЫБРАТЬ |Ссылка.Контрагент КАК Контрагент, |Ссылка.Организация КАК Организация, |Ссылка.Дата, |Ссылка.ВидВзаиморасчетов, |Ссылка.Номенклатура, |Ссылка.ВалютаДокумента КАК ВалютаДокумента, |Ссылка.СтавкаНДС, |Ссылка.СуммаВключаетНДС, |Ссылка.Ответственный КАК Ответственный, |Ссылка.СчетДоходов КАК СчетДоходов, |Ссылка.СчетУчетаНДСПоРеализации КАК СчетУчетаНДСПоРеализации, |Ссылка.СчетРасходов КАК СчетРасходов, |ДоговорКонтрагента КАК ДоговорКонтрагента, |Количество КАК Количество, |Цена КАК Цена, |Сумма КАК Сумма, |СуммаНДС КАК СуммаНДС, |СчетУчетаРасчетовСКонтрагентом КАК СчетУчетаРасчетовСКонтрагентом, |СчетУчетаРасчетовПоАвансам КАК СчетУчетаРасчетовПоАвансам, |ВыданСФ КАК ВыданСФ, |Ссылка.Субконто КАК Субконто, |СчетФактура КАК СчетФактура |ИЗ |Документ.ОказаниеУслуг.Контрагенты |"; // КДС Получение Данных из Документы.ОказаниеУслуг их выгрузка //в таблицу значений Результат = Запрос.Выполнить().Выгрузить(); // КДС Загрузка в табличную часть формы Таблица.Загрузить(Результат); //Пока Результат.Следующий() Цикл // Сообщить(Результат.Наименование); //КонецЦикла КонецПроцедуры &НаКлиенте Процедура СформироватьАкты(Команда) ФормированиеАктов() КонецПроцедуры &НаСервере Процедура ФормированиеАктов() Экспорт Для каждого Стр из Таблица Цикл ОказаниеУслуг = Документы.ОказаниеУслуг.СоздатьДокумент(); ОказаниеУслуг.Дата = КонецМесяца(ТекущаяДата()); ОказаниеУслуг.Организация = Стр.Организация; ОказаниеУслуг.Контрагент = Стр.Контрагент; ОказаниеУслуг.Субконто = Стр.Субконто; ОказаниеУслуг.СчетДоходов = Стр.СчетДоходов; ОказаниеУслуг.СчетУчетаНДСПоРеализации = Стр.СчетУчетаНДСПоРеализации; ОказаниеУслуг.СчетРасходов = Стр.СчетРасходов; ОказаниеУслуг.ВидВзаиморасчетов = Стр.ВидВзаиморасчетов; ОказаниеУслуг.ВалютаДокумента = Стр.ВалютаДокумента; ОказаниеУслуг.Ответственный = Стр.Ответственный; ОказаниеУслуг.Номенклатура = Стр.Номенклатура; ОказаниеУслуг.СтавкаНДС = Стр.СтавкаНДС; ОказаниеУслуг.СуммаВключаетНдс = Стр.СуммаВключаетНДС; //Сообщить(Стр.НомерСтроки); НоваяСтрокаТЧ = ОказаниеУслуг.Контрагенты.Добавить(); НоваяСтрокаТЧ.Контрагент = Стр.Контрагент; НоваяСтрокаТЧ.ДоговорКонтрагента = Стр.ДоговорКонтрагента; НоваяСтрокаТЧ.Количество = Стр.Количество; НоваяСтрокаТЧ.Цена = Стр.Цена; НоваяСтрокаТЧ.Сумма = Стр.Сумма; НоваяСтрокаТЧ.СуммаНДС = Стр.СуммаНДС; НоваяСтрокаТЧ.СчетФактура = Стр.СчетФактура; НоваяСтрокаТЧ.СчетУчетаРасчетовСКонтрагентом = Стр.СчетУчетаРасчетовСКонтрагентом; НоваяСтрокаТЧ.СчетУчетаРасчетовПоАвансам = Стр.СчетУчетаРасчетовПоАвансам; НоваяСтрокаТЧ.ВыданСФ = Стр.ВыданСФ; //ОказаниеУслуг.Записать(РежимЗаписиДокумента.Проведение); ОказаниеУслуг.Записать(); КонецЦикла //ОказаниеУслуг = Новый(Тип("ДокументСсылка.ОказаниеУслуг")); //ОказаниеУслуг.Скопировать(Выборка); //Контрагент = Строка.Контрагент; //НовыйДокумент = Документы.ОказаниеУслуг.СоздатьДокумент(); //НовыйДокумент.Дата = КонецМесяца(ТекущаяДата()); //НовыйДокумент.Контрагент = Строка.Контрагент; //НовыйДокумент.Контрагент = Контрагент; //ФормаДокумента = НовыйДокумент.ПолучитьФорму("ФормаДокумента"); //ФормаДокумента.Контрагент = Строка.Контрагент; //НовыйДокумент.Контрагент = Таблица.Контрагент; //Сообщить(ТекущаяДата()); //НовыйДокумент.Записать(); //Возврат НовыйДокумент.Ссылка; //КонецЦикла КонецПроцедуры |
|||
26
tashi_ork
31.05.12
✎
18:48
|
Объект можно получить из ссылки функцией ПолучитьОбъект(). С заполнением нужно смотреть в каждом конкретном случае, можно попытаться выдрать код, который отрабатывает в форме, и вставить в свою обработку.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |