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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

builin 89 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 92 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>";
	
КонецПроцедуры

Показать вопрос

Диалог подтверждения действия пользователем
sr.epifanov 16 1
&НаКлиенте
Процедура КомандаСпроситьУПользователя(Команда)
	
	Оповещение = Новый ОписаниеОповещения("КомандаСпроситьУПользователяЗавершение", ЭтаФорма, Неопределено);
	ТекстВопроса = "Будет выполнено некое действие. Продолжить?";
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаСпроситьУПользователяЗавершение(Результат, ДополнительныеПараметры = Неопределено) Экспорт
	
	Если Результат = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;
	
        // Сделать что нужно
	
КонецПроцедуры

Вопрос перед закрытием конфигуратора

Как сделать так, чтобы конфигуратор задавал вопрос перед закрытием? Древняя проблема конфигуратора. Если у вас нет никаких несохраненных изменений, то при случайном нажатии "крестика" конфигуратор закрывается без каких либо вопросов. И закрываются все о...
SeiOkami 354 5 6 8

Типизировать Колонки

Процедура находит колонки с произвольным типом и заменяет их на типизированные
Источник: https://t.me/JuniorOneS
SeiOkami 354 5 6 8
// Процедура находит колонки с произвольным типом и заменяет их на типизированные
//
// Параметры:
//  ТаблицаЗначений	 - ТаблицаЗначений - Таблица, колонки которой необходимо типизировать
//
Процедура ТипизироватьКолонки(ТаблицаЗначений) Экспорт
	
	ТипизируемыеКолонки = Новый Массив;
	
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		
		Если ЗначениеЗаполнено(Колонка.ТипЗначения.Типы()) Тогда
			Продолжить;
		КонецЕсли;
		
		ОписаниеКолонки = Новый Структура("Имя,Заголовок,Типы,Ширина,Значения");
		ЗаполнитьЗначенияСвойств(ОписаниеКолонки, Колонка);
		
		ОписаниеКолонки.Типы     = Новый Массив;
		ОписаниеКолонки.Значения = ТаблицаЗначений.ВыгрузитьКолонку(0);
		
		Для Каждого ТекущееЗначение Из ОписаниеКолонки.Значения Цикл
			ТипЗначения = ТипЗнч(ТекущееЗначение);
			Если ОписаниеКолонки.Типы.Найти(ТипЗначения) = Неопределено Тогда
				ОписаниеКолонки.Типы.Добавить(ТипЗначения);
			КонецЕсли;
		КонецЦикла;
		
		ТипизируемыеКолонки.Добавить(ОписаниеКолонки);
		
	КонецЦикла;
	
	Для Каждого ОписаниеКолонки Из ТипизируемыеКолонки Цикл
		
		ТипыКолонки  = ОписаниеКолонки.Типы;
		//"Нюанс" платформы. Невозможно создать описание типов с Неопределено. Для 1С это будет как "Произвольный"
		Если ТипыКолонки.Количество() = 1 И ТипыКолонки[0] = Тип("Неопределено") Тогда
			ТипыКолонки.Добавить(Тип("Null"));
			ТипыКолонки.Добавить(Тип("Булево"));
		КонецЕсли;
		
		ОписаниеТипа = Новый ОписаниеТипов(ОписаниеКолонки.Типы);
		
		ВременноеИмя = "Колонка" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
		
		НоваяКолонка = ТаблицаЗначений.Колонки.Добавить(ВременноеИмя, 
		ОписаниеТипа, ОписаниеКолонки.Заголовок, ОписаниеКолонки.Ширина);
		
		ТаблицаЗначений.ЗагрузитьКолонку(ОписаниеКолонки.Значения, НоваяКолонка);
		
		ТаблицаЗначений.Колонки.Удалить(ОписаниеКолонки.Имя);
		
		НоваяКолонка.Имя = ОписаниеКолонки.Имя;
		
	КонецЦикла;
	
КонецПроцедуры

Вызов процедур или функций модуля объекта из модуля формы

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

Скриншот сеанса средствами 1С

Процедура сохраняет скриншот текущего сеанса пользователя по переданному адресу. Работает из клиента 1С на УФ (начиная с версии 8.3.17)
Источник: https://t.me/JuniorOneS
SeiOkami 354 5 6 8
// Процедура сохраняет скриншот текущего сеанса пользователя по переданному адресу
// Работает начиная с версии 8.3.17.
//
// Параметры:
//  ПолныйПуть	 - Строка	 - Полный путь к файлу
//
&НаКлиенте
Процедура СохранитьСкриншотСеанса(ПолныйПуть = "")
	
	#Если НЕ ВебКлиент Тогда
	
	ВременныйФайл = ПолучитьИмяВременногоФайла(".zip");
	
	ОтчетОбОшибке = Новый ОтчетОбОшибке(ИнформацияОбОшибке());
	ОтчетОбОшибке.Записать(ВременныйФайл, Ложь);
	
	КаталогФайлов = КаталогВременныхФайлов() + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
	ЧтениеАрхива  = Новый ЧтениеZipФайла(ВременныйФайл);
	ЧтениеАрхива.ИзвлечьВсе(КаталогФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
	
	ПутьСкриншота = КаталогФайлов + "\screenshot.png";
	КопироватьФайл(ПутьСкриншота, ПолныйПуть);
	
	УдалитьФайлы(ВременныйФайл);
	УдалитьФайлы(КаталогФайлов);
	
	#КонецЕсли
	
КонецПроцедуры

Не переносите код таким образом

Как нельзя переносить текст кода Не переносите код таким образом Иногда так бывает, что названия вызываемого метода и передаваемых параметров формируют слишком длинную строчку кода. И приходится её разбивать на несколько. По этому поводу есть ссылка на ...
SeiOkami 354 5 6 8

Колонки результата запроса

Нюанс о типизации колонок результата запроса Колонки результата запроса У результата запроса есть одна особенность. Какой бы вы ни выбирали тип значений, платформа добавит к колонке результата тип Null. Число, Строка, Булево, Ссылка. Неважно. Даже если ...
SeiOkami 354 5 6 8

Вопрос. Стоит ли мне учить 1С для дальнейшего потом заработка

Всем привет,я новичок в программировании, подскажите пожалуйста стоит ли мне учить 1С для дальнейшего потом заработка, или все же попробовать какой-то другой язык?
ArByZzZ