Все публикации

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

Копирование файлов

Копирование всех файлов из одного каталога в доугой
Процедура СкопироватьФайлы(Знач КаталогИсточник, Знач КаталогПриемник)
	
	//Проверим и поправим окончания пути каталогов
	Если Прав(КаталогИсточник, 1) <> "\" Тогда
		КаталогИсточник = КаталогИсточник + "\";
	КонецЕсли;	
	Если Прав(КаталогПриемник, 1) <> "\" Тогда
		КаталогПриемник = КаталогПриемник + "\";
	КонецЕсли;	
	
	//Создадим каталог приемник
	СоздатьКаталог(КаталогПриемник);
	
	МассивФайлов = НайтиФайлы(КаталогИсточник, "*.*", Истина);
	
	Для Каждого Файл Из МассивФайлов Цикл
		ПолноеИмяИсточник = Файл.ПолноеИмя;
		ПолноеИмяПриемник = КаталогПриемник + СтрЗаменить(Файл.ПолноеИмя, КаталогИсточник, "");
		
		Если ПустаяСтрока(Файл.Расширение) Тогда
			СоздатьКаталог(ПолноеИмяПриемник);	
		Иначе
			КопироватьФайл(ПолноеИмяИсточник, ПолноеИмяПриемник);
		КонецЕсли;
	КонецЦикла;	
	
КонецПроцедуры

Проверки объекта на изменения

Функция для проверки объекта на изменения
AlexFisher 1
Функция ОбъектМодифицирован(Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина) 
    
	Ссылка = Объект.Ссылка;
	Метаданное = Ссылка.Метаданные();
    
	Для каждого Реквизит из Метаданное.Реквизиты Цикл
		Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
    
	Если ПроверятьСтандартные Тогда
		Для каждого Реквизит из Метаданное.СтандартныеРеквизиты Цикл
			Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
				Возврат Истина;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
    
    
    Если ПроверятьТабличныеЧасти Тогда
        Для каждого ТЧ из Метаданное.ТабличныеЧасти Цикл
            
            Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
                Возврат Истина;
            КонецЕсли;
                        
            Для Индекс = 0 по Объект[ТЧ.Имя].Количество()-1 Цикл
                ОбъектСтрокаТЧ = Объект[ТЧ.Имя][Индекс];
                СсылкаСтрокаТЧ = Ссылка[ТЧ.Имя][Индекс];
                Для каждого РеквизитТЧ из ТЧ.Реквизиты Цикл
                    Если ОбъектСтрокаТЧ[РеквизитТЧ.Имя] <> СсылкаСтрокаТЧ[РеквизитТЧ.Имя] Тогда
                        Возврат Истина;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
            
        КонецЦикла;        
    КонецЕсли;
    
    Возврат Ложь;
    
КонецФункции

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз Промо

Быстрое и надежное обновление файловых и серверных баз, защита от шифровальщиков, автоматическое обновление доработанных конфигураций и расширений, а также многое другое.
bolsun
950 руб.

Добавляем подменю со статусами в командную панель

andrey5565 35 1 3
#Область  ОбработчикиСобытий
 
 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ДобавитьЭлементыНаФорму();
КонецПроцедуры

#КонецОбласти  

#Область  ВспомогательныеПроцедурыИФункции

&НаСервере
Процедура ДобавитьЭлементыНаФорму()
	
	// 1.0. Добавляем на форму группу с видом Подменю: "__ГруппаСтатус";
	Если Элементы.Найти("__ГруппаСтатус") = Неопределено Тогда
		НоваяГруппа = Элементы.Добавить("__ГруппаСтатус", Тип("ГруппаФормы"), ЭтотОбъект.КоманднаяПанель);
		НоваяГруппа.Заголовок = "Установить статус";
		НоваяГруппа.Вид = ВидГруппыФормы.Подменю; 
		
		НоваяГруппа.ЦветРамки = WebЦвета.Черный;
		НоваяГруппа.ЦветФона = Новый Цвет(81, 103, 188);
		НоваяГруппа.ЦветТекстаЗаголовка = WebЦвета.Белый;
		
		НоваяГруппа.ШрифтЗаголовка = Новый Шрифт(, , Истина, , , , );
	КонецЕсли;	
	
	//Элементы.Переместить(Элементы.__ГруппаСтатус, ЭтотОбъект.КоманднаяПанель, ЭтотОбъект.КоманднаяПанель.ПодчиненныеЭлементы.ФормаОбновить);
	// 1.1. Добавляем реквизит формы "__АдресВоВременномХранилище" (соответствие ИмяКоманды --- СсылкаНаЭлементСправочникаСтатусыКлиентов);
	//Для хранения адреса во временном хранилище, где хранится соответствие "ИмяКоманды, СсылкаНаЭлементСправочникаСтатусыКлиентов"
	Если Элементы.Найти("__АдресВременногоХранилища") = Неопределено Тогда
		ТипСтрока = Новый ОписаниеТипов("Строка");
		РеквизитТекст = Новый РеквизитФормы("__АдресВременногоХранилища", ТипСтрока);
		ДобавляемыеРеквизиты = Новый Массив;
		ДобавляемыеРеквизиты.Добавить(РеквизитТекст);
		ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	КонецЕсли;
	
	//1.2. Получаем статусы заказов поставщиков;
	// Справочник ---	СтатусыКлиентов;
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	СтатусыКлиентов.Ссылка КАК Ссылка,
		|	СтатусыКлиентов.Наименование КАК Наименование
		|ИЗ
		|	Справочник.СтатусыКлиентов КАК СтатусыКлиентов";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	СоответствиеИменКомандСсылок = Новый Соответствие;
	
	Пока Выборка.Следующий() Цикл

		НаименованиеСтатусаБезПробелов = СокрЛП(СтрЗаменить(Выборка.Наименование, " ", ""));

		//1.3. Создаем команду;
		Если Команды.Найти("__УстановитьСтатус" + НаименованиеСтатусаБезПробелов) = Неопределено Тогда
			НоваяКоманда = Команды.Добавить("__УстановитьСтатус" + НаименованиеСтатусаБезПробелов);
			НоваяКоманда.Действие = "ИзменитьСтатус";
		КонецЕсли;

		//1.4. Создаем элемент формы;
		Если Элементы.Найти("__ИзменитьСтатус" + НаименованиеСтатусаБезПробелов) = Неопределено Тогда
			НоваяКнопка = Элементы.Добавить("__ИзменитьСтатус" + НаименованиеСтатусаБезПробелов, Тип("КнопкаФормы"), Элементы.__ГруппаСтатус);
			НоваяКнопка.ИмяКоманды = "__УстановитьСтатус" + НаименованиеСтатусаБезПробелов; 
			НоваяКнопка.Заголовок = Выборка.Наименование;
		КонецЕсли;

		СоответствиеИменКомандСсылок.Вставить("__УстановитьСтатус" + НаименованиеСтатусаБезПробелов, Выборка.Ссылка);
		
	КонецЦикла;
	
	//1.5.  Сохраняем во временное хранилище СоответствиеИменКомандСсылок; 
	НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор();
	АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(СоответствиеИменКомандСсылок, НовыйУникальныйИдентификатор);
	//1.6. Записываем адрес во временном хранилище в реквизит формы;
	ЭтотОбъект.__АдресВременногоХранилища = АдресВоВременномХранилище;	
	
КонецПроцедуры // ДобавитьЭлементыНаФорму()

&НаКлиенте
Процедура ИзменитьСтатус(Команда)
	
	ВыбранныеКлиенты = Элементы.Список.ВыделенныеСтроки;
	Если ВыбранныеКлиенты <> Неопределено Тогда
		//1.7. Получаем из временного хранилища СоответствиеИменКомандСсылок; 
		СоответствиеИменКомандСсылок = ПолучитьИзВременногоХранилища(ЭтотОбъект.__АдресВременногоХранилища);
		//1.8. Получаем выбранный статус;
		ВыбранныйСтатус = СоответствиеИменКомандСсылок.Получить(Команда.Имя);
		ИзменитьСтатусНаСервере(ВыбранныйСтатус, ВыбранныеКлиенты);
	КонецЕсли;
	//1.9. Оповещаем списки об изменении;
	ОповеститьОбИзменении(Тип("СправочникСсылка.СтатусыКлиентов"));
	
КонецПроцедуры

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

#КонецОбласти

Как разработчику 1С получать пассивный доход, а не головную боль?

Спойлер: это возможно :)
Бесплатно

Программная установка условного оформления (УО) поля динамического списка

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

КонецПроцедуры // ()

Определение границы запрета изменения данных в УПП

RomanVG 78 5 1
СоответствиеГраницЗапрета = ПараметрыСеанса.ГраницыЗапретаИзмененияДанных.Получить();
ГраницаПериода = СоответствиеГраницЗапрета[Организация.Ссылка];
	
// Если дата запрета по организации не определена, то используется основная дата запрета для пользователя
Если НЕ ЗначениеЗаполнено(ГраницаПериода) Тогда
    ГраницаПериода = СоответствиеГраницЗапрета[Справочники.Организации.ПустаяСсылка()];    
КонецЕсли;

// Если основная дата запрета для пользователя не определена, то используется общая дата запрета
Если НЕ ЗначениеЗаполнено(ГраницаПериода) Тогда
    ГраницаПериода = СоответствиеГраницЗапрета["ОбщаяДатаЗапретаРедактирования"];
КонецЕсли;

Заполнение информации о Контрагенте по ИНН через сервис api-fns.ru

Необходимо получить API ключ, бесплатно выдается на портале; Получение формата данных JSON с помощью стандартного GET - запроса; Необходимо учитывать что подключение защищенное (нужно указать параметр СоединениеOpenSSL в http-соединении, иначе будет получен редирект);
andrey5565 35 1 3
&НаКлиенте
Процедура ЗаполнитьПоИНН(Команда)

	 //Проверка заполнения ИНН;
	 Если НЕ ЗначениеЗаполнено(Объект.ИНН) Тогда
		 
		 Сообщение = Новый СообщениеПользователю;
		 Сообщение.Текст = "Значение реквизита не заполнено !";
		 Сообщение.Поле = "ИНН";
		 Сообщение.Сообщить();
		 Возврат;    
		 
	 КонецЕсли;
	 
	 //Создаем HTTPS-соединение, GET-запрос;
	 hostname 		= "api-fns.ru";
	 APIkey			= "СЮДА ВВОДИМ АПИ КЛЮЧ";
	 resourse 		= СтрШаблон("/api/egr?req=%1&key=%2+", Объект.ИНН, APIkey);
	 
	 httpconn 		= Новый HTTPСоединение(hostname ,,,,, 5, Новый ЗащищенноеСоединениеOpenSSL());
	 httprequest 	        = Новый HTTPЗапрос(resourse);
	 
	 Ответ = Неопределено;
	 
	Попытка
	
		Ответ = httpconn.Получить(httprequest); 
	
	Исключение
		
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось выполнить http запрос, код состояния:" + Ответ.КодСостояния;
		Сообщение.Сообщить();
		Возврат; 
		
	КонецПопытки;	
	
	//чтение ответа HTTP-сервера;
	СведенияJSON = Неопределено;
	Попытка
		
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));
		
		СведенияJSON = ПрочитатьJSON(ЧтениеJSON, Истина);   
		
	Исключение 
		
		Возврат;  
		
	КонецПопытки;
	
	//достаем из соответствия необходимую информацию;	
	Попытка
		ПолученноеЗначениеКПП 				= СведенияJSON["items"][0]["ЮЛ"]["КПП"];	
		ПолученноеЗначениеНаименование 	        = СведенияJSON["items"][0]["ЮЛ"]["НаимСокрЮЛ"];	
		ПолученноеЗначениеЮрЛицо 			=  СведенияJSON["items"][0]["ЮЛ"]["Адрес"]["АдресПолн"];
	Исключение  
		Сообщение 		= Новый СообщениеПользователю;
		Сообщение.Текст 	= "Произошла ошибка! Перепроверьте введенную информацию";
		Сообщение.Сообщить();
		Возврат;
	КонецПопытки;
	//произвольное кол-во реквизитов;
	
	//делаем проверку на расхождение полученных данных и данных контрагента;
	Если Объект.КПП <> ПолученноеЗначениеКПП 
			ИЛИ Объект.Наименование <> ПолученноеЗначениеНаименование 
			ИЛИ Объект.Наименование <> ПолученноеЗначениеНаименование Тогда
			
		//если расхождение есть, задаем вопрос:	
		ТекстВопроса = "Для ИНН "+ Объект.ИНН +
		" в государственном реестре плательщиков соответствует юридическое лицо со следующими реквизитами:
		|
		|Наименование: " + ПолученноеЗначениеНаименование + "
		|КПП                : " + ПолученноеЗначениеКПП + "
		|ЮрАдрес		: " + ПолученноеЗначениеЮрЛицо + "
		|Установить данные реквизиты для текущего контрагента?";
		
		Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); 
		
	КонецЕсли;
	
	Если  Ответ = КодВозвратаДиалога.Нет Тогда
		
		Возврат;
		
	Иначе
		
		Объект.КПП = ПолученноеЗначениеКПП;
		Объект.Наименование = ПолученноеЗначениеНаименование;
		
		ЮрАдресЗначение =  ПолучитьВидКонтактнойИнформацииЮрАдрес();
		СтруктураОтбора = Новый Структура("Вид", ЮрАдресЗначение);
		
		МассивЗначений = Объект.КонтактнаяИнформация.НайтиСтроки(СтруктураОтбора);
		
		Если МассивЗначений.Количество() <> 0 Тогда
		   Объект.КонтактнаяИнформация.Удалить(МассивЗначений[0]);
		КонецЕсли;
	
		НоваяСтрокаТЧ = Объект.КонтактнаяИнформация.Добавить();
		НоваяСтрокаТЧ.Тип = ПолучитьТипКонтактнойИнформации();
		НоваяСтрокаТЧ.Вид = ЮрАдресЗначение;
		НоваяСтрокаТЧ.Значение = ПолученноеЗначениеЮрЛицо;
		
	КонецЕсли;
	
КонецПроцедуры

//вспомогательные функции;
&НаСервереБезКонтекста
Функция ПолучитьВидКонтактнойИнформацииЮрАдрес()
	Возврат Справочники.ВидыКонтактнойИнформации.ЮридическийАдресКонтрагента;
КонецФункции // ()

&НаСервереБезКонтекста
Функция ПолучитьТипКонтактнойИнформации()
	Возврат Перечисления.ТипыКонтактнойИнформации.Адрес;
КонецФункции // ()

Преобразование Объекта ДеревоЗначений в Объект ТаблицаЗначений

В первую функцию передаем - ДеревоЗначений, во вторую (рекурсивную) функцию передаем созданный объект встроенного языка - ТаблицаЗначений, и строку дерева; В место вызова функции ДеревоЗначенийВТаблицуЗначений() произойдет возврат ТаблицыЗначений.
andrey5565 35 1 3
&НаСервере
Функция ДеревоЗначенийВТаблицуЗначений(Знач ДеревоЗначений)
	
	ТаблицаТоваров = Новый ТаблицаЗначений;
	
	//заполним колонки;
	Для каждого Колонка Из ДеревоЗначений.Колонки Цикл
		ТаблицаТоваров.Колонки.Добавить(Колонка.Имя); 
	КонецЦикла;
	
	//произведем вызов вспомогательной рекурсивной функции;
	Для каждого Строка Из ДеревоЗначений.Строки Цикл
		РекурсивноеЗаполнениеТаблицыЗначений(ТаблицаТоваров, Строка);
	КонецЦикла;   
		
	Возврат ТаблицаТоваров;
	
КонецФункции // ()

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

Работа с универсальными коллекциями данных

Преобразование таблицы значений в массив структур, параметр - ТаблицаЗначений, возвращаемое значение - МассивСтруктур;
andrey5565 35 1 3
&НаСервере
Функция ТаблицаЗначенийВМассивСтруктур(Знач ТаблицаЗначений)  Экспорт

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

Unicode decode

Декодирует русские символы в юникоде (UnicodeEncode) и любые символы в юникоде (UnicodeEncode2, исп. вспом. ф-ю ПереводЧислаИз16в10)
mikaelangelm 66 1 4
Функция UnicodeEncode(Строка) Экспорт
	
	Результат = Строка; 
	
	СписокСимволов = Новый СписокЗначений;
	СписокСимволов.Добавить("\u0430", "а");
	СписокСимволов.Добавить("\u0431", "б");
	СписокСимволов.Добавить("\u0432", "в");
	СписокСимволов.Добавить("\u0433", "г");
	СписокСимволов.Добавить("\u0434", "д");
	СписокСимволов.Добавить("\u0435", "е");
	СписокСимволов.Добавить("\u0451", Символ(1105));
	СписокСимволов.Добавить("\u0436", "ж");
	СписокСимволов.Добавить("\u0437", "з");
	СписокСимволов.Добавить("\u0438", "и");
	СписокСимволов.Добавить("\u0439", "й");
	СписокСимволов.Добавить("\u043a", "к");
	СписокСимволов.Добавить("\u043b", "л");
	СписокСимволов.Добавить("\u043c", "м");
	СписокСимволов.Добавить("\u043d", "н");
	СписокСимволов.Добавить("\u043e", "о");
	СписокСимволов.Добавить("\u043f", "п");
	СписокСимволов.Добавить("\u0440", "р");
	СписокСимволов.Добавить("\u0441", "с");
	СписокСимволов.Добавить("\u0442", "т");
	СписокСимволов.Добавить("\u0443", "у");
	СписокСимволов.Добавить("\u0444", "ф");
	СписокСимволов.Добавить("\u0445", "х");
	СписокСимволов.Добавить("\u0446", "ц");
	СписокСимволов.Добавить("\u0447", "ч");
	СписокСимволов.Добавить("\u0448", "ш");
	СписокСимволов.Добавить("\u0448", "щ");
	СписокСимволов.Добавить("\u044a", "ъ");
	СписокСимволов.Добавить("\u044b", "ы");
	СписокСимволов.Добавить("\u044c", "ь");
	СписокСимволов.Добавить("\u044d", "э");
	СписокСимволов.Добавить("\u044e", "ю");
	СписокСимволов.Добавить("\u044f", "я");
	
	СписокСимволов.Добавить("\u0410", "А");
	СписокСимволов.Добавить("\u0411", "Б");
	СписокСимволов.Добавить("\u0412", "В");
	СписокСимволов.Добавить("\u0413", "Г");
	СписокСимволов.Добавить("\u0414", "Д");
	СписокСимволов.Добавить("\u0415", "Е");
	СписокСимволов.Добавить("\u0401", Символ(1025));
	СписокСимволов.Добавить("\u0416", "Ж");
	СписокСимволов.Добавить("\u0417", "З");
	СписокСимволов.Добавить("\u0418", "И");
	СписокСимволов.Добавить("\u0419", "Й");
	СписокСимволов.Добавить("\u041a", "К");
	СписокСимволов.Добавить("\u041b", "Л");
	СписокСимволов.Добавить("\u041c", "М");
	СписокСимволов.Добавить("\u041d", "Н");
	СписокСимволов.Добавить("\u041e", "О");
	СписокСимволов.Добавить("\u041f", "П");
	СписокСимволов.Добавить("\u0420", "Р");
	СписокСимволов.Добавить("\u0421", "С");
	СписокСимволов.Добавить("\u0422", "Т");
	СписокСимволов.Добавить("\u0423", "У");
	СписокСимволов.Добавить("\u0424", "Ф");
	СписокСимволов.Добавить("\u0425", "Х");
	СписокСимволов.Добавить("\u0426", "Ц");
	СписокСимволов.Добавить("\u0427", "Ч");
	СписокСимволов.Добавить("\u0428", "Ш");
	СписокСимволов.Добавить("\u0428", "Щ");
	СписокСимволов.Добавить("\u042a", "Ъ");
	СписокСимволов.Добавить("\u042b", "Ы");
	СписокСимволов.Добавить("\u042c", "Ь");
	СписокСимволов.Добавить("\u042d", "Э");
	СписокСимволов.Добавить("\u042e", "Ю");
	СписокСимволов.Добавить("\u042f", "Я");
	
	
	СписокСимволов.Добавить("\u0022", "'");
	
	СписокСимволов.Добавить("\u003E", ">");
	СписокСимволов.Добавить("\u003е", ">");
	
	СписокСимволов.Добавить("\u003C", "<");
	СписокСимволов.Добавить("\u003c", "<");
	
	Для Каждого текЭлемент Из СписокСимволов Цикл
		
		Результат = СтрЗаменить(Результат,текЭлемент.Значение, текЭлемент.Представление);	
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции
	
Функция UnicodeEncode2(Строка) Экспорт 
    Результат = "";
    Попытка
        //регулярное выражение

        Колекция = Новый Массив; //РегВыр.Execute(Строка);
        Для Каждого Элемент Из Колекция Цикл
            Если СтрДЛина(Элемент.value) = 1 Тогда
                Продолжить;
            КонецЕсли;        
            
            КодСимвола = ПереводЧислаИз16в10(Сред(ВРег(Элемент.value), 2));
            Символ = Символ(КодСимвола);
            Строка = СтрЗаменить(Строка, "\" + Элемент.value, Символ); 
        КонецЦикла;
        Результат = Строка; //СтрЗаменить(Строка, "<br \/>", "");
    Исключение
        Результат = Строка;
        Сообщить("Ошибка преобразования из Unicode", СтатусСообщения.Информация);
    КонецПопытки;
    
    Возврат Результат;
КонецФункции

Функция ПереводЧислаИз16в10(Знач Значение)
	    
	    	СтруктураЧисел = Новый Соответствие;
		СтруктураЧисел.Вставить("0", 0);
		СтруктураЧисел.Вставить("1", 1);
		СтруктураЧисел.Вставить("2", 2);
		СтруктураЧисел.Вставить("3", 3);
		СтруктураЧисел.Вставить("4", 4);
		СтруктураЧисел.Вставить("5", 5);
		СтруктураЧисел.Вставить("6", 6);
		СтруктураЧисел.Вставить("7", 7);
		СтруктураЧисел.Вставить("8", 8);
		СтруктураЧисел.Вставить("9", 9);
		СтруктураЧисел.Вставить("A", 10);
		СтруктураЧисел.Вставить("B", 11);
		СтруктураЧисел.Вставить("C", 12);
		СтруктураЧисел.Вставить("D", 13);
		СтруктураЧисел.Вставить("E", 14);
		СтруктураЧисел.Вставить("F", 15);
	    
	    
	    Результат = 0;
	    
	    //перевод значения в строку

	    Если ТипЗнч(Значение) <> Тип("Строка") Тогда
	        Значение = СокрЛП(Строка(Значение));
	    КонецЕсли;
	    
	    МаксРазрядЦелых = 0;
	    МаксРазрядЦелых = СтрДлина(Значение) - 1;
	    
	    н = МаксРазрядЦелых;
	    Ин = 1;
	    Пока н >= 0 Цикл
	        ТекЗначение = СтруктураЧисел.Получить(Сред(Значение, Ин, 1)) * Pow(16, н);
	        Результат = Результат + ТекЗначение;
	        н = н - 1;
	        Ин = Ин + 1;
	    КонецЦикла;
	    
	    Возврат Результат;
	КонецФункции

1с83. Шаблон кода для программной установки условного оформления поля динамического списка

Вызывать процедуру из модуля формы "ПриОткрытии"
buketoff 161 2 4 8
&НаКлиенте
Процедура УстановитьУсловноеОформлениеДляПоляСрокаГодности()
	
	ЭлементОформления = СписокПартийДС.УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.Использование = Истина;
	
	ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
	ПолеОформления.Использование = Истина;
	ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ГоденДо");
	ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
	ПолеОформления.Использование = Истина;
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.Использование = истина;
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ГоденДо");
	ЭлементОтбора.ПравоеЗначение = ТекущаяДата() - 23668200;
	
	Оформление = ЭлементОформления.Оформление;
	Оформление.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона"), WebЦвета.Коралловый);
	
КонецПроцедуры

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

!!! ВНИМАНИЕ !!! Ещё не тестировал, написал в промежутке, между основными задачами, оттестирую и доработаю как появится время. Если кто оттестит, буду очень рад конструктивным отзывам. Часто какие-то процедуры требуют какие-то значения полей справочник...

TCP-клиент для 1С

Внешняя компонента по технологии Native API. Позволяет подключаться по TCP-протоколу к серверу, а также обрабатывать ответ от сервера.
1 000 руб.

Чистка номенклатуры в 1С

Данная обработка позволяет найти неиспользуемую номенклатуру, пометить ее на удаление и перенести в отдельную группу.
2 100 руб.

СЖИМАТЕЛЬ КАРТИНОК [БАЗОВЫЙ]

"СЖИМАТЕЛЬ КАРТИНОК" (уменьшение размера и разрешения) Выбираем файл изображения и получаем готовый результат 5 вариантов
Бесплатно

Получить даты за период в запросе

Генерация списка дат за период с настраиваемым шагом в днях в запросе
ChOP 216 2 9 6
// Возвращает текст запроса, или добавляет запрос во временную таблицу, или возвращает результат запроса, или таблицу значений с результатом запроса.
// Следует указать истина только в одном из следующих параметров:
// - ПолучитьТекстЗапроса
// - ПолучитьРезультатЗапроса
// - ПолучитьТаблицуЗначений.
// 
// Параметры:
//  НачалоПериода              - Дата - начало периода отсчета.
//  КонецПериода               - Дата - конец периода отсчета включительно.
//  Шаг                        - Число - шаг вывода дат в днях.
//  ПолучитьПоследнююДату      - Булево - признак вывода последнего дня, если тот не попадает по шагу.
//  ИмяКолонкиПериод           - Строка - имя колонки с датами.
//  ПолучитьКолонкуШаг         - Булево - признак получения колонки шага, используемой для отладки.
//  ИмяКолонкиШаг              - Строка - имя колонки с шагом.
//  ПолучитьТекстЗапроса       - Булево - возврат текста запроса.
//  ДобавитьВоВременныеТаблицы - Булево - добавление запроса во временную таблицу.
//  МенеджерВременныхТаблиц    - МенеджерВременныхТаблиц - менеджер временных таблиц.
//  ИмяВременнойТаблицы        - Строка - имя временной таблицы.
//  ПолучитьРезультатЗапроса   - Булево - получить результат запроса.
//  ПолучитьТаблицуЗначений    - Булево - получить таблицу значений с результатом запроса.
//  УничтожитьВТ               - Булево - если истина, в конце запроса будут уничтеженны промежуточные временные таблицы.
//                                                                         
// Возвращаемое значение:
//  - Строка            - если ПолучитьТекстЗапроса истина. 
//	- Временная таблица - если ДобавитьВоВременныеТаблицы истина. 
//	- Результат запрос  - если ПолучитьРезультатЗапроса истина.
//	- Таблица значений  - если ПолучитьТаблицуЗначений истина.
//
Функция ПолучитьДатыЗаПериодВЗапросе(НачалоПериода = Неопределено, КонецПериода = Неопределено, Шаг = 1, ПолучитьПоследнююДату = Ложь,
										ИмяКолонкиПериод = "Период", ПолучитьКолонкуШаг = Ложь, ИмяКолонкиШаг = "Шаг",
										ПолучитьТекстЗапроса = Ложь, ДобавитьВоВременныеТаблицы = Ложь, МенеджерВременныхТаблиц = Неопределено,
										ИмяВременнойТаблицы = "#ДатыЗаПериод", ПолучитьРезультатЗапроса = Ложь, ПолучитьТаблицуЗначений = Ложь,
										УничтожитьВТ = Истина) Экспорт
										
	ТекстЗапроса = 
		"ВЫБРАТЬ 0 КАК Цифра
		|ПОМЕСТИТЬ Цифры
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 1
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 2
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 3
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 4
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 5
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 6
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 7
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 8
		|ОБЪЕДИНИТЬ ВЫБРАТЬ 9
		|;
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, СписокДней.Дней) КАК Период
		|ПОМЕСТИТЬ НужныйПериод
		|ИЗ
		|	(ВЫБРАТЬ
		|		СотниТысяч.Цифра * 100000 + ДесяткиТысяч.Цифра * 10000 + Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра КАК Дней
		|	ИЗ
		|		Цифры КАК СотниТысяч
		|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК ДесяткиТысяч
		|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК Тысячи
		|					ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК Сотни
		|						ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК Десятки
		|							ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК Единицы
		|							ПО (Десятки.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
		|								И (Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
		|						ПО (Сотни.Цифра * 100 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
		|					ПО (Тысячи.Цифра * 1000 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
		|				ПО (ДесяткиТысяч.Цифра * 10000 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
		|			ПО (СотниТысяч.Цифра * 100000 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
		|	ГДЕ
		|		СотниТысяч.Цифра * 100000 + ДесяткиТысяч.Цифра * 10000 + Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) КАК СписокДней
		|;
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	НужныйПериод1.Период КАК Период,
		|	СУММА(1) + (&Шаг - 1) КАК Шаг
		|ПОМЕСТИТЬ ПериодДоОбрезания
		|ИЗ
		|	НужныйПериод КАК НужныйПериод1
		|		ЛЕВОЕ СОЕДИНЕНИЕ НужныйПериод КАК НужныйПериод2
		|		ПО НужныйПериод1.Период >= НужныйПериод2.Период
		|
		|СГРУППИРОВАТЬ ПО
		|	НужныйПериод1.Период
		|;
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ПериодДоОбрезания.Период КАК Период,
		|	ПериодДоОбрезания.Шаг КАК Шаг
		|ПОМЕСТИТЬ ПериодПлюсПоследняяДата
		|ИЗ
		|	ПериодДоОбрезания КАК ПериодДоОбрезания
		|ГДЕ
		|	ПериодДоОбрезания.Шаг / &Шаг = (ВЫРАЗИТЬ(ПериодДоОбрезания.Шаг / &Шаг КАК ЧИСЛО(10, 0)))
		|
		|СГРУППИРОВАТЬ ПО
		|	ПериодДоОбрезания.Период,
		|	ПериодДоОбрезания.Шаг
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ
		|	&КонецПериода,
		|	NULL
		|;
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ПериодПлюсПоследняяДата.Период КАК " + ИмяКолонкиПериод
		 +
		 	?(ПолучитьКолонкуШаг,",
								 |	СУММА(ПериодПлюсПоследняяДата.Шаг) КАК " + ИмяКолонкиШаг, "")
		+
			?(ДобавитьВоВременныеТаблицы, "
										  |ПОМЕСТИТЬ " + ИмяВременнойТаблицы, "")
		+
		"
		|ИЗ
		|	ПериодПлюсПоследняяДата КАК ПериодПлюсПоследняяДата
		|"
		 +
		    ?(ПолучитьПоследнююДату,"ГДЕ
									|    НЕ ПериодПлюсПоследняяДата.Шаг ЕСТЬ NULL
									|", "")
		 +
		"СГРУППИРОВАТЬ ПО
		|	ПериодПлюсПоследняяДата.Период
		|"
		 +
		 	?(УничтожитьВТ, ";
							|////////////////////////////////////////////////////////////////////////////////
							|УНИЧТОЖИТЬ Цифры
							|; 
							|////////////////////////////////////////////////////////////////////////////////
							|УНИЧТОЖИТЬ НужныйПериод
							|;
							|////////////////////////////////////////////////////////////////////////////////
							|УНИЧТОЖИТЬ ПериодДоОбрезания
							|;
							|////////////////////////////////////////////////////////////////////////////////
							|УНИЧТОЖИТЬ ПериодПлюсПоследняяДата ", "");										

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

	Если ПолучитьРезультатЗапроса Тогда
		Возврат РезультатЗапроса;
	КонецЕсли;
	
	Если ПолучитьТаблицуЗначений Тогда
		Возврат РезультатЗапроса.Выгрузить();
	КонецЕсли;
			
КонецФункции

Условное оформление

Добавление условного оформления одной строкой в элементы формы: ДинамическийСписок, ТаблицаФормы - поддерживает добавление сравниваемого значения при виде сравнения ВСписке - создание/подбор (отборы будут дополнены) элемента отбора - замена (т.е. удален...
mikaelangelm 66 1 4

Открыть отчет СКД с передачей параметров и отборами

ChOP 216 2 9 6
// Открывает отчет на СКД с передачей параметров и отборов
//
// Параметры:
//  ЭтаФорма					 - ФормаКлиентскогоПриложения - Форма клиентского приложения 
//  ФормаОтчета					 - Строка - Путь к форме отчета, например: "Отчет.ТестовыйОтчёт.Форма" 
//  Параметры					 - Структура - Ключ- имя параметра, значение- присваиваемое значение
//  Отборы						 - Массив структур - Структура вида: Новый Структура("ИмяОтбора, Значение, ВидСравнения", ИмяОтбора, Значение, ВидСравнения) 
//  СформироватьПриОткрытии		 - Булево - Признак формировании отчета при открытии 
//  КлючВарианта				 - Строка - Ключ варианта отчета, который следует открыть
//  ПользовательскиеНастройки	 - Пользовательские настройки отчета - КомпоновщикНастроек.ПользовательскиеНастройки 
//
Процедура КомандаОткрытьОтчётСОтбором(ЭтаФорма, ФормаОтчета, Параметры = Неопределено, Отборы = Неопределено,
	          СформироватьПриОткрытии = Истина, КлючВарианта = Неопределено, ПользовательскиеНастройки = Неопределено) Экспорт
		
	ФормаОтчёта = ПолучитьФорму(ФормаОтчета);
	КомпоновщикНастроек = ФормаОтчёта.Отчет.КомпоновщикНастроек;
	
	Для Каждого Парам Из Параметры Цикл 
		УстановитьПользовательскийПараметрСКД(КомпоновщикНастроек, Парам.Ключ, Парам.Значение);	
	КонецЦикла;	
	
	Для Каждого Отбор Из Отборы Цикл 
		УстановитьПользовательскийОтборСКД(КомпоновщикНастроек, Отбор.ИмяОтбора, Отбор.Значение, Отбор.ВидСравнения);	
	КонецЦикла;
	
	ПараметрыФормы = Новый Структура();
	ПараметрыФормы.Вставить("СформироватьПриОткрытии", СформироватьПриОткрытии);
	Если КлючВарианта <> Неопределено Тогда
		ПараметрыФормы.Вставить("КлючВарианта", КлючВарианта);		
	КонецЕсли;  
	ПараметрыФормы.Вставить("ПользовательскиеНастройки", ?(ПользовательскиеНастройки <> Неопределено, ПользовательскиеНастройки,
																									  КомпоновщикНастроек.ПользовательскиеНастройки)); 
	
	ОткрытьФорму(ФормаОтчета, ПараметрыФормы, ЭтаФорма);
	
КонецПроцедуры

Процедура УстановитьПользовательскийПараметрСКД(КомпоновщикНастроек, ИмяПараметра, Значение)
	
	Перем ПараметрДанных, Настройки, ПользовательскиеНастройки, ПользовательскийПараметр;
	
	Настройки = КомпоновщикНастроек.Настройки;
	
	ПараметрДанных = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
	
	Если ЗначениеЗаполнено(ПараметрДанных.ИдентификаторПользовательскойНастройки) Тогда
		
		ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;
		ПользовательскийПараметр = ПользовательскиеНастройки.Элементы.Найти(ПараметрДанных.ИдентификаторПользовательскойНастройки);
		ПользовательскийПараметр.Использование = Истина;
		ПользовательскийПараметр.Значение = Значение;

	КонецЕсли;
	
КонецПроцедуры

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

	КонецЕсли;

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

Преобразование строки в число

Не вызывает исключение
RomanVG 78 5 1
// функция преобразует строку в число, примеры:
// 315 руб. = 315
// 1 007,30 м2 (квадратный метр) = 1007,3
// -12.5% = -12,5
// ,05 = 0,05
// пустая строка или пробелы = 0
Функция грв_СтрокаВЧисло(Знач СтрокаЧисло) Экспорт
	
	Результат = "";
	Для Индекс = 1 По СтрДлина(СтрокаЧисло) Цикл
		Символ = Сред(СтрокаЧисло, Индекс, 1);
		КодСимвола = КодСимвола(Символ);
		Если ((КодСимвола >= 48 И КодСимвола <= 57) Или (Символ = "-" И Индекс = 1) Или (Символ = ",") Или (Символ = ".") Или (Символ = " ") Или (КодСимвола = 160)) Тогда
			Если КодСимвола <> 32 И КодСимвола <> 160 Тогда
				Результат = Результат + Символ;
			КонецЕсли; 
		Иначе
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Результат = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(Результат);
	
	Возврат Результат;
	
КонецФункции

Как запустить скрипт VBS с правами администратора

Понадобилось по быстрому запустить скрипт для очистки логов IIS. Но для этого потребовались права администратора. Помог совет со StackOverflow, добавил в начало скрипта: If Not WScript.Arguments.Named.Exists(elevate) Then CreateObject(Shell.Application)....
bolsun 325 5 7 5