Универсальные функции, которые избавят вас от написания велосипедов

15.07.26

Разработка - Универсальные функции

Каждый раз, когда необходимо выполнить действия с коллекциями на языке 1С, программист 1С вспоминает, какую именно функцию ему необходимо применить для определенного типа коллекции. Настало время избавиться от этой проблемы. Ниже - практическая подборка из 11 методов расширения Внешний регламент, которые помогут писать код быстрее, не задумываясь о типе коллекций.

1. Определить(Данные,Значение,ИмяКолонки="")

Классический «велосипед» при работе с данными - необходимо добавить уникальное значение в массив или строку с уникальным значением в таблицу значений. Делается это одной элегантной строкой.

Пример:

СТЗ = ВнешнийРегламент.Определить(ТЗ,Зн,"Колонка1");
// или
ЭМ = ВнешнийРегламент.Определить(ЛюбойМассив,Зн);

Возможные типы параметра Данные:

Массив
ТаблицаЗначений
ДеревоЗначений
СтрокаДереваЗначений
ТекстовыйДокумент
СписокЗначений

 

2. Исключить(Данные,Значение,ИмяКолонки)

Исключаем из коллекций данные по значению, возвращает количество исключенных элементов или строк

Пример:

ВнешнийРегламент.Исключить(ТЗ,Зн,"Колонка1");
// или
к = ВнешнийРегламент.Исключить(ЛюбойМассив,Зн);

Возможные типы параметра Данные:

Массив
ТаблицаЗначений
ДеревоЗначений
СтрокаДереваЗначений
ТекстовыйДокумент
СписокЗначений

 

3. Свернуть(Данные,КолонкиСуммирования="")

Сворачиваем коллекций, возвращает количество удаленных элементов или строк

Пример:

ВнешнийРегламент.Свернуть(ТЗ,"Количество,Сумма");
// или
к = ВнешнийРегламент.Свернуть(ЛюбойМассив);

Возможные типы параметра Данные:

Массив
ТаблицаЗначений
ТекстовыйДокумент
СписокЗначений

 

4. ОпределитьКолонки(ТЗ,ИменаКолонок,ТипыКолонок="",ИмяКолонкиДляВставки="")

Определить колонки в дереве значений или таблице значений, если колонки нет

ТипыКолонок должны иметь вид "Строка.100,,Число.19.2"
если задано ИмяКолонкиДляВставки и если она есть, то все колонки будут вставлены до нее
 

Пример:


ВнешнийРегламент.ОпределитьКолонки(ТЗ,"Количество,Сумма","Число.19.2,Число.19.3");

Возможные типы параметра Данные:

ТаблицаЗначений
ДеревоЗначений

 

5. ИсключитьКолонки(ТЗ,ИменаКолонок)

Исключить колонки в дереве значений или таблице значений, если они есть

Пример:

ВнешнийРегламент.ИсключитьКолонки(ТЗ,"Количество,Сумма");

 

6. НайтиСсылки(ТипИмя,СтруктураФильтров=0)

Возвращает массив ссылок после выполнения запроса к базе данных по заданным фильтрам

Пример:

СП = Новый Структура;
СП.Вставить("ИНН","7777777777");
СП.Вставить("КПП","8888888888");
МассивСсылок = ВнешнийРегламент.НайтиСсылки("Справочник.Контрагенты",СП);

 

7. ЕстьВДанных(Данные,ВозможныеВарианты)

Проверяем, существует ли в данных любая подстрока из ВозможныеВарианты

Пример:

ФлагЕсть = ВнешнийРегламент.ЕстьВДанных("Имя1","Имя1,Имя2");
// ВозможныеВарианты - строка имен, разделенных запятыми или массив строк

Возможные типы параметра Данные:

Строка
Массив
СписокЗначений

 

8. ЕстьСвойство(Объект, ИмяРеквизита)

Проверяем наличие реквизита или свойства у произвольного объекта без обращения к метаданным

Пример:

ФлагЕсть = ВнешнийРегламент.ЕстьСвойство(Объект,"ИНН");

 

9. СтрокаВДата(Стр)

Возвращает дату из строки, поддерживает все возможные варианты формата даты

Пример:

Момент = ВнешнийРегламент.СтрокаВДата("2026-02-01");
// или
Момент = ВнешнийРегламент.СтрокаВДата("2026");

// возможные варианты: ДД.ММ.ГГГГ, ДД.ММ.ГГ, ДД/ММ/ГГГГ, ДД/ММ/ГГ, ГГГГММДД,
// ГГГГ-ММ-ДД, ДД.ММ.ГГГГ ЧЧ:мм:сс , ГГГГ, ГГГГ-ММ

 

10. ПолучитьМоментСозданияПоУИ1С(СтрУИ1С)

Возвращает момент создания объекта по уникальному идентификатору 1С

Пример:

Момент = ВнешнийРегламент.ПолучитьМоментСозданияПоУИ1С("902f35b7-000f-11f1-8f23-0050569ba6c1");

 

11. ОбластьМакетаВТаблицу(Макет,ИмяОбласти,начать_со_строки=1)

Возвращает ТЗ из макета, начиная с заданной строки. Имена колонок нумеруются по порядку "Поле1" и т.д.

Пример:

ТЗ = ВнешнийРегламент.ОбластьМакетаВТаблицу(Макет,Неопределено,2);

 

Вступайте в нашу телеграмм-группу Инфостарт

Внешний регламент универсальные функции ВнешнийРегламент. cfe

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    6168    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    11017    DeerCven    15    

64

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    62937    dimanich70    87    

177

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8519    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    79011    atdonya    31    

75

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    11364    ke.92@mail.ru    18    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 2158 15.07.26 11:03 Сейчас в теме
Это конечно хорошо, что перечислены функции, которыми сам пользуешься)

Но нужен либо их листинг, либо вложение))
_smile_; ivnik; abolior; v8_088; ubnkfl; +5 Ответить
2. v8_088 15.07.26 12:06 Сейчас в теме
Рыбу продаете ? - Нет только показываю.
_smile_; abolior; 9899100; +3 Ответить
3. moolex 905 15.07.26 17:07 Сейчас в теме
Функция Определить(Данные,Значение,ИмяКолонки="") Экспорт
	
	// Определяет новый элемент в массиве данных если нет, возвращает индекс в массиве
	// Определяет новую строку в ТЗ если нет, возвращает строку ТЗ
	// Определяет новый элемент в списке значений, возвращает элемент в списке значений
	// Определить новую строку в текстовом документе если нет такой, возвращает номер строки
	// Определить новый элемент справочника по коду, наименованию или реквизиту
	
	Если (ТипЗнч(Данные)=Тип("Массив")) Тогда
		Индекс = Данные.Найти(Значение);
		Если (Индекс=Неопределено) Тогда
			Индекс = Данные.Количество();
			Данные.Добавить(Значение);
		КонецЕсли;
		Возврат Индекс;
		
	ИначеЕсли (ТипЗнч(Данные)=Тип("ТаблицаЗначений")) Тогда
		Если (Данные.Колонки.Найти(ИмяКолонки)<>Неопределено) Тогда
			СТЗ = Данные.Найти(Значение,ИмяКолонки);
			Если (СТЗ=Неопределено) Тогда
				СТЗ             = Данные.Добавить();
				СТЗ[ИмяКолонки] = Значение;
			КонецЕсли;
			Возврат СТЗ;
		КонецЕсли;
		
	ИначеЕсли (ТипЗнч(Данные)=Тип("ДеревоЗначений")) Тогда
		Если (Данные.Колонки.Найти(ИмяКолонки)<>Неопределено) Тогда
			СДЗ = Данные.Строки.Найти(Значение,ИмяКолонки);
			Если (СДЗ=Неопределено) Тогда
				СДЗ             = Данные.Строки.Добавить();
				СДЗ[ИмяКолонки] = Значение;
			КонецЕсли;
			Возврат СДЗ;
		КонецЕсли;
		
	ИначеЕсли (ТипЗнч(Данные)=Тип("СтрокаДереваЗначений")) Тогда
		СДЗ = Данные.Строки.Найти(Значение,ИмяКолонки);
		Если (СДЗ=Неопределено) Тогда
			СДЗ             = Данные.Строки.Добавить();
			СДЗ[ИмяКолонки] = Значение;
		КонецЕсли;
		Возврат СДЗ;
	
	ИначеЕсли (ТипЗнч(Данные)=Тип("ТекстовыйДокумент")) Тогда
		Результат = 0;
		Стр       = Строка(Значение);
		н         = 1;
		Пока (н<=Данные.КоличествоСтрок()) Цикл
			Если (Данные.ПолучитьСтроку(н)=Стр) Тогда
				Результат = н;
				Прервать;
			КонецЕсли;
			н = н + 1;
		КонецЦикла;
		Если (Результат=0) Тогда
			Данные.ДобавитьСтроку(Стр);
			Результат = Данные.КоличествоСтрок();
		КонецЕсли;
		Возврат Результат;

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

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

КонецФункции
Показать
19. rnobody 4 17.07.26 14:29 Сейчас в теме
(3)
У меня получилось немного длиннее


Я, правда, совсем не понимаю одного: зачем пытаться создавать ненайденное при поиске? Слишком ситуативно - один раз, где-то, когда-то может и нужно было, но в библиотеку такое вставлять?
4. moolex 905 15.07.26 17:08 Сейчас в теме
Функция Исключить(Данные,Значение,ИмяКолонки="") Экспорт
	
	// Исключает элементы из массива по значению
	// Исключает строки   из таблицы значений по заданной колонке
	// Исключает элементы из списка значений по значению
	// Исключает строки из текстового документа по значению
	// возвращает количество исключенных объектов
	
	Результат = 0;
    Если (ТипЗнч(Данные)=Тип("Массив")) Тогда
	    н = 0;
		Пока (н<Данные.Количество()) Цикл
			Если (Данные[н]=Значение) Тогда
				Данные.Удалить(н);
				Результат = Результат + 1;
			Иначе
				н = н + 1;
			КонецЕсли;
		КонецЦикла;
		
	ИначеЕсли (ТипЗнч(Данные)=Тип("ТаблицаЗначений")) Тогда
		Если (Данные.Колонки.Найти(ИмяКолонки)<>Неопределено) Тогда
		    н = 0;
			Пока (н<Данные.Количество()) Цикл
				Если (Данные[н][ИмяКолонки]=Значение) Тогда
					Данные.Удалить(н);
					Результат = Результат + 1;
				Иначе
					н = н + 1;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	ИначеЕсли (ТипЗнч(Данные)=Тип("ДеревоЗначений")) Тогда
		
		Если (Данные.Колонки.Найти(ИмяКолонки)<>Неопределено) Тогда
		    н = 0;
			Пока (н<Данные.Строки.Количество()) Цикл
				Если (Данные.Строки[н][ИмяКолонки]=Значение) Тогда
					Данные.Строки.Удалить(н);
					Результат = Результат + 1;
				Иначе
					н = н + 1;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	ИначеЕсли (ТипЗнч(Данные)=Тип("СтрокаДереваЗначений")) Тогда
		
		Если (Данные.Владелец().Колонки.Найти(ИмяКолонки)<>Неопределено) Тогда
		    н = 0;
			Пока (н<Данные.Строки.Количество()) Цикл
				Если (Данные.Строки[н][ИмяКолонки]=Значение) Тогда
					Данные.Строки.Удалить(н);
					Результат = Результат + 1;
				Иначе
					н = н + 1;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	ИначеЕсли (ТипЗнч(Данные)=Тип("СписокЗначений")) Тогда
		Элемент = Данные.НайтиПоЗначению(Значение);
		Пока (Элемент<>Неопределено) Цикл
			Данные.Удалить(Элемент);
			Результат = Результат + 1;
			Элемент = Данные.НайтиПоЗначению(Значение);
		КонецЦикла;
	
	ИначеЕсли (ТипЗнч(Данные)=Тип("ТекстовыйДокумент")) Тогда
		н = 1;
		Пока (н<=Данные.КоличествоСтрок()) Цикл
			Если (Данные.ПолучитьСтроку(н)=Значение) Тогда
				Данные.УдалитьСтроку(н);
				Результат = Результат + 1;
			Иначе
				н = н + 1;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Возврат Результат;

КонецФункции
Показать
5. moolex 905 15.07.26 17:09 Сейчас в теме
Функция Свернуть(Данные,КолонкиСуммирования="") Экспорт

	// Сворачивает массив, список значений, текстовый документ по подобию сворачивания таблицы значений.
	// если Данные есть таблица значений, то сворачивает таблицу по всем колонкам, кроме КолонкиСуммирования
	Результат = 0;
	М         = Новый Массив;
	
	Если (ТипЗнч(Данные)=Тип("ТекстовыйДокумент")) Тогда
		Результат = Данные.КоличествоСтрок();
		н         = 1;
		Пока (н<=Данные.КоличествоСтрок()) Цикл
			Если (М.Найти(Данные.ПолучитьСтроку(н))=Неопределено) Тогда
				М.Добавить(Данные.ПолучитьСтроку(н));
				н = н + 1;
			Иначе
				Данные.УдалитьСтроку(н);
			КонецЕсли;
		КонецЦикла;
		Результат = Результат - Данные.КоличествоСтрок();
		
	ИначеЕсли (ТипЗнч(Данные)=Тип("ТаблицаЗначений")) Тогда	
		Результат = Данные.Количество();
		КолонкиГруппировок = "";
		Для Каждого Колонка Из Данные.Колонки Цикл
			Если (Найти(","+КолонкиСуммирования+",",","+Колонка.Имя+",")=0) Тогда
				КолонкиГруппировок = КолонкиГруппировок  + ?(КолонкиГруппировок="","",",") + Колонка.Имя;
			КонецЕсли;
		КонецЦикла;
		Данные.Свернуть(КолонкиГруппировок,КолонкиСуммирования);
		Результат = Результат - Данные.Количество();
		
	Иначе
		Результат = Данные.Количество();
		н = 0;
		Если (ТипЗнч(Данные)=Тип("Массив")) Тогда
			Пока (н<Данные.Количество()) Цикл
				Если (М.Найти(Данные[н])=Неопределено) Тогда
					М.Добавить(Данные[н]);
					н = н + 1;
				Иначе
					Данные.Удалить(н);
				КонецЕсли;
			КонецЦикла;
			
		ИначеЕсли (ТипЗнч(Данные)=Тип("СписокЗначений")) Тогда
			Пока (н<Данные.Количество()) Цикл
				Если (М.Найти(Данные[н].Значение)=Неопределено) Тогда
					М.Добавить(Данные[н].Значение);
					н = н + 1;
				Иначе
					Данные.Удалить(н);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		Результат = Результат - Данные.Количество();
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
Показать
6. moolex 905 15.07.26 17:15 Сейчас в теме
Функция ОпределитьКолонки(ДЗ,ИменаКолонок,ТипыКолонок="",ИмяКолонкиДляВставки="") Экспорт
	
	// Определить колонки в дереве значений или таблицы значений, если колонки нет
	// ТипыКолонок должны иметь вид "Строка.100,,Число.19.2"
	// если задано ИмяКолонкиДляВставки и если она есть, то все колонки будут вставлены до нее
	Результат   = 0;
	МассивИмен  = СтрРазделить(ИменаКолонок,",",0);
	МассивТипов = СтрРазделить(ТипыКолонок,",",1);
	Если (ЗначениеЗаполнено(ТипыКолонок)) Тогда
		Если (МассивИмен.Количество()<>МассивТипов.Количество()) Тогда Возврат -1; КонецЕсли;
	Иначе
		МассивТипов.Очистить();
	КонецЕсли;
	нкв = -1;
	Если (ЗначениеЗаполнено(ИмяКолонкиДляВставки)) Тогда
		Колонка = ДЗ.Колонки.Найти(ИмяКолонкиДляВставки);
		Если (Колонка<>Неопределено) Тогда
			нкв = ДЗ.Колонки.Индекс(Колонка);
		КонецЕсли;
	КонецЕсли;
	нк = 0;
	Для Каждого ИмяКолонки Из МассивИмен Цикл
		Если (ДЗ.Колонки.Найти(ИмяКолонки)=Неопределено) Тогда
			Заголовок = ПредставлениеИмени(ИмяКолонки);
			Если (нкв>=0) Тогда
				Если (МассивТипов.Количество()>0) Тогда
					ДЗ.Колонки.Вставить(нкв,ИмяКолонки,ОТ(МассивТипов[нк]),Заголовок);
				Иначе
					ДЗ.Колонки.Вставить(нкв,ИмяКолонки,,Заголовок);
				КонецЕсли;
				нкв = нкв + 1;
			Иначе
				Если (МассивТипов.Количество()>0) Тогда
					ДЗ.Колонки.Добавить(ИмяКолонки,ОТ(МассивТипов[нк]),Заголовок);
				Иначе
					ДЗ.Колонки.Добавить(ИмяКолонки,,Заголовок);
				КонецЕсли;
			КонецЕсли;
			Результат = Результат + 1;
		КонецЕсли;
		нк = нк + 1;
	КонецЦикла;
	Возврат Результат;
	
КонецФункции
Показать
7. moolex 905 15.07.26 17:16 Сейчас в теме
Функция ИсключитьКолонки(ДЗ,ИменаКолонок) Экспорт
	
	// исключить колонки в дереве значений или таблицы значений
	Результат = 0;
	МассивИмен = СтрРазделить(ИменаКолонок,",",0);
	Для Каждого ИмяКолонки Из МассивИмен Цикл
		Если (ДЗ.Колонки.Найти(ИмяКолонки)<>Неопределено) Тогда
			ДЗ.Колонки.Удалить(ИмяКолонки);
			Результат = Результат + 1;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;
	
КонецФункции
Показать
8. moolex 905 15.07.26 20:41 Сейчас в теме
Функция НайтиСсылки(ТипИмя,СтруктураФильтров=0) Экспорт
	
	// возвращает массив ссылок после выполнения запроса к базе данных по заданным фильтрам
	Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ "+ТипИмя);
	Если (СтруктураФильтров<>0) Тогда
		СтрДоп = "";
		СтрИ   = "";
		Для Каждого ЭС Из СтруктураФильтров Цикл
			СтрДоп = СтрДоп + СтрИ + "("+ЭС.Ключ+"=&"+ЭС.Ключ+")";
			Запрос.УстановитьПараметр(ЭС.Ключ,ЭС.Значение);
			СтрИ = "И";
		КонецЦикла;
		Если (ЗначениеЗаполнено(СтрДоп)) Тогда
			Запрос.Текст = Запрос.Текст + " ГДЕ " + СтрДоп;
		КонецЕсли;
	КонецЕсли;
	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	
КонецФункции
Показать
9. moolex 905 15.07.26 20:42 Сейчас в теме
Функция ЕстьВДанных(Данные,ВозможныеВарианты) Экспорт
	
	// проверяем, существует ли в данных любая подстрока из ВозможныеВарианты
	// варианты типа Данные: строка, массив строк, список значений строк
	// ВозможныеВарианты - строка имен, разделенных запятыми или массив строк
	
	Результат       = 0;
	МассивВариантов = 0;
	Если (ТипЗнч(ВозможныеВарианты)=Тип("Массив")) Тогда
		МассивВариантов = ВозможныеВарианты;
	Иначе
		МассивВариантов = СтрРазделить(ВозможныеВарианты,",");
	КонецЕсли;
	
	Если (ТипЗнч(Данные)=Тип("Строка")) Тогда
		Если (МассивВариантов.Найти(Данные)<>Неопределено) Тогда
			Результат = 1;
		КонецЕсли;
	ИначеЕсли (ТипЗнч(Данные)=Тип("Массив")) Тогда
		Для Каждого ЭМ Из Данные Цикл
			Если (МассивВариантов.Найти(ЭМ)<>Неопределено) Тогда
				Результат = 1;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	ИначеЕсли (ТипЗнч(Данные)=Тип("СписокЗначений")) Тогда
		Для Каждого ЭСЗ Из Данные Цикл
			Если (МассивВариантов.Найти(ЭСЗ.Значение)<>Неопределено) Тогда
				Результат = 1;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Возврат Результат;
	
КонецФункции
Показать
10. moolex 905 15.07.26 21:31 Сейчас в теме
Функция ЕстьСвойство(Объект, ИмяРеквизита) Экспорт
	
	// проверяем наличие реквизита или свойства у произвольного объекта без обращения к метаданным
	Результат          = 0;
	КлючУникальности   = Новый УникальныйИдентификатор;
	СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
	ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
	Если (СтруктураРеквизита[ИмяРеквизита]<>КлючУникальности) Тогда Результат = 1; КонецЕсли;
	Возврат Результат;
	
КонецФункции
Показать
11. moolex 905 15.07.26 21:31 Сейчас в теме
Функция СтрокаВДата(Стр) Экспорт
	
	// Возвращает дату из строки
	// возможные варианты: ДД.ММ.ГГГГ, ДД.ММ.ГГ, ДД/ММ/ГГГГ, ДД/ММ/ГГ, ГГГГММДД, ГГГГ-ММ-ДД, ДД.ММ.ГГГГ ЧЧ:мм:сс , ГГГГ, ГГГГ-ММ
	Результат = Дата(1,1,1);
	Если (ЗначениеЗаполнено(Стр)) Тогда
		Стр2 = СтрЗаменить(СокрЛП(Стр),"/",".");
		Если (Найти(Стр2,".")>0) Тогда
			Если (СтрДлина(Стр2)=10) Тогда
				Стр2 = Стр2 + " 00:00:00";
			ИначеЕсли (СтрДлина(Стр2)=8) Тогда // для ДД.ММ.ГГ
				Год  = Прав(Стр2,2);
				Стр3 = Лев(Стр2,6) + ?(Число(Год)<30,"20","19") + Год;
				Стр2 = Стр3 + " 00:00:00";
			КонецЕсли;	
			Попытка
				Результат = Дата(Стр2);
			Исключение
				Результат = Дата(1,1,1);
			КонецПопытки;
			
		Иначе
			// для варианта 2026-03-30 11:20:01
			Стр2 = СтрЗаменить(СокрЛП(Стр),"-","");
			Если (СтрДлина(Стр2)>14) Тогда
				Стр2 = ЗаменитьСимволы(СокрЛП(Стр2), ": ","");
			Иначе
				Если (СтрДлина(Стр2)<5)  Тогда Стр2 = Стр2 + "01";   КонецЕсли; // только год
				Если (СтрДлина(Стр2)<7)  Тогда Стр2 = Стр2 + "01";   КонецЕсли; // только год и месяц
				Если (СтрДлина(Стр2)=12) Тогда Стр2 = Стр2 + "00";   КонецЕсли; // год месяц день час минута
				Если (СтрДлина(Стр2)=10) Тогда Стр2 = Стр2 + "0000"; КонецЕсли; // год месяц день час
			КонецЕсли;
			Попытка
				Результат = Дата(Стр2);
			Исключение
				Результат = Дата(1,1,1);
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;
	Возврат Результат;
	
КонецФункции
Показать
12. moolex 905 15.07.26 21:32 Сейчас в теме
Функция ПолучитьМоментСозданияПоУИ1С(УИ1С) Экспорт
 
    Строка16    = Сред(УИ1С, 16, 3) + Сред(УИ1С, 10, 4) + Сред(УИ1С, 1, 8);
    Разрядность = СтрДлина(Строка16);
    ЧислоСек    = 0;
    Для Позиция = 1 По Разрядность Цикл
        ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка16,Позиция,1))*Pow(16,Разрядность - Позиция);
    КонецЦикла;
    ЧислоСек     = ЧислоСек / 10000000;
	СмещениеЧасы = (ТекущаяДата()-ТекущаяУниверсальнаяДата())/3600;
    Возврат Дата(1582, 10, 15, СмещениеЧасы, 00, 00) + ЧислоСек;

КонецФункции
Показать
13. moolex 905 15.07.26 21:33 Сейчас в теме
Функция ОбластьМакетаВТаблицу(Макет,ИмяОбласти,начать_со_строки=1) Экспорт
	
	// создает ТЗ и копирует область макета в ТЗ
	Область = Макет.ПолучитьОбласть(ИмяОбласти);
	ТЗ      = Новый ТаблицаЗначений;
	Для нк = 1 По Область.ШиринаТаблицы Цикл
		Если (начать_со_строки=2) Тогда
			ТЗ.Колонки.Добавить("Поле"+нк,,СокрЛП(Область.Область(1, нк, 1, нк).Текст));
		Иначе
			ТЗ.Колонки.Добавить("Поле"+нк);
		КонецЕсли;
	КонецЦикла;
	Для нс = начать_со_строки По Область.ВысотаТаблицы Цикл
		СТЗ = ТЗ.Добавить();
		Для нк = 1 По Область.ШиринаТаблицы Цикл
			СТЗ[нк-1] = СокрЛП(Область.Область(нс, нк, нс, нк).Текст);
		КонецЦикла;
	КонецЦикла;
	Возврат ТЗ;
	
КонецФункции
Показать
14. 9899100 10 15.07.26 22:10 Сейчас в теме
(13) а откорректировать публикацию - не? религия не позволяет?
15. moolex 905 16.07.26 07:53 Сейчас в теме
(14) в комментариях оказалось удобнее добавить.
А самое главное - удобнее потом комментировать отдельную функцию...
16. 9899100 10 16.07.26 08:58 Сейчас в теме
(15) Посмотрите оформление на этом примере https://infostart.ru/1c/articles/942569/
всё уже давно придумано :)
17. booksfill 17.07.26 11:19 Сейчас в теме
СтрокаВДата - я бы добавил возможность работы с Unix-время (UNIX TIMESTAMP) - частая задача при работе с внешним миром.

Строка типа "30.03.26 12:00:00" у вас (точнее у меня, может чего не заметил, но скопировал метод и проверил в консоли) превращается в 30.03.0026 12:00:00.

Зачем вообще понадобился велосипед, когда более продвинутый вариант есть в СтроковыеФункцииКлиентСервер от БСП?
Там не реализован тот же UNIX TIMESTAMP, ну так и проверяйте только это + на экзотические хотелки, а для остального вызывайте метод из БСП, он все же более оттестирован.

Вот решил спросить ИИ, он рекомендует еще реализовать:
Полный стандарт ISO 8601 / RFC 3339 (с буквой T), Формат RFC 1123 / RFC 822, который используется во всех веб-серверах и электронных письмах: Mon, 30 Mar 2026 12:00:00 GMT,
Даты с текстовыми названиями месяцев на русском - 30 марта 2026 г.

От себя рекомендовал бы возможность передачи локали, чтобы иметь возможность работы, например, с 03/25/2026 (США). Оченно полезно, например, если разбирать HTML странички.
18. Yashazz 4930 17.07.26 13:04 Сейчас в теме
- Есть 14 разных стандартов, настало время сделать единый для всех, и мы его сделаем!
Спустя полгода:
- Теперь есть 15 разных стандартов...

Автор, у каждого из опытных разработчиков уже накоплена своя такая библиотека. И каждый на определённом этапе изобретает свой велосипед и открывает свою америку, радостно публикуя подобное. Нормальный этап, многие проходили) И поверьте, 95% продолжат пользоваться своим, а не взять ваше. Ну разве что БЯМ стащат отсюда да начнут подсовывать пионэрам)))

Пресловутая БСП и типовые конфы, кстати, тоже грешат незнанием собственных возможностей. Многократно встречал велосипеды в типовых, при наличии готовых; встречал дубли этих "готовых единых", но с "маааленькими различиями". Тоже, как был слабо упорядоченный хаос, так и есть.
20. PCUser 17.07.26 15:00 Сейчас в теме
Здравствуйте у меня ошибки по ЗаменитьСимволы() ПредставлениеИмени() ВернутьЧастьСлева() ВернутьЧастьСправа() и самое главное по ОТ(). Возможно я чего то не знаю но у меня таких функций нет
22. moolex 905 17.07.26 22:17 Сейчас в теме
(20)
Функция ВернутьЧастьСлева(Стр,Разделитель="=") Экспорт
	
	// Возвращает левую часть конструкции Свойство=Значение
	Результат = "";
	поз = Найти(Стр,Разделитель);
	Если (поз>1) Тогда
		Результат = Лев(Стр,поз-1);
	КонецЕсли;
	Возврат Результат;
	
КонецФункции

Функция ВернутьЧастьСправа(Стр,Разделитель="=") Экспорт
	
	// Возвращает правую часть конструкции Свойство=Значение
	Результат = "";
	поз = Найти(Стр,Разделитель);
	Если (поз>0) Тогда
		Результат = Прав(Стр,СтрДлина(Стр)-поз-СтрДлина(Разделитель)+1);
	КонецЕсли;
	Возврат Результат;
	
КонецФункции

Функция ПредставлениеИмени(ИмяПеременной) Экспорт
	
    ИмяПеременной2 = СокрЛП(ИмяПеременной);
	Если (ИмяПеременной2="_") Тогда Возврат ""; КонецЕсли;
	Длина          = СтрДлина(ИмяПеременной2);
	Если (Длина<4) Тогда Возврат ИмяПеременной2; КонецЕсли;
	Результат      = Лев(ИмяПеременной, 1);
	Цифры          = "0123456789";
	Для н = 2 По Длина Цикл
		Буква = Сред(ИмяПеременной, н, 1);
		Если (Буква<>НРег(Буква))ИЛИ(Найти(Цифры,Буква)>0) Тогда
			Результат = Результат + " " + НРег(Буква);
		Иначе
			Результат = Результат + Буква;
		КонецЕсли;
    КонецЦикла;
    Результат = СтрЗаменить(Результат, "_", " ");
    Возврат Результат;
	
КонецФункции

Функция ОТ(ТипСтрокой) Экспорт
	
	// Возвращает описание типов из строки
	// ТипСтрокой - например "Число.19.2","Строка.10","Строка","Дата","Момент","Массив"

    Результат = Неопределено;
	Если (ТипСтрокой="Строка") Тогда
		Результат = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(0,ДопустимаяДлина.Переменная));
	ИначеЕсли (ТипСтрокой="Дата") Тогда
		Результат = Новый ОписаниеТипов("Дата",,Новый КвалификаторыДаты(ЧастиДаты.Дата));
	ИначеЕсли (ТипСтрокой="ДатаВремя")ИЛИ(ТипСтрокой="Момент") Тогда
		Результат = Новый ОписаниеТипов("Дата",,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя));
	ИначеЕсли (Найти(ТипСтрокой,"Строка.")=1) Тогда
		Длина     = Число(ВернутьЧастьСправа(ТипСтрокой,"."));
		Результат = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(Длина,ДопустимаяДлина.Переменная));
	ИначеЕсли (Найти(ТипСтрокой,"Число")=1) Тогда
		М = СтрРазделить(ТипСтрокой,".");
		Длина    = 19;
		Точность = 0;
		Если (М.Количество()>1) Тогда Длина = Число(М[1]);КонецЕсли;
		Если (М.Количество()>2) Тогда Точность = Число(М[2]);КонецЕсли;
		Результат = Новый ОписаниеТипов("Число",,Новый КвалификаторыЧисла(Длина,Точность,ДопустимыйЗнак.Любой));
		
	ИначеЕсли (Найти(ТипСтрокой,",")>0) Тогда // составной тип
		Массив = Новый Массив;
		М1     = СтрРазделить(ТипСтрокой,",");
		Для Каждого ЭМ Из М1 Цикл
			Массив.Добавить(ОТ(ЭМ));
        КонецЦикла;
		Результат = Новый ОписаниеТипов(Массив);
		
	ИначеЕсли (ТипСтрокой="Справочник")             Тогда Результат = Справочники.ТипВсеСсылки();
	ИначеЕсли (ТипСтрокой="Документ")               Тогда Результат = Документы.ТипВсеСсылки();
	ИначеЕсли (ТипСтрокой="Перечисление")           Тогда Результат = Перечисления.ТипВсеСсылки();
	ИначеЕсли (ТипСтрокой="ПланСчетов")             Тогда Результат = ПланыСчетов.ТипВсеСсылки();
	ИначеЕсли (ТипСтрокой="ПланВидовХарактеристик") Тогда Результат = ПланыВидовХарактеристик.ТипВсеСсылки();
	ИначеЕсли (ТипСтрокой="ПланВидовРасчета")       Тогда Результат = ПланыВидовРасчета.ТипВсеСсылки();
	ИначеЕсли (ТипСтрокой="ПланОбмена")             Тогда Результат = ПланыОбмена.ТипВсеСсылки();
	ИначеЕсли (ТипСтрокой="Задача")                 Тогда Результат = Задачи.ТипВсеСсылки();
	ИначеЕсли (ТипСтрокой="БизнесПроцесс")          Тогда Результат = БизнесПроцессы.ТипВсеСсылки();
		
	ИначеЕсли (ТипСтрокой="ТочкаМаршрутаБизнесПроцесса") Тогда
		Массив = Новый Массив;
		Для Каждого Мета Из Метаданные.БизнесПроцессы Цикл
			Массив.Добавить(Тип("ТочкаМаршрутаБизнесПроцессаСсылка."+Мета.Имя));
		КонецЦикла;
		Результат =	Новый ОписаниеТипов(Массив);
		
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"Справочник"))   Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"Справочник.","СправочникСсылка."));
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"Документ"))     Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"Документ.","ДокументСсылка."));
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"Перечисление")) Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"Перечисление.","ПеречислениеСсылка."));
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"ПланСчетов"))   Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"ПланСчетов.","ПланСчетовСсылка."));
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"ПланВидовХарактеристик")) Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"ПланВидовХарактеристик.","ПланВидовХарактеристикСсылка."));
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"ПланВидовРасчета")) Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"ПланВидовРасчета.","ПланВидовРасчетаСсылка."));
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"ПланОбмена"))       Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"ПланОбмена.","ПланОбменаСсылка."));
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"Задача"))           Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"Задача.","ЗадачаСсылка."));
	ИначеЕсли (СтрНачинаетсяС(ТипСтрокой,"БизнесПроцесс"))    Тогда Результат = Новый ОписаниеТипов(СтрЗаменить(ТипСтрокой,"БизнесПроцесс.","БизнесПроцессСсылка."));

	Иначе // Массив,Булево, СписокЗначений и т.п.
		Результат = Новый ОписаниеТипов(ТипСтрокой);
	КонецЕсли;
	Возврат Результат;
	
КонецФункции

Показать
23. moolex 905 17.07.26 22:18 Сейчас в теме
Функция ЗаменитьСимволы(Стр, СтрСимволы, СтрНовыйСимвол) Экспорт
	
	Результат = Стр;
	д         = СтрДлина(СтрСимволы);
	Для н=1 По д Цикл
		Результат = СтрЗаменить(Результат, Сред(СтрСимволы, н, 1), СтрНовыйСимвол);
	КонецЦикла;
	Возврат Результат;
	
КонецФункции
Показать
21. gybson 13 17.07.26 22:00 Сейчас в теме
Как на ровном месте создать когнитивную сложность и множить её.
user_2194436; +1 Ответить
24. moolex 905 17.07.26 22:29 Сейчас в теме
В процессе создания и правки публикации забыл написать самое главное:
Все упомянутые экспортные функции входят в поставку расширения ВнешнийРегламент.cfe
(в общем серверном модуле ВнешнийРегламент)
Для отправки сообщения требуется регистрация/авторизация