Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 4, свеженьких 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Автозапуск обработки / внешней обработки          
bizisoft Подменю пользователя
сообщение 16.10.20, 21:42
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 229
Из: Донецк
Спасибо сказали: 18 раз
Рейтинг: 21

Здравствуйте.
1С (8.3.14.2095) / Альфа-Авто (4.1.23.01) / Файловый режим / обычные формы.

Есть обработки для обмена с сайтом и рассылка прайсов.
Запуск этих обработок осуществляется через планировщик заданий windows (запускается база, в качестве параметра передается внешняя обработка и в ней в качестве своего параметра "режим" внешней обработки (т.е какие функции будут отрабатывать).

Грядет перевод базы на клиент-серверный режим работы, и что-то мне подсказывает, что автостарт обработок перестанет работать.

Думаю, что можно переделать это все на регламентные задания, но никак не могу врубится с чего начать.
Прочитал уже несколько статей на инфостарте и др. сайтах, но уловить ниточку действий никак не получается.
Понял, что возможно это провернуть через добавление регламентного задания в конфигурацию или без изменения конфигурации, но прописыванием в модуле объекта внешней обработки каких-то команд.

Люди добрые, направьте на путь истинный, растолкуйте, как лучше это сделать и в какой последовательности нужно действовать?


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

nik389 Подменю пользователя
сообщение 18.10.20, 19:07
Сообщение #2

Завсегдатай
****
Группа: Пользователи
Сообщений: 115
Из: Украина
Спасибо сказали: 32 раз
Рейтинг: 29

bizisoft @ 16.10.20, 21:42 * ,
Если конфигурация написана с использованием БСП, то особых сложностей не возникнет
в модуль вашей внешней обработки нужно будет всего лишь добавить команду, у которой свойство
Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода()

например:

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

Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
  // Реализация логики команды
  Если ИдентификаторКоманды = "МояПроцедура" Тогда
      Выполнить_МояПроцедура();
  КонецЕсли;  
КонецПроцедуры


и тогда расписание регламентного задания будет возможно задать для этой вашей процедуры, БСП это берет на себя

П.С. - дочитал, что у вас обычные формы. - тогда возможно будет по-лругому, давно не работал с обычными формами

Спасибо сказали: bizisoft,

bizisoft Подменю пользователя
сообщение 20.10.20, 10:51
Сообщение #3

Завсегдатай
****
Группа: Пользователи
Сообщений: 229
Из: Донецк
Спасибо сказали: 18 раз
Рейтинг: 21

nik389 @ Вчера, 20:07 * ,
Не уверен, что в Альфа-Авто используется БСП.

Рарус ответил касательно РЗ следующее:
Цитата
В конфигурации стандартный функционал работы Регламентных заданий: устанавливается расписание, пользователь и другие настройки запуска. Из специфики клиент-серверного варианта - должны быть разблокирована работа регламентных заданий для этой базы на сервере.


Я попробовал следующие действия:
- в общем модуле "фзФоновыеЗадания" добавил процедуру
Процедура ВыполнитьМоюОбработку(Параметр) Экспорт
    Сообщить(Параметр);
        Сообщить("Параметр");
КонецПроцедуры

- добавил метаданные РегламентныеЗадания бс_ОбменССайтом имя метода выбрал фзФоновыеЗадания.ВыполнитьМоюОбработку

В режиме предприятия добавляю регламентное задание, выбираю Вид задание бс_ОбменССайтом, выбираю пользователя, заполняю "Ключ" = 123 (с потолка), ставлю галочку Использование.
Нажимаю кнопку "Выполнить регламентное задание немедленно" и вот что получается:
Регламентные задания
Бс обмен с сайтом    Бс обмен с сайтом    Робот    19.10.2020 16:47:22    Задание выполнено

Воновые задания
<Самостоятельный запуск>    Бс обмен с сайтом    Задание выполнено    20.10.2020 10:36:00    20.10.2020 10:36:00


Я правильно понимаю, что задание выполнилось, судя по значению "Состояния", но при этом Сообщить("Параметр"); не выводит сообщение или при регламентных заданиях сообщения не выводятся?

Теперь можно в процедуре ВыполнитьМоюОбработку(Параметр) прописать запуск внешней обработки или обычной разработки?


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

bizisoft Подменю пользователя
сообщение 20.10.20, 13:11
Сообщение #4

Завсегдатай
****
Группа: Пользователи
Сообщений: 229
Из: Донецк
Спасибо сказали: 18 раз
Рейтинг: 21

Попробовал следующиее:

В в модуле объекта обработки прописал экспортную процедуру Тест() для проверки возможности запуска

Процедура Тест() Экспорт    
    ТД = Новый ТекстовыйДокумент;
    ТД.ВставитьСтроку(1, "Тестовая строка");
    ТД.Записать("D:\1с\_DN\Тестовый_файл.txt");
КонецПроцедуры



В общем модуле "фзФоновыеЗадания" в процедуре прописал:
Процедура ВыполнитьМоюОбработку(Параметр) Экспорт
    Рассылка = Обработки._РассылкаПрайсовБизисофт.Создать();
    Рассылка.Тест();
КонецПроцедуры


Нажимаю выполнить РЗ немедленно - отрабатывает и в указанной директории создаются файлы.

Т.е. получается все работает и экспортная процедура выполняется.

А как можно вызвать процедуру(ы) находящиеся в модуле формы обработки или это невозможно и нужно обработку переписать т.о., чтобы все функции и процедуры находились в модуле объекта обработки?
Также не понятно как правильно поступить с функциями/процедурами, которые вызываются в теле экспортной процедуры, их нужно тоже делать экспортными?



Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

bizisoft Подменю пользователя
сообщение Сегодня, 16:28
Сообщение #5

Завсегдатай
****
Группа: Пользователи
Сообщений: 229
Из: Донецк
Спасибо сказали: 18 раз
Рейтинг: 21

Попробовал провести эксперимент с обработкой для рассылки прайсов.
Перенес функции и процедуры, которые формируют прайсы и отправляют клиентам, в модуль объекта.
На форме кнопкой вызываю процедуру из модуля объекта, которая запускает процесс.
Все отрабатывает и на почту приходят файлы.

Теперь когда все работает, пробую запустить это через регламентные задания, но выдает ошибку "Слишком много фактических параметров для метода фонового задания".

Как понять данную ошибку? Подскажите пожалуйста из-за это и как можно обойти?
Перем ТемаПисьма, ТекстПисьма;
Перем ОшибкаОтправки;


Функция ОтправитьФайлPOSTЗапросом(ФайлАрхив, ПараметрыПодключения) Экспорт
    НТТРАдресСайта = ПараметрыПодключения[0];
    НТТРПорт = ПараметрыПодключения[1];
    НТТРЛогин = ПараметрыПодключения[2];
    НТТРПароль = ПараметрыПодключения[3];
    ИДСклада = ПараметрыПодключения[4];
    
    //Подготовка переменных
    Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    //Определяем имя файла ответа от веб-сервера
    ИмяФайлаОтвета = КаталогВременныхФайлов() + "answer.tmp";
    //Какой-то ранее созданный архив
    ИмяФайлаДанных = ФайлАрхив; //"D:\42489.zip";
    //Закодируем содержимое файла по Base64, то есть преобразуем его к URL-неактивному виду.
    СодержимоеZIP = Base64Строка(Новый ДвоичныеДанные(ИмяФайлаДанных));
    //Проверим размер кодированного файла.
    ДопустимыйРазмерФайлаВБайтах = 2500000;
    Если СтрДлина(СодержимоеZIP) > ДопустимыйРазмерФайлаВБайтах Тогда
        //Какие-то ваши действия, возможно
        Возврат 0;
    КонецЕсли;
    ИмяФайлаОтправки = КаталогВременныхФайлов() + "post.txt";
    ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, ЛОЖЬ);
    //Определяем раздел двоичных данных
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""data""; filename=""" + ИмяФайлаДанных + """");
    //С таким же успехом в Content-Type можно указать application/x-octet-stream
    ФайлОтправки.ЗаписатьСтроку("Content-Type: application/x-zip-compressed" + Символы.ПС + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку(СодержимоеZIP);
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    //Определяем раздел для каких либо других POST-данных, например содержимого полей виртуальной HTML-формы.
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    //Соответствует HTML-тэгу input type="submit" name="submit" value="Submit" /
    ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""submit""" + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку("1");
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    //Соответствует HTML-тэгу
    //input type="text" name="some_field" value="Some text" /
    ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""some_field""" + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку("Some text");
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    ФайлОтправки.Закрыть();

    ЗаголовокHTTP = Новый Соответствие();
    //При необходимости зададим Referer, например таким образом
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
    СерверИсточник = НСтр(СтрокаСоединения, "Srvr") + НСтр(СтрокаСоединения, "Ref");
    ЗаголовокHTTP.Вставить("Referer", СерверИсточник);
    //Укажем формат данных Content-Type
    ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
    //Укажем длину POST-запроса Content-Length
    ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);

    //api.avto.pro:8080/api/v1/parts/fileupload/42489
    //Сервер = "api.avto.pro"; //Естественно, следует указать свой адрес.
    //Порт = "8080";
    
    Сервер = НТТРАдресСайта; //"ga.dn.ua"; //Естественно, следует указать свой адрес.
    Порт = НТТРПорт; //"80"; //Это общепринятый порт. Возможно, для вашего сервера применяется другой. Конкретное значение уточните у хостера.
    //ИспользоватьПрокси - какая-то логическая переменная, может быть значение флажка на форме или переключатель
    ИспользоватьПрокси = Ложь;
    Если ИспользоватьПрокси Тогда
        Прокси = Новый ИнтернетПрокси;
        Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина;
        Прокси.Пароль = "ПарольПрокси"; // укажите своё значение
        Прокси.Пользователь = "ПользовательПрокси"; // укажите своё значение
        НТТР = Новый HTTPСоединение(Сервер, Порт, , , Прокси);
    Иначе
        НТТР = Новый HTTPСоединение(Сервер, Порт);
    КонецЕсли;
    
    //АдресСкрипта = "/UpdateParts?warehouseId="+ИДСклада;          //  /api/v1/parts/fileupload/
    //АдресСкрипта = "/api/v1/parts/fileupload/"+ИДСклада;
    АдресСкрипта = "load_price_achiv.php"; //"ld.php"; //Естественно, следует указать имя своего скрипта.
    Попытка
        Сообщить("Пробуем отправить");  
        НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСкрипта, ИмяФайлаОтвета, ЗаголовокHTTP);
        Сообщить("Что-то отправили");
    Исключение
        #Если Клиент Тогда
            Сообщить("Неудачная попытка соединения: " + ОписаниеОшибки());
        #Иначе
            ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Неудачная попытка соединения: " + ОписаниеОшибки());
        #КонецЕсли
        Возврат 0;
    КонецПопытки;
    //Удалим файл отправки POST-запроса. Больше он нам не нужен.
    УдалитьФайлы(ИмяФайлаОтправки);
    
    //Отправили данные, анализируем ответ сервера.
    ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
    Если ФайлОтвета.Существует() Тогда
        ТекстОтвета = Новый ТекстовыйДокумент();
        ТекстОтвета.Прочитать(ИмяФайлаОтвета);
        Если ТекстОтвета.КоличествоСтрок() > 0 Тогда
            ОтветСервера = ТекстОтвета.ПолучитьТекст();
            #Если Клиент Тогда
                Сообщить(ОтветСервера);
            #КонецЕсли
        Иначе
            #Если Клиент Тогда
                Сообщить("Отправка файла на сервер: Получен пустой ответ сервера.");
            #Иначе
                ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Получен пустой ответ сервера.");
            #КонецЕсли
        КонецЕсли;

        УдалитьФайлы(ИмяФайлаОтвета);
    Иначе
        #Если Клиент Тогда
            Сообщить("Отправка файла на сервер: Ответ сервера не получен.");
        #Иначе
            ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Ответ сервера не получен.");
        #КонецЕсли
    КонецЕсли;


    Сообщить("Файл прайса скопирован на "+НТТРАдресСайта);

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

Функция ОтправитьПочту(КвоПисем, имяФайлаОтправки, Получатели, НовоеТело = "")
    Если Получатели.Количество() = 0 Тогда
        Возврат Истина;
    КонецЕсли;
    
    УчетнаяЗапись = эпПолучитьУчетнуюЗаписьПоУмолчанию();
    СтруктураРежимовОбмена = Новый Структура("Получить, Отправить", Ложь, Истина);  
    Профиль = эпПолучитьПочтовыйПрофиль(УчетнаяЗапись, СтруктураРежимовОбмена);
    
//    эпОтправитьЭлектронныеПисьма(УчетнаяЗапись);
    Попытка
        ИнтернетПочта = Новый ИнтернетПочта;
    Исключение
        #Если Клиент Тогда
            Сообщить("Неудачная попытка Отправки почты: " + ОписаниеОшибки());
        #Иначе
            ЗаписьЖурналаРегистрации("ОтправитьПочту", УровеньЖурналаРегистрации.Ошибка, , , "Неудачная попытка Отправки почты: " + ОписаниеОшибки());
        #КонецЕсли
        //Предупреждение("2а");
    КонецПопытки;
    
    Попытка
        ИнтернетПочта.Подключиться(Профиль);
    Исключение
        Сообщить("Произошли ошибки при проверке настроек учетной записи. "+ОписаниеОшибки());
        Возврат "Произошли ошибки при проверке настроек учетной записи. "+ОписаниеОшибки();
    КонецПопытки;

    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Для каждого Стр Из Получатели Цикл
        ПочтовыйАдрес=Сообщение.Получатели.Добавить(Стр.Email);
        ПочтовыйАдрес.ОтображаемоеИмя=СокрЛП(Стр.Имя);
    КонецЦикла;

    ПочтовыйАдрес = Сообщение.ОбратныйАдрес.Добавить(Профиль.ПользовательSMTP);//ПользовательSMTP);
    ПочтовыйАдрес.ОтображаемоеИмя = Профиль.Пользователь;
    Сообщение.Отправитель.Адрес = Профиль.ПользовательSMTP;
    Сообщение.Отправитель.ОтображаемоеИмя=Профиль.Пользователь;
    Сообщение.ИмяОтправителя=Профиль.Пользователь;
    
    Если НовоеТело = "" Тогда
        Сообщение.Тема=ТемаПисьма;
        Сообщение.Тексты.Добавить(ТекстПисьма);
        Сообщение.Вложения.Добавить(имяФайлаОтправки);
    Иначе
        Сообщение.Тема="Отчет о рассылки "+Строка(ТекущаяДата());//РабочаяДата;
        Сообщение.Тексты.Добавить(НовоеТело);
    КонецЕСли;
    
    Попытка
        ИнтернетПочта.Послать(Сообщение);
        //Сообщить("Сообщение отправлено. "+СокрЛП(имяФайлаОтправки));
    Исключение
        Сообщить("Не удалось отправить письмо, Ошибка: "+ОписаниеОшибки());
        Возврат "Не удалось отправить письмо, Ошибка: "+ОписаниеОшибки();
    КонецПопытки;
    ИнтернетПочта.Отключиться();
    
    Возврат Истина;
КонецФункции

&НаСервере
Функция КурсЗапросомСервер(ДатаДок, ВалютаДок)
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Дата",ДатаДок);
    Запрос.УстановитьПараметр("Валюта",ВалютаДок);
    Запрос.Текст = "Выбрать        
            |КурсыВалют.Период,        
            |КурсыВалют.Курс,        
            |КурсыВалют.Кратность        
            |ИЗ        
            |РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта =&Валюта) КАК КурсыВалют";
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Если Выборка.Следующий() Тогда      
        Рез = Выборка.Курс; //Строка(Выборка.Курс)+":"+Строка(Выборка.Кратность);
    КонецЕсли;
    Возврат Рез;
КонецФункции


Процедура Тест() Экспорт

    ТД = Новый ТекстовыйДокумент;
    ТД.ВставитьСтроку(1, "Тестовая строка");
    дт = Строка(ТекущаяДата());
    дт = СтрЗаменить(дт, ".", "_");
    дт = СтрЗаменить(дт, ":", "_");
    ТД.Записать("D:\1с\_DN\Тестовый_файл_"+дт+".txt");
КонецПроцедуры

Процедура СтартРассылки(ЭтоАдмин, ГрупповаяРассылка=Ложь) Экспорт
    //Формируем прайсы
    НовыйПрайс();
    //Получаем настройки из регистра сведений НастройкиРассылкиПрайсов
    КвоПисем=0;    
    КаталогИБ = НСтр(СтрокаСоединенияИнформационнойБазы(), "File");    
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    НастройкиРассылкиПрайсов.НомерПрайса КАК НомерПрайса,
        |    НастройкиРассылкиПрайсов.ТипЦены КАК ТипЦены,
        |    НастройкиРассылкиПрайсов.Склады КАК Склады,
        |    НастройкиРассылкиПрайсов.Валюта КАК Валюта,
        |    НастройкиРассылкиПрайсов.Доп КАК Доп,
        |    НастройкиРассылкиПрайсов.Активно КАК Активно
        |ИЗ
        |    РегистрСведений.НастройкиРассылкиПрайсов КАК НастройкиРассылкиПрайсов
        |ГДЕ
        |    НастройкиРассылкиПрайсов.Активно = ИСТИНА";
    
    НастройкиРассылки = Запрос.Выполнить().Выгрузить();
    //ТабличноеПоле1 = Запрос.Выполнить().Выгрузить();
    
    //ЭлементыФормы.НадпТекОперация.Заголовок = "Этап (9/9): Отправка писем.";
    Для каждого Стр из НастройкиРассылки Цикл
        ИмяФайла = КаталогИБ+"\ExtForms\_MailPrices\price"+Строка(Стр.НомерПрайса)+".zip";        
        Тхт = Строка(Стр.НомерПрайса)+"  "+Строка(Стр.ТипЦены)+"  "+Строка(Стр.Склады)+"  "+Строка(Стр.Валюта);
        #Если Клиент Тогда
            Сообщить(Тхт);
        #Иначе
            ЗаписьЖурналаРегистрации("Настройка прайсов", УровеньЖурналаРегистрации.Предупреждение, , , Тхт);
        #КонецЕсли

        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Контрагенты.ПометкаУдаления,
        |    Контрагенты.РассылатьПрайсы,
        |    Контрагенты.НомерПрайса,
        |    Контрагенты.Ссылка,
        |    Контрагенты.Наименование
        |ИЗ
        |    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    Контрагенты.ПометкаУдаления = ЛОЖЬ
        |    И Контрагенты.РассылатьПрайсы = ИСТИНА
        |    И Контрагенты.НомерПрайса = &НомерПрайса";
        Запрос.УстановитьПараметр("НомерПрайса",Стр.НомерПрайса);
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();    
        Если ЭтоАдмин Тогда //флТолькоАдмин Тогда
            Получатели = Новый ТаблицаЗначений;
            Получатели.Колонки.Добавить("Имя");
            Получатели.Колонки.Добавить("Email");    
            ПолучателиНовСтр = Получатели.Добавить();
            ПолучателиНовСтр.Имя = "bizisoft";
            ПолучателиНовСтр.Email = "bizisoft@yandex.ru";            
            ТемаПисьма = "Остатки на " + СокрЛП(Формат(ТекущаяДата(),"ДЛФ=D"));
        //Организация = Справочники.Организации.НайтиПоКоду("00001");  
            ТекстПисьма = "Это письмо отправлено автоматически, отвечать на него не нужно.";
            ОтправитьПочту(1, ИмяФайла, Получатели);
            Продолжить;
        КонецЕсли;

            //КвоПисем=КвоПисем+1;    
        Если ГрупповаяРассылка Тогда //флГрупповаяРассылка Тогда
            Получатели = Новый ТаблицаЗначений;
            Получатели.Колонки.Добавить("Имя");
            Получатели.Колонки.Добавить("Email");        
            
            КвоПисем = 0;
            Пока Выборка.Следующий() Цикл
                ЭлектронныйАдрес = Неопределено;
                ЭлектронныйАдрес = киПолучитьПредставлениеКИ(Выборка.Ссылка, Справочники.ВидыКонтактнойИнформации["АдресЭлектроннойПочтыРабочий"]);
                ПолучателиНовСтр = Получатели.Добавить();
                ПолучателиНовСтр.Имя = Выборка.Наименование;
                ПолучателиНовСтр.Email = ЭлектронныйАдрес;            
                КвоПисем=КвоПисем+1;                    
            КонецЦикла;
            
            ТемаПисьма = "Остатки на " + СокрЛП(Формат(ТекущаяДата(),"ДЛФ=D"));
            Организация = Справочники.Организации.НайтиПоКоду("00001");  
            ТекстПисьма = "Это письмо отправлено автоматически, отвечать на него не нужно."+Символы.ПС+Символы.ПС+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["АдресЮридический"])+Символы.ПС+
                          "Магазин тел."+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ТелефонРабочий"])+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ТелефонСотовый"])+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ТелефонКонтактный"])+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ТелефонДомашний"])+Символы.ПС+
                          "E-mail: "+киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["АдресЭлектроннойПочтыРабочий"])+Символы.ПС+
                          "Интернет-Магазин: "+киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ВебСтраницаОрганизации"])+Символы.ПС+
                          "С уважением Гранд-Авто";    
            ОтправитьПочту(КвоПисем, ИмяФайла, Получатели);
        Иначе
            Получатели = Новый ТаблицаЗначений;
            Получатели.Колонки.Добавить("Имя");
            Получатели.Колонки.Добавить("Email");        
            ТемаПисьма = "Остатки на " + СокрЛП(Формат(ТекущаяДата(),"ДЛФ=D"));
            Организация = Справочники.Организации.НайтиПоКоду("00001");
            ТекстПисьма = "Это письмо отправлено автоматически, отвечать на него не нужно."+Символы.ПС+Символы.ПС+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["АдресЮридический"])+Символы.ПС+
                          "Магазин тел."+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ТелефонРабочий"])+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ТелефонСотовый"])+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ТелефонКонтактный"])+Символы.ПС+
                          киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ТелефонДомашний"])+Символы.ПС+
                          "E-mail: "+киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["АдресЭлектроннойПочтыРабочий"])+Символы.ПС+
                          "Интернет-Магазин: "+киПолучитьПредставлениеКИ(Организация, Справочники.ВидыКонтактнойИнформации["ВебСтраницаОрганизации"])+Символы.ПС+
                          "С уважением Гранд-Авто";
            Пока Выборка.Следующий() Цикл
                КвоПисем = 0;            
                Получатели.Очистить();
                ЭлектронныйАдрес = Неопределено;
                ЭлектронныйАдрес = киПолучитьПредставлениеКИ(Выборка.Ссылка, Справочники.ВидыКонтактнойИнформации["АдресЭлектроннойПочтыРабочий"]);
                ПолучателиНовСтр = Получатели.Добавить();
                ПолучателиНовСтр.Имя = Выборка.Наименование;
                ПолучателиНовСтр.Email = ЭлектронныйАдрес;            
                КвоПисем=КвоПисем+1;    
                ОтправитьПочту(КвоПисем, ИмяФайла, Получатели);    
            КонецЦикла;               
        КонецЕсли;
    
        Если Стр.Доп = 1 Тогда
            Сообщить("Вызов процедуры отправки файла ПОСТ запросом на сайт");
            ФТПСервер = Константы.ФТПСервер.Получить();//"ga.dn.ua";
            ПараметрыПодключения = Новый Массив();
            ПараметрыПодключения.Добавить(ФТПСервер);   //хост
            ПараметрыПодключения.Добавить("80");         //порт
            ПараметрыПодключения.Добавить("login");    //логин
            ПараметрыПодключения.Добавить("password");   //пароль
            ПараметрыПодключения.Добавить("ИДСклада"); //ид склада    
            Сообщить(ИмяФайла);
            ОтправитьФайлPOSTЗапросом(ИмяФайла, ПараметрыПодключения);
            //--- отчет на почту о загрузке архива на сайт
            Пол = Новый ТаблицаЗначений;
            Пол.Колонки.Добавить("Имя");
            Пол.Колонки.Добавить("Email");
            ПолНовСтр = Пол.Добавить();
            ПолНовСтр.Имя = "bizisoft";
            ПолНовСтр.Email = "bizisoft@yandex.ru";
            
            ТемаПисьма = "Отчет загрузки файла";
            ТекстПисьма = "Файл "+Строка(ИмяФайла)+" был загружен на сайт:"+ФТПСервер;
            ОтправитьПочту(1, ИмяФайла, Пол);
            //---

        КонецЕсли;        
    КонецЦикла;
    //ЭлементыФормы.НадпТекОперация.Заголовок = "Этап (-/-): Процесс завершен.";

КонецПроцедуры

Функция НовыйПрайс()
//дтНач = ТекущаяДата();
    КаталогИБ = НСтр(СтрокаСоединенияИнформационнойБазы(), "File");    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    НастройкиРассылкиПрайсов.НомерПрайса КАК НомерПрайса,
        |    НастройкиРассылкиПрайсов.ТипЦены КАК ТипЦены,
        |    НастройкиРассылкиПрайсов.Склады КАК Склады,
        |    НастройкиРассылкиПрайсов.Валюта КАК Валюта,
        |    НастройкиРассылкиПрайсов.Доп КАК Доп,
        |    НастройкиРассылкиПрайсов.Активно КАК Активно
        |ИЗ
        |    РегистрСведений.НастройкиРассылкиПрайсов КАК НастройкиРассылкиПрайсов
        |ГДЕ
        |    НастройкиРассылкиПрайсов.Активно = ИСТИНА";
    
    НастройкиРассылки = Запрос.Выполнить().Выгрузить();
    Для каждого стрНастройки из НастройкиРассылки Цикл
        //Сообщить(стрНастройки.НомерПрайса);
        //Сообщить(стрНастройки.ТипЦены);
        //Сообщить(стрНастройки.Склады);
        //СТРОИМ ЗАПРОС ПО ВЫБРАННЫМ СКЛАДАМ
        ТекстЗапросаИТОГ =  "ВЫБРАТЬ
                            |    ЦеныСрезПоследних.Номенклатура,
                            |    ЦеныСрезПоследних.Цена * (КурсУпр.Курс / КурсУпр.Кратность) / (КурсВал.Курс / КурсВал.Кратность) КАК Цена";
        Счетчик = 0;
        Сообщить(стрНастройки.Склады);
        //Преобразуем строку с разделителями (Склады: Д-МАГАЗИН; Д-ЦЕНТР) в массив
        МассивИзСтроки = СтрРазделить(стрНастройки.Склады,";",Ложь);
        врСЗСклады = Новый СписокЗначений;
        //Помещаем массив во временный список значений
        врСЗСклады.ЗагрузитьЗначения(МассивИзСтроки);
        Сообщить(врСЗСклады);
        //Пересобираем список складов, но уже ввиде ссылок
        СЗСклады = Новый СписокЗначений;
        СпрСклады = Справочники.СкладыКомпании;
        Для Каждого Элемент Из врСЗСклады Цикл
            НайденныйСклад = СпрСклады.НайтиПоНаименованию(Элемент.Значение);
            Если НЕ НайденныйСклад.Пустая() Тогда
                СЗСклады.Добавить(НайденныйСклад, НайденныйСклад);
            КонецЕсли;            
        КонецЦикла;
        //Собираем текст запроса
        Для Каждого Элемент Из СЗСклады Цикл //стрНастройки.Склады Цикл
          //  Сообщить(Элемент.Представление+": "+Строка(Элемент.Значение)+"   "+Строка(Элемент.Значение.Код)      );
            Счетчик=Счетчик+1;
            ТекстЗапросаИТОГ = ТекстЗапросаИТОГ+","+Символы.ПС+
                "Остатки"+Строка(Счетчик)+".КоличествоОстаток-Остатки"+Строка(Счетчик)+".РезервОстаток КАК "+Строка(Элемент.Значение.Код);                    
        КонецЦикла;
        ТекстЗапросаИТОГ = ТекстЗапросаИТОГ+Символы.ПС+Символы.ПС+
            "ИЗ
            |    РегистрСведений.Цены.СрезПоследних(&Период, ТипЦен = &Цена И ПодразделениеКомпании = &Подразделение) КАК ЦеныСрезПоследних
            |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсУпр
            |        ПО (КурсУпр.Валюта = &ВалютаУпр)
            |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсРег
            |        ПО (КурсРег.Валюта = &ВалютаРег)
            |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсВал
            |        ПО (КурсВал.Валюта = &Валюта)";
        Счетчик = 0;
        Для Каждого Элемент Из СЗСклады Цикл //стрНастройки.Склады Цикл
     //       Сообщить(Элемент.Представление+": "+Строка(Элемент.Значение)+"   "+Строка(Элемент.Значение.Код)      );
            Счетчик=Счетчик+1;
            ТекстЗапросаИТОГ = ТекстЗапросаИТОГ+Символы.ПС+
            "        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&Период, СкладКомпании = &Склад"+Строка(Счетчик)+") КАК Остатки"+Строка(Счетчик)+"
            |        ПО ЦеныСрезПоследних.Номенклатура = Остатки"+Строка(Счетчик)+".Номенклатура";        
        КонецЦикла;    
        //Формируем запрос
        Запрос = Новый Запрос;
        Запрос.Текст = ТекстЗапросаИТОГ;
        //Обработка параметров
        Запрос.УстановитьПараметр("Подразделение", Справочники.ПодразделенияКомпании.ОсновноеПодразделение);
        Запрос.УстановитьПараметр("Цена", стрНастройки.ТипЦены);
        Запрос.УстановитьПараметр("Период", ТекущаяДата());
        Счетчик = 0;
        Для Каждого Элемент Из СЗСклады Цикл //стрНастройки.Склады Цикл             
            Счетчик=Счетчик+1;
            Запрос.УстановитьПараметр("Склад"+Строка(Счетчик), Элемент.Значение);
        КонецЦикла;
        Запрос.УстановитьПараметр("ВалютаУпр", Константы.ВалютаУправленческогоУчетаКомпании.Получить());
        Запрос.УстановитьПараметр("ВалютаРег", Константы.ВалютаРегламентированногоУчетаОрганизаций.Получить());
        Запрос.УстановитьПараметр("Валюта", стрНастройки.Валюта);
        
    //    Сообщить(ТекстЗапросаИТОГ);    
            
            
        //Сообщить(стрНастройки.Валюта);
        //Сообщить(стрНастройки.Доп);
        
        Результат = Запрос.Выполнить();
        ТЗ = Результат.Выгрузить();
        
        //бсПоказатьРезультатВТаблице(ТЗ);
        
        //ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
        //ЭлементыФормы.Индикатор1.МаксимальноеЗначение = ТЗ.Количество();
        //ЭлементыФормы.Индикатор1.Значение = 0;  
        ИмяФайлаПрайса = КаталогИБ+"\ExtForms\_MailPrices\price"+Строка(стрНастройки.НомерПрайса);          
        ТабличныйДокумент=Новый ТабличныйДокумент;
        Макет = ПолучитьМакет("Макет");        
        ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
        ОбластьЗаголовок.Параметры.ПечОрганизация = Справочники.Организации.ОсновнаяОрганизация;
        ТабличныйДокумент.Вывести(ОбластьЗаголовок);     
        ОбластьКопирования = Макет.ПолучитьОбласть("Шапка|Основное");    
        ТабличныйДокумент.Вывести(ОбластьКопирования);
        //Заполняем шипку складами из настроек
        Для каждого ст из СЗСклады Цикл //стрНастройки.Склады Цикл
            ОбластьКопирования = Макет.ПолучитьОбласть("Шапка|Склад");
            ОбластьКопирования.Параметры.СкладКомпанииНаименование = ст;
            ТабличныйДокумент.Присоединить(ОбластьКопирования);
        КонецЦикла;    
        //Заполняем шапку типом цены из настроек
        ОбластьКопирования = Макет.ПолучитьОбласть("Шапка|Цены");
        ОбластьКопирования.Параметры.ТипЦен = стрНастройки.ТипЦены;//ст.ТипыЦен.Наименование;
        ТабличныйДокумент.Присоединить(ОбластьКопирования);            
        //Получаем курсы основных валют
        ТекКурс = КурсЗапросомСервер(ТекущаяДата(), Справочники.Валюты.НайтиПоКоду("840"));
        ТекКурсР = КурсЗапросомСервер(ТекущаяДата(), Справочники.Валюты.НайтиПоКоду("643"));
        ТекВалюта = стрНастройки.Валюта;  
        Пп = 0;
        Для каждого стр из ТЗ Цикл
            Пп=Пп+1;
              ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
            //Заполняем основную часть макета
            ОбластьКопирования = Макет.ПолучитьОбласть("Детали|Основное");    
            ОбластьКопирования.Параметры.пп = Пп;
            ОбластьКопирования.Параметры.ПечНоменклатура = стр.Номенклатура;
            ОбластьКопирования.Параметры.ПечАртикул = стр.Номенклатура.тАртикул;
            ОбластьКопирования.Параметры.ПечПроизводитель = стр.Номенклатура.Производитель;
            ОбластьКопирования.Параметры.ПечМодель = стр.Номенклатура.Модель;                
            ТабличныйДокумент.Вывести(ОбластьКопирования);    
            //Выводим остатки на складах в макет
            Для каждого скл из СЗСклады Цикл //стрНастройки.Склады Цикл    
            //    Сообщить(скл);    
                Склад = Справочники.СкладыКомпании.НайтиПоНаименованию(скл);
            //    Сообщить(Склад.Код);
                ОбластьКопирования = Макет.ПолучитьОбласть("Детали|Склад");
                ТекКол=0;
                Попытка
                    ТекКол = Число(стр[Склад.Код]);
                Исключение
                    ТекКол = 0;
            //        Сообщить("Ошибка преобразования в число для: "+Строка(стр[Склад.Код]));
                КонецПопытки;
                
                Если ТекКол>5 Тогда
                    ОбластьКопирования.Параметры.ПечСклад = ">5";
                Иначе
                    ОбластьКопирования.Параметры.ПечСклад = ТекКол; //стр[Склад.Код];
                КонецЕсли;                
                ТабличныйДокумент.Присоединить(ОбластьКопирования);
            КонецЦикла;            
            ОбластьКопирования = Макет.ПолучитьОбласть("Детали|Цены");
            //Расчитываем цены по полученым курсам     
            ВалютаРегламентированногоУчета=Константы.ВалютаРегламентированногоУчетаОрганизаций.Получить();
            ВалютаУправленческогоУчета = Константы.ВалютаУправленческогоУчетаКомпании.Получить();
    
                ЦенаВВалюте = стр.Цена;
            Состояние("Формирование прайса",Пп,,);
            ОбластьКопирования.Параметры.ПечЦена = ЦенаВВалюте;//стр[НаимКолонки];
            ТабличныйДокумент.Присоединить(ОбластьКопирования);
        КонецЦикла;
        ТабличныйДокумент.Записать(ИмяФайлаПрайса+".xls", ТипФайлаТабличногоДокумента.XLS97);
        //Архивируем прайсы    
        Zip = Новый ЗаписьZipФайла(ИмяФайлаПрайса+".zip");
        Zip.Добавить(ИмяФайлаПрайса+".xls");
        Zip.Записать();
    
    КонецЦикла;    

    Возврат 0;


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


Signature
1С:Предприятие 8.2 (8.2.19.130)
"Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" (4.1.20.01)
обычные формы.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
2 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 1 bizisoft

 

RSS Текстовая версия Сейчас: 22.10.20, 21:59
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!