Публикации

БСП
Разработки

Отправить двоичные данные в телеграм (zip/pdf/gif)

https://gist.github.com/PlugFox/4499132c45b73ae5bc8dda52a1218dff Готовая обработка бинарником Send2Telegram.epf В принципе можете интегрировать в свое решение, у её модуля объекта есть конструктор и экспортные процедуры отправки. НаСервере Процедура ПриСоз... Читать дальше
5 FOX 13 2

Downloader 1C

Консольное приложение для подготовки библиотеки дистрибутива 1С

TurboConf - расширение Конфигуратора 1С Промо

TurboConf повышает эффективность работы в Конфигураторе 1С и помогает автоматизировать рутинные задачи.
1 bolsun

Скомпоновать результат отчета

Выполняет компоновку СКД по переданным настройкам
// Выполняет компоновку СКД по переданным настройкам
//
// Параметры:
//  Результат               - ТабличныйДокумент,ТаблицаЗначений,ДеревоЗначений                      - результат выполнения
//  СхемаКомпоновкиДанных   - СхемаКомпоновкиДанных                                                 - выполняемая СКД
//  НастройкиКомпоновки     - НастройкиКомпоновкиДанных,КомпоновщикНастроекКомпоновкиДанных,Строка  - выполняемые настройки или адрес временного хранилища или компоновщик с настройками
//  ДанныеРасшифровки       - ДанныеРасшифровкиКомпоновкиДанных, Неопределено                       - данные расшифровки
//  ВнешниеНаборыДанных     - Структура, Неопределено                                               - коллекция внешних наборов данных
//  ДополнительныеПараметры - Структура, Неопределено                                               - коллекция внешних наборов данных
//       * МакетОформления              - МакетОформленияКомпоновкиДанных   - Макет оформления, в соответствии с которым необходимо оформлять макет компоновки данных.
//       * ПроверятьДоступностьПолей    - Булево - Определяет, выполнять ли проверку прав на просмотр полей и проверку доступности поля во включенных функциональных возможностях.
//       * ПараметрыФункциональныхОпций - Булево - Содержит параметры функциональных опций, используемые при исполнении отчета.
//       * ВозможностьИспользованияВнешнихФункций - Булево - Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.
//
// SeiOkami: 
//     https://infostart.ru/profile/309462/
//     https://t.me/JuniorOneS
//Подробнее об использовании метода: https://infostart.ru/public/1082944/?ref=1159
//
Процедура СкомпоноватьРезультатОтчета(Результат, СхемаКомпоновкиДанных, НастройкиКомпоновки, 
    ДанныеРасшифровки = Неопределено, ВнешниеНаборыДанных = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
           
    
    //Инициализируем настройки
    Если ТипЗнч(НастройкиКомпоновки) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
        ВыполняемыеНастройки    = НастройкиКомпоновки.ПолучитьНастройки();
    ИначеЕсли ТипЗнч(НастройкиКомпоновки) = Тип("Строка") И ЭтоАдресВременногоХранилища(НастройкиКомпоновки) Тогда
        ВыполняемыеНастройки    = ПолучитьИзВременногоХранилища(НастройкиКомпоновки);
    Иначе 
        ВыполняемыеНастройки    = НастройкиКомпоновки;   
    КонецЕсли;
    
    Если НЕ ТипЗнч(ВыполняемыеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
        Возврат;
    КонецЕсли;
    

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

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

Преобразовать массив структур в ТаблицуЗначений

Функция ПреобразоватьМассивВТаблицуЗначений(мсДанные) Экспорт
    
    тзДанные = Новый ТаблицаЗначений;
    Для Каждого ЭлементМассива Из мсДанные Цикл
        Если тзДанные.Колонки.Количество() = 0 Тогда
            Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
				МассивДопустимыеТипы = Новый Массив;
				ТипКолонки = ТипЗнч(ЗначениеСтруктуры.Значение); 
    			МассивДопустимыеТипы.Добавить(ТипКолонки);                     
    			Описание_Типов = Новый ОписаниеТипов(МассивДопустимыеТипы);
				тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ,Описание_Типов);
            КонецЦикла;
        КонецЕсли;
        НоваяСтрока = тзДанные.Добавить();
        Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
            НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение;
        КонецЦикла;
    КонецЦикла;
    
    Возврат тзДанные;
    
КонецФункции

Отправить сообщение или табличный документ в телеграм

Отправить сообщение или табличный документ в телеграм
4 FOX 13 2
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/// The MIT License
/// 
/// Copyright (c) 2019 Plague Fox
/// 
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the "Software"), to deal
/// in the Software without restriction, including without limitation the rights
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
/// copies of the Software, and to permit persons to whom the Software is
/// furnished to do so, subject to the following conditions:
/// 
/// The above copyright notice and this permission notice shall be included in
/// all copies or substantial portions of the Software.
/// 
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
/// THE SOFTWARE.
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Перем Токен,ИдентификаторПолучателя; // Телеграм
Перем ПроксиПротокол,ПроксиСервер,ПроксиПорт,ПроксиПользователь,ПроксиПароль; // Прокси

Процедура ОтправитьСообщениеВТелеграм(Сообщение)
    // Глобальные переменные в процедуре:
    // + Токен
    // + ИдентификаторПолучателя
    
    // Сформировать соединение и запрос
    Соединение  = ПолучитьСоединение();
    Адрес       = СтрШаблон("/bot%1/sendMessage?chat_id=%2&parse_mode=HTML&text=%3"
                , Токен
                , ИдентификаторПолучателя
                , КодироватьСтроку(Сообщение, СпособКодированияСтроки.КодировкаURL, "UTF8"));
    Заголовки   = Новый Соответствие;
    Запрос      = Новый HTTPЗапрос(Адрес, Заголовки);
    
    // GET
    Ответ       = Соединение.Получить(Запрос);
    
    // Разбор ответа
    Если Ответ.КодСостояния <> 200 Тогда
        ОтветСтрокой    = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        ВызватьИсключение СтрШаблон("Ошибка отправки вложения в телеграм.
            |Код состояния: %1
            |Тело: %2"
            , Ответ.КодСостояния
            , ОтветСтрокой
        ); 
    КонецЕсли;  
КонецПроцедуры // ОтправитьСообщениеВТелеграм()
//************************************************************
Процедура ОтправитьТабличныйДокументВТелеграм(ТабличныйДокумент, ИмяФайла = "", Сообщение = "")
    // Глобальные переменные в процедуре:
    // + Токен
    // + ИдентификаторПолучателя
    
    // Сформировать тело запроса
    Разделитель     = Строка(Новый УникальныйИдентификатор());
    
    // Формируем основное составное сообщение
    Тело            = Новый ПотокВПамяти();
    ЗаписьДанных    = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, Символы.ВК + Символы.ПС, Символы.ПС, Истина);
    
    // chat_id
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""chat_id""");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку(ИдентификаторПолучателя);
    
    // disable_notification
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""disable_notification""");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку("True");
        
    Если Не ПустаяСтрока(Сообщение) Тогда 
        // caption
        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""caption""");
        ЗаписьДанных.ЗаписатьСтроку("");
        ЗаписьДанных.ЗаписатьСтроку(Сообщение);        
        
        // parse_mode
        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""parse_mode""");
        ЗаписьДанных.ЗаписатьСтроку("");
        ЗаписьДанных.ЗаписатьСтроку("HTML");
    КонецЕсли;
    
    // document    
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=""document""; filename=""%1.pdf""", ?(ПустаяСтрока(ИмяФайла), "document_" + Строка(Новый УникальныйИдентификатор()), ИмяФайла)));
    ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");
    ЗаписьДанных.ЗаписатьСтроку("");   
    ЗаписьДанных.Закрыть();    
    
    // Добавим файл
    ТабличныйДокумент.Записать(Тело, ТипФайлаТабличногоДокумента.PDF);
    
    // Завершение записи
    ЗаписьДанных    = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, Символы.ВК + Символы.ПС, Символы.ПС, Ложь);
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
    ЗаписьДанных.Закрыть();
    
    ДанныеТела          = Тело.ЗакрытьИПолучитьДвоичныеДанные();   

    // Сформировать соединение и запрос
    Соединение  = ПолучитьСоединение();
    Заголовки   = Новый Соответствие;
    Заголовки.Вставить("Content-Type",      "multipart/form-data; boundary=" + Разделитель);
    Заголовки.Вставить("Accept",            "*/*");
    Заголовки.Вставить("Cache-Control",     "no-cache");
    Заголовки.Вставить("Host",              "api.telegram.org");
    Заголовки.Вставить("Accept-Encoding",   "gzip, deflate");
    Заголовки.Вставить("Content-Length",    Формат(ДанныеТела.Размер(), "ЧДЦ=0; ЧН=0; ЧГ=0"));
    Заголовки.Вставить("Connection",        "close");
    Адрес       = СтрШаблон("/bot%1/sendDocument", Токен);
    Запрос      = Новый HTTPЗапрос(Адрес, Заголовки);
    Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);

    // POST
    Ответ       = Соединение.ОтправитьДляОбработки(Запрос);

    // Разбор ответа
    Если Ответ.КодСостояния <> 200 Тогда
        ОтветСтрокой    = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        ВызватьИсключение СтрШаблон("Ошибка отправки вложения в телеграм.
            |Код состояния: %1
            |Тело: %2"
            , Ответ.КодСостояния
            , ОтветСтрокой
        ); 
    КонецЕсли;
КонецПроцедуры // ОтправитьТабличныйДокументВТелеграм()
//************************************************************
Функция ПолучитьСоединение()    
    // Глобальные переменные в процедуре:
    // + ПроксиПротокол
    // + ПроксиСервер
    // + ПроксиПорт
    // + ПроксиПользователь
    // + ПроксиПароль
    
    Прокси      = Новый ИнтернетПрокси(Истина);
    Если ТипЗнч(ПроксиПротокол) = Тип("Строка") И Не ПустаяСтрока(ПроксиПротокол) Тогда
        Прокси.Установить(ПроксиПротокол, ПроксиСервер, ПроксиПорт, ПроксиПользователь, ПроксиПароль, Ложь);
    КонецЕсли;
    SSL         = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение  = Новый HTTPСоединение("api.telegram.org", 443,,, Прокси, 30, SSL, Ложь); 
    Возврат Соединение;
КонецФункции // ПолучитьСоединение()

// ТЕЛЕГРАМ +
Токен                   = ""; // 000000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ИдентификаторПолучателя = ""; // -000000000
// ТЕЛЕГРАМ -

// ПРОКСИ +
ПроксиПротокол          = "https"; // для socks5 - https
ПроксиСервер            = "socks5://0.0.0.0"; // socks5://domain.tld
ПроксиПорт              = 1080; // 1080
ПроксиПользователь      = ""; // user
ПроксиПароль            = ""; // password              
// ПРОКСИ -

Получить данные физического лица

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

Записать текстовый файл без BOM

Для тех кому нужно записать текстовый файл без BOM-раздела. Основная суть в записи через файловый поток
ПутьФайла = ПолучитьИмяВременногоФайла();

СтрокаТекста = "текст";

ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(СтрокаТекста);		
ТекстовыйФайл.Записать(ПутьФайла, КодировкаТекста.UTF8, Символы.ПС);

ФайловыйПоток = Новый ФайловыйПоток(ПутьФайла,РежимОткрытияФайла.Создать);
ТекстовыйФайл.Записать(ФайловыйПоток,КодировкаТекста.UTF8, Символы.ПС, Ложь);

ФайловыйПоток.Закрыть();

Клиент TurboStore

Программа добавляет в Конфигуратор "ТурбоПоиск", который ищет сразу по нескольким источникам данных: сервису FastCode, библиотеке стандартных подсистем (БСП) и каталогу разработок TurboStore.
bolsun 33 4

Формат изображения (уменьшить,обрезать,масштабировать,сжать)

Формат изображения (уменьшить,обрезать,масштабировать,сжать)
Артур 39 1 4
&НаКлиенте
Процедура сжатьФото(Фото)
	МаксимальнаяШирина	= 700; 
	МаксимальнаяВысота	= 400;
			
	ОбрезкаЛ	=  200;
	ОбрезкаВ	=  0;
	ОбрезкаП	=  200;
	ОбрезкаН	=  0;
	
    // Создаем объект
    ФайлКартинка = Новый COMОбъект("WIA.ImageFile");
    ФайлКартинка.LoadFile(Фото);

    //Сообщить("Картинка: " + Картинка.Имя);
    //Сообщить("    Расширение файла: " + ФайлКартинка.FileExtension);
    //Сообщить("    Ширина: " + ФайлКартинка.Width);
    //Сообщить("    Высота: " + ФайлКартинка.Height);
    //Сообщить("    Размер: " + Окр(ФайлКартинка.FileData.Count / 1024, 2) + " Кб");
        
    ФайлПрогресс = Новый COMОбъект("WIA.ImageProcess"); ///ФайлПрогресс.Filters - список Фильтров, всего 8
		
    ФайлПрогресс.Filters.Add(ФайлПрогресс.FilterInfos("Scale").FilterID);    ///масштабирование  
    ФайлПрогресс.Filters.Add(ФайлПрогресс.FilterInfos("Crop").FilterID);     ///Обрезка
	ФайлПрогресс.Filters.Add(ФайлПрогресс.FilterInfos("Convert").FilterID);  ///Конвертация (Сжатия)
		
	ФайлПрогресс.Filters(1).Properties("MaximumWidth").Value  = МаксимальнаяШирина;        
	ФайлПрогресс.Filters(1).Properties("MaximumHeight").Value = МаксимальнаяВысота;	    
	ФайлПрогресс.Filters(1).Properties("PreserveAspectRatio").Value = Ложь;  ///Сохранять пропорции (По умолчанию было истина - сбивает разрешения высоту и ширину)
	
	//Форматы преобразований имееют следующий формат:
	///wiaFormatBMP    = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";      ///  .BMP
	wiaFormatJPEG   = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";         ///  .JPEG

	ФайлПрогресс.Filters(3).Properties("FormatID").Value = wiaFormatJPEG;
	ФайлПрогресс.Filters(3).Properties("Quality").Value = 50;          ///Качество фотографии  (от 1 - 100); 100 =60КБ  50 = 8КБ

	///Обрезка
	ФайлПрогресс.Filters(2).Properties("Left").Value   =  ОбрезкаЛ;       /// лево;    
	ФайлПрогресс.Filters(2).Properties("Top").Value    =  ОбрезкаВ;       /// верх;     
	ФайлПрогресс.Filters(2).Properties("Right").Value  =  ОбрезкаП;       /// право;    
	ФайлПрогресс.Filters(2).Properties("Bottom").Value =  ОбрезкаН;	      /// низ;      
	
	///Применить фильтры к фотографии
    ФайлКартинка = ФайлПрогресс.Apply(ФайлКартинка);

	///Удалить старое фото и создать новое
	УдалитьФайлы(фото);
    ФайлКартинка.SaveFile(фото);
	
	
	//Сообщить("    Расширение файла: " + ФайлКартинка.FileExtension);
	//Сообщить("    Ширина: " + ФайлКартинка.Width);
	//Сообщить("    Высота: " + ФайлКартинка.Height);
	//Сообщить("    Размер: " + Окр(ФайлКартинка.FileData.Count / 1024, 2) + " Кб");
КонецПроцедуры

Убрать итоги из готового текста запроса

Позволяет убрать итоги из текста запроса, на пример, перед передачей его в СКД
ChOP 19 3
СхемаЗапроса = новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1).ВыраженияИтогов.Очистить();
СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1).КонтрольныеТочкиИтогов.Очистить();
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();