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

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

Найти с/ф полученный

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

Найти с/ф выданный

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

OneTracker - трекер учета рабочего времени программиста 1С Промо

Программа автоматически замеряет время работы разработчика с 1С в режиме Конфигуратора или Предприятия. Учет ведется в разрезах задач, информационных баз или объектов конфигураций.
990 руб.

Строка в дату по форматной строке

Преобразование строки в дату по форматной строке
Функция СтрокаВДату(ФорматДаты, Дано, Ошибка = Ложь)
	
	Попытка
		
		ТестоваяДата = Формат('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';
		
	КонецПопытки;
	
КонецФункции

Цвет текста только что выведенной области табличного документа

ОбластьОформления = ТабДок.Вывести(ОбластьСтрокаТаб);
ОбластьОформления.ЦветТекста = WebЦвета.Красный;

Добавить договор

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

Найти основной договор

&НаСервере
Функция ПолучитьОсновнойДоговор(Организация, Контрагент, ВидДоговора)
	
	Рез = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	ОсновныеДоговорыКонтрагента.Договор КАК Договор
		|ИЗ
		|	РегистрСведений.ОсновныеДоговорыКонтрагента КАК ОсновныеДоговорыКонтрагента
		|ГДЕ
		|	ОсновныеДоговорыКонтрагента.Организация = &Организация
		|	И ОсновныеДоговорыКонтрагента.Контрагент = &Контрагент
		|	И ОсновныеДоговорыКонтрагента.ВидДоговора = &ВидДоговора";
	
	Запрос.УстановитьПараметр("ВидДоговора", ВидДоговора);
	Запрос.УстановитьПараметр("Контрагент", Контрагент);
	Запрос.УстановитьПараметр("Организация", Организация);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
		Рез = ВыборкаДетальныеЗаписи.Договор;
	КонецЕсли;
	
	//если основной договор не отмечен, то поищем среди всех договоров и если по данному виду он один и непомеченный на удаление, то возьмем его
	
	Если Рез.Пустая() Тогда
		Запрос.Текст = 
			"ВЫБРАТЬ
			|	МАКСИМУМ(ДоговорыКонтрагентов.Ссылка) КАК Договор,
			|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДоговорыКонтрагентов.Ссылка) КАК КоличествоДоговоров
			|ИЗ
			|	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
			|ГДЕ
			|	ДоговорыКонтрагентов.Владелец = &Контрагент
			|	И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора
			|	И ДоговорыКонтрагентов.Организация = &Организация
			|	И НЕ ДоговорыКонтрагентов.ПометкаУдаления";
		
		Запрос.УстановитьПараметр("ВидДоговора", ВидДоговора);
		Запрос.УстановитьПараметр("Контрагент", Контрагент);
		Запрос.УстановитьПараметр("Организация", Организация);
		
		РезультатЗапроса = Запрос.Выполнить();
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		
		Если ВыборкаДетальныеЗаписи.Следующий() Тогда
			Если ВыборкаДетальныеЗаписи.КоличествоДоговоров=1 Тогда
				Рез = ВыборкаДетальныеЗаписи.Договор;
			ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоДоговоров=0 Тогда
				Рез = СоздатьОсновнойДоговор(Организация, Контрагент, ВидДоговора);
			ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоДоговоров>1 Тогда
				Рез = ВыборкаДетальныеЗаписи.Договор;
				ТекстОшибки = СтрШаблон("Для контрагента %1 подставлен первый договор из нескольких по виду %2 для организации %3", Контрагент, ВидДоговора, Организация);
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Рез;

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

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

```
/*******************************************************
 Отключение (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)
```

Заполнить счета учета

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

Проверка, есть ли ключ у соответствия

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

Таблица значений в табличный документ

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

Выгрузка Таблицы значений в Объект Таблица Значений на форме обработки (для передачи сервер - клиент)

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

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

Telegram 1C. Полный разбор API. Курс

Разберись со всеми возможностями API Telegram при работе из 1С
FastCode 66 8
-10%

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

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

Проверка заполненности полей объекта и возврат статуса + незаполненных полей

Проверяет поля объекта через ЗначениеЗаполнено(), возвращает структуру с полями: Результат - Булево - = Истина, когда заполнены все поля, = Ложь когда есть не заполненные поля. НеЗаполненныеПоля - Строка - не заполненные поля через запятую
#Область ПроверкаЗаполненностиПолей
Функция ПроверкаЗаполненностиРеквизитовОбъекта(ОбъектПроверки, ПоляПроверкиШапки = "Дата, Номер", ПоляПроверкиТЧ = "Номенклатура, Количество", ИмяТЧ = "Товары") Экспорт
    НеЗаполненныеПоля = "";
    Результат         = Ложь;
    
    РезультатПроверкиШапки = ПоляЗаполнены(ОбъектПроверки, ПоляПроверкиШапки);
    РезультатПроверкиТЧ    = ПоляЗаполнены(ОбъектПроверки[ИмяТЧ], ПоляПроверкиТЧ);
    
    Результат = ?(РезультатПроверкиШапки = Ложь Или РезультатПроверкиТЧ = Ложь, Ложь, Истина);
    
    Возврат Новый Структура("Результат, НеЗаполненныеПоля", Результат, НеЗаполненныеПоля);
КонецФункции

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

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

Реквизиты Объекта в Структуру

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

Проверка типа данных на принадлежность к ссылочным типам

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

Создать Таблицу значений со структурой по данным источника

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

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

Универсальные процедуры для работы с логами

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

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

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

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

Добавить вертикальную черту к началу каждой строчки в тексте

Полезно, если надо перенести SQL запрос в код 1С и для прочих подобных ситуаций. В обработку добавить реквизиты "ТекстИсходный", "ТекстФорматированный". Вид полей формы "Поле текстового документа".
ChOP 30 5
&НаКлиенте
Процедура Форматировать(Команда)
	
	ТекстИсходный = СокрЛП(ТекстИсходный);
	ТекстФорматированный = "";
	
	Для Индекс = 1 По СтрЧислоСтрок(ТекстИсходный) Цикл
		
		ТекстФорматированный = ТекстФорматированный + "|" + СтрПолучитьСтроку(ТекстИсходный,Индекс) + Символы.ПС;
		
	КонецЦикла;
	
	ТекстФорматированный = СокрЛП(ТекстФорматированный);
	
КонецПроцедуры

WooCommerce 1C. Интеграция 1C с интернет магазином на WordPress. Курс

WooCommerce 1с. Научись интегрировать 1С с популярным интернет магазином на WordPress
FastCode 66 8
-10%