Шаблоны кода 1С


Добавить новый Назад

Отправка сообщения в чат-бот телеграм

Удобно использовать при отладке: добавив к условию точки остановки <здесь ваше произвольное условие> И ОповеститьВтелеграм(ОписаниеОшибки()) = Неопределено - отправит в телеграм причину ошибки, если она произошла. Или, условие точки остановки ОповеститьВтелеграм("Процедура окончена") = Неопределено И Ложь - сообщит о том, что точка остановки пройдена

telegram отладка

Добавил: mikaelangelo
Вставить в модуль
// отправка любого сообщения, в т.ч. ОписаниеОшибки(), в Телеграм бот
Функция ОповеститьВтелеграм(Сообщение) Попытка 
	
	// 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

Чтение файлов Excel в таблицу значений (автоматическое наименование столбцов)

Функция считывает содержимое страницы файла Excel в таблицу значений, автоматически именует столбцы таблицы по первой строке файла. Пробелы заменяются на "".

Таблица значений чтение Excel Excel

Добавил: eXtend88
Вставить в модуль
&НаСервере
Функция ПодготовитьТаблицуСДанными(ФайлАдресВХранилище)
	
	ИмяФайлаСервер = ПолучитьИмяВременногоФайла(".xlsx");
	ФайлИмпорта = ПолучитьИзВременногоХранилища(ФайлАдресВХранилище);
	ФайлИмпорта.Записать(ИмяФайлаСервер);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	Попытка
		ТабличныйДокумент.Прочитать(ИмяФайлаСервер, СпособЧтенияЗначенийТабличногоДокумента.Текст);
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();
	КонецПопытки;	
	
	ПЗ = Новый ПостроительЗапроса;
	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
	ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
	ПЗ.ЗаполнитьНастройки();
	ПЗ.Выполнить();
	
	ТаблицаПромежуточныхДанных = ПЗ.Результат.Выгрузить();
	
	Возврат	ТаблицаПромежуточныхДанных;
	
КонецФункции
Комментарии: 1

Получить представление [разницы] времени

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

Дата

Добавил: markers
Вставить в модуль
// Возвращает представление прошедшего времени
//
// Параметры:
//  РазницаВремени  - Число - Высчитанная разница времени в секундах/милисекундах
//	ВремяВМилисекундах - Булево - Время передано в милисекундах
//
// Возвращаемое значение:
//   Строка   - Представление разницы времени
//
Функция ПолучитьПредставлениеВремени(РазницаВремени, ВремяВМилисекундах = Ложь) Экспорт
	
	РазмерЧаса = 3600;
	РазмерМинуты = 60;
	РазмерСекунды = 1;
	
	Если ВремяВМилисекундах Тогда
		
		РазмерЧаса = РазмерЧаса * 1000;
		РазмерМинуты = РазмерМинуты * 1000;
		РазмерСекунды = РазмерСекунды * 1000;
		
	КонецЕсли;
	
	Часов = Цел(РазницаВремени / РазмерЧаса);
	Минут = Цел((РазницаВремени - (Часов * РазмерЧаса)) / РазмерМинуты);
	Секунд = Цел((РазницаВремени - ((Часов * РазмерЧаса) + (Минут * РазмерМинуты))) / РазмерСекунды);
	
	Если ВремяВМилисекундах Тогда
		
		Милисекунд = РазницаВремени - ((Часов * РазмерЧаса) + (Минут * РазмерМинуты) + (Секунд * РазмерСекунды));
		
	Иначе
		
		Милисекунд = Цел((РазницаВремени - ((Часов * РазмерЧаса) + (Минут * РазмерМинуты) + (Секунд * РазмерСекунды))) * 1000);
		
	КонецЕсли;
	
	ВремяТекст = "";
	
	Если РазницаВремени >= РазмерЧаса Тогда
		
		//ВремяТекст = ВремяТекст + Строка(Часов) + " час.";
		ВремяТекст = ВремяТекст + " " + СтрокаСЧислом(";%1 час;;%1 часа;%1 часов;%1 часа", Часов, ВидЧисловогоЗначения.Количественное);
		
	КонецЕсли;
	
	Если РазницаВремени >= РазмерМинуты Тогда
		
		//ВремяТекст = ВремяТекст + ?(Часов > 0, ?(Секунд > 0, " ", " и "), "") + Строка(Минут) + " мин.";
		ВремяТекст = ВремяТекст + ?(Часов > 0, ?(Секунд > 0, " ", " и "), "") + " " + СтрокаСЧислом(";%1 минута;;%1 минуты;%1 минут;%1 минут", Минут, ВидЧисловогоЗначения.Количественное);
		
	КонецЕсли;
	
	Если РазницаВремени >= РазмерСекунды и Секунд > 0 Тогда
		
		//ВремяТекст = ВремяТекст + ?(Минут > 0, ?(Милисекунд > 0, " ", " и "), "") + Строка(Секунд) + " сек.";
		ВремяТекст = ВремяТекст +  ?(Минут > 0, ?(Милисекунд > 0, " ", " и "), "") + " " + СтрокаСЧислом(";%1 секунда;;%1 секунды;%1 секунд;%1 секунд", Секунд, ВидЧисловогоЗначения.Количественное);
		
	КонецЕсли;
	
	Если Милисекунд > 0 и РазницаВремени <= РазмерСекунды Тогда
		
		//ВремяТекст = ВремяТекст + ?(Секунд > 0, " и ", "") + Строка(Милисекунд) + " мсек.";
		ВремяТекст = ВремяТекст + Строка(Милисекунд) + " мсек.";
		
	КонецЕсли;
	
	Возврат ВремяТекст;
	
КонецФункции // ПолучитьПредставлениеВремени()
// Внимание, если у вас старая платформа и не поддерживает  метод "СтрокаСЧислом" закоментируйте строки и раскоментируйте строки над ними
Добавить комментарий

Получить разницу дат в [секундах, минутах, днях, ...]

Получает разницу дат в указанной единице изменения

Дата

Добавил: markers
Вставить в модуль
// Получение запросом

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

	Тип = НРег(Тип);
	
	Если МеньшаяДата > БольшаяДата и ВыбиратьБольшуюДатуПервой Тогда
		
		ВремДата = БольшаяДата;
		БольшаяДата = МеньшаяДата;
		МеньшаяДата = ВремДата;
		
	ИначеЕсли БольшаяДата = МеньшаяДата Тогда 
		
		Возврат 0;
		
	КонецЕсли;
		
	Если Тип = "сек" или Тип = "секунда" или Тип = "секунды" Тогда Возврат БольшаяДата - МеньшаяДата;
	ИначеЕсли Тип = "мин" или Тип = "минута" или Тип = "минуты" Тогда Тип = "МИНУТА"
	ИначеЕсли Тип = "час" или Тип = "часы" Тогда Тип = "ЧАС"
	ИначеЕсли Тип = "день" или Тип = "дней" или Тип = "дни" Тогда Тип = "ДЕНЬ"
	ИначеЕсли Тип = "неделя" или Тип = "недель" или Тип = "недели" Тогда Тип = "НЕДЕЛЯ"
	ИначеЕсли  Тип = "месяц" или Тип = "месяцев" или Тип = "месяцы" Тогда Тип = "МЕСЯЦ"
	ИначеЕсли Тип = "год" или Тип = "лет" Тогда Тип = "ГОД"
	Иначе Возврат 0;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("БольшаяДата", БольшаяДата);
	Запрос.УстановитьПараметр("МеньшаяДата", МеньшаяДата);
	Запрос.УстановитьПараметр("ВидСравнения", Тип);
	Запрос.Текст= "ВЫБРАТЬ РАЗНОСТЬДАТ(&МеньшаяДата, &БольшаяДата, ДЕНЬ) КАК Разница";
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "ДЕНЬ", Тип);
	Выборка = Запрос.Выполнить().Выбрать(); 
	
	Возврат ?(Выборка.Следующий(), ?(Выборка.Разница <> Null, Выборка.Разница, 0), 0);
		
КонецФункции

// На клиенте

// Возращает разницу переданных дат в указанном типе разницы
//
// Параметры:
//  МеньшаяДата 	- Меньшая (Начальная) дата, к примеру дата документа
//  БольшаяДата 	- Большая (Конечная) дата, к примеру текущая дата
//  Тип		- Тип разницы, поддерживается: секунда, минута, час, день, неделя, месяц, год
//	ВыбиратьБольшуюДатуПервой - В случае если в качестве меньшей даты, указана большая, можно ли их поменять местами
//
// Порядок указания дат не пренципиален, функция сама определит какая из дат большая.
// По умолчанию тип разницы "день".
// Указывать тип можно в любом регистре.
// Возращает целое число!
//
Функция ПолучитьРазницуДатВ(Знач МеньшаяДата, Знач БольшаяДата, Тип = "день", ВыбиратьБольшуюДатуПервой = Истина) Экспорт
	
	Тип = НРег(Тип);
	
	Если МеньшаяДата > БольшаяДата и ВыбиратьБольшуюДатуПервой Тогда
		
		ВремДата = БольшаяДата;
		БольшаяДата = МеньшаяДата;
		МеньшаяДата = ВремДата;
		
	ИначеЕсли БольшаяДата = МеньшаяДата Тогда 
		
		Возврат 0;
		
	КонецЕсли;
	
	Разница = БольшаяДата - МеньшаяДата;	
	
	Если Тип = "сек" или Тип = "секунда" или Тип = "секунды" Тогда
		Возврат Разница;
	ИначеЕсли Тип = "мин" или Тип = "минута" или Тип = "минуты" Тогда
		Возврат Цел(Разница / 60);
	ИначеЕсли Тип = "час" или Тип = "часы" Тогда
		Возврат Цел(Разница / (60*60));
	ИначеЕсли Тип = "день" или Тип = "дней" или Тип = "дни" Тогда 
		Возврат Цел(Разница / (60*60*24));
	ИначеЕсли Тип = "неделя" или Тип = "недель" или Тип = "недели" Тогда
		Возврат Цел(Разница / (60*60*24*7));
	ИначеЕсли  Тип = "месяц" или Тип = "месяцев" или Тип = "месяцы" Тогда
		Возврат Цел(Разница / (60*60*24*30));
	ИначеЕсли Тип = "год" или Тип = "лет" Тогда
		Возврат Цел(Разница / (60*60*24*365));
	Иначе 
		Возврат 0;
	КонецЕсли;
	
КонецФункции
Добавить комментарий

Получить дату через указанное количество [дней, месяцев, лет, ...]

Функция получает при помощи запроса дату через указанный промежуток

Дата

Добавил: markers
Вставить в модуль
// Возращает дату через указанное количество в указанном типе
//
// Параметры:
//	Дата1	- Дата от которой будет производится исчисление
//	Кол		- Количество прибавляемых или убавляемых единиц указанного типа
//	Тип		- Тип исчисления, поддерживается: секунда, минута, день, час, неделя, меняс, год
//	Знак	- При значении "+" прибавляет к дате указанное количество единиц указанного типа
//			  При значении "-" отнимает от даты указанное количество единиц указанного типа
//
// По умолчанию тип разницы "День", знак равен "+". 
// Указывать тип можно в любом регистре!
// Допускается передавать отрицательное количество единиц в поле "Кол" и опускании значения "Знак"
// В таком случае функция будет считать значение параметра знак равным "-"
//
Функция ПолучитьДатуЧерез(Дата1, Кол, Знач Тип = "день", Знач Знак = "") Экспорт

	Если Кол = 0 Тогда
		Возврат Дата1;
	КонецЕсли;
	
	Тип = НРег(Тип);
	
	Если Кол < 0 и НЕ ЗначениеЗаполнено(Знак) Тогда
		Кол = Кол * -1;
		Знак = "-";
	ИначеЕсли НЕ ЗначениеЗаполнено(Знак) Тогда
		Знак = "+";
	КонецЕсли;
	
	ЗнакПлюс = ?(Знак = "+", Истина, Ложь);
	
	Если НЕ ЗнакПлюс Тогда
		
		Кол = Кол * -1;
		
	КонецЕсли;
	
	Если Тип = "сек" или Тип = "секунда" или Тип = "секунды" Тогда Тип = "СЕКУНДА"
	ИначеЕсли Тип = "мин" или Тип = "минута" или Тип = "минуты" Тогда Тип = "МИНУТА"
	ИначеЕсли Тип = "час" или Тип = "часы" Тогда Тип = "ЧАС"
	ИначеЕсли Тип = "день" или Тип = "дней" или Тип = "дни" Тогда Тип = "ДЕНЬ"
	ИначеЕсли Тип = "неделя" или Тип = "недель" или Тип = "недели" Тогда Тип = "НЕДЕЛЯ"
	ИначеЕсли  Тип = "месяц" или Тип = "месяцев" или Тип = "месяцы" Тогда Тип = "МЕСЯЦ"
	ИначеЕсли Тип = "год" или Тип = "лет" Тогда Тип = "ГОД"
	Иначе Возврат 0;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Дата", Дата1);
	Запрос.УстановитьПараметр("Кол", Кол);
	Запрос.Текст= "ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, &Кол) КАК Значение";
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "ДЕНЬ", Тип);
	Выборка = Запрос.Выполнить().Выбрать(); 
	
	Возврат ?(Выборка.Следующий(), Выборка.Значение, 0);
	
КонецФункции
Добавить комментарий

Соединение и запрос данных из другой базы 1с

делаем запрос в УТ из сторонней базы для поиска документа

V82.COMConnector

Добавил: kAndrat
Вставить в модуль
//Подключение к внешней базе
&НаСервере
 Функция ПодключитьВнешнийИсточник(СтрокаСоединения, ОбъектПодключения="V82.COMConnector") 
	 Попытка
		 Connector = Новый COMОбъект("V82.COMConnector");
		 COM = Connector.connect(СтрокаСоединения);
		 Возврат COM;
	 Исключение
		  Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
		  Возврат Неопределено;
	 КонецПопытки;
	 
 КонецФункции	


&НаКлиенте
Процедура Подключение(Команда)
	ПодключениеСервер();
КонецПроцедуры


//Подключение и Выгрузка данных из сторонней базы
&НаСервере
Процедура ПодключениеСервер()
	 Соединение = ПодключитьВнешнийИсточник("Srvr=""ИмяСервера"";Ref=""ИмяБазы"";Usr=""Пользователь"";Pwd=""Пароль"";");
	 Запрос = Соединение.NewObject("Запрос");
	 Запрос.Текст = "ВЫБРАТЬ
		|	РеализацияТоваровУслуг.Номер
		|		ИЗ
		|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		|		ГДЕ
		|	РеализацияТоваровУслуг.Номер =  &Номер";
	Запрос.УстановитьПараметр("Номер",Номер);
	РезультатЗапроса = Запрос.Выполнить().Выгрузить(); //Получили COM объект
	Преобразование = ЗначениеИзСтрокиВнутр(Соединение.ЗначениеВСтрокуВнутр(РезультатЗапроса));  //преобразовали COM объект

	Для каждого стр из Преобразование Цикл
		Сообщить(стр.номер);
	КонецЦикла;
		
КонецПроцедуры
Комментарии: 1

Cформировать сумму строкой в договор

Cформировать сумму строкой в договор: 375 165 (триста семьдесят пять тысяч сто шестьдесят пять) рублей 07 копеек

сумма строкой в договор

Добавил: babys
Вставить в модуль
ОбластьМакета.Параметры.Сумма  = ""+окр(СведенияОДокументе.Сумма) + " (" + ЧислоПрописью(СведенияОДокументе.Сумма,"Л=ru_RU",") рубль, ) рубля, ) рублей, м, копейка, копейки, копеек, ж, 2");
Добавить комментарий

СКД внешние источники данных

СКД внешние источники данных

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

Как получить дату и время создания элемента справочника, документа по ссылке

Добавил: Kams
Вставить в модуль
 // но по GUID можно определить время и дату
Функция ДатаСозданияСсылки(Ссылка)
    ГУИД = Ссылка.УникальныйИдентификатор();
    Строка16 = Сред(ГУИД, 16, 3) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
    Разрядность = СтрДлина(Строка16);
    ЧислоСек = 0;
    Для Позиция = 1 По Разрядность Цикл
        ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка16,Позиция,1))*Pow(16,Разрядность - Позиция);
    КонецЦикла;
    ЧислоСек = ЧислоСек / 10000000;
    Возврат Дата(1582, 10, 15, 04, 00, 00) + ЧислоСек;
КонецФункции   
Добавить комментарий

Генератор случайных чисел для диапазона с дробными и отрицательными числами

Генератор случайных чисел

Добавил: ChOP
Вставить в модуль
Функция Генератор(КоличествоСимволовПослеЗапятой = 0, НижняяГраница, ВерхняяГраница )
	
		Множитель = 1;
		
		Пока КоличествоСимволовПослеЗапятой <> 0 Цикл
			
			КоличествоСимволовПослеЗапятой = КоличествоСимволовПослеЗапятой - 1;
			
			Множитель = Множитель*10;
			
		КонецЦикла;
		
		Генератор = Новый ГенераторСлучайныхЧисел();
		
		НижняяГраница = НижняяГраница * Множитель;
		ВерхняяГраница = ВерхняяГраница * Множитель;
		
		Если НижняяГраница > ВерхняяГраница Тогда
			
			Возврат Неопределено;
		
		ИначеЕсли НижняяГраница < 0 Тогда
			
			НижняяГраница = 0;
			ВерхняяГраница = ВерхняяГраница - НижняяГраница;
			
			РезультатГенератора = Генератор.СлучайноеЧисло(НижняяГраница, ВерхняяГраница)/-Множитель - НижняяГраница;
							
		ИначеЕсли НижняяГраница >= 0 Тогда
			
			РезультатГенератора = Генератор.СлучайноеЧисло(НижняяГраница, ВерхняяГраница)/Множитель;
									
		КонецЕсли;

		Возврат РезультатГенератора ;

КонецФункции
Добавить комментарий

TurboConf

Удобный поиск шаблонов кода

прямо в Конфигураторе

Узнать подробнее