В своё время мне нужен был код создания документа через обработку, пол дня потерял пока нашёл гайд по решению данной задачи. Поэтому просто решил поделиться данным решением. Подойдёт только новичкам, опытные программисты могут даже не читать =)
Подробная иструкция с комментариями ниже:
Код выполняется на сервере.
// Создаём пустую форму документа
НовыйЭлемент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Выбираем вид операции документа
НовыйЭлемент.ВидОперации =Перечисления.ВидыОперацийРеализацияТоваров.Услуги;
// Выбираем организацию
НовыйЭлемент.Организация = Справочники.Организации.НайтиПоКоду("0000001");
//Выбираем подразделение
НовыйЭлемент.ПодразделениеОрганизации = Справочники.ПодразделенияОрганизаций.НайтиПоКоду("001");
//Выбираем контрагента
НовыйЭлемент.Контрагент = Справочники.Контрагенты.НайтиПоКоду(выборка.Код);
//Выбираем Договор
НовыйЭлемент.ДоговорКонтрагента = выборка.Договор;
//Если БП, то выбираем и счета, но искать по коду на самом деле не корректно
НовыйЭлемент.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПокоду("543.01");
НовыйЭлемент.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.НайтиПокоду("211.01");
//Выбираем валюту
НовыйЭлемент.ВалютаДокумента = Справочники.Валюты.НайтиПоНаименованию("AZN");
//Устанавливаем Дату
НовыйЭлемент.Дата = ТекущаяДата();
//Если БП ставим способ зачета
НовыйЭлемент.СпособЗачетаАвансов = Перечисления.СпособыЗачетаАвансов.Автоматически;
//НДС документа
НовыйЭлемент.ДокументБезНДС = истина;
// ----------------
//Работаем с табличной частью
//Создаём строку табличной части
Строка = НовыйЭлемент.Услуги.Добавить();
//Выбираем номенклатуру
Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Объект.Тариф);
//Выбираем ставку НДС строки
Строка.СтавкаНДС = Перечисления.СтавкиНДС.БЕЗНДС;
// Если БП, то Выбираем счет учёта номенклатуры, повторюсь: искать по коду на самом деле не корректно
Строка.СчетДоходов = ПланыСчетов.Хозрасчетный.НайтиПокоду("542.01");
Строка.СчетРасходов = ПланыСчетов.Хозрасчетный.НайтиПокоду("701.01");
//Определяем цену, у Вас скорее всего будет просто цена из выборки
Строка.Цена = Число(ттариф) * Число(ккв);
// Количество
Строка.Количество = 1;
// Определяем сумму
Строка.Сумма = Число(ттариф) * Число(ккв) * число(Строка.Количество);
// Проводим документ
НовыйЭлемент.Записать(РежимЗаписиДокумента.Проведение)
Проведём подробный анализ кода:
Под комментарием: "Создаём пустую форму документа":
Мы создаём сам документ как объект.
Под комментарием: "Выбираем вид операции документа":
У документа реализация товаров и услуг есть несколько видов операции, в основном это "товары" и "услуги". По той, причине, что код был использован в БП 3.0, а там есть оба этих видов операции и по ТЗ нужно было выбирать услуги, я выбираю услуги:
"НовыйЭлемент.ВидОперации =Перечисления.ВидыОперацийРеализацияТоваров.Услуги;" — тут услуги можете поменять на товары и тогда создать документ "Реализация товаров и услуг с табличной частью товары".
Под коммментарием: "Выбираем организацию":
Тут мы ищем объект в справочнике "Оргазиции" по его коду. Допустим у Вас несколько организаций, система для каждого из них выдаёт код, вот по этому коду и ищем.
Под коммментарием: "Выбираем подразделение":
Тут мы ищем объект в справочнике "ПодразделенияОрганизаций" по его коду. Допустим у Вас несколько подразделений, система для каждого из них выдаёт код, вот по этому коду и ищем.
Под коммментарием: "Выбираем Контрагента":
Тут мы ищем объект в справочнике "Контрагенты" по его коду. Система для каждого контрагента выдаёт код, вот по этому коду и ищем.
Под коммментарием: "Выбираем Договор":
У меня там стоит "Выборка.Договор" потому, что я ранее, до этого кода, получал договор по запросу, вы можете также искать по коду или по реквизиту.
Под коммментарием: "Если БП, то выбираем и счета, но искать по коду на самом деле не корректно":
Лучше всего указывать название счета, к примеру: ПланыСчетов.Хозрасчетный.ДоходОтПродаж;
Под коммментарием: "Выбираем валюту":
Валюту ищет в справочнике валют, но лучше и его искать по коду.
Под коммментарием: "Выбираем валюту":
Я выбрал текущую дату, но вы можете указать любой.
Под комментарием: "Если БП ставим способ зачета":
Так мы указываем способ зачёта аванса создаваемого документа.
Под комментарием: "НДСДокумента":
Выбирайте необходимый вам способ учёта НДС
Это были общие реквизиты, теперь проходим к табличной части документа, в данном примере это табличная часть услуги:
Под комментарием: "Создаём строку табличной части":
Таким образом мы создаём строку в табличной части документа.
Под комментарием: "Выбираем номенклатуру":
Выбираем номенклатуру в созданной строке:
У меня указан Объект.Тариф, так как номенклатура указывалась в форме обработки, но вы можете подставить туда своё значение, также можете сделать поиск по коду или получать через выборку.
Под комментарием: "Выбираем ставку НДС строки":
У каждой номенклатуры в табличной части в БП 3.0 есть своя ставка НДС, указываем её. В моём случае реквизит НДС получал из перечислений. Поэтому я выбираю оттуда.
Под комментарием: "Определяем цену, у Вас скорее всего будет просто цена из выборки":
Тут мы определяем цену номенклатуры.
Под комментарием: "Количество"
Указываем количество данной номенклатуры в документе
Под комментарием: "Определяем сумму"
При создании через код, системе не считает сумму автоматически, придётся считать через формулу: Цена * Количество — Скидка + НДС
Под комментарием: "Проводим документ"
А это нужно, чтобы документ сохранился и провелся в базе.
Буду рад Вашим комментариям и отзывам =)
(1)Я бы еще добавил пример заполнения документа через обработку заполнения: пример создания структуры, которую потом подкинуть типа НовыйДокументРеализация.Заполнить(СтруктураЗаполнения);
Разве не должно быть какойто глобальной команды которая дозаполняет документ всякими скрытыми значениями. ПриВводеНового часто всречаю
(2) Сделаю в свободное время =)
(3) Что вы имеете ввиду под скрытыми?
(0) обратите внимание:
1) у каждого объекта метаданных есть обязательные поля — к примеру у Документа это «Дата»
поэтому привыкайте программировать так:
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
конструкции языка идут друг за другом. в будущем избежите ряд ошибок при отладке и тестировании
2) в типовых конфигурациях в документах используется конструкция при открытии формы ЗаполнитьШапкуДокумента(…..)
используйте подобные процедуры
3) Запись документов желательно оформлять (обрамлять) в конструкции Попытка Исключение КонецПопытки
Я делаю дважды — сначала Записать (РежимЗаписи.Запись), затем следует конструкция Записать(РежимЗаписи.Проведение).
Для чего такая подстраховка — при записи в черновик проверяется заполненность полей документа, прав доступа и т.д.
При проведении проверяется возможность проведения, другие права доступа — на регистры и т.д.
Поэтому где выстрелит ошибка заранее не известно.
Иногда проведение убираю, провожу позже групповой обработкой по разным причинам…
И обязательно прописываю Сообщить(«что-то пошло не так….») и Сообщить(«Документ успешно создан»),
чтобы понимать успешно ли отработала обработка или нет.
Он имеет ввиду то, что при создании документа в пользовательском режиме по кнопке «Создать» в документе есть много служебных реквизитов, которые даже не выведены на форму, но их заполнение обязательно.
Я всегда делал так.
1) создаю документ руками и заполняю в нем только обязательные поля, если док с табличной частью, то добавляю 1 строку и туда.
2) сохраняю и провожу его.
3) Консолью запросов выбираю все реквизиты этого документа и смотрю какие реквизиты и чем заполнились без моего участия. Так же поступаю с табличной частью.
И вот у меня на руках полный перечень реквизитов обязательных к заполнению при создании нового документа программно.
После такого заполнения программно документы всегда проводятся без ошибок и ни чем не отличаются от созданных в ручную.
(4)Какойнить реквизит видоперации или тип взаиморасчетов или валюта с кратностью. которые при интерактивном выборе и вводе заполняются а при программном нет.
(6) благодарю за информацию
(7) благодарю за информацию)
«// Создаём пустую форму документа
НовыйЭлемент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();» — вот это воистину эпично!!!
Прежде чем нести доброе и светлое новичкам, не мешало бы СП почитать:
ДокументМенеджер.<Имя документа> (DocumentManager.<Имя документа>)
СоздатьДокумент (CreateDocument)
Синтаксис:
СоздатьДокумент()
Возвращаемое значение:
Тип: ДокументОбъект.<Имя документа>.
Описание:
Создает новый документ.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:
// создание нового документа РасходнаяНакладная
НовДок = Документы.РасходнаяНакладная.СоздатьДокумент();
НовДок.Записать();
Дальше статью читать не стал, потому как это крамола и должно предать ее анафеме!!!
(11) и чем Вас не устраивает мой вариант?
(12) По Вашему «создание формы» и «создание документа» — это одно и то же?
(13) ну не так выразился) и что тут такого?)
Благодарю за исправление, поставил + в знак благодарности)
Поскольку в примере присутствует слово «выборка», то предполагается, что создание документов идет в цикле.
В связи с этим имеет смысл вынести за его пределы получение повторяющихся значений, таких, как организация, подразделение, счета учета, да и ссылки на контрагентов/номенклатуру имеет смысл получить одним запросом, а не делать повторяющийся поиск «найтипокоду» или аналогичный.
(7)
Ага, вот только этап: «Найти, откуда вся эта хрень заполняется и в зависимости от чего, ть?» забыли.
И еще один нюанс — если тупо заполнять руками служебные реквизиты — есть вероятность того, что в следующих релизах типовой конфы либо сами эти реквизиты изменятся, либо изменятся принципы их заполнения.. Так что политкорректнее вызывать типовые обработчики заполнения этих реквизитов. Если это возможно, конечно. Тогда останется только один нюанс — в последующих релизах могут измениться и сами эти обработчики %) Но тут уж никуда не деться скорее всего.