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


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

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

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

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

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

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

Подключение к DBF

Подключение к DBF с параметрами

DBF

Добавил: Артур
Функция НовоеПодключение2()  //Подключение к DBF
	Таблица = Новый ТаблицаЗначений();

Connection = Новый COMОбъект("ADODB.Connection"); // Создание COM-объекта
	Connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;
	         |Data Source=" +КаталогФайла +";
	         |Extended Properties=DBASE III");    
    Connection.BeginTrans();    
   // Создание объекта выполнения команды
    Command = Новый COMОбъект("ADODB.Command");
   // Указание активного соединения 
    Command.ActiveConnection = Connection;    
   // Определение текста команды

	Command.CommandText = "SELECT * FROM Calls WHERE DATE between  @DataN AND @DataK";  //Calls  -название файла DBF
	Дата1 = Формат(НачПериода, "ДФ=MM.dd.yyyy");
	Дата2 = Формат(КонПериода, "ДФ=MM.dd.yyyy");
	
    Param1 = Command.CreateParameter("@DataN", 133, 1);
    Command.Parameters.Append(Param1);
    Param1.Value = Дата1;
	
	Param2 = Command.CreateParameter("@DataK", 133, 1);
    Command.Parameters.Append(Param2);
    Param2.Value = Дата2;

   // Определение типа команды
   //Command.CommandType = 4;
   // Создание объекта набора записей
    RecordSet = Новый COMОбъект("ADODB.RecordSet");
    RecordSet = Command.Execute();
	
	Пока RecordSet.EOF=0 Цикл //Цикл по записям файла DBF
	        м= Таблица.Добавить();
		м.Дата 			   	=  RecordSet.Fields("DATE").Value;
		м.Длительность		=  RecordSet.Fields("IDURATION").Value ;
		м.Время	           	=  RecordSet.Fields("ITIME").Value;
		м.СО              	=  RecordSet.Fields("CO").Value   ;
		м.ВнутрНомер        =  RecordSet.Fields("EXTENSION").Value ;
		м.TrunkГруппа       =  RecordSet.Fields("TRUNKGROUP").Value ;
		м.Transfer         	=  RecordSet.Fields("TRANSFER").Value   ;
		м.Цена            	=  RecordSet.Fields("PRICE").Value     ;
		м.Номер           	=  RecordSet.Fields("NUMBER").Value   ;
		м.Статус           	=  RecordSet.Fields("STATUS").Value   ;
		м.ВремяДоОтвета     =  RecordSet.Fields("RINGBEFORE").Value ;
		м.CallerID         	=  RecordSet.Fields("CALLERID").Value  ;
	    RecordSet.MoveNext(); //Переходим к следующей записи
	КонецЦикла;
	RecordSet.Close();

Возврат Таблица;	
КонецФункции

Расчет сумм по выделенным ячейкам табличного поля

Табличного документа сумма, суммы суммирование (https://infostart.ru/public/71130/)

ТабличныйДокумент

Добавил: miha
Функция РасчетСуммыПоЯчейкам(ТабличноеПоле) Экспорт

    Сумма = 0;
    КоличествоСумм = 0;
    СоответствиеЯчеек = Новый Соответствие;
    ОписаниеТипов = Новый ОписаниеТипов("Число");

    Для Каждого ВыделеннаяОбласть Из ТабличноеПоле.ВыделенныеОбласти Цикл
        Для Индекс1 = ВыделеннаяОбласть.Лево По ВыделеннаяОбласть.Право Цикл
            Для Индекс2 = ВыделеннаяОбласть.Верх По ВыделеннаяОбласть.Низ Цикл
                Область = ТабличноеПоле.Область(Индекс2, Индекс1, Индекс2, Индекс1);
                Значение = ОписаниеТипов.ПривестиЗначение(Область.Текст);
                СоответствиеЯчеек.Вставить(Область.Имя, Значение);
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

    Для каждого Ячейка Из СоответствиеЯчеек Цикл
        Значение = Ячейка.Значение;
        Если Значение <> 0 Тогда
            Сумма = Сумма + Значение;
            КоличествоСумм = КоличествоСумм + 1;
        КонецЕсли;
    КонецЦикла;

    КоличествоВыделено = СоответствиеЯчеек.Количество();
    Если КоличествоВыделено > 1 Тогда
        ТекстИтогов = " Выделено ячеек: " + КоличествоВыделено
            + "    Просуммировано ячеек: " + КоличествоСумм
            + "    Итого по выделенным ячейкам: " + Сумма;
    Иначе
        ТекстИтогов = "";
    КонецЕсли;

    Возврат ТекстИтогов;

КонецФункции // РасчетСуммыПоЯчейкам()

Обмен через ВЕБ Сервисы 2 часть

Обмен через ВЕБ Сервисы , Подключение к созданной web ссылке с другой базы.

XML web-сервис веб-сервис ws

Добавил: Артур
Процедура КнопкаЗаполнитьТаблицуИзПервойБазыНажатие(Кнопка)
      
	ВСОпределение = Новый 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.ЗначениеАтрибута("КоличествоКонечныйОстаток");
				прервать;	
			конеццикла;
		КонецЕсли;
	конеццикла;	
	
	исключение
	    сообщить(Данные);
	КонецПопытки;
	
	
конецпроцедуры

Обмен через ВЕБ Сервисы 1 часть

Обмен xml файлами через ВЕБ Сервисы (Запрос остаток товаров с одной базы на другую по wеб сервису,) настройка и создание web сервиса.

XML web-сервис веб-сервис ws

Добавил: Артур
//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 запись , и отправляет обратно 

Пауза, ожидание в коде

Пауза выполнения кода

Пауза ожидание таймер

Добавил: FantomLav
Процедура Ожидание(МСекунды)
	Перем Таймер;
	Таймер     = ТекущаяУниверсальнаяДатаВМиллисекундах() + МСекунды;
	Пока Таймер > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл
		Состояние(ОКР((Таймер-ТекущаяУниверсальнаяДатаВМиллисекундах())/1000),1);
	КонецЦикла;
КонецПроцедуры

Чтение XML файла

Чтение XML файла по объектно. (Экономим память, не читаем файл полностью, а отдельными блоками)

XML XDTO ЧтениеXML

Добавил: eXtend88
ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(ИмяФайлаНаСервере);
	Пока ЧтениеXML.Прочитать() Цикл
		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
			Если ЧтениеXML.Имя = "Товар" Тогда // Считываем номенклатуру в XDTO
				ДанныеТовараXML = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
				НоменклатураОбъект = Справочники.Номенклатура.СоздатьОбъект();
				//  Заполняем реквизиты номенклатруы данными объекта XDTO 
				НоменклатураОбъект.Записать();
				Сообщение = Новый СообщениеПользователю;
				Сообщение.Текст = "Создана:" + НоменклатураОбъект.Наименование;
				Сообщение.Сообщить();
			Иначе
				ЧтениеXML.Прочитать();
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	ЧтениеXML.Закрыть();

Оправка Push уведомления

Оправка Push уведомления через онлайн сервис Pushover

Push Rest API

Добавил: alexgood
Процедура ОтправитьPushOverУведомление(ТекстСообщения, ЗаголовокСообщения)

	Сервер = "api.pushover.net";
	Адрес = "1/messages.json";
	TokenKey = "......"; //Здесь токен канала
	UserID = "......"; //Здесь ИД пользователя

	Соединение = Новый HTTPСоединение(Сервер,,,,Новый ИнтернетПрокси(истина),10, Новый ЗащищенноеСоединениеOpenSSL);
	СтрокаПараметров = "?token=%3&user=%4&html=1&message=%1&title=%2";
	СтрокаПараметров = СтрЗаменить(СтрокаПараметров, "%1", ТекстСообщения);
	СтрокаПараметров = СтрЗаменить(СтрокаПараметров, "%2", ЗаголовокСообщения);
	СтрокаПараметров = СтрЗаменить(СтрокаПараметров, "%3", TokenKey);
	СтрокаПараметров = СтрЗаменить(СтрокаПараметров, "%4", UserID);
	Запрос = Новый HTTPЗапрос(Адрес+СтрокаПараметров);
	
	Попытка
		Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	Исключение
		СообщениеПользователю = Новый СообщениеПользователю;
		СообщениеПользователю.Текст  = "Ошибка запроса к серверу: "+Ответ.КодСостояния;
		СообщениеПользователю.Сообщить();
		Возврат;
	КонецПопытки;	
	
	Если Ответ.КодСостояния <> 200 Тогда
	 	СообщениеПользователю = Новый СообщениеПользователю;
		СообщениеПользователю.Текст  = "Ошибка запроса к серверу: "+Ответ.КодСостояния;
		СообщениеПользователю.Сообщить();
		Возврат;
	КонецЕсли; 

КонецПроцедуры // ОтправитьPushУведомление()

Запись документа XML иерархия

Запись документа XML, по иерархии

XML

Добавил: Артур
Процедура ВыгрузитьСкладыНажатие(Элемент)		//выгрузка склады
	ЗаписьXML = Новый ЗаписьXML;
	ПутьКФайлу = 	КаталогВременныхФайлов()+ "Склады.xml";
	ЗаписьXML.ОткрытьФайл(ПутьКФайлу,  "UTF-8"); //Открываем файл для записи, указываем кодировку
	ЗаписьXML.ЗаписатьОбъявлениеXML();  // Записываем объявление XML
	ЗаписьXML.ЗаписатьНачалоЭлемента("Склады"); // Начало элемента 
	Выборка   = Справочники.Склады.ВыбратьИерархически();
	Пока Выборка.Следующий() Цикл  // Начинаем выгружать 
		если  Выборка.ЭтоГруппа = Истина тогда
			Если Выборка.УровеньВВыборке() = 0 Тогда 
			ЗаписьXML.ЗаписатьНачалоЭлемента("Склад"); // Начало элемента Склад
		ЗаписьXML.ЗаписатьАтрибут("Код",          Строка(Выборка.Код));
		ЗаписьXML.ЗаписатьАтрибут("Наименование", Строка(Выборка.Наименование));
		ЗаписьXML.ЗаписатьАтрибут("Родитель", Строка(Выборка.Родитель));
			ЗаписьXML.ЗаписатьКонецЭлемента();
		    Иначеесли Выборка.УровеньВВыборке() = 1 Тогда 
			ЗаписьXML.ЗаписатьНачалоЭлемента("Склад1"); 
		ЗаписьXML.ЗаписатьАтрибут("Код1",          Строка(Выборка.Код));
		ЗаписьXML.ЗаписатьАтрибут("Наименование1", Строка(Выборка.Наименование));
		ЗаписьXML.ЗаписатьАтрибут("Родитель1", Строка(Выборка.Родитель));
		    ЗаписьXML.ЗаписатьКонецЭлемента();	
			КонецЕсли;
		иначеесли Выборка.ЭтоГруппа = Ложь тогда
		ЗаписьXML.ЗаписатьНачалоЭлемента("Склад2");
		ЗаписьXML.ЗаписатьАтрибут("Код2",          Строка(Выборка.Код));
		ЗаписьXML.ЗаписатьАтрибут("Наименование2", Строка(Выборка.Наименование));
		ЗаписьXML.ЗаписатьАтрибут("Родитель2", Строка(Выборка.Родитель));
		ЗаписьXML.ЗаписатьАтрибут("Подразделение2", Строка(Выборка.Подразделение));
		ЗаписьXML.ЗаписатьАтрибут("ВидСклада2", Строка(Выборка.ВидСклада));
		ЗаписьXML.ЗаписатьКонецЭлемента(); // Конец элемента Организация
		КонецЕсли;
	КонецЦикла;
	ЗаписьXML.ЗаписатьКонецЭлемента(); // Конец элемента 
	ЗаписьXML.Закрыть();

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

Выгрузка Запроса в XML документ, в виде дерева(В Виде иерархии)

Выгрузка Запроса в XML документ, в виде дерева

XML дерево запрос иерархия XML

Добавил: Артур
Процедура ЛюбаяСЗапросом()
ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ПутьП,  "UTF-8"); //Открываем файл для записи, указываем кодировку
	ЗаписьXML.ЗаписатьОбъявлениеXML();  // Записываем объявление XML
	ЗаписьXML.ЗаписатьНачалоЭлемента("ОстаткиТоваров"); // Начало элемента 
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыНаСкладах.Период КАК Период,
		|	ТоварыНаСкладах.Регистратор КАК Регистратор,
		|	ТоварыНаСкладах.Номенклатура КАК Номенклатура,
		|	ТоварыНаСкладах.Количество КАК Количество
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
		|ГДЕ
		|	ТоварыНаСкладах.Период МЕЖДУ &НачПериод И &КонПериод
		|	И ТоварыНаСкладах.Номенклатура В ИЕРАРХИИ(&Номенклатура)		
		|ИТОГИ ПО
		|		Регистратор";

Результат = Запрос.Выполнить();
	Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
	ОбойтиУровеньДерева(Дерево.Строки, ЗаписьXML);   //вызов процедуры
	ЗаписьXML.ЗаписатьКонецЭлемента();     
	ЗаписьXML.Закрыть();

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

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

TurboConf

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

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

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