Здравствуйте, уважаемые программисты. Такой вопрос, у меня есть http сервис, где я должен отправить цены со скидками и без 1 раз в день. Скидки определяются типовым образом (УТ 11.4)

Решил сделать так: создавать документ реализация и получать там скидки на товары, которые отправляю (не сохраняя сам документ). Проблема в том, что типовое определение скидки мне до сих пор не ясно.... Поэтому получаю форму и там запускаю процедуру.

Код знаю, что ужасен, просто стараюсь пока получить нужные мне данные не обращая внимания на "Красоту".

Помогите пожалуйста запустить процедуру формы из сервера (не думаю, что это возможно) или если у кого есть опыт работы с типовым функционалом, дайте подсказку.

Этот код не подходит потому, что мне не подходит запуск на клиенте.

```1c
    функция СоздатьДокументНаСервере(Номерзаказ)

    Реализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    Реализация.Дата = ТекущаяДата();
    Товары = Реализация.Товары.Добавить();
    Товары.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00-00000757");
    Товары.Цена = 39.90;
    Товары.Количество = 1;
    Товары.КоличествоУпаковок = 1;
    Товары.Склад = Справочники.Склады.НайтиПоНаименованию("Магазин") ;

    Товары.Характеристика= Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию("70x80 1200g");
    Товары.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
    Реализация.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ОблагаетсяНДСУПокупателя;
    Реализация.Склад = Справочники.Склады.НайтиПоНаименованию("Магазин") ;
    Реализация.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РеализацияКлиенту;
    Реализация.Организация = справочники.Организации.НайтиПоНаименованию("Магаз");
    Реализация.Партнер = Справочники.Партнеры.НайтиПоКоду("УТ-00000002");
    Реализация.Валюта = Справочники.Валюты.НайтиПоНаименованию("AZN");
    Реализация.ВалютаВзаиморасчетов =Реализация.Валюта;
    Реализация.ПорядокОплаты = Перечисления.ПорядокОплатыПоСоглашениям.РасчетыВРубляхОплатаВРублях;
    //Реализация.БанковскийСчет = Справочники.БанковскиеСчетаОрганизаций.НайтиПоНаименованию("AZN");
    Реализация.Касса = Справочники.Кассы.НайтиПоНаименованию("Касса"); //Проверить что подставится при ручном создании

    Реализация.Записать(РежимЗаписиДокумента.Проведение);
    Номерзаказ = Реализация.ссылка;

    Возврат Номерзаказ;

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

    &НаКлиенте
    Процедура ПолучитьСкидки(Команда, Номерзаказ) экспорт

    СоздатьДокументНаСервере(Номерзаказ);

    П = Новый Структура("Ключ", Номерзаказ);
    Форма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", П);
    Форма.открыть();
    //др = "Документ.РеализацияТоваровУслуг.ПолучитьФорму(");
    Форма.РассчитатьСкидкиНаценкиКлиент();

    Форма.записать();

    ДобавлениеСкидокВМассив(Номерзаказ)
    КонецПроцедуры

    функция ДобавлениеСкидокВМассив(Номерзаказ)
    Реализация = НомерЗаказ;
    МассивСкидок = Новый Массив;
    Для Каждого стр из Реализация.Товары цикл
    ЦенаСоСкидкой = Стр.Цена - (стр.цена *стр.ПроцентРучнойСкидки / 100);
    МассивСкидок.Добавить(ЦенаСоСкидкой);
    КонецЦикла;
    Возврат МассивСкидок;
    Конецфункции
```
---
Если кому нужно будет:

```1c
    Результат = Новый Структура;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаБезСкидки,
    | 0 КАК Цена,
    | ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка КАК НоменклатураСсылка,
    | ЦеныНоменклатурыСрезПоследних.Характеристика.Ссылка КАК Характеристика
    |ИЗ
    | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ВидЦены.Идентификатор = &ЦенаБезСкидки) КАК ЦеныНоменклатурыСрезПоследних
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.Изменения КАК ЦеныНоменклатурыИзменения
    | ПО ЦеныНоменклатурыСрезПоследних.Регистратор = ЦеныНоменклатурыИзменения.Регистратор";
    Запрос.УстановитьПараметр("ЦенаБезСкидки", "Розничный");
    Запрос.УстановитьПараметр("ДатаСреза", ТекущаяДата());

    Выборка = Запрос.Выполнить().Выбрать();

    НомерСтроки = 1;
    ЦеныОтвет = Новый Структура;

    Реализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

    Реализация.Дата = ТекущаяДата();
    Реализация.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ОблагаетсяНДСУПокупателя;
    Реализация.Склад = Справочники.Склады.НайтиПоНаименованию("Магазин") ;
    Реализация.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РеализацияКлиенту;
    Реализация.Организация = справочники.Организации.НайтиПоНаименованию("Организация");
    Реализация.Партнер = Справочники.Партнеры.НайтиПоКоду("УТ-00000002");
    Реализация.Валюта = Справочники.Валюты.НайтиПоНаименованию("AZN");
    Реализация.ВалютаВзаиморасчетов =Реализация.Валюта;
    Реализация.ПорядокОплаты = Перечисления.ПорядокОплатыПоСоглашениям.РасчетыВРубляхОплатаВРублях;
    Реализация.Касса = Справочники.Кассы.НайтиПоНаименованию("Касса");

    Пока Выборка.Следующий() Цикл

    ТЧ = Реализация.Товары.Добавить();
    ТЧ.Номенклатура = выборка.номенклатура;
    ТЧ.Характеристика = выборка.характеристика;
    ТЧ.Цена = 5;
    ТЧ.Количество = 1;
    ТЧ.КоличествоУпаковок = 1;
    ТЧ.Сумма = выборка.ЦенаБезСкидки;
    ТЧ.Склад = Справочники.Склады.НайтиПоНаименованию("Магазин") ;
    ТЧ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;

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

    ПримененныеСкидки = СкидкиНаценкиСервер.Рассчитать(Реализация, СтруктураПараметры);
    СтруктураСообщений = СкидкиНаценкиСервер.СтруктураСообщений(Реализация);

    СтрокаЦеныОтвет = Новый Структура;

    Для Каждого Строка Из Реализация.Товары Цикл
    ЦенаСоСкидкой = ТЧ.Сумма;
    КонецЦикла;
    СтрокаЦеныОтвет.Вставить("Code", Строка(Выборка.Номенклатура));
    СтрокаЦеныОтвет.Вставить("PriceWithoutDiscount", Формат(Выборка.ЦенаБезСкидки,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=.; ЧН=0"));
    СтрокаЦеныОтвет.Вставить("PriceWithDiscount", Формат(ЦенаСоСкидкой,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=.; ЧН=0"));

    ЦеныОтвет.Вставить("Row" + СтрЗаменить(НомерСтроки,Символы.НПП,"),СтрокаЦеныОтвет);
    НомерСтроки = НомерСтроки + 1;
    ТЧ = ";

    КонецЦикла;

    Ответ = Новый Структура;
    Ответ.Вставить("id", Данные.id);
    Ответ.Вставить("Type", "GetPriceList");
    Ответ.Вставить("Command", ЦеныОтвет);
    Результат.Вставить("Code",200);
    Результат.Вставить("Description", Ответ);
    Возврат Результат;
```
---
Нельзя получить форму на сервере. Выход - скопировать имеющуюся функцию в модуль сервиса и оттуда юзать.
---
Я знаю, что невозможно. Просто скидка определяется в форме. А функция без этой скидки бесполезна
---
Надо выдрать из модуля формы ВЕСЬ АЛГОРИТМ определения скидки. Так понятнее ?
---
Пойду застрелюсь =)) Ибо это ад, а не алгоритм =)
---
Да ладно, я за день выдрал как-то алгоритм формирования документа Отпуск из 3-го ЗУПа, надо было из Документооборота его автоматом создавать. Делается это всё. С матерщиной, но делается.
---
Согласен =))) Спасибо ещё раз)
---
Зачем оскорблять человека, он же уже сам написал, что "код ужасен".
Не думайте, что вы круче только потому, что разбираетесь в чем-то лушче.
---
Это мой же код =)
---
Сорри, перепутал. Ну ничего, все когда-то начинали с подобного. Учитесь и улучшайтесь.
---
благодарю =) Кстати откопал)
---
Можно также скопировать форму, удалить ненужные процедуры, а нужные сделать экспортными. Создавать форму, выполнять все что нужно, не открывая ее.
---
хммм. Но из формы их нужно будет вытащить . А для этого этот ад придется отлаживать...
---
это каким образом вы получаете форму, не получив самого объекта? Вы 1С с VS перепутали. Тут формы не являются отдельными объектами. И в УФ все стало только хуже - теперь проблема просто получить значение с "соседней" формы даже "внутри" объекта.
В 1С получить процедуры другого объекта можно только, если они в Модуле Менеджера.
И в любом случае - вам надо все обращения к другим объектам делать на сервере.
---
Если кому нужно будет:

```1c
    Результат = Новый Структура;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаБезСкидки,
    | 0 КАК Цена,
    | ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка КАК НоменклатураСсылка,
    | ЦеныНоменклатурыСрезПоследних.Характеристика.Ссылка КАК Характеристика
    |ИЗ
    | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ВидЦены.Идентификатор = &ЦенаБезСкидки) КАК ЦеныНоменклатурыСрезПоследних
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.Изменения КАК ЦеныНоменклатурыИзменения
    | ПО ЦеныНоменклатурыСрезПоследних.Регистратор = ЦеныНоменклатурыИзменения.Регистратор";
    Запрос.УстановитьПараметр("ЦенаБезСкидки", "Розничный");
    Запрос.УстановитьПараметр("ДатаСреза", ТекущаяДата());

    Выборка = Запрос.Выполнить().Выбрать();

    НомерСтроки = 1;
    ЦеныОтвет = Новый Структура;

    Реализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

    Реализация.Дата = ТекущаяДата();
    Реализация.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ОблагаетсяНДСУПокупателя;
    Реализация.Склад = Справочники.Склады.НайтиПоНаименованию("Магазин") ;
    Реализация.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РеализацияКлиенту;
    Реализация.Организация = справочники.Организации.НайтиПоНаименованию("Организация");
    Реализация.Партнер = Справочники.Партнеры.НайтиПоКоду("УТ-00000002");
    Реализация.Валюта = Справочники.Валюты.НайтиПоНаименованию("AZN");
    Реализация.ВалютаВзаиморасчетов =Реализация.Валюта;
    Реализация.ПорядокОплаты = Перечисления.ПорядокОплатыПоСоглашениям.РасчетыВРубляхОплатаВРублях;
    Реализация.Касса = Справочники.Кассы.НайтиПоНаименованию("Касса");

    Пока Выборка.Следующий() Цикл

    ТЧ = Реализация.Товары.Добавить();
    ТЧ.Номенклатура = выборка.номенклатура;
    ТЧ.Характеристика = выборка.характеристика;
    ТЧ.Цена = 5;
    ТЧ.Количество = 1;
    ТЧ.КоличествоУпаковок = 1;
    ТЧ.Сумма = выборка.ЦенаБезСкидки;
    ТЧ.Склад = Справочники.Склады.НайтиПоНаименованию("Магазин") ;
    ТЧ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;

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

    ПримененныеСкидки = СкидкиНаценкиСервер.Рассчитать(Реализация, СтруктураПараметры);
    СтруктураСообщений = СкидкиНаценкиСервер.СтруктураСообщений(Реализация);

    СтрокаЦеныОтвет = Новый Структура;

    Для Каждого Строка Из Реализация.Товары Цикл
    ЦенаСоСкидкой = ТЧ.Сумма;
    КонецЦикла;
    СтрокаЦеныОтвет.Вставить("Code", Строка(Выборка.Номенклатура));
    СтрокаЦеныОтвет.Вставить("PriceWithoutDiscount", Формат(Выборка.ЦенаБезСкидки,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=.; ЧН=0"));
    СтрокаЦеныОтвет.Вставить("PriceWithDiscount", Формат(ЦенаСоСкидкой,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=.; ЧН=0"));

    ЦеныОтвет.Вставить("Row" + СтрЗаменить(НомерСтроки,Символы.НПП,"),СтрокаЦеныОтвет);
    НомерСтроки = НомерСтроки + 1;
    ТЧ = ";

    КонецЦикла;

    Ответ = Новый Структура;
    Ответ.Вставить("id", Данные.id);
    Ответ.Вставить("Type", "GetPriceList");
    Ответ.Вставить("Command", ЦеныОтвет);
    Результат.Вставить("Code",200);
    Результат.Вставить("Description", Ответ);
    Возврат Результат;
```