Имя: Пароль:
1C
1С v8
Заполнение Документа на основании табличной части из формы
,
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
Объект можно получить из ссылки функцией ПолучитьОбъект(). С заполнением нужно смотреть в каждом конкретном случае, можно попытаться выдрать код, который отрабатывает в форме, и вставить в свою обработку.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой