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

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

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

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

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

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

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

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

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

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

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

Есть список и надо почистить старые записи: 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...

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

Осторожнее с пересылкой кода через мессенджеры/форумы, могут испортиться теги.
ChOP 87 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 14 1
&НаКлиенте
Процедура КомандаСпроситьУПользователя(Команда)
	
	Оповещение = Новый ОписаниеОповещения("КомандаСпроситьУПользователяЗавершение", ЭтаФорма, Неопределено);
	ТекстВопроса = "Будет выполнено некое действие. Продолжить?";
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Запрос 1С

Здравствуйте, изучаю 1С и получил задание, разработать отчет, который выводит остатки по складам, + две колонки в конце, объем закупок и объем продаж по выбранному складу. Я в запросах новичок, но знаю про соединения, функции некоторые. То есть я могу выво...

Получить данные временной таблицы

При добавлении данной функции в общий модуль, позволяет быстро и без внесения изменений в код получать данные из временных таблиц в запросе. Используется в случае, если МенеджерВременныхТаблиц = Неопределенно. Доступна с версии 8.3.8
ChOP 87 1 2 5
//Функция возвращает содержимое временной таблицы в запросе по индексу
//
// Параметры:
//  Запрос - Запрос - исполняемый запрос
//  ИндексПакета - Число – индекс временной таблицы
//
// Возвращаемое значение: 
//  - Таблица значений - таблица значений с содержимым временной таблицы.
// 
Функция ПолучитьДанныеВременнойТаблицы(Запрос, ИндексПакета) Экспорт
	Возврат Запрос.ВыполнитьПакетСПромежуточнымиДанными()[ИндексПакета].Выгрузить();
КонецФункции

Шпаргалка по горячим клавишам для разработчика 1С

Сочетания клавиш.png
SeiOkami 330 5 5 8

Тикеты - система учета задач/Help Desk в 1С (интеграция с Trello, Мобильное приложение)

Система предназначена для учета задач в 1С как между пользователем — разработчиком, так и для внутренних нужд организаций в качестве обслуживания бизнес-процессов. Основное преимущество разработки - это подключение клиентской части в виде внешней обработки...
2 000 руб.

Как узнать какая программа блокирует файл

Скачайте программу Process Explorer с сайта Microsoft Она бесплатная и не требует установки. ProcessExplorer Нажмите Ctrl+F или кнопку поиска на панели инструментов ProcessExplorer Введите имя заблокированного файла и нажмите Search. Будет найдет процесс, ...
bolsun 284 4 3 7

Замеряет скорость выполнения запроса и получает его выгрузки

Возвращает результат анализа запроса и полученные данные. При этом переданный объект запроса не выполняется Удобно использовать в отладке для анализа запроса прямо с установленными параметрами и МВТ 1. Выбирает все данные из менеджера временных таблиц
SeiOkami 330 5 5 8

Добавить или обновить колонку

Добавляет колонку в таблицу значений Если колонка уже есть, то обновляет свойства Заголовок и Ширина Возвращает добавленную или найденную колонку
Источник: https://t.me/JuniorOneS
SeiOkami 330 5 5 8
// Добавляет колонку в таблицу значений
// Если колонка уже есть, то обновляет свойства Заголовок и Ширина
//
// Параметры:
//  ТаблицаЗначений  - ТаблицаЗначений - Таблица значений, в которую нужно добавить колонку
//  Имя              - Строка - Имя колонки
//  Тип              - ОписаниеТипов, Неопределено - Объект, описывающий допустимые типы значений для колонки. 
//                 Если параметр не указан, в колонке можно будет хранить значение любого типа.
//  Заголовок        - Строка, Неопределено - Заголовок колонки таблицы значений.
//                 Используется при визуальном отображении таблицы значений.
//  Ширина           - Строка, Неопределено - Ширина колонки в символах.
//                 Используется при визуальном отображении таблицы значений.
//
// Возвращаемое значение:
//   КолонкаТаблицыЗначений - добавленная (или найденная) колонка 
//
Функция ДобавитьКолонкуБезопасно(ТаблицаЗначений, Имя, 
	Тип = Неопределено, Заголовок = Неопределено, Ширина = Неопределено) Экспорт
	
	Колонка	= ТаблицаЗначений.Колонки.Найти(Имя);
	
	Если Колонка = Неопределено Тогда
		Колонка	= ТаблицаЗначений.Колонки.Добавить(Имя, Тип);
	КонецЕсли;
	
	Если Заголовок <> Неопределено Тогда
		Колонка.Заголовок	= Заголовок;
	КонецЕсли;
	
	Если Ширина <> Неопределено Тогда
		Колонка.Ширина	= Ширина;
	КонецЕсли;
	
	Возврат Колонка;
	
КонецФункции

Добавить отбор построителя

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