Интенсив по разработке чат бота ВКонтакте. Используя API ВКонтакте создавать чат бот ВКонтакте из 1С. Получить список пользователей группы ВКонтакте и разослать им сообщения.
Функция считывает содержимое страницы файла Excel в таблицу значений, автоматически именует столбцы таблицы по первой строке файла. Пробелы заменяются на "".
&НаСервере
Функция ПодготовитьТаблицуСДанными(ФайлАдресВХранилище)
ИмяФайлаСервер = ПолучитьИмяВременногоФайла(".xlsx");
ФайлИмпорта = ПолучитьИзВременногоХранилища(ФайлАдресВХранилище);
ФайлИмпорта.Записать(ИмяФайлаСервер);
ТабличныйДокумент = Новый ТабличныйДокумент;
Попытка
ТабличныйДокумент.Прочитать(ИмяФайлаСервер, СпособЧтенияЗначенийТабличногоДокумента.Текст);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТаблицаПромежуточныхДанных = ПЗ.Результат.Выгрузить();
Возврат ТаблицаПромежуточныхДанных;
КонецФункции
&НаСервере
Функция ПодготовитьТаблицуСДанными(ФайлАдресВХранилище)
ИмяФайлаСервер = ПолучитьИмяВременногоФайла(".xlsx");
ФайлИмпорта = ПолучитьИзВременногоХранилища(ФайлАдресВХранилище);
ФайлИмпорта.Записать(ИмяФайлаСервер);
ТабличныйДокумент = Новый ТабличныйДокумент;
Попытка
ТабличныйДокумент.Прочитать(ИмяФайлаСервер, СпособЧтенияЗначенийТабличногоДокумента.Текст);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТаблицаПромежуточныхДанных = ПЗ.Результат.Выгрузить();
Возврат ТаблицаПромежуточныхДанных;
КонецФункции
TurboConf повышает эффективность работы в Конфигураторе 1С и помогает программисту автоматизировать свои задачи.
Удобно использовать при отладке: добавив к условию точки остановки <здесь ваше произвольное условие> И ОповеститьВтелеграм(ОписаниеОшибки()) = Неопределено - отправит в телеграм причину ошибки, если она произошла. Или, условие точки остановки ОповеститьВтелеграм("Процедура окончена") = Неопределено И Ложь - сообщит о том, что точка остановки пройдена
// отправка любого сообщения, в т.ч. ОписаниеОшибки(), в Телеграм бот
Функция ОповеститьВтелеграм(Сообщение) Попытка
// 1) Создаем бота в телеграме, для этого нужно перейти в @BotFather и проследовать инструкциям,
// по окончании которых нам предоставят Access token
ДанныеДоступа = "это Access token";
// 2) однократно получаем ID чата с ботом, предварительно написав боту любое сообщение
// быстро: https://cms3.ru/kak-poluchit-chat-id-telegram/
// чуть дольше: из текста json ответа, в объекте chat: "chat": {"id": "ид чата"}
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
ТекстJSONОтвета = Соединение.Получить(Новый HTTPЗапрос("bot" + ДанныеДоступа + "/getUpdates")).ПолучитьТелоКакСтроку();
//(затем можно закомментировать две строчки кода выше)
ИдЧата = "это chat.id";
// 3) Отправляем сообщение с ранее указанными сообщением, токеном, ид чата
ЗапрячьТелегу = Новый HTTPСоединение("api.telegram.org",443,,,,15,Новый ЗащищенноеСоединениеOpenSSL());
ЗапрячьТелегу.Получить(Новый HTTPЗапрос("bot" + ДанныеДоступа + "/sendMessage?chat_id=" + ИдЧата + "&text=" + Сообщение));
Исключение КонецПопытки КонецФункции
// отправка любого сообщения, в т.ч. ОписаниеОшибки(), в Телеграм бот
Функция ОповеститьВтелеграм(Сообщение) Попытка
// 1) Создаем бота в телеграме, для этого нужно перейти в @BotFather и проследовать инструкциям,
// по окончании которых нам предоставят Access token
ДанныеДоступа = "это Access token";
// 2) однократно получаем ID чата с ботом, предварительно написав боту любое сообщение
// быстро: https://cms3.ru/kak-poluchit-chat-id-telegram/
// чуть дольше: из текста json ответа, в объекте chat: "chat": {"id": "ид чата"}
Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
ТекстJSONОтвета = Соединение.Получить(Новый HTTPЗапрос("bot" + ДанныеДоступа + "/getUpdates")).ПолучитьТелоКакСтроку();
//(затем можно закомментировать две строчки кода выше)
ИдЧата = "это chat.id";
// 3) Отправляем сообщение с ранее указанными сообщением, токеном, ид чата
ЗапрячьТелегу = Новый HTTPСоединение("api.telegram.org",443,,,,15,Новый ЗащищенноеСоединениеOpenSSL());
ЗапрячьТелегу.Получить(Новый HTTPЗапрос("bot" + ДанныеДоступа + "/sendMessage?chat_id=" + ИдЧата + "&text=" + Сообщение));
Исключение КонецПопытки КонецФункции
произносит заданную фразу
Voice = Новый COMObject("SAPI.SpVoice");
Voice.Speak("Привет!");
Voice = Новый COMObject("SAPI.SpVoice");
Voice.Speak("Привет!");
Выполняет запуск внешнего процесса, с оповещением и ожиданием результата
&НаКлиенте
Процедура КомандаВыполнитьПрограмму(Команда)
СтрокаЗапуска = "C:\Application.exe";
НачатьЗапускПриложения(Новый ОписаниеОповещения("НачатьЗапускПриложенияЗавершение", ЭтотОбъект), СтрокаЗапуска,, Истина);
КонецПроцедуры
&НаКлиенте
Процедура НачатьЗапускПриложенияЗавершение(КодВозврата, ДополнительныеПараметры) Экспорт
//Вставить обработку завершения выполнения
КонецПроцедуры
&НаКлиенте
Процедура КомандаВыполнитьПрограмму(Команда)
СтрокаЗапуска = "C:\Application.exe";
НачатьЗапускПриложения(Новый ОписаниеОповещения("НачатьЗапускПриложенияЗавершение", ЭтотОбъект), СтрокаЗапуска,, Истина);
КонецПроцедуры
&НаКлиенте
Процедура НачатьЗапускПриложенияЗавершение(КодВозврата, ДополнительныеПараметры) Экспорт
//Вставить обработку завершения выполнения
КонецПроцедуры
ред. 03 октября 2019 20:49
// но по GUID можно определить время и дату
Функция ДатаСозданияСсылки(Ссылка)
ГУИД = Ссылка.УникальныйИдентификатор();
Строка16 = Сред(ГУИД, 16, 3) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
Разрядность = СтрДлина(Строка16);
ЧислоСек = 0;
Для Позиция = 1 По Разрядность Цикл
ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка16,Позиция,1))*Pow(16,Разрядность - Позиция);
КонецЦикла;
ЧислоСек = ЧислоСек / 10000000;
Возврат Дата(1582, 10, 15, 04, 00, 00) + ЧислоСек;
КонецФункции
// но по GUID можно определить время и дату
Функция ДатаСозданияСсылки(Ссылка)
ГУИД = Ссылка.УникальныйИдентификатор();
Строка16 = Сред(ГУИД, 16, 3) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
Разрядность = СтрДлина(Строка16);
ЧислоСек = 0;
Для Позиция = 1 По Разрядность Цикл
ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка16,Позиция,1))*Pow(16,Разрядность - Позиция);
КонецЦикла;
ЧислоСек = ЧислоСек / 10000000;
Возврат Дата(1582, 10, 15, 04, 00, 00) + ЧислоСек;
КонецФункции
ред. 02 апреля 2019 16:48
Обмен через ВЕБ Сервисы , Подключение к созданной web ссылке с другой базы.
Процедура КнопкаЗаполнитьТаблицуИзПервойБазыНажатие(Кнопка)
ВСОпределение = Новый WSОпределения("127.7.7.7/Obmen/ws/Obmen.1cws?wsdl", "admin", "pass");
//127.7.7.7 - ВашИПАдресГдеОпубликованWebСервис
//admin - пользователь информационной базы с полными правами и пароль -pass
ВСПрокси = Новый WSПрокси(ВСОпределение, "127.7.7.7", "Obmen", "ObmenSoap");
//127.7.7.7 - URl пространство имен Веб сервиса первой базы, Obmen -наименование
// расширения ,
//ObmenSoap тоже самое Но добавляем Soap к названии ))
Склад= Элементы.Склад.Значение; //Элемент формы, выбранное поле - склад
Время=ТекущаяДата();
ВСПрокси.Пользователь = "admin";
ВСПрокси.Пароль = "pass";
Данные = ВСПрокси.ОстаткиТоваровТНН(Строка(Склад),Дата(Время)); // подключаемся и получаем данные xml
попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(данные); //Открываем файл
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
ст = Таб.Добавить(); //Табличная часть на форме
ст.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ЧтениеXML.ЗначениеАтрибута("Номенклатура"));
ст.Склад = Справочники.Склады.НайтиПоНаименованию(ЧтениеXML.ЗначениеАтрибута("Склад"));
ст.КоличествоНачальныйОстаток = ЧтениеXML.ЗначениеАтрибута("КоличествоНачальныйОстаток");
ст.КоличествоПриход = ЧтениеXML.ЗначениеАтрибута("КоличествоПриход");
ст.КоличествоРасход = ЧтениеXML.ЗначениеАтрибута("КоличествоРасход");
ст.КоличествоКонечныйОстаток = ЧтениеXML.ЗначениеАтрибута("КоличествоКонечныйОстаток");
прервать;
конеццикла;
КонецЕсли;
конеццикла;
исключение
сообщить(Данные);
КонецПопытки;
конецпроцедуры
Процедура КнопкаЗаполнитьТаблицуИзПервойБазыНажатие(Кнопка)
ВСОпределение = Новый WSОпределения("127.7.7.7/Obmen/ws/Obmen.1cws?wsdl", "admin", "pass");
//127.7.7.7 - ВашИПАдресГдеОпубликованWebСервис
//admin - пользователь информационной базы с полными правами и пароль -pass
ВСПрокси = Новый WSПрокси(ВСОпределение, "127.7.7.7", "Obmen", "ObmenSoap");
//127.7.7.7 - URl пространство имен Веб сервиса первой базы, Obmen -наименование
// расширения ,
//ObmenSoap тоже самое Но добавляем Soap к названии ))
Склад= Элементы.Склад.Значение; //Элемент формы, выбранное поле - склад
Время=ТекущаяДата();
ВСПрокси.Пользователь = "admin";
ВСПрокси.Пароль = "pass";
Данные = ВСПрокси.ОстаткиТоваровТНН(Строка(Склад),Дата(Время)); // подключаемся и получаем данные xml
попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(данные); //Открываем файл
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
ст = Таб.Добавить(); //Табличная часть на форме
ст.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ЧтениеXML.ЗначениеАтрибута("Номенклатура"));
ст.Склад = Справочники.Склады.НайтиПоНаименованию(ЧтениеXML.ЗначениеАтрибута("Склад"));
ст.КоличествоНачальныйОстаток = ЧтениеXML.ЗначениеАтрибута("КоличествоНачальныйОстаток");
ст.КоличествоПриход = ЧтениеXML.ЗначениеАтрибута("КоличествоПриход");
ст.КоличествоРасход = ЧтениеXML.ЗначениеАтрибута("КоличествоРасход");
ст.КоличествоКонечныйОстаток = ЧтениеXML.ЗначениеАтрибута("КоличествоКонечныйОстаток");
прервать;
конеццикла;
КонецЕсли;
конеццикла;
исключение
сообщить(Данные);
КонецПопытки;
конецпроцедуры
ред. 22 ноября 2018 16:19
Обмен xml файлами через ВЕБ Сервисы (Запрос остаток товаров с одной базы на другую по wеб сервису,) настройка и создание web сервиса.
//1.Создаем web-сервис (заполняем только "Основные" и "Прочее", пока что ...)
// - Имя любое(не критично, но желательно на англ.)
// -URl пространство имен - вводим ip адресс для удобства (пример: 127.7.7.7)
// -Пакеты XDTO , я еще не совсем разобрался )), поэтому выбираю стандартный
// (http://v8.1c.ru/8.1/xdto), особой роли не играет в данном примере.
// -Имя файла публикации - Любое значение с форматом *.1cws(Пример: Obmen.1cws)
//2. Создаем Операцию с параметрами (Напоминает стандартную "Функцию" с параметрами)
// Например -Операция "ОстаткиТоваровНТТ"
// тип возвращаемого значение- "Строка"- string (http://www.w3.org/2001/XMLSchema)
//3 создаем операции :Время с Типом: DataTime , Склад с Типом: string - пока хватит )
//4 создаем процедуру для операции "ОстаткиТоваровНТТ", в свойствах операции и
// заполним функцию ниже:
//5 в самом конце, обновляем базу и публикуем, готово!
Функция ОстаткиТоваровНТТ(Склад, Время)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML(); // Записываем объявление XML
ЗаписьXML.ЗаписатьНачалоЭлемента("ОстаткиТоваров");
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
| СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток,
| СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход) КАК КоличествоПриход,
| СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
| СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачПериод, &КонПериод, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
|ГДЕ
| ТоварыНаСкладахОстаткиИОбороты.Склад = &Склад
|СГРУППИРОВАТЬ ПО
| ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
| ТоварыНаСкладахОстаткиИОбороты.Склад,
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура УБЫВ";
Запрос.УстановитьПараметр("НачПериод", Дата(НачалоДня(Время)));
Запрос.УстановитьПараметр("КонПериод", Дата(КонецДня(Время)));
Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию(Склад,Истина)); //склад заморозки Москва
Если запрос.Выполнить().Пустой() тогда
ответ = "За выбранный период остатков не найдено";
возврат ответ;
КонецЕсли;
Результат = Запрос.Выполнить().Выбрать();
пока Результат.Следующий() цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Результат");
ЗаписьXML.ЗаписатьАтрибут("Склад", Строка(Результат.Склад));
ЗаписьXML.ЗаписатьАтрибут("КоличествоНачальныйОстаток", Строка(Результат.КоличествоНачальныйОстаток));
ЗаписьXML.ЗаписатьАтрибут("КоличествоПриход", Строка(Результат.КоличествоПриход));
ЗаписьXML.ЗаписатьАтрибут("Номенклатура", Строка(Результат.Номенклатура));
ЗаписьXML.ЗаписатьАтрибут("КоличествоРасход", Строка(Результат.КоличествоРасход));
ЗаписьXML.ЗаписатьАтрибут("КоличествоКонечныйОстаток", Строка(Результат.КоличествоКонечныйОстаток));
ЗаписьXML.ЗаписатьКонецЭлемента();
конеццикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
данные= ЗаписьXML.Закрыть();
Возврат Данные;
конецфункции
// Функция получает остатки из регистра по полученным параметрам (Время и склад),
// формирует XML запись , и отправляет обратно
//1.Создаем web-сервис (заполняем только "Основные" и "Прочее", пока что ...)
// - Имя любое(не критично, но желательно на англ.)
// -URl пространство имен - вводим ip адресс для удобства (пример: 127.7.7.7)
// -Пакеты XDTO , я еще не совсем разобрался )), поэтому выбираю стандартный
// (http://v8.1c.ru/8.1/xdto), особой роли не играет в данном примере.
// -Имя файла публикации - Любое значение с форматом *.1cws(Пример: Obmen.1cws)
//2. Создаем Операцию с параметрами (Напоминает стандартную "Функцию" с параметрами)
// Например -Операция "ОстаткиТоваровНТТ"
// тип возвращаемого значение- "Строка"- string (http://www.w3.org/2001/XMLSchema)
//3 создаем операции :Время с Типом: DataTime , Склад с Типом: string - пока хватит )
//4 создаем процедуру для операции "ОстаткиТоваровНТТ", в свойствах операции и
// заполним функцию ниже:
//5 в самом конце, обновляем базу и публикуем, готово!
Функция ОстаткиТоваровНТТ(Склад, Время)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML(); // Записываем объявление XML
ЗаписьXML.ЗаписатьНачалоЭлемента("ОстаткиТоваров");
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
| СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток,
| СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход) КАК КоличествоПриход,
| СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
| СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачПериод, &КонПериод, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты
|ГДЕ
| ТоварыНаСкладахОстаткиИОбороты.Склад = &Склад
|СГРУППИРОВАТЬ ПО
| ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
| ТоварыНаСкладахОстаткиИОбороты.Склад,
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура УБЫВ";
Запрос.УстановитьПараметр("НачПериод", Дата(НачалоДня(Время)));
Запрос.УстановитьПараметр("КонПериод", Дата(КонецДня(Время)));
Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию(Склад,Истина)); //склад заморозки Москва
Если запрос.Выполнить().Пустой() тогда
ответ = "За выбранный период остатков не найдено";
возврат ответ;
КонецЕсли;
Результат = Запрос.Выполнить().Выбрать();
пока Результат.Следующий() цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Результат");
ЗаписьXML.ЗаписатьАтрибут("Склад", Строка(Результат.Склад));
ЗаписьXML.ЗаписатьАтрибут("КоличествоНачальныйОстаток", Строка(Результат.КоличествоНачальныйОстаток));
ЗаписьXML.ЗаписатьАтрибут("КоличествоПриход", Строка(Результат.КоличествоПриход));
ЗаписьXML.ЗаписатьАтрибут("Номенклатура", Строка(Результат.Номенклатура));
ЗаписьXML.ЗаписатьАтрибут("КоличествоРасход", Строка(Результат.КоличествоРасход));
ЗаписьXML.ЗаписатьАтрибут("КоличествоКонечныйОстаток", Строка(Результат.КоличествоКонечныйОстаток));
ЗаписьXML.ЗаписатьКонецЭлемента();
конеццикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
данные= ЗаписьXML.Закрыть();
Возврат Данные;
конецфункции
// Функция получает остатки из регистра по полученным параметрам (Время и склад),
// формирует XML запись , и отправляет обратно
Функция открывает внешний отчет или обработку из справочника "ВнешниеОбработки", нужно передать только имя обработки.
Функция ОткрытьВнешнийОтчет(ИмяОтчета) Экспорт
ПутьКВременномуФайлу=КаталогВременныхФайлов()+
"ВременныйФайл" + формат(ТекущаяДата(),"ДФ=ddMMyyyyhhmmss")+ ".tmp";
о = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОтчета);
Если о=Справочники.ВнешниеОбработки.ПустаяСсылка() Тогда
Возврат неопределено;
КонецЕсли;
Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОтчета).ХранилищеВнешнейОбработки.Получить().Записать(ПутьКВременномуФайлу);
Если о.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет Тогда
ВнешниеОтчеты.ПолучитьФорму(ПутьКВременномуФайлу).Открыть();
КонецЕсли;
Если о.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка Тогда
ВнешниеОбработки.ПолучитьФорму(ПутьКВременномуФайлу).Открыть();
КонецЕсли;
УдалитьФайлы(ПутьКВременномуФайлу);
Возврат неопределено;
конецфункции
Функция ОткрытьВнешнийОтчет(ИмяОтчета) Экспорт
ПутьКВременномуФайлу=КаталогВременныхФайлов()+
"ВременныйФайл" + формат(ТекущаяДата(),"ДФ=ddMMyyyyhhmmss")+ ".tmp";
о = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОтчета);
Если о=Справочники.ВнешниеОбработки.ПустаяСсылка() Тогда
Возврат неопределено;
КонецЕсли;
Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОтчета).ХранилищеВнешнейОбработки.Получить().Записать(ПутьКВременномуФайлу);
Если о.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет Тогда
ВнешниеОтчеты.ПолучитьФорму(ПутьКВременномуФайлу).Открыть();
КонецЕсли;
Если о.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка Тогда
ВнешниеОбработки.ПолучитьФорму(ПутьКВременномуФайлу).Открыть();
КонецЕсли;
УдалитьФайлы(ПутьКВременномуФайлу);
Возврат неопределено;
конецфункции
//На клиенте
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = "Выберите файл";
Если ДиалогВыбора.Выбрать() Тогда
ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
Команда1НаСервере(ИмяФайла);
КонецЕсли;
//На сервере
//Вывод в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
//вывод в таблицу значений
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТаблицаЗначений = ПЗ.Результат.Выгрузить();
//На клиенте
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = "Выберите файл";
Если ДиалогВыбора.Выбрать() Тогда
ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
Команда1НаСервере(ИмяФайла);
КонецЕсли;
//На сервере
//Вывод в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
//вывод в таблицу значений
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТаблицаЗначений = ПЗ.Результат.Выгрузить();
Как по GUID определить время и дату создания ссылки?
Функция UUID_Timestamp(Ссылка)
ГУИД = Ссылка.УникальныйИдентификатор();
// Например ГУИД равен: bdb62d89-cede-11e4-b12b-d4ae52b5e909
// Дата содержится в первых символах, bdb62d89-cede-11e4 которые нужно переставить задом наперед: 11e4-cede-bdb62d89
Строка16 = Сред(ГУИД, 15, 4) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
// Убираем "лишние" знаки "-"(тире).
Строка16 = СтрЗаменить(Строка16, "-", "");
// Убираем первый символ, так как в нем содержится версия стандарта (зашит в седьмой октет)
Строка15 = Сред(Строка16, 2);
// Получаем timestamp в 60 бит : 1E4 CEDE BDB6 2D89
ЧислоСек = 0;
Для Позиция = 1 По СтрДлина(Строка15) Цикл
ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка15,Позиция,1))*Pow(16,СтрДлина(Строка15) - Позиция);
КонецЦикла;
ЧислоСек = ЧислоСек / 10000000;
// Прибавляем к дате начала Григореанского календаря
Возврат Дата(1582, 10, 15, 00, 00, 00) + ЧислоСек + СмещениеСтандартногоВремени() + СмещениеЛетнегоВремени();;
КонецФункции
Функция UUID_Timestamp(Ссылка)
ГУИД = Ссылка.УникальныйИдентификатор();
// Например ГУИД равен: bdb62d89-cede-11e4-b12b-d4ae52b5e909
// Дата содержится в первых символах, bdb62d89-cede-11e4 которые нужно переставить задом наперед: 11e4-cede-bdb62d89
Строка16 = Сред(ГУИД, 15, 4) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
// Убираем "лишние" знаки "-"(тире).
Строка16 = СтрЗаменить(Строка16, "-", "");
// Убираем первый символ, так как в нем содержится версия стандарта (зашит в седьмой октет)
Строка15 = Сред(Строка16, 2);
// Получаем timestamp в 60 бит : 1E4 CEDE BDB6 2D89
ЧислоСек = 0;
Для Позиция = 1 По СтрДлина(Строка15) Цикл
ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка15,Позиция,1))*Pow(16,СтрДлина(Строка15) - Позиция);
КонецЦикла;
ЧислоСек = ЧислоСек / 10000000;
// Прибавляем к дате начала Григореанского календаря
Возврат Дата(1582, 10, 15, 00, 00, 00) + ЧислоСек + СмещениеСтандартногоВремени() + СмещениеЛетнегоВремени();;
КонецФункции
GET-запрос к HTTP-серверу
Заголовки=Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml");
Заголовки.Вставить("Accept","application/xml");
Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса="clients/list";
Запрос.Заголовки=Заголовки;
Соединение=Новый HTTPСоединение("api.yourserver.ru");//таким образом полный URL запроса http://api.yourserver.ru/clients/list
Ответ=Соединение.Получить(Запрос);
КодСостояния=Ответ.КодСостояния;
СтрокаОтвета=Ответ.ПолучитьТелоКакСтроку();
Если КодСостояния=200 тогда
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаОтвета);
Попытка
КонтрагентыСписокXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип("http://api.yourserver.ru/xdto","ClientList"));
Исключение
Сообщить(СформироватьСообщениеОбОшибке(ИнформацияОбОшибке()));
Предупреждение("Сервер прислал плохие данные!");
Возврат;
КонецПопытки;
//обработка объекта XDTO
Иначе
//обработка ошибочных кодов
КонецЕсли;
Заголовки=Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml");
Заголовки.Вставить("Accept","application/xml");
Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса="clients/list";
Запрос.Заголовки=Заголовки;
Соединение=Новый HTTPСоединение("api.yourserver.ru");//таким образом полный URL запроса http://api.yourserver.ru/clients/list
Ответ=Соединение.Получить(Запрос);
КодСостояния=Ответ.КодСостояния;
СтрокаОтвета=Ответ.ПолучитьТелоКакСтроку();
Если КодСостояния=200 тогда
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаОтвета);
Попытка
КонтрагентыСписокXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип("http://api.yourserver.ru/xdto","ClientList"));
Исключение
Сообщить(СформироватьСообщениеОбОшибке(ИнформацияОбОшибке()));
Предупреждение("Сервер прислал плохие данные!");
Возврат;
КонецПопытки;
//обработка объекта XDTO
Иначе
//обработка ошибочных кодов
КонецЕсли;
ред. 07 августа 2015 14:59
Автоматическое заполнение сведений о внешней обработки для отчета
#Область ОсновныеНастройкиДляПодключения
//не забываем заполнять Обработка->Действия->Свойства->ХранилищеВариантовОтчетов
Функция ВернутьСтруктуруПараметров()
Структура = Новый Структура();
Структура.Вставить("Документ","");
Структура.Вставить("Представление",ЭтотОбъект.Метаданные().Представление());
Структура.Вставить("Наименование",ЭтотОбъект.Метаданные().Синоним);
Структура.Вставить("Идентификатор",ЭтотОбъект.Метаданные().Имя);
Структура.Вставить("Версия","1.0.0.0");
Возврат Структура;
КонецФункции
Функция СведенияОВнешнейОбработке() ЭКСПОРТ
ПараметрыОбработки = ВернутьСтруктуруПараметров();
Сведения = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
Сведения.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
Сведения.Наименование = ПараметрыОбработки.Наименование;
стр = Сведения.Команды.Добавить();
стр.Представление = ПараметрыОбработки.Представление;
стр.Идентификатор = ПараметрыОбработки.Идентификатор;
стр.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Возврат Сведения;
КонецФункции
#КонецОбласти
#Область ОсновныеНастройкиДляПодключения
//не забываем заполнять Обработка->Действия->Свойства->ХранилищеВариантовОтчетов
Функция ВернутьСтруктуруПараметров()
Структура = Новый Структура();
Структура.Вставить("Документ","");
Структура.Вставить("Представление",ЭтотОбъект.Метаданные().Представление());
Структура.Вставить("Наименование",ЭтотОбъект.Метаданные().Синоним);
Структура.Вставить("Идентификатор",ЭтотОбъект.Метаданные().Имя);
Структура.Вставить("Версия","1.0.0.0");
Возврат Структура;
КонецФункции
Функция СведенияОВнешнейОбработке() ЭКСПОРТ
ПараметрыОбработки = ВернутьСтруктуруПараметров();
Сведения = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
Сведения.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
Сведения.Наименование = ПараметрыОбработки.Наименование;
стр = Сведения.Команды.Добавить();
стр.Представление = ПараметрыОбработки.Представление;
стр.Идентификатор = ПараметрыОбработки.Идентификатор;
стр.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Возврат Сведения;
КонецФункции
#КонецОбласти
ДанныеНакладной = Новый ТаблицаЗначений();
ДанныеНакладной.Колонки.Добавить("НоменклатураАртикул");
ДанныеНакладной.Колонки.Добавить("Количество");
ДанныеНакладной.Колонки.Добавить("Цена");
Для Каждого Стр Из Товары Цикл
Если Стр.Номенклатура.Артикул = "" Тогда
Сообщить ("Внимание! В номенклатуре " + Стр.Номенклатура + " не определен артикул.");
Иначе
СтрокаТЗ = ДанныеНакладной.Добавить();
СтрокаТЗ.НоменклатураАртикул = Стр.Номенклатура.Артикул;
СтрокаТЗ.Количество = Стр.Количество;
СтрокаТЗ.Цена = Стр.Цена;
КонецЕсли;
КонецЦикла;
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
XML = Новый ЗаписьXML;
ИмяФайла = "" + КРВ_ВспомогательныеФункции.УбратьНули(Номер)
+ " - " + КРВ_ВспомогательныеФункции.УбратьНедопустимыеСимволы(Контрагент);
XML.ОткрытьФайл("d:\1C_DATA\ОБМЕН\" + ИмяФайла + ".xml");
Сериализатор.ЗаписатьXML(XML, ДанныеНакладной);
ДанныеНакладной = Новый ТаблицаЗначений();
ДанныеНакладной.Колонки.Добавить("НоменклатураАртикул");
ДанныеНакладной.Колонки.Добавить("Количество");
ДанныеНакладной.Колонки.Добавить("Цена");
Для Каждого Стр Из Товары Цикл
Если Стр.Номенклатура.Артикул = "" Тогда
Сообщить ("Внимание! В номенклатуре " + Стр.Номенклатура + " не определен артикул.");
Иначе
СтрокаТЗ = ДанныеНакладной.Добавить();
СтрокаТЗ.НоменклатураАртикул = Стр.Номенклатура.Артикул;
СтрокаТЗ.Количество = Стр.Количество;
СтрокаТЗ.Цена = Стр.Цена;
КонецЕсли;
КонецЦикла;
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
XML = Новый ЗаписьXML;
ИмяФайла = "" + КРВ_ВспомогательныеФункции.УбратьНули(Номер)
+ " - " + КРВ_ВспомогательныеФункции.УбратьНедопустимыеСимволы(Контрагент);
XML.ОткрытьФайл("d:\1C_DATA\ОБМЕН\" + ИмяФайла + ".xml");
Сериализатор.ЗаписатьXML(XML, ДанныеНакладной);
POST-запрос к HTTP-серверу
ЗаписьXML=Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
Фабрика.ЗаписатьXML(ЗаписьXML, КонтрагентXDTO);//объект XDTO создан и заполнен ранее
Заголовки=Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml");
Заголовки.Вставить("Accept","application/xml");
Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса="clients/add";
Запрос.Заголовки=Заголовки;
Запрос.УстановитьТелоИзСтроки(ЗаписьXML.Закрыть());
Соединение=Новый HTTPСоединение("api.yourserver.ru");//таким образом полный URL запроса http://api.yourserver.ru/clients/add
Ответ=Соединение.ОтправитьДляОбработки(Запрос);
КодСостояния=Ответ.КодСостояния;
СтрокаОтвета=Ответ.ПолучитьТелоКакСтроку();
Если КодСостояния=201 тогда
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаОтвета);
Попытка
СтатусРаботыXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип("http://api.yourserver.ru/xdto","Status"));
Исключение
Сообщить(СформироватьСообщениеОбОшибке(ИнформацияОбОшибке()));
Предупреждение("Сервер прислал плохие данные!");
Возврат;
КонецПопытки;
//обработка объекта XDTO
Иначе
//обработка ошибочных кодов
КонецЕсли;
ЗаписьXML=Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
Фабрика.ЗаписатьXML(ЗаписьXML, КонтрагентXDTO);//объект XDTO создан и заполнен ранее
Заголовки=Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml");
Заголовки.Вставить("Accept","application/xml");
Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса="clients/add";
Запрос.Заголовки=Заголовки;
Запрос.УстановитьТелоИзСтроки(ЗаписьXML.Закрыть());
Соединение=Новый HTTPСоединение("api.yourserver.ru");//таким образом полный URL запроса http://api.yourserver.ru/clients/add
Ответ=Соединение.ОтправитьДляОбработки(Запрос);
КодСостояния=Ответ.КодСостояния;
СтрокаОтвета=Ответ.ПолучитьТелоКакСтроку();
Если КодСостояния=201 тогда
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаОтвета);
Попытка
СтатусРаботыXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип("http://api.yourserver.ru/xdto","Status"));
Исключение
Сообщить(СформироватьСообщениеОбОшибке(ИнформацияОбОшибке()));
Предупреждение("Сервер прислал плохие данные!");
Возврат;
КонецПопытки;
//обработка объекта XDTO
Иначе
//обработка ошибочных кодов
КонецЕсли;
ред. 07 августа 2015 15:00
// Функция возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Демо обработка");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", "Демо обработка");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Демо обработка",
"Идентификатор",
"ВызовСерверногоМетода",
Истина,"");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Процедура ВыполнитьКоманду(Идентификатор, ОбъектыНазначения) Экспорт
// Тело процедуры
КонецПроцедуры
// Функция возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Демо обработка");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", "Демо обработка");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Демо обработка",
"Идентификатор",
"ВызовСерверногоМетода",
Истина,"");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Процедура ВыполнитьКоманду(Идентификатор, ОбъектыНазначения) Экспорт
// Тело процедуры
КонецПроцедуры
ред. 21 декабря 2020 15:17
Формирует строку со структурой JSON без создания файла
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Выражение");
ЗаписьJSON.ЗаписатьЗначение("Сумма 1 + 1");
ЗаписьJSON.ЗаписатьИмяСвойства("Результат");
ЗаписьJSON.ЗаписатьЗначение(2);
ЗаписьJSON.ЗаписатьКонецОбъекта();
ТелоЗапроса = ЗаписьJSON.Закрыть();
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Выражение");
ЗаписьJSON.ЗаписатьЗначение("Сумма 1 + 1");
ЗаписьJSON.ЗаписатьИмяСвойства("Результат");
ЗаписьJSON.ЗаписатьЗначение(2);
ЗаписьJSON.ЗаписатьКонецОбъекта();
ТелоЗапроса = ЗаписьJSON.Закрыть();
Отправка электронной почты
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "";
Профиль.ПользовательSMTP = "";
Профиль.ПарольSMTP = "";
Профиль.ИспользоватьSSLSMTP = false;
Профиль.ПортSMTP = 25;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации;
Письмо = Новый ИнтернетПочтовоеСообщение;
Текст1 = Письмо.Тексты.Добавить(Текст);
Текст1.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Письмо.Тема = Тема;
Письмо.Отправитель = "";
Письмо.ИмяОтправителя = "Сообщение от 1с";
Письмо.Получатели.Добавить("");
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Сообщить("Подключено");
Исключение
Сообщить("Не удалось подключиться к серверу");
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
Почта.Послать(Письмо);
Сообщить("Письмо отправлено");
Исключение
Сообщить("Не удалось отправить письмо");
Сообщить(ОписаниеОшибки());
КонецПопытки;
Почта.Отключиться();
Сообщить("Соединение завершено");
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "";
Профиль.ПользовательSMTP = "";
Профиль.ПарольSMTP = "";
Профиль.ИспользоватьSSLSMTP = false;
Профиль.ПортSMTP = 25;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации;
Письмо = Новый ИнтернетПочтовоеСообщение;
Текст1 = Письмо.Тексты.Добавить(Текст);
Текст1.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Письмо.Тема = Тема;
Письмо.Отправитель = "";
Письмо.ИмяОтправителя = "Сообщение от 1с";
Письмо.Получатели.Добавить("");
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Сообщить("Подключено");
Исключение
Сообщить("Не удалось подключиться к серверу");
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
Почта.Послать(Письмо);
Сообщить("Письмо отправлено");
Исключение
Сообщить("Не удалось отправить письмо");
Сообщить(ОписаниеОшибки());
КонецПопытки;
Почта.Отключиться();
Сообщить("Соединение завершено");
делаем запрос в УТ из сторонней базы для поиска документа
//Подключение к внешней базе
&НаСервере
Функция ПодключитьВнешнийИсточник(СтрокаСоединения, ОбъектПодключения="V82.COMConnector")
Попытка
Connector = Новый COMОбъект("V82.COMConnector");
COM = Connector.connect(СтрокаСоединения);
Возврат COM;
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции
&НаКлиенте
Процедура Подключение(Команда)
ПодключениеСервер();
КонецПроцедуры
//Подключение и Выгрузка данных из сторонней базы
&НаСервере
Процедура ПодключениеСервер()
Соединение = ПодключитьВнешнийИсточник("Srvr=""ИмяСервера"";Ref=""ИмяБазы"";Usr=""Пользователь"";Pwd=""Пароль"";");
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслуг.Номер
| ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ГДЕ
| РеализацияТоваровУслуг.Номер = &Номер";
Запрос.УстановитьПараметр("Номер",Номер);
РезультатЗапроса = Запрос.Выполнить().Выгрузить(); //Получили COM объект
Преобразование = ЗначениеИзСтрокиВнутр(Соединение.ЗначениеВСтрокуВнутр(РезультатЗапроса)); //преобразовали COM объект
Для каждого стр из Преобразование Цикл
Сообщить(стр.номер);
КонецЦикла;
КонецПроцедуры
//Подключение к внешней базе
&НаСервере
Функция ПодключитьВнешнийИсточник(СтрокаСоединения, ОбъектПодключения="V82.COMConnector")
Попытка
Connector = Новый COMОбъект("V82.COMConnector");
COM = Connector.connect(СтрокаСоединения);
Возврат COM;
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции
&НаКлиенте
Процедура Подключение(Команда)
ПодключениеСервер();
КонецПроцедуры
//Подключение и Выгрузка данных из сторонней базы
&НаСервере
Процедура ПодключениеСервер()
Соединение = ПодключитьВнешнийИсточник("Srvr=""ИмяСервера"";Ref=""ИмяБазы"";Usr=""Пользователь"";Pwd=""Пароль"";");
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслуг.Номер
| ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ГДЕ
| РеализацияТоваровУслуг.Номер = &Номер";
Запрос.УстановитьПараметр("Номер",Номер);
РезультатЗапроса = Запрос.Выполнить().Выгрузить(); //Получили COM объект
Преобразование = ЗначениеИзСтрокиВнутр(Соединение.ЗначениеВСтрокуВнутр(РезультатЗапроса)); //преобразовали COM объект
Для каждого стр из Преобразование Цикл
Сообщить(стр.номер);
КонецЦикла;
КонецПроцедуры
Функция на вход принимает Запрос, Текст запроса, таблицу значений и дерево значений
// Пример универсальной функции для создания схемы компоновки данных
// Опубликовал Дмитрий Иванов (kambl) в раздел Программирование - Практика программирования
// http://infostart.ru/public/575659/
//
// Если вам приходится часто создавать схему компоновки данных программно или вы начинающий специалист и пытаетесь разобраться, что же за зверь такой СКД, то эта статья может оказаться вам полезной. Функция создает схему компоновки с минимально необходимой структурой данных. С помощью передачи дополнительных параметров есть возможность добавления ресурсов и оформления.
// Появилась необходимость часто прибегать к программному созданию схемы компоновки данных. Было принято решение написать универсальную функцию принимающую различные наборы данных и на выходе возвращающую готовую СКД. Функция на вход принимает Запрос, Текст запроса, таблицу значений и дерево значений.
// Помимо набора данных функция принимает ряд необязательных параметров:
//
// Структура ресурсов: содержит перечень полей ресурсов, где ключ - ИмяПоля, Значение(Строка) - Агрегатная функция ("Сумма", "Среднее", "Количество", и т.д.);
// Флаг АвтоЗаполнениеДоступныхПолей;
// Строковое Имя макета оформления.
//
// НаборДанных (Типы: Строка, Запрос, ТаблицаЗначений, ДеревоЗначений)
// Искомый набор данных
//
// СтруктураРесурсов (Тип: Структура) - Структура полей ресурсов, где ключ - ИмяПоля, Значение(Строка) - Агрегатная функция
//
// ВноситьПоляВыбора (Тип: Булево) - Флаг добавление полей набора
//
// ИмяСтандартногоМакетаОформления (Тип: Строка) - Имя макета оформления
//
Функция СоздатьСхемуКомпоновкиДанных(НаборДанных, СтруктураРесурсов = Неопределено, АвтоЗаполнениеДоступныхПолей = Истина, ИмяСтандартногоМакетаОформления = "")
СКД = Новый СхемаКомпоновкиДанных;
// Заполнение основных данных схемы
ИсточникДанных = СКД.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных";
ИсточникДанных.ТипИсточникаДанных = "Local";
Если ТипЗнч(НаборДанных) = Тип("Строка") или
ТипЗнч(НаборДанных) = Тип("Запрос") Тогда
ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
ТекущийНаборДанных.Имя = "ОсновнойНабор";
ТекущийНаборДанных.Запрос = ?(ТипЗнч(НаборДанных) = Тип("Строка"), НаборДанных, НаборДанных.Текст);
ТекущийНаборДанных.ИсточникДанных = "ИсточникДанных";
ТекущийНаборДанных.АвтоЗаполнениеДоступныхПолей = АвтоЗаполнениеДоступныхПолей;
ТипНабора = "Запрос";
ИначеЕсли ТипЗнч(НаборДанных) = Тип("ТаблицаЗначений") или
ТипЗнч(НаборДанных) = Тип("ДеревоЗначений") Тогда
ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
ТекущийНаборДанных.Имя = "ОсновнойНабор";
ТекущийНаборДанных.ИмяОбъекта = "ТаблицаИсточник"; // связывание с внешними данными идёт именно по нему
ТекущийНаборДанных.ИсточникДанных = "ИсточникДанных";
ТипНабора = "Объект";
Иначе
Возврат Неопределено;
КонецЕсли;
НастройкиПоУмолчанию = СКД.НастройкиПоУмолчанию;
// Создание структуры.
// Группировка, детальные записи и автовыбранное поле
Группировка = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группировка.Использование = Истина;
АвтоПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоПоле.Использование = Истина;
КоллекцияКолонок = Новый ТаблицаЗначений;
КоллекцияКолонок.Колонки.Добавить("Имя");
КоллекцияКолонок.Колонки.Добавить("ТипЗначения");
КоллекцияКолонок.Колонки.Добавить("Заголовок");
Если ТипНабора = "Запрос" Тогда
ПостроительЗапроса = Новый ПостроительЗапроса;
Если ТипЗнч(НаборДанных) = Тип("Строка") Тогда
ПостроительЗапроса.Текст = СокрЛП(НаборДанных);
Иначе
ПостроительЗапроса.Текст = СокрЛП(НаборДанных.Текст);
КонецЕсли;
ПостроительЗапроса.ЗаполнитьНастройки();
Для Каждого ПолеОтбора Из ПостроительЗапроса.ВыбранныеПоля Цикл
НоваяКолонка = КоллекцияКолонок.Добавить();
НоваяКолонка.Имя = ПолеОтбора.Имя;
НоваяКолонка.ТипЗначения = ПостроительЗапроса.ДоступныеПоля[ПолеОтбора.ПутьКДанным].ТипЗначения;
НоваяКолонка.Заголовок = ПолеОтбора.Представление
КонецЦикла;
ИначеЕсли ТипНабора = "Объект" Тогда
Для Каждого Колонка Из НаборДанных.Колонки Цикл
НоваяКолонка = КоллекцияКолонок.Добавить();
НоваяКолонка.Имя = Колонка.Имя;
НоваяКолонка.ТипЗначения = Колонка.ТипЗначения;
НоваяКолонка.Заголовок = Колонка.Имя;
КонецЦикла;
КонецЕсли;
// Добавление ресурсов
Если ТипЗнч(СтруктураРесурсов) = Тип("Структура") Тогда
Для Каждого ЭлСтруктуры Из СтруктураРесурсов Цикл
// Проверка, а Существует ли поле ресурса среди полей набора
Если КоллекцияКолонок.Найти(ЭлСтруктуры.Ключ) <> Неопределено Тогда
// Проверка на правильность указания агрегатной функции
Если ЭлСтруктуры.Значение = "Сумма" ИЛИ
ЭлСтруктуры.Значение = "Среднее" ИЛИ
ЭлСтруктуры.Значение = "Максимум" ИЛИ
ЭлСтруктуры.Значение = "Минимум" ИЛИ
ЭлСтруктуры.Значение = "Количество" Тогда
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = ЭлСтруктуры.Ключ;
ПолеРесурса.Выражение = ЭлСтруктуры.Значение + "(" + ЭлСтруктуры.Ключ + ")";
ИначеЕсли ЭлСтруктуры.Значение = "КоличествоРазличные" Тогда
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = ЭлСтруктуры.Ключ;
ПолеРесурса.Выражение = "Количество(Различные " + ЭлСтруктуры.Ключ + ")";
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Добавление полей в набор
Для Каждого НоваяКолонка Из КоллекцияКолонок Цикл
ПолеНабора = ТекущийНаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабора.Заголовок = СокрЛП(НоваяКолонка.Заголовок);
ПолеНабора.Поле = СокрЛП(НоваяКолонка.Имя);
ПолеНабора.ПутьКДанным = СокрЛП(НоваяКолонка.Имя);
// Удалим Неопределено и NULL
Массив = Новый Массив;
Для Каждого ТекущийТип Из НоваяКолонка.ТипЗначения.Типы() Цикл
Если ТекущийТип = Тип("Неопределено") ИЛИ ТекущийТип = Тип("NULL") ИЛИ
ТекущийТип = Неопределено ИЛИ ТекущийТип = Null Тогда
Продолжить;
КонецЕсли;
Массив.Добавить(ТекущийТип);
КонецЦикла;
ПолеНабора.ТипЗначения = Новый ОписаниеТипов(Массив, НоваяКолонка.ТипЗначения.КвалификаторыЧисла,
НоваяКолонка.ТипЗначения.КвалификаторыСтроки,
НоваяКолонка.ТипЗначения.КвалификаторыДаты);
ВыбранноеПолеКомпоновкиДанных = НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(ПолеНабора.ПутьКДанным);
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
КонецЦикла;
// Оформление
Если не ПустаяСтрока(ИмяСтандартногоМакетаОформления) Тогда
ЗначениеПараметраВывода = НастройкиПоУмолчанию.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МакетОформления"));
ЗначениеПараметраВывода.Значение = ИмяСтандартногоМакетаОформления;
ЗначениеПараметраВывода.Использование = Истина;
КонецЕсли;
Возврат СКД;
КонецФункции // СоздатьСхемуКомпоновкиДанных
// Пример универсальной функции для создания схемы компоновки данных
// Опубликовал Дмитрий Иванов (kambl) в раздел Программирование - Практика программирования
// http://infostart.ru/public/575659/
//
// Если вам приходится часто создавать схему компоновки данных программно или вы начинающий специалист и пытаетесь разобраться, что же за зверь такой СКД, то эта статья может оказаться вам полезной. Функция создает схему компоновки с минимально необходимой структурой данных. С помощью передачи дополнительных параметров есть возможность добавления ресурсов и оформления.
// Появилась необходимость часто прибегать к программному созданию схемы компоновки данных. Было принято решение написать универсальную функцию принимающую различные наборы данных и на выходе возвращающую готовую СКД. Функция на вход принимает Запрос, Текст запроса, таблицу значений и дерево значений.
// Помимо набора данных функция принимает ряд необязательных параметров:
//
// Структура ресурсов: содержит перечень полей ресурсов, где ключ - ИмяПоля, Значение(Строка) - Агрегатная функция ("Сумма", "Среднее", "Количество", и т.д.);
// Флаг АвтоЗаполнениеДоступныхПолей;
// Строковое Имя макета оформления.
//
// НаборДанных (Типы: Строка, Запрос, ТаблицаЗначений, ДеревоЗначений)
// Искомый набор данных
//
// СтруктураРесурсов (Тип: Структура) - Структура полей ресурсов, где ключ - ИмяПоля, Значение(Строка) - Агрегатная функция
//
// ВноситьПоляВыбора (Тип: Булево) - Флаг добавление полей набора
//
// ИмяСтандартногоМакетаОформления (Тип: Строка) - Имя макета оформления
//
Функция СоздатьСхемуКомпоновкиДанных(НаборДанных, СтруктураРесурсов = Неопределено, АвтоЗаполнениеДоступныхПолей = Истина, ИмяСтандартногоМакетаОформления = "")
СКД = Новый СхемаКомпоновкиДанных;
// Заполнение основных данных схемы
ИсточникДанных = СКД.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных";
ИсточникДанных.ТипИсточникаДанных = "Local";
Если ТипЗнч(НаборДанных) = Тип("Строка") или
ТипЗнч(НаборДанных) = Тип("Запрос") Тогда
ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
ТекущийНаборДанных.Имя = "ОсновнойНабор";
ТекущийНаборДанных.Запрос = ?(ТипЗнч(НаборДанных) = Тип("Строка"), НаборДанных, НаборДанных.Текст);
ТекущийНаборДанных.ИсточникДанных = "ИсточникДанных";
ТекущийНаборДанных.АвтоЗаполнениеДоступныхПолей = АвтоЗаполнениеДоступныхПолей;
ТипНабора = "Запрос";
ИначеЕсли ТипЗнч(НаборДанных) = Тип("ТаблицаЗначений") или
ТипЗнч(НаборДанных) = Тип("ДеревоЗначений") Тогда
ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
ТекущийНаборДанных.Имя = "ОсновнойНабор";
ТекущийНаборДанных.ИмяОбъекта = "ТаблицаИсточник"; // связывание с внешними данными идёт именно по нему
ТекущийНаборДанных.ИсточникДанных = "ИсточникДанных";
ТипНабора = "Объект";
Иначе
Возврат Неопределено;
КонецЕсли;
НастройкиПоУмолчанию = СКД.НастройкиПоУмолчанию;
// Создание структуры.
// Группировка, детальные записи и автовыбранное поле
Группировка = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группировка.Использование = Истина;
АвтоПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоПоле.Использование = Истина;
КоллекцияКолонок = Новый ТаблицаЗначений;
КоллекцияКолонок.Колонки.Добавить("Имя");
КоллекцияКолонок.Колонки.Добавить("ТипЗначения");
КоллекцияКолонок.Колонки.Добавить("Заголовок");
Если ТипНабора = "Запрос" Тогда
ПостроительЗапроса = Новый ПостроительЗапроса;
Если ТипЗнч(НаборДанных) = Тип("Строка") Тогда
ПостроительЗапроса.Текст = СокрЛП(НаборДанных);
Иначе
ПостроительЗапроса.Текст = СокрЛП(НаборДанных.Текст);
КонецЕсли;
ПостроительЗапроса.ЗаполнитьНастройки();
Для Каждого ПолеОтбора Из ПостроительЗапроса.ВыбранныеПоля Цикл
НоваяКолонка = КоллекцияКолонок.Добавить();
НоваяКолонка.Имя = ПолеОтбора.Имя;
НоваяКолонка.ТипЗначения = ПостроительЗапроса.ДоступныеПоля[ПолеОтбора.ПутьКДанным].ТипЗначения;
НоваяКолонка.Заголовок = ПолеОтбора.Представление
КонецЦикла;
ИначеЕсли ТипНабора = "Объект" Тогда
Для Каждого Колонка Из НаборДанных.Колонки Цикл
НоваяКолонка = КоллекцияКолонок.Добавить();
НоваяКолонка.Имя = Колонка.Имя;
НоваяКолонка.ТипЗначения = Колонка.ТипЗначения;
НоваяКолонка.Заголовок = Колонка.Имя;
КонецЦикла;
КонецЕсли;
// Добавление ресурсов
Если ТипЗнч(СтруктураРесурсов) = Тип("Структура") Тогда
Для Каждого ЭлСтруктуры Из СтруктураРесурсов Цикл
// Проверка, а Существует ли поле ресурса среди полей набора
Если КоллекцияКолонок.Найти(ЭлСтруктуры.Ключ) <> Неопределено Тогда
// Проверка на правильность указания агрегатной функции
Если ЭлСтруктуры.Значение = "Сумма" ИЛИ
ЭлСтруктуры.Значение = "Среднее" ИЛИ
ЭлСтруктуры.Значение = "Максимум" ИЛИ
ЭлСтруктуры.Значение = "Минимум" ИЛИ
ЭлСтруктуры.Значение = "Количество" Тогда
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = ЭлСтруктуры.Ключ;
ПолеРесурса.Выражение = ЭлСтруктуры.Значение + "(" + ЭлСтруктуры.Ключ + ")";
ИначеЕсли ЭлСтруктуры.Значение = "КоличествоРазличные" Тогда
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = ЭлСтруктуры.Ключ;
ПолеРесурса.Выражение = "Количество(Различные " + ЭлСтруктуры.Ключ + ")";
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Добавление полей в набор
Для Каждого НоваяКолонка Из КоллекцияКолонок Цикл
ПолеНабора = ТекущийНаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабора.Заголовок = СокрЛП(НоваяКолонка.Заголовок);
ПолеНабора.Поле = СокрЛП(НоваяКолонка.Имя);
ПолеНабора.ПутьКДанным = СокрЛП(НоваяКолонка.Имя);
// Удалим Неопределено и NULL
Массив = Новый Массив;
Для Каждого ТекущийТип Из НоваяКолонка.ТипЗначения.Типы() Цикл
Если ТекущийТип = Тип("Неопределено") ИЛИ ТекущийТип = Тип("NULL") ИЛИ
ТекущийТип = Неопределено ИЛИ ТекущийТип = Null Тогда
Продолжить;
КонецЕсли;
Массив.Добавить(ТекущийТип);
КонецЦикла;
ПолеНабора.ТипЗначения = Новый ОписаниеТипов(Массив, НоваяКолонка.ТипЗначения.КвалификаторыЧисла,
НоваяКолонка.ТипЗначения.КвалификаторыСтроки,
НоваяКолонка.ТипЗначения.КвалификаторыДаты);
ВыбранноеПолеКомпоновкиДанных = НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(ПолеНабора.ПутьКДанным);
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
КонецЦикла;
// Оформление
Если не ПустаяСтрока(ИмяСтандартногоМакетаОформления) Тогда
ЗначениеПараметраВывода = НастройкиПоУмолчанию.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МакетОформления"));
ЗначениеПараметраВывода.Значение = ИмяСтандартногоМакетаОформления;
ЗначениеПараметраВывода.Использование = Истина;
КонецЕсли;
Возврат СКД;
КонецФункции // СоздатьСхемуКомпоновкиДанных