Имя: Пароль:
1C
1С v8
Программное создание счетнаоплатупокупателя
0 капитошка_
капитонов
 
04.09.14
10:52
Добрый день.
Я немного отчаялся, знаю что тема платиновая, перегуглил гугл - но нормального ответа так и не нашел.
Есть один вебсервис. И этот вебсервис должен возвращать base64 бинарник с файлом.

На данный момент не записывается счет. Выдает ошибку {WebСервис.testWS.Модуль(128)}: Ошибка при вызове метода контекста (Записать): Не удалось записать: "Счет на оплату покупателю"!
Перелопатил все форумы, как я понимаю, что-то я заполняю не так. Вопрос только что.
Как например заполнить поле б/счет, касса? Я так понимаю оно обязательное, но у документа Счетнаоплатупокупателю нет такого поля(пытаюсь засунуть значение в СтруктурнаяЕдиница, не уверен что это верно).
В общем, помогите, пожалуйста.
Код функции

Функция createBill(INN,Summ)
    
    
  Если ПустаяСтрока(INN) ИЛИ Summ = 0 Тогда
  Возврат "empty data";
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст =
  "ВЫБРАТЬ ПЕРВЫЕ 1
  | Контрагенты.Ссылка, Контрагенты.ОсновнойДоговорКонтрагента.Ссылка КАК договор
  |ИЗ
  | Справочник.Контрагенты КАК Контрагенты
  |ГДЕ
  | Контрагенты.ИНН = &ИНН";

Запрос.УстановитьПараметр("ИНН", INN);

Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() = 0 Тогда
   Возврат "client not found";;
КонецЕсли;
                    
СчетДок = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
СчетДок.Дата = ТекущаяДата();
СчетДок.Контрагент =Результат[0].Ссылка;
//СчетДок.СуммаДокумента = Summ;
Организ=     Справочники.Организации.НайтиПоКоду(000000001).Ссылка;

СчетДок.ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.НайтиПоКоду("УТ0000162").Ссылка;

СчетДок.Организация=Организ;
СчетДок.СтруктурнаяЕдиница=Справочники.БанковскиеСчета.НайтиПоКоду(000000001).Ссылка;
ТабДок = Новый ТабличныйДокумент;

                                        
попытка
   СчетДок.Записать();
Возврат "Все ок";  
исключение
    сообщить(ОписаниеОшибки());
    Возврат ОписаниеОшибки();
конецпопытки;
                

      // ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
  
//ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
//ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);


            // Возврат ДанныеФайла;
КонецФункции
1 NcSteel
 
04.09.14
10:53
ник слишком длинный из принципа помогать не буду )
2 Михаил Козлов
 
04.09.14
10:57
Посмотрите в модуле документа Счет на оплату процедуры проверки шапки и табличных частей. Какие реквизиты обязательны к заполнению.
Похоже у Вас договор контрагента не соответствует организации и контрагенту.
3 капитошка_
капитонов
 
04.09.14
11:42
>Посмотрите в модуле документа Счет на оплату процедуры проверки шапки и табличных частей

Я честно говоря лютый нуб в этом во всем, посмотрел в макет СчетНаОплату, обязательны атрибуты Контрагента, атрибуты продавца и атрибуты товаров.
Но видимо смотрел я не туда, ибо сам по себе счет из интерфейса создается с небольшим набором полей
Организация, банк/счет, Контрагент, Договор(с контрагентом), Дата.

>Похоже у Вас договор контрагента не соответствует организации и контрагенту.
В смысле заключен не с той организацией/не тому контрагенту принадлежит?
Нет, договор я захардкодил.

Как минимум нашел 1 проблему - НайтиПоКоду должно содержать в себе строку, я же передавал decimal и результат был пустой(почему не NULL?)

В любом случае, ошибка не исчезла.
4 lxndr
 
04.09.14
11:46
(3) забей свой код в отдельную обработку, посмотри ошибки при обычном выполнении (например, включи остановку по ошибке)
5 капитошка_
капитонов
 
04.09.14
12:12
(4) Не очень понял как мне это сделать, извините.
Создал обработку, засунул в команды свой код, пустую форму, запускаю отладку, открываю обработку тыкаю на кнопку выполнить - естественно ничего не происходит = )

У меня управление торговлей, если что.

Давайте пойдем простым путем.
Я понимаю, что вероятнее всего я что-то не заполняю в счете.
Сейчас я просто вытащу запросом все поля из счета существующего и выведу для себя и узнаю что я не заполняю как надо
6 Михаил Козлов
 
04.09.14
12:21
(3) Контрагента Вы ищете по ИНН, а договор - по коду. Откуда уверенность, что этот договор соответствует организации и контрагенту? Попробуйте "сообщить" наименование контрагента (и организации) из документа и из договора.
7 капитошка_
капитонов
 
04.09.14
12:30
(6) Да, уже попробовал. Все верно, все совпадает
8 lxndr
 
04.09.14
12:41
9 капитошка_
капитонов
 
04.09.14
13:12
(8) Мегакруто, спасибо.

Невозможно записать документ: Счет на оплату покупателю  от 04.09.2014 13:09:25
Не заполнено значение реквизита "Организация"!
Не заполнено значение реквизита "Валюта документа"!
Не заполнено значение реквизита "Банк/касса"!
Не заполнено значение реквизита "Кратность взаиморасчетов"!
{Обработка.СоздатьСчет.Форма.Форма.Форма(40)}: Ошибка при вызове метода контекста (Записать): Не удалось записать: "Счет на оплату покупателю"!


С валютой я согласен. С Кратностью тоже.
Но Организацию я же заполнил(выводил отдельно, ссылка должна передаваться). А банк/касса так и не понял куда заполнять, нет такого поля у счета =\(8)
10 lxndr
 
04.09.14
13:14
(9) теперь по порядку
Организ=     Справочники.Организации.НайтиПоКоду(000000001).Ссылка;

Надо хотя бы так:
Организ=     Справочники.Организации.НайтиПоКоду("000000001").Ссылка;
11 lxndr
 
04.09.14
13:15
лучше без ссылки.
12 капитошка_
капитонов
 
04.09.14
13:25
(10)
Да это я уже переделал, код теперь примерно такой



                          Функция createBill(INN,Summ)
    
    typeFile = ФабрикаXDTO.Тип("http://www.sample-package.org";, "File");
                              
// текФайл = ФабрикаXDTO.Создать(typeFile);
//текФайл.binaryData = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "base64Binary"));
// текФайл.ext = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "string"));
  Если ПустаяСтрока(INN) ИЛИ Summ = 0 Тогда
// текФайл.message = "empty data";
  Возврат "empty data";
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст =
  "ВЫБРАТЬ ПЕРВЫЕ 1
  | Контрагенты.Ссылка, Контрагенты.ОсновнойДоговорКонтрагента.Ссылка КАК договор
  |ИЗ
  | Справочник.Контрагенты КАК Контрагенты
  |ГДЕ
  | Контрагенты.ИНН = &ИНН";

Запрос.УстановитьПараметр("ИНН", INN);

Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() = 0 Тогда
// текФайл.message = "client not found";
  Возврат "client not found";;
КонецЕсли;
                    
СчетДок = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
СчетДок.Дата = ТекущаяДата();
СчетДок.Контрагент =Результат[0].Ссылка;
//СчетДок.СуммаДокумента = Summ;
Организ=Справочники.Организации.НайтиПоКоду("000000001").Наименование;

СчетДок.ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.НайтиПоКоду("УТ0000162").Ссылка;

СчетДок.Организация=Справочники.Организации.НайтиПоКоду("000000001").Ссылка;
Возврат Строка(СчетДок.Организация.Наименование);//Возвращает то что и должен
СчетДок.СтруктурнаяЕдиница=Справочники.БанковскиеСчета.НайтиПоКоду("000000001").Ссылка; //Возвращает что и должен
ТабДок = Новый ТабличныйДокумент;
// ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(СчетДок,"СчетЗаказ");
      



попытка
   СчетДок.Записать();
Возврат "Все ок";  
исключение
    сообщить(ОписаниеОшибки());
    Возврат ОписаниеОшибки();
конецпопытки;
                

       ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
  
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);

//текФайл.binaryData = ДанныеФайла;
//текФайл.message = "ok";
// текФайл.ext = "pdf";
             Возврат ДанныеФайла;
КонецФункции
13 hhhh
 
04.09.14
13:39
(12) ну, за это

СчетДок.ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.НайтиПоКоду("УТ0000162").Ссылка;

в нормальных фирмах сразу расстреливают. Пиши

СчетДок.ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.НайтиПоКоду("УТ0000162");
14 капитошка_
капитонов
 
04.09.14
13:40
Товарищи, ура.
Счет создался.

В конечном итоге, хоть и выводилась ошибка о незаполнености организации и банк/счета все заполняется ок.
Добавил два поля - кратность и валюту и счет создался.

(8) +200 в карму, еще бы ты объяснил как подобную ерундистику(обработку с формой) сделать самому и совсем золотой стал бы
15 капитошка_
капитонов
 
04.09.14
13:43
(13) А за что расстреливают? Типа НайтиПоКоду возвращает целиком структуру, а .Ссылка только ссылку на структуру?
Но в документации написано что НайтиПоКоду возвращает таки Ссылку на структуру, чтобы это не значило
16 hhhh
 
04.09.14
13:52
(15) ну, и зачем ты у Ссылки получаешь еще ссылку?  Одной ссылки тебе мало? Время-то нехило тратишь.
17 капитошка_
капитонов
 
04.09.14
14:09
(16) i have to go deeper

Вот еще какая проблема.
Есть теперь у меня счет и я хочу его сохранить как PDF.
Макет стандартный, заполняется тоже стандартно, по существующим параметрам.

Вот тут http://help1c.com/faq/view/1566.html
Описано что печатать в табличный документ надо делать через

Документы.Счет.Печать(ТабДок, СчетДок.Ссылка);

Который потом мы записываем как pdf и возвращаем что нам надо.

Однако, код, я так понимаю, написано для 8.3, в 8.2(а у меня 8.2) это не работает.

Как заполнить табличный документ стандартным методом(без перечисления каждого объекта)?
18 elCust
 
04.09.14
14:13
А как это будет работать?

СчетДок.Контрагент =Результат[0].Ссылка;

если в запросе поля только

Контрагенты.Ссылка, Контрагенты.ОсновнойДоговорКонтрагента.Ссылка КАК договор
19 капитошка_
капитонов
 
04.09.14
14:16
(18) Что именно это?
СчетДок.Контрагент принимает в себя результат выборки Контрагенты.Ссылка, что не так?
20 elCust
 
04.09.14
14:16
(19) КАК договор
21 elCust
 
04.09.14
14:17
Тогда пиши СчетДок.Контрагент =Результат[0].Договор;
22 капитошка_
капитонов
 
04.09.14
14:17
(20) как договор там  Контрагенты.ОсновнойДоговорКонтрагента.Ссылка. А ссылка на контрагента без алиаса
23 elCust
 
04.09.14
14:18
А, ну да. Не увидел ссылку.
24 hhhh
 
04.09.14
14:21
(18) вообще-то Документы.Счет.Печать(ТабДок, СчетДок.Ссылка);
- это из 8.2. Там нет ничего из 8.3.
25 капитошка_
капитонов
 
04.09.14
14:22
(24) От чего тогда возвращается что метод Печать не найден у объекта?
26 hhhh
 
04.09.14
14:26
(25) это не метод, обычная процедурка. Или функция. Значит, нет ее там. Просто посмотрите, есть она там или правда нет.
27 капитошка_
капитонов
 
04.09.14
14:36
(26) Посмотрел - нету. Во всяком случае автоподстановщик не хочет видеть никакой печати.

Вопрос: Как?

Есть СчетДок.Печать();
Но при присваивании ТабДок=СчетДок.Печать();
я так понимаю ничего полезного не произойдет.
28 капитошка_
капитонов
 
04.09.14
14:59
Разобрался.
Надо делать вот так


ТабДок=СчетДок.ПолучитьМакет("СчетЗаказ");

Дальше как обычно
29 капитошка_
капитонов
 
04.09.14
15:07
(28) Нет, не канает.
Base64 конечно возвращает, но PDFка пустая. Ничего не заполняется = )
30 hhhh
 
04.09.14
15:30
напишите свою функцию Печать(). В типовой конфе Печать() - это не функция, а процедура, поэтому ничего не возвращает.
31 капитошка_
капитонов
 
04.09.14
15:42
(30) Я не очень понимаю логику, честно говоря.

У меня есть объект. У объекта есть макет - описание как его печатать, я так понимаю.
Есть функция готовая, которая печатает(как то же из интерфейса объект печатается ведь).
Вопрос - как использовать эту самую функцию?

Что надо вернуть в Печать()? Заполненный табличный документ?

Неужто нет никакого метода у объекта заполнить готовый макет
32 Garykom
 
гуру
04.09.14
15:48
(31) какой напишешь такой и будет метод...
33 hhhh
 
04.09.14
15:55
(31) ну открыть модуль документа Счет и скопипастить к себе в обработку, потом творчески переработать.
34 Garykom
 
гуру
04.09.14
16:00
(32)+ и да макет это не "описание как его печатать" а описание в каком виде его печатать, т.е. внешнее оформление а не данные!

ЗЫ Слегка шаг в назад (или вперед или в сторону) от 1С 7.7 там можно было в макеты (точнее таблицы) засовывать путь до данных относительно какого то объекта метаданных типа лдокДокумент.ДатаДок
35 капитошка_
капитонов
 
04.09.14
16:08
(33) Открываю форму документа СЧетНаОплатуПокупателю, смотрю.

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

Процедура ОсновныеДействияФормыДействиеПечать(Кнопка)

    УниверсальныеМеханизмы.НапечататьДокументПоУмолчанию(ЭтотОбъект);

КонецПроцедуры // ОсновныеДействияФормыДействиеПечать()


Все ок, яснопонятно.
Вставляю себе УниверсальныеМеханизмы.НапечататьДокументПоУмолчанию(СчетДок);
Результат нет метода НапечататьДокументПоУмолчанию.


Этот же форум говорит, что это потому что я требую у клиента то чего у него нет
v8: Метод объекта не обнаружено (НапечататьДокументПоУмолчанию)

Дело в теме закончилось тем, что товарищ забил и "написал свою процедуру печать"

В конечном итоге, я так понимаю, что я должен пойти по пути
ЗагрузитьОбласть->ЗаполнитьОбласть->ТабДок.Записать
Верно?

Как то тоскливо
36 hhhh
 
04.09.14
16:11
ну, почитайте про модуль документа и чем он отличается от модуля формы документа. Нельзя же так нереально тупить.
37 hhhh
 
04.09.14
16:13
вот у меня такое

Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, НепосредственнаяПечать = Ложь) Экспорт
    
    // Получить экземпляр документа на печать
    Если ИмяМакета = "Счет" Тогда
        
        ТабДокумент = ПечатьСчетаЗаказа(ИмяМакета);
        
    КонецЕсли;
    
    УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(ЭтотОбъект, ""), НепосредственнаяПечать);
    
КонецПроцедуры // Печать


как видите оно никакого ТабДОк не возвращает, а само печатает или выводит на экран.
38 капитошка_
капитонов
 
04.09.14
16:42
(37) Ок
У меня есть вот такое


Функция ПечатьСчетаЗаказа(Тип) Экспорт

    Возврат СоздатьТабличныйДокументПечатиСчетаЗаказа(Тип, ПолучитьПараметрыПечатиСчетаЗаказа(Тип));

КонецФункции


Очень нравится! Возвращает что нужно и вообще. Можно использовать в вебсервисе обращаясь как к методу. Но возвращается что метод такой не найден у объекта. Как так?

Я конечно дебил, вы уж извините, но в этих джунглях логики 1с разобраться я не в силах
39 hhhh
 
04.09.14
16:55
а как вызываете этот метод?
40 капитошка_
капитонов
 
04.09.14
16:56
(39)

ТабДок=СчетДок.ПечатьСчетаЗаказа("Счет")
41 капитошка_
капитонов
 
04.09.14
17:03
Короче, победа.

Достаточно было скопировать из модуля документа(Документы->СчетНаОплатуПокупателю->Правой Кнопкой->Открыть Модуль) функцию СоздатьТабличныйДокументПечатиСчетаЗаказа целиком.

Передать в нее "Счет", СчетДок.ПолучитьПараметрыПечатиСчетаЗаказа("Счет");

Получившийся табличный документ засунуть в ТабДок и дальше как в примерах.

Всем спасибо.
2 + 2 = 3.9999999999999999999999999999999...