arefaste/1C_Forums huggingface dataset:
Заполнение "пустых" строк табличной части
Теги: 1С,ТаблицаЗначений,Форма,Таблица значений,Массив

Данный алгоритм предназначен для заполнения строк табличной части элементами по условию пустоты. 
Если в табличной части существуют "пустые записи" ( в данном примере строки в колонках которых значение не заполнено), то они заполнятся при выборе из формы. Например строки с номерами 2, 5, 12 не заполнены. При пользовательском выборе элементов, значения вставятся соответственно в 2, 5, 12. А не в конец списка.
С точки зрения клиент-сервер, алгоритм не совсем оптимизирован, но достаточно универсален.

# Код реализации

```1c
&НаКлиенте
Процедура Подбор(Команда)

	ПараметрыФормы = Новый Структура("МножественныйВыбор, ЗакрыватьПриВыборе",Истина,Ложь);
	ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",ПараметрыФормы,Элементы.ТаблицаЗначений);
	// реквизиты:
	//Таблица значение - ТаблицаЗначений ( Одна колонка "Материал" )
	//Команда - " Подбор "

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

&НаКлиенте
Функция ПоискПустыхСтрок(Таблица,КоличествоЗначений)

	МассивПустыхСтрок = Новый Массив(); // В данном массиве будут храниться индексы пустых записей
	СчетчикПустых = 0;

	Для Каждого Строка Из Таблица Цикл
		Если  (НЕ ЗначениеЗаполнено(Строка.Материал)) И (СчетчикПустых<КоличествоЗначений)  Тогда  // Проверяем на заполненность значение в колонке (текущей строки) в цикле И проверяем нужно ли дальше идти по циклу, ведь нам нужно лишь определенное кол пустых строк
			СчетчикПустых = СчетчикПустых+1;
			МассивПустыхСтрок.Добавить(Таблица.Индекс(Строка)); // Если значение в определенной колонке "пустое", то добавляем в массив  - индекс текущей строки в цикле
		ИначеЕсли СчетчикПустых=КоличествоЗначений Тогда // Если кол пустых строк и кол значений введенных пользователем равно, то выходим из цикла и не ищем дополнительные пустые строки
			Возврат МассивПустыхСтрок;
		КонецЕсли;
	КонецЦикла;

	Возврат МассивПустыхСтрок;

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

&НаКлиенте
Процедура ТаблицаЗначенийОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	МассивПустыхСтрок = ПоискПустыхСтрок(ТаблицаЗначений,ВыбранноеЗначение.Количество()); // передаем саму таблицу, а также Кол выбранных элементов для того, чтобы не искать все пустые строки, а лишь определенное кол

	Для Индекс = 0 По ВыбранноеЗначение.ВГраница() Цикл
		Если Индекс < МассивПустыхСтрок.Количество() Тогда // Если выбранных значений меньше, чем пустых строк, то ..., иначе, исключительный случай, когда все пустые строки заполнились
			Строка = ТаблицаЗначений.Вставить(МассивПустыхСтрок[Индекс]); // Вставляем запись вместо пустой, вытесняя пустую запись вниз ( увеличиваем индекс пустой записи на 1, так как работает функция ВСТАВИТЬ() )
			Строка.Материал = ВыбранноеЗначение[Индекс]; // Заполняем реквизит табличной части выбранным значением
			ТаблицаЗначений.Удалить(МассивПустыхСтрок[Индекс]+1); // Удаляем пустую запись, которая ниже добавленной на 1
		Иначе
			Строка = ТаблицаЗначений.Добавить(); // Тот самый случай, когда кол выбранных записей больше, чем пустых строк. В этом случаи  добавляем записи в конец табличной части
			Строка.Материал = ВыбранноеЗначение[Индекс];
		КонецЕсли;
	КонецЦикла;


КонецПроцедуры
```
Получить дату из строки формата YYYY-MM-DDThh:mm:ss ISO 8601
Теги: 1С

# Код реализации

```1c
Функция ПолучитьДатуВеб(СтрДата)

	Рез = Дата(1,1,1);

	//2018-03-19T23:59:59
	СтрГод = Сред(СтрДата, 1, 4);
	СтрМесяц = Сред(СтрДата, 6, 2);
	СтрЧисло = Сред(СтрДата, 9, 2);
	СтрЧас = Сред(СтрДата, 12, 2);
	СтрМинута = Сред(СтрДата, 15, 2);
	СтрСекунда = Сред(СтрДата, 18, 2);

	Попытка
		Рез = Дата(Число(СтрГод), Число(СтрМесяц), Число(СтрЧисло), Число(СтрЧас), Число(СтрМинута), Число(СтрСекунда));
	Исключение
	КонецПопытки;

	Возврат Рез;

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

# Примечания

- Дата = XMLЗначение(Тип("Дата"), "2018-03-19T23:59:59");
Найти с/ф полученный
Теги: 1С,БП30,БП3

Ищет счет-фактура полученный

# Код реализации

```1c
Функция НайтиСФПолученный(ДокументОснование) Экспорт

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

	Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);
	ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
	Если ВыборкаЗапроса.Следующий() Тогда
		Рез = ВыборкаЗапроса.Ссылка;
	КонецЕсли;

	Возврат Рез;

КонецФункции
```
Найти с/ф выданный
Теги: 1С,БП30,БП3

Ищет счет-фактура выданный

# Код реализации

```1c
Функция НайтиСФВыданный(ДокументОснование) Экспорт

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

	Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);
	ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
	Если ВыборкаЗапроса.Следующий() Тогда
		Рез = ВыборкаЗапроса.Ссылка;
	КонецЕсли;

	Возврат Рез;

КонецФункции
```
Строка в дату по форматной строке
Теги: 1С,Формат,Дата,Строка

Преобразование строки в дату по форматной строке

# Код реализации

```1c
Функция СтрокаВДату(ФорматДаты, Дано, Ошибка = Ложь)

	Попытка

		ТестоваяДата = Формат('00010101', "ДФ=" + ФорматДаты); // — необязательная проверка первого правильности параметра

	Исключение

		Ошибка = Истина;
		Возврат '00010101';

	КонецПопытки;

	СтруктураДаты = Новый Соответствие;

	Для Счетчик = 1 По СтрДлина(ФорматДаты) + 7 Цикл

		СтруктураДаты[Сред(ФорматДаты + "dMyHhms", Счетчик, 1)] = 0; // — инициализация частей даты

	КонецЦикла;

	Для Счетчик = 1 По 12 Цикл

		Дано = СтрЗаменить(Дано, Формат(Дата(1, Счетчик, 1), "ДФ=MMММ"), Формат(Счетчик, "ЧЦ=4; ЧВН=")); // — замена названий месяцев числами
		Дано = СтрЗаменить(Дано, Формат(Дата(1, Счетчик, 1), "ДФ=MMМ" ), Формат(Счетчик, "ЧЦ=3; ЧВН="));

	КонецЦикла;

	Для Счетчик = 1 По СтрДлина(ФорматДаты) Цикл

		СтруктураДаты[Сред(ФорматДаты, Счетчик, 1)] = 10 * СтруктураДаты[Сред(ФорматДаты, Счетчик, 1)] + Найти("123456789", Сред(Дано, Счетчик, 1)); // — накопление частей даты
		Ошибка = Ошибка ИЛИ Найти("dMyHhms", Сред(ФорматДаты, Счетчик, 1)) И НЕ Найти("0123456789", Сред(Дано, Счетчик, 1)); // — необязательная проверка на цифры

	КонецЦикла;

	СтруктураДаты["y"] = СтруктураДаты["y"] + ?(СтруктураДаты["y"] < 50, 2000, ?(СтруктураДаты["y"] < 100, 1900, 0)); // — дополнение двух цифр года до четырех

	Попытка

		Возврат Дата(СтруктураДаты["y"], СтруктураДаты["M"], СтруктураДаты["d"], СтруктураДаты["H"] + СтруктураДаты["h"], СтруктураДаты["m"], СтруктураДаты["s"])

	Исключение

		Ошибка = Истина;
		Возврат '00010101';

	КонецПопытки;

КонецФункции
```
Добавить договор
Теги: 1С,БП3

# Код реализации

```1c
&НаСервере
Функция СоздатьОсновнойДоговор(Организация, Контрагент, ВидДоговора, СделатьОсновным=Ложь)

	НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
	НовыйДоговор.Организация = Организация;
	НовыйДоговор.Владелец = Контрагент;
	НовыйДоговор.ВидДоговора = ВидДоговора;
	НовыйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить();
	НовыйДоговор.Наименование = ВидДоговора;

	Попытка
		НовыйДоговор.Записать();
	Исключение
		ТекстОшибки = СтрШаблон("Не удалось сохранить новый договор для контрагента %1 по виду договора %2 для организации %3", Контрагент, ВидДоговора, Организация);
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
		Возврат Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
	КонецПопытки;

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

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

	Возврат НовыйДоговор.Ссылка;
КонецФункции
```
Отключение (DETACH) баз MS SQL с отбором по вхождению в имя
Теги: 1С,DB,MSSQL,Администрирование,DETACH,SQL

# Код реализации

```1c
```
/*******************************************************
 Отключение (DETACH) баз MS SQL с отбором по вхождению в имя
*******************************************************/

DECLARE @SQL VARCHAR(max)  = ''

DECLARE @StrNewLine CHAR
SET @StrNewLine = CHAR(10) + CHAR(13)

SELECT
	@SQL += 'alter database ['+ name + '] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE' + '' + @StrNewLine
	--+ 'GO' + @StrNewLine
	+ 'EXEC master.dbo.sp_detach_db @dbname = '+ name + ';' + @StrNewLine

from master.sys.databases AS SysDB
WHERE SysDB.name LIKE 'tvs_%'

PRINT @SQL
EXEC (@SQL)
```
```
Заполнить счета учета
Теги: 1С,БП3

Заполнение счетов учета в табличных частях и шапке документа "Поступление товаров и услуг", но подойдет и для других видов документа

# Код реализации

```1c
Документы.ПоступлениеТоваровУслуг.ЗаполнитьСчетаУчетаВТабличнойЧасти(ДокОб, "Товары");
Документы.ПоступлениеТоваровУслуг.ЗаполнитьСчетаУчетаВТабличнойЧасти(ДокОб, "Услуги");
Документы.ПоступлениеТоваровУслуг.ЗаполнитьСчетаУчетаРасчетов(ДокОб);

// Для детального разбора используем
СчетаУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаУчетаНоменклатуры(Организация, Номенклатура, Склад);
```

# Примечания

- В КД2 просто "палочка-выручалочка"
Проверка, есть ли ключ у соответствия
Теги: 1С,Соответствие

# Код реализации

```1c
Функция ЕстьКлючСоответствия(Объект, Ключ) Экспорт
  Если Объект[Ключ] <> Неопределено Тогда
    Возврат Истина;
  КонецЕсли;
  До = Объект.Количество();
  Объект.Вставить(Ключ);
  После = Объект.Количество();
  Если До <> После Тогда
    Объект.Удалить(Ключ);
  КонецЕсли;
  Возврат До = После;
КонецФункции
```

# Примечания

- А для чего вставка и проверка количества? Вхождение же уже проверили на этапе получения ключа?

- (1) Ruizave, на тот случай, если ключ в соответствии есть, но содержит значение Неопределено.
Таблица значений в табличный документ
Теги: 1С,ТаблицаЗначений,ТабличныйДокумент

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

# Код реализации

```1c
// Получить табличный документ на основании таблицы значений
//
// Параметры:
//  Таблица - ТаблицаЗначений
//
// Возвращаемое значение:
//  ТабличныйДокумент
//
&НаСервере
Функция ПолучитьТабличныйДокумент(Таблица)
    ТабДокумент = Новый ТабличныйДокумент;

    // Выводим заголовок таблицы
    КолонкаИндекс = 0;
    Пока КолонкаИндекс < Таблица.Колонки.Количество() Цикл
        Колонка = Таблица.Колонки[КолонкаИндекс];
		ОбластьКолонки = ТабДокумент.Область(1, КолонкаИндекс + 1, 1, КолонкаИндекс + 1);
		Если ПустаяСтрока(Колонка.Заголовок) Тогда
			ОбластьКолонки.Текст = Колонка.Имя;
		Иначе
			ОбластьКолонки.Текст = Колонка.Заголовок;
		КонецЕсли;
		ОбластьКолонки.ШиринаКолонки = Колонка.Ширина;
        КолонкаИндекс = КолонкаИндекс + 1;
    КонецЦикла;

    // Выводим строки таблицы
    СтрокаИндекс = 0;
    Пока СтрокаИндекс < Таблица.Количество() Цикл
        Таблица_Строка = Таблица[СтрокаИндекс];
        КолонкаИндекс = 0;
        Пока КолонкаИндекс < Таблица.Колонки.Количество() Цикл
            Колонка = Таблица.Колонки[КолонкаИндекс];
            ТабДокумент.Область(СтрокаИндекс + 2, КолонкаИндекс + 1, СтрокаИндекс + 2, КолонкаИндекс + 1).Текст = Таблица_Строка[Колонка.Имя];  // + 2, т.к. в первой строке выведен заголовок
            КолонкаИндекс = КолонкаИндекс + 1;
        КонецЦикла;
        СтрокаИндекс = СтрокаИндекс + 1;
    КонецЦикла;

    Возврат ТабДокумент;
КонецФункции
```
Выгрузка Таблицы значений в Объект Таблица Значений на форме обработки (для передачи сервер - клиент)
Теги: 1С,ТаблицаЗначений,Запрос

Передача данных из Таблицы значений на сервере в объект Таблица значений на обработке.

# Код реализации

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

	//создаем ТаблицуЗначений ТЗ
	ТЗ=новый ТаблицаЗначений;
	//Выгружаем Результат Запроса в Таблицу Значений ТЗ
	ТЗ=запрос.Выполнить().Выгрузить();
	//создаем ТаблицуЗначений ТЗрез
	ТЗрез=новый ТаблицаЗначений;
	//в ТаблицуЗначений ТЗрез выгружаем данные с формы
	ТЗрез=данныеформывзначение(Объект.Результат,Тип("ТаблицаЗначений"));
	//В ТаблицуЗначений ТЗрез сохраняем ТЗ
	ТЗрез=ТЗ;
	//Записываем значения Таблицы ТЗрез в объект на форме.
	ЗначениеВданныеФормы(ТЗрез,объект.Результат);

	//данныевреквизитформы(Тзрез,"Результат0");

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

# Примечания

- Подскажите, а что мешало сделать так:
Объект.Результат.Загрузить(Запрос.Выполнить().Выгрузить());?

- Почему не сделать
ЗначениеВданныеФормы(запрос.Выполнить().Выгрузить(),объект.Результат);?
Заполнить параметры запроса из структуры
Теги: 1С,v8,Запрос

Кусок кода с заполнением параметров запроса из структуры с именами полей равных именам параметров.
Позволяет заполнять запроса с неизвестным составом параметров из структуры, где добавлены все возможные параметры

# Код реализации

```1c
//пПараметрыЗапроса - структура с данными для запроса
ПараметрыЗапроса=Запрос.НайтиПараметры();
Для Каждого ПараметрЗапроса Из пПараметрыЗапроса Цикл
	Если ПараметрыЗапроса.Найти(ПараметрЗапроса.Ключ)<>Неопределено Тогда
		Запрос.УстановитьПараметр(ПараметрЗапроса.Ключ, ПараметрЗапроса.Значение)
	КонецЕсли
КонецЦикла;
```
Проверка заполненности полей объекта и возврат статуса + незаполненных полей
Теги: 1С,ПустаяДата,Пустая ссылка,ЗначениеЗаполнено,Реквизиты,Поля,ПустаяСтрока

Проверяет поля объекта через ЗначениеЗаполнено(), возвращает структуру с полями:
Результат - Булево - = Истина, когда заполнены все поля, = Ложь когда есть не заполненные поля.
НеЗаполненныеПоля  - Строка - не заполненные поля через запятую

# Код реализации

```1c
#Область ПроверкаЗаполненностиПолей
Функция ПроверкаЗаполненностиРеквизитовОбъекта(ОбъектПроверки, ПоляПроверкиШапки = "Дата, Номер", ПоляПроверкиТЧ = "Номенклатура, Количество", ИмяТЧ = "Товары") Экспорт
    НеЗаполненныеПоля = "";
    Результат         = Ложь;

    РезультатПроверкиШапки = ПоляЗаполнены(ОбъектПроверки, ПоляПроверкиШапки);
    РезультатПроверкиТЧ    = ПоляЗаполнены(ОбъектПроверки[ИмяТЧ], ПоляПроверкиТЧ);

    Результат = ?(РезультатПроверкиШапки = Ложь Или РезультатПроверкиТЧ = Ложь, Ложь, Истина);

    Возврат Новый Структура("Результат, НеЗаполненныеПоля", Результат, НеЗаполненныеПоля);
КонецФункции

Функция ПоляЗаполнены(ОбъектПроверки, ПоляПроверки, НеЗаполненныеПоля = "") Экспорт

    Результат = Истина;

    ПоляПроверкиМассив = СтрРазделить(ПоляПроверки, ",", Ложь);
    Для Каждого Поле Из ПоляПроверкиМассив Цикл
        Поле         = СокрЛП(Поле);
        ЗначениеПоля = ОбъектПроверки[Поле];

        Если ЗначениеЗаполнено(ЗначениеПоля) Тогда
            Продолжить;
        КонецЕсли;

        Результат = Ложь;
        НеЗаполненныеПоля = ?(НеЗаполненныеПоля = "", "", ", ") + Поле;
    КонецЦикла;

    Возврат Результат;
КонецФункции
#КонецОбласти
```
Реквизиты Объекта в Структуру
Теги: 1С,v8,Структура

Вернуть реквизиты объекта в виде структуры
Ключ (Имя) - Значение

# Код реализации

```1c
&НаСервере
Функция РеквизитыОбъектаВСтруктуру()

	Результат = Новый Структура;

	ДанныеОбъекта = РеквизитФормыВЗначение("Объект");
	МДОбъекта = ДанныеОбъекта.Метаданные();

	Для Каждого ТекРеквизит Из МДОбъекта.Реквизиты Цикл
		Результат.Вставить(ТекРеквизит.Имя, ДанныеОбъекта[ТекРеквизит.Имя])
	КонецЦикла;

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

КонецФункции
```
Проверка типа данных на принадлежность к ссылочным типам
Теги: 1С

Проверяет тип (ОписаниеТипов) на принадлежность к ссылочным - может понадобиться при Сериализации/Десериализации данных для ИБ с различной структурой

# Код реализации

```1c
Функция ЭтоТипСсылка(ТипДанных, ВсеТипыСсылок = Неопределено) Экспорт
    Результат = Ложь;

    Если ВсеТипыСсылок = Неопределено Тогда
        ВсеТипыСсылок = ОписаниеТипаВсеСсылки();
    КонецЕсли;

    Если ТипЗнч(ТипДанных) = Тип("ОписаниеТипов") Тогда
        ТипыВнутри = ТипДанных.Типы();
        Для каждого Тип Из ТипыВнутри Цикл
            Если ВсеТипыСсылок.СодержитТип(Тип) Тогда
                Результат = Истина;
            КонецЕсли;
        КонецЦикла;
    Иначе
        Если ВсеТипыСсылок.СодержитТип(ТипДанных) Тогда
            Результат = Истина;
        КонецЕсли;
    КонецЕсли;

    Возврат Результат;
КонецФункции
```
Создать Таблицу значений со структурой по данным источника
Теги: 1С,ТаблицаЗначений

Создает таблицу значений со структурой колонок по данным источника. Есть возможность исключить ссылочные типы из обработки.
Может обрабатывать типы РезультатЗапроса, ТаблицаЗначений, ВременнаяТаблицаЗапроса

# Код реализации

```1c
Функция ПустаяТаблицаЗначенийПоКолонкамИсточника(Данные, ДобавлятьСсылочныеТипы = Истина) Экспорт
    Перем ВсеТипыСсылок; //для кэширования

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

    Результат = Новый ТаблицаЗначений;
    КолонкиТЗ = Результат.Колонки;

    Для Каждого ТекущаяКолонкаЗапроса Из КолонкиЗапроса Цикл
        Если ДобавлятьСсылочныеТипы = Ложь Тогда
            Если ЭтоТипСсылка(ТекущаяКолонкаЗапроса.ТипЗначения, ВсеТипыСсылок) Тогда
                Продолжить;
            КонецЕсли;
        КонецЕсли;

        НоваяКолонкаТЗ = КолонкиТЗ.Добавить(ТекущаяКолонкаЗапроса.Имя, ТекущаяКолонкаЗапроса.ТипЗначения);
        ЗаполнитьЗначенияСвойств(НоваяКолонкаТЗ, ТекущаяКолонкаЗапроса);
    КонецЦикла;

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

Функция ЭтоТипСсылка(ТипДанных, ВсеТипыСсылок = Неопределено) Экспорт
    Результат = Ложь;

    Если ВсеТипыСсылок = Неопределено Тогда
        ВсеТипыСсылок = ОписаниеТипаВсеСсылки();
    КонецЕсли;

    Если ТипЗнч(ТипДанных) = Тип("ОписаниеТипов") Тогда
        ТипыВнутри = ТипДанных.Типы();
        Для каждого Тип Из ТипыВнутри Цикл
            Если ВсеТипыСсылок.СодержитТип(Тип) Тогда
                Результат = Истина;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

    Возврат Результат;
КонецФункции
```
Универсальные процедуры для работы с логами
Теги: 1С,логи,конкатенация,строковые переменные

Эти процедуры требуются для безболезненных изменений в коде при переходах от строк к массивам строк и обратно и поддержки старых реализаций. Кроме того позволяет изменять вывод лога добавляя в него строки дат, префиксы и др. оформление
добавляет к логу данные, действуя в зависимости от типа (строка или массив). оформляет добавляемые строки лога как заголовок

# Код реализации

```1c
#Область Логирование
// Процедура - Добавляет к логу данные действуя в зависимости от типа (строка или массив)
//
// Параметры:
//  Лог         - Массив, Строка - Лог
//  Данные     - Строка - Данные для добавления
//
Процедура ДобавитьВЛог(Лог, Данные) Экспорт
    Если ТипЗнч(Лог) = Тип("Строка") Тогда
        Лог = Лог + ?(Лог = "", "", Символы.ПС) + Данные;
    ИначеЕсли ТипЗнч(Лог) = Тип("Массив") Тогда
        Лог.Добавить(Данные);
    ИначеЕсли ТипЗнч(Лог) = Тип("ТекстовыйДокумент") Тогда
        лог.ДобавитьСтроку(Данные);
    ИначеЕсли ТипЗнч(Лог) = Тип("Неопределено") Тогда //по умолчанию лог это массив
        Лог = Новый Массив;
        Лог.Добавить(Данные);
    КонецЕсли;
КонецПроцедуры

Процедура ДобавитьВЛогЗаголовок(Лог, Данные) Экспорт

    РазделительЛога = "--------------------------------------------------------------------------";
    Если ТипЗнч(Лог) = Тип("Массив")  Тогда
        СтрокВЛоге = Лог.Количество();

        Если СтрокВЛоге > 0 Тогда
            ПоследняяСтрокаЛога = Лог.Получить(СтрокВЛоге - 1);
            Если РазделительЛога <> ПоследняяСтрокаЛога Тогда
                ДобавитьВЛог(Лог, РазделительЛога);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;

    ДобавитьВЛог(Лог, Данные);
    ДобавитьВЛог(Лог, РазделительЛога);
КонецПроцедуры
#КонецОбласти

//быстрая запись в строку из массива для большого объема строк
Функция МассивСтрокВСтроку(Строки) Экспорт

    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    Для Каждого ТекущаяСтрока Из Строки Цикл
        Запись.ЗаписатьБезОбработки(ТекущаяСтрока + Символы.ПС);

    КонецЦикла;

    Возврат Запись.Закрыть();
КонецФункции

Функция ЛогСтрокой(Лог) Экспорт

    Если ТипЗнч(Лог) = Тип("ТекстовыйДокумент") Тогда
        Лог.ПолучитьТекст();
    ИначеЕсли ТипЗнч(Лог) = Тип("Массив") Тогда
        Результат = МассивСтрокВСтроку(Лог);
    ИначеЕсли ТипЗнч(Лог) = Тип("Строка") Тогда
        Результат = Лог;
    КонецЕсли;

    Возврат Результат;
КонецФункции
```
Очистка номера телефона от "мусора" (нецифровых символов)
Теги: 1С,Минимализмы,Задачи

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

В платформе 8.3.6 появились функции СтрРазделить и СтрСоединить, которые позволяют решить эту задачу в одну строку без цикла:

# Код реализации

```1c
СтрСоединить(СтрРазделить(СтрокаСЦифрами, СтрСоединить(СтрРазделить(СтрокаСЦифрами, "0123456789"))))

// Если список ненужных символов известен, например, "(", ")" и "-", то выражение может быть еще короче:

СтрСоединить(СтрРазделить(СтрокаСЦифрами, "()-"))
```

# Примечания

- СтрСоединить СтрРазделить СтрСоединить СтрРазделить СтрСоединить СтрРазделить СтрСоединить СтрРазделить
СтрРазделить СтрСоединить СтрРазделить СтрСоединить

- (1) Farovsky, первый СтрРазделить получает все символы "не цифры", потом соединяем, и опять разделяем исходный номер, только уже этими полученными символами. И затем снова соединяем для получения результата.

- Оформил в виде отдельной функции
//Функция очищает номер телефона от нецифровых символов
Функция ОчиститьНомер(Номер, ОчищаемыеСимволы = "") Экспорт
	
	Если ПустаяСтрока(ОчищаемыеСимволы) Тогда
		
		Возврат СтрСоединить(СтрРазделить(Номер, СтрСоединить(СтрРазделить(Номер, "0123456789"))));
		
	КонецЕсли;
	
	Возврат СтрСоединить(СтрРазделить(Номер, ОчищаемыеСимволы))	
	
КонецФункции