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

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

Защита кода 1С. Основные методы защиты конфигураций и обработок

В этой статье мы рассмотрим различные способы защиты кода ваших разработок 1С от взлома и нелицензионного использования. Для чего программисты обычно защищают свои разработки? Защита демо-версий продуктов Защита алгоритмов и бизнес-логики от копирования...
bolsun 307 5 3 9

Прогресс с помощью СКД на обычных формах

Методы для вывода прогресс-бара средствами платформы в поле состояния с помощью СКД //УПРАВЛЕНИЕ ИНДИКАТОРОМ// Функция ИнициализироватьИндикатор(ПраваяГраница) Экспорт НастройкаИндикатора = Новый Структура; //установка параметров для вывода преценто...
Smaylukk 41 3

FastCode - сервис для программистов 1С Промо

Огромная база полезных шаблонов кода, статьи, курсы, интересные разработки, поиск по БСП, ответы на вопросы, помощь сообщества разработчиков. Клиент для поиска прямо в Конфигураторе!
bolsun
Бесплатно

Учет оргтехники и ТМЦ в офисе

Конфигурация 1с на базе платформы 8.3 для учета оргтехники, мебели, и других ТМЦ в офисе, без лишних хлопот
Бесплатно

Получаем состав плана обмена с признаком регистрации

Простая функция получения состава плана обмена программно Функция ПолучитьСписокПланаОбмена(стрИмяПланаОбмена) ВыбранныйПланОбмена = Метаданные.ПланыОбмена[стрИмяПланаОбмена]; тзПланОбменаСостав = Новый ТаблицаЗначений; тзПланОбменаСостав.Колонки...
DiKSer 17 3

Курс по разработке мобильных приложений на 1С

В курсе подробно рассматривается разработка мобильных приложений на 1С для операционной системы Android. Большая часть курса подойдет и для операционных систем iOS и Windows Phone. Но процесс сборки рассмотрен только для Android.
2 500 руб.

Добавление данных по регистру в документ "Перенос данных" в ЗУП

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

Получить список принтеров

Источник: http://1clenta.ru/pattern/3
&НаКлиенте
Функция ПолучитьМассивПринтеров()
    
    МассивПринтеров = Новый Массив;

    Попытка
        objWMIService = ПолучитьCOMОбъект("winmgmts:\\.\root\CIMV2"); 
    Исключение
        ТекстСообщения = НСтр("ru = 'Список принтеров не доступен!'");
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
        Возврат МассивПринтеров;
    КонецПопытки;
    
    Выборка = objWMIService.ExecQuery("SELECT * FROM Win32_Printer",,48);   
    
    Для Каждого objItem Из Выборка Цикл  
        МассивПринтеров.Добавить(objItem.Caption);
    КонецЦикла;
    
    Возврат МассивПринтеров;
КонецФункции

Индикатор отчета для Обычных форм

miha 71 5
Процедура СформироватьОтчет(Кнопка)
    Элем = ЭлементыФормы.Добавить(Тип("Индикатор"), "Инд1", Истина);
    Элем.Верх = ЭтаФорма.Высота - 20;
    Элем.Высота = 25;
    Элем.Ширина = 150;
    Элем.ОтображатьПроценты = Истина;
    Элем.МинимальноеЗначение = 1;
    Элем.МаксимальноеЗначение = 100;
    Состояние( "Выводим данные отчета");
    
    Для сч = 1 по 100 Цикл
        Для ф=1 по 1000 Цикл
           //спим
 
        КонецЦикла;
       //ваш алгоритм обновления индикатора
 
        Элем.Значение = сч;        
        ЭтаФорма.Обновить();
    КонецЦикла;
    
    ЭлементыФормы.Удалить(Элем);
КонецПроцедуры

Как узнать, чем занято место на диске (Windows)

Как быстро найти, что занимает больше всего места на диске. Я пользуюсь двумя бесплатными утилитами. Scanner http://steffengerlach.de/freeware/ Scanner disk Программа показывает содержимое диска в виде круговой диаграммы. Можно смотреть также структуру ...
bolsun 307 5 3 9

Курс по HTTP-сервисам в 1С

В курсе подробно рассматривается работа с HTTP протоколом в 1С: HTTP соединение, HTTP запрос и ответ, HTTP-сервисы, работа с JSON, установка веб-серверов Apache и IIS, публикация на веб-сервере, настройка HTTPS. А также рассматриваются основы HTTP протокол...
1 500 руб.

Общие элементы массивов

Функция возвращает общие элементы (пересечение) двух массивов
prog1c 58 1 6
Функция ОбщиеЭлементыМассивов(Массив1, Массив2)

	Результат = Новый Массив;
	
	Для каждого ЭлементМассива Из Массив1 Цикл
		Если Массив2.Найти(ЭлементМассива) <> Неопределено И
				Результат.Найти(ЭлементМассива) = Неопределено Тогда
			Результат.Добавить(ЭлементМассива);
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;

КонецФункции // ОбщиеЭлементыМассивов()

Ключ менеджера записи регистра сведений

Функция возвращает ключ менеджера записи регистра сведений
Источник: https://t.me/JuniorOneS
SeiOkami 360 5 6 8
// Функция возвращает ключ менеджера записи регистра сведений на основе 
//	https://fastcode.im/Templates/7545
//
// Параметры:
//  ДанныеЗаписи	- МенеджерЗаписи, Структура, Произвольный - коллекция с данными записи
//  ИмяРегистра		- Строка - Имя регистра. Если не передано, то метаданные регистра берутся из ДанныеЗаписи
// 
// Возвращаемое значение:
//  КлючЗаписи - Ключ записи регистра
//
Функция КлючМенеджераЗаписиРегистраСведений(ДанныеЗаписи, ИмяРегистра = "") Экспорт
	
	Если ПустаяСтрока(ИмяРегистра) Тогда
		МетаданныеРегистра = Метаданные.НайтиПоТипу(ТипЗнч(ДанныеЗаписи));
	Иначе
		МетаданныеРегистра = Метаданные.РегистрыСведений[ИмяРегистра];
	КонецЕсли;
	
	ЗначенияКлюча = Новый Структура("Период");
	
	Для Каждого ОписаниеИзмерения Из МетаданныеРегистра.Измерения Цикл
		ЗначенияКлюча.Вставить(ОписаниеИзмерения.Имя);
	КонецЦикла;
	
	ЗаполнитьЗначенияСвойств(ЗначенияКлюча, ДанныеЗаписи);
	
	Возврат РегистрыСведений[МетаданныеРегистра.Имя].СоздатьКлючЗаписи(ЗначенияКлюча);
	
КонецФункции

1С Django. Личный кабинет контрагента. Курс

Разработай мини-сайт на современном фреймворке Django для оформления заказов контрагентами в 1С
FastCode 346 2 8 19
-10%

Добавить таблицу в менеджер временных таблиц

Процедура добавляет таблицу в менеджер временных таблиц
Источник: https://t.me/JuniorOneS
SeiOkami 360 5 6 8
// Процедура добавляет таблицу в менеджер временных таблиц
//
// Параметры:
//  МенеджерВременныхТаблиц	 - МенеджерВременныхТаблиц - Менеджер, в который нужно добавить таблицу
//  ИмяТаблицы				 - Строка - Имя временной таблицы
//  ДанныеТаблицы			 - ТаблицаЗначений - Данные таблицы
//
Процедура ДобавитьТаблицуВМенеджерВременныхТаблиц(МенеджерВременныхТаблиц, ИмяТаблицы, ДанныеТаблицы) Экспорт
	
	ИменаКолонок = Новый Массив;
	Для Каждого Колонка Из ДанныеТаблицы.Колонки Цикл
		ИменаКолонок.Добавить(Колонка.Имя);
	КонецЦикла;
	ИменаКолонок = СтрСоединить(ИменаКолонок, ",");
	
	ТекстЗапроса = "ВЫБРАТЬ %1 ПОМЕСТИТЬ %2 ИЗ &ТЗ КАК ТЗ";
	ТекстЗапроса = СтрШаблон(ТекстЗапроса, ИменаКолонок, ИмяТаблицы);
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("ТЗ", ДанныеТаблицы);
	Запрос.Выполнить();
	
КонецПроцедуры

Узнать версию платформы

miha 71 5
СисИнфо = Новый СистемнаяИнформация;

Если Лев(СисИнфо.ВерсияПриложения, 3) = "8.2" Тогда
	V8Com = Новый COMОбъект("V82.Application");
Иначе
	V8Com = Новый COMОбъект("V83.Application");
КонецЕсли;

Проверка изменения полей регистра сведений ПередЗаписью, кеширование средствами БСП

Проверка изменения полей регистра сведений ПередЗаписью с использованием кеширования исходных данных через БСП (БуферОбмена). Сложность в том, что при изменении данных регистра сведений сперва происходит запись пустого набора данных и когда записывается итоговый набор данных, прежние данные запросом уже не получить. Данный код кеширует прежние данные в первой итерации во временном хранилище и передает его адрес второй итерации через параметр сеанса (встроенными средствами БСП).

Блог Жёлтая тетрадь http://t.me/yellow_pad

builin 90 1 3 3
Процедура ПередЗаписью(Отказ, Замещение)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли; 
	
	ИмяИсточника = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Новый Структура("Пользователь, Отборы", ИмяПользователя(), Отбор.Задача.Значение));
	
	Если ЭтотОбъект.Количество() = 0 Тогда
		
		ОбщегоНазначения.СкопироватьВБуферОбмена(ПолучитьНачальныеДанные(Отбор.Задача.Значение), ИмяИсточника);
		
	Иначе
		
		БуферОбмена = ОбщегоНазначения.СтрокиИзБуфераОбмена();
		Если БуферОбмена.Источник = ИмяИсточника Тогда // новая запись
			НачальныеДанные = БуферОбмена.Данные;
		Иначе
			НачальныеДанные = Неопределено;
		КонецЕсли; 
		
		ТекущаяДата = ТекущаяДата();
		
		Для каждого Запись Из ЭтотОбъект Цикл
			
			ТекНачальныеДанные = ?(НачальныеДанные = Неопределено, Неопределено, НачальныеДанные.Найти(Запись.Задача, "Задача"));
			
			Если ТекНачальныеДанные = Неопределено Тогда // запись создана
				Запись.ДатаСоздания = ТекущаяДата;
				Продолжить;
			КонецЕсли; 
			
			Если ЗначениеЗаполнено(Запись.Ссылка)
				И НЕ Запись.Ссылка = ТекНачальныеДанные.Ссылка Тогда // получена новая ссылка
				Запись.ДатаПолученияСсылки = ТекущаяДата;
			КонецЕсли; 
			
		КонецЦикла; 
		
		// очистим буфер обмена
		ОбщегоНазначения.СкопироватьВБуферОбмена(Неопределено, ИмяИсточника);
		
	КонецЕсли; 
	
КонецПроцедуры

Функция ПолучитьНачальныеДанные(Задачи)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	*
	|ИЗ
	|	РегистрСведений.ЗадачиДляОбмена КАК ЗадачиДляОбмена
	|ГДЕ
	|	ЗадачиДляОбмена.Задача В (&Задачи)";
	
	Запрос.УстановитьПараметр("Задачи", Отбор.Задача.Значение);
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

Разложить массив по типам объектов

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

Проверить что переменная соответствует заданному типу

Порой нужно проверить что переменная имеет именно то описание типа что требуется в документации
VolAll 8 1
чАртикул = 100000000000;
ТипДанныхДолженБыть  = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный));

РезультатПриведения  = ТипДанныхДолженБыть.ПривестиЗначение(чАртикул);

булПроверка = РезультатПриведения = чАртикул;

Как получить атрибут ХМЛ

Есть список и надо почистить старые записи: http://192.168.0.10:8080/opt/out/ReplyFormA/5953 Х = СоздатьОбъект(Msxml2.DOMDocument.6.0); х.async = 0; х.load(http://+ айпиООО +/opt/out/ReplyFormA); Список= х.selectNodes(//url); Для ии=0 По Список.length...
Дионисий 11 1

Отображает PDF документ в HTML поле на форме через WebKit

Осторожнее с пересылкой кода через мессенджеры/форумы, могут испортиться теги.
ChOP 94 1 2 5
//Процедура отображает PDF документ в HTML поле на форме через WebKit:
//
// Параметры:
//  HTMLДокумент - Поле HTML документа - поле, в которое надо вывести pdf.
// 
//	ДвоичныеДанные - Двоичные данные - pdf документ.
//
Процедура ОтобразитьPDF(HTMLДокумент, ДвоичныеДанные) Экспорт
	
	СтрокаPDFФайла = ПолучитьBase64СтрокуИзДвоичныхДанных(ДвоичныеДанные);
	
	HTMLДокумент = "<!DOCTYPE html>
				|<html>
				|	<head>
				|		<meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" />
				|		<meta name=""viewport"" content=""width=device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=no"">
				|		<script src=""https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.4.456/pdf.min.js""></script>
				|		<script src=""https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.4.456/pdf.worker.min.js""></script>
				|		<canvas id=""the-canvas""></canvas>
				|		<script>
				|			var currPage = 1; //Pages are 1-based not 0-based
				|			var numPages = 0;
				|			var thePDF = null;
				|			
				|			var loadingTask = pdfjsLib.getDocument({data: atob(`" + СтрокаPDFФайла + "`)});
				|			loadingTask.promise.then(function(pdf) {
				|			       
				|			     thePDF = pdf;
				|			     numPages = pdf.numPages;
				|			
				|			     pdf.getPage(1).then(handlePages);                      
				|			
				|			     function handlePages(page) { 
				|			        var scale = 1.5;
				|			
				|			        var viewport = page.getViewport({scale: scale});
				|			
				|			        var canvas = document.createElement( ""canvas"" );
				|			        canvas.style.display = ""block"";
				|			        var context = canvas.getContext('2d');
				|			        canvas.height = viewport.height;
				|			        canvas.width = viewport.width;
				|			
				|			        var renderContext = {
				|			              canvasContext: context,
				|			              viewport: viewport
				|			        };
				|			        var renderTask = page.render(renderContext);
				|			
				|			         document.body.appendChild( canvas );
				|			
				|			        currPage++;
				|			        if ( thePDF !== null && currPage <= numPages )
				|			        {
				|			            thePDF.getPage( currPage ).then( handlePages );
				|			        }
				|			       };
				|			
				|			});
				|		</script>
				|	</body>
				|</html>";
	
КонецПроцедуры