|
|
|
Программное создание счетнаоплатупокупателя | ☑ | ||
|---|---|---|---|---|
|
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
|
(5) https://drive.google.com/file/d/0BznMls9nyJ0cRkVlcVBnc0tiQ2M/edit?usp=sharing
Качни, запусти, почитай |
|||
|
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
|
Короче, победа.
Достаточно было скопировать из модуля документа(Документы->СчетНаОплатуПокупателю->Правой Кнопкой->Открыть Модуль) функцию СоздатьТабличныйДокументПечатиСчетаЗаказа целиком. Передать в нее "Счет", СчетДок.ПолучитьПараметрыПечатиСчетаЗаказа("Счет"); Получившийся табличный документ засунуть в ТабДок и дальше как в примерах. Всем спасибо. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |