arefaste/1C_Forums huggingface dataset:
Преобразовать UNICODE ответ с Сайта
Теги: 1С,UTF-8,UTF-16,UNICODE

Часто сайты возвращают ответ в кодировке UNICODE, при этом в ответе встречаются текст в кодировке UTF-16 и UTF-8 прочитать подобный текст для 1С - большая проблема

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

```1c
//Отдельные сайты шлют ответы в перемешку UTF-16 и UTF-8
//Например 		"%u041F%20%3A TEST"
//Надо сделать 	"%u041F%u0020%u003A TEST"
Функция ПреобразоватьUnicode(Unicode) Экспорт

	СтрUnicode = "";

	МассивПодстрок = СтрРазделить(Unicode,"%",Ложь);
	Для Каждого Подстрока Из МассивПодстрок Цикл
		Если Сред(Подстрока,1,1) = "u" Тогда 		//Это UTF-16
			СтрUnicode = СтрUnicode + "%" + Подстрока;
			Продолжить;
		Иначе										//Это UTF-8
			ПервыеДваСимвола = Сред(Подстрока,1,2);
			ПоследниеСимволы = Сред(Подстрока,3);
			Подстрока = "u00" + ПервыеДваСимвола + ПоследниеСимволы;
			СтрUnicode = СтрUnicode + "%" + Подстрока;
		КонецЕСли;
	КонецЦикла;

	СтрUnicode  = СтрЗаменить(СтрUnicode,"%","\");		//Подготовим для JSON

	ЧтениеJSON = Новый ЧтениеJSON;

	Стр = "{""Текст"":"""+СтрUnicode + """}";

	ЧтениеJSON.УстановитьСтроку(Стр);

    Соответствие    =  ПрочитатьJSON(ЧтениеJSON, Истина);
    Результат    = Соответствие.Получить("Текст");

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

# Примечания

- а если сразу было сделать простую структуру типа
С = Новый Структура ("Текст", <ТекстЮникод>);
далее сделать строку json
потом json перевести в структуру обратно
и на выходе взять значение по ключу структуры?
Получение данных из запроса динамического списка
Теги: 1С

Можно использовать для создания обработок изменения данных, позволяя пользователю использовать функционал динамического списка (отборы, условное оформление ...). Пользователь настраивает дин. список как ему нужно, мы выгружаем данные  в ТЗ и изменяем.

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

```1c
		СписокСхема 		= Элементы.СписокДокументов.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
		Настройки			= Элементы.СписокДокументов.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

		КомпоновщикМакета 	= Новый КомпоновщикМакетаКомпоновкиДанных;
		МакетКомпоновки   	= КомпоновщикМакета.Выполнить(СписокСхема, Настройки, ,
                ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

		ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
		ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

		ПроцессорВывода 	= Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

		ПолученныеДанные	= ПроцессорВывода.Вывести(ПроцессорКомпоновки);  // Таблица значений.
```
Пауза() при выполнении кода 1С
Теги: 1С,Пауза,Неограниченное время,WshShell

Продолжается поиск оптимального решения формирования Паузы в коде 1С. Известные способы формирования Паузы, имеют некоторые недостатки. Использование  ping() - не стабильно. Использование HTTPСоединение - пауза ограничена 20 сек (по отзывам пользователей). Использование WshShell позволяет обойти эти ограничения.

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

```1c
// Пауза от 1 до 999 сек
// Без показа дополнительных окон
Процедура Пауза(Секунд) Экспорт

	WshShell = Новый COMОбъект("WScript.Shell");

	СтрокаКоманды = "timeout /t "+Секунд+" /nobreak";
	СтрокаКоманды = "cmd /c "+СтрокаКоманды;					// Закрываем окно после завершения (ключ /с)

	ОжидатьЗавершения = Истина;
	WshShell.Run(СтрокаКоманды, 0,ОжидатьЗавершения);			// 0 - не показывать окно командного интерпритатора

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

# Примечания

- Процедура Пауза(КолВоСекунд)
КонДата = ТекущаяДата() + КолВоСекунд;
Пока ТекущаяДата() < КонДата Цикл
	// пауза ...
КонецЦикла;

КонецПроцедуры // Пауза()

- (1) akmi, обязательно процессор нагружать?
Процедура КомандаСистемы() без отображения окна командного интерпритатора
Теги: 1С,WshShell,ЗапуститьПриложение,КомандаСистемы,Окно

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

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

```1c
Процедура КомандаСистемыWshShell(Команда, ИмяКаталога = "", ЗакрыватьОкно = Истина, ПоказыватьОкно = Ложь, ОжидатьЗавершения = Истина)
	//В командной строке можно выполнить несколько команд
	//В этом случае команды отделяются " && "

	Отладка = Ложь;
	Если Отладка = Истина Тогда
		ЗакрыватьОкно = Ложь;
		ПоказыватьОкно = Истина;
	КонецЕСли;

	WshShell = Новый COMОбъект("WScript.Shell");

	СтрокаКоманды = Команда;
	Если ЗначениеЗаполнено(ИмяКаталога) Тогда
		МассивПодстрок = СтрРазделить(ИмяКаталога, ":\",Ложь);
		Если МассивПодстрок.Количество() = 2 Тогда
			ИмяДиска = МассивПодстрок.Получить(0)+":";
			КомандаСменитьКаталог = " "+ИмяДиска + " && " + " cd " + ИмяКаталога;

			СтрокаКоманды = КомандаСменитьКаталог + " && " + СтрокаКоманды;
		КонецЕСли;
	КонецЕсли;

	Если ЗакрыватьОкно = Истина Тогда
		СтрокаКоманды = "cmd /c "+СтрокаКоманды;
	Иначе
		СтрокаКоманды = "cmd /k "+СтрокаКоманды;
	КонецЕСли;

	//Запустить командный Интерпритатор, установить каталог по умолчанию, запустить программу, закрыть Окно интерпритатора (ключ /с)
	//     cmd /c c: && cd c:\OpenSSL && OpenSSL.exe
	//
	//Запустить командный Интерпритатор, использовать каталог по умолчанию, запустить программу, НЕ закрывать Окно интерпритатора (ключ /k)
	//     cmd /k OpenSSL.exe
	//

	Если ПоказыватьОкно = Истина Тогда
		WshShell.Run(СтрокаКоманды, 1,ОжидатьЗавершения);
	Иначе
		WshShell.Run(СтрокаКоманды, 0,ОжидатьЗавершения);
	КонецЕСли;

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

Процедура ПодписатьOpenSSL()

	ИмяКаталога 			= "c:\OpenSSL";
	ИмяФайлаДляПодписания 	= "Тест.txt";
	ИмяФайлаПодписано 		= "Sign.txt";
	ИмяФайлаПриватногоКлюча = "Server.key";

	СтрокаКоманды = "openssl.exe dgst -sha256 -sign "+ИмяФайлаПриватногоКлюча+" -out "+ИмяФайлаПодписано+" " + ИмяФайлаДляПодписания;

	ЗакрыватьОкно = Истина;
	ПоказыватьОкно = Ложь;
	ОжидатьЗавершениеКоманды = Истина;

	КомандаСистемыWshShell(СтрокаКоманды,ИмяКаталога, ЗакрыватьОкно, ПоказыватьОкно, ОжидатьЗавершениеКоманды);

КонецПроцедуры
```
Формирование Паузы при выполнении кода
Теги: 1С,Пауза

За 30 лет развития 1С так и не смогли реализовать нормальную функцию Пауза. Периодически приходится изобретать велосипед. Часто с квадратными колесами. На просторах Интернета нашел идеальный вариант. Все штатным способом.
По отзывам в Интернете, данный способ имеет ограничение 20 сек. 
Так что рекомендую использовать WshShell

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

```1c
Процедура Пауза(Секунд)

	СоединениеHTTP = Новый HTTPСоединение("127.0.0.0",,,,, Секунд);

	Попытка
    	СоединениеHTTP.Получить(Новый HTTPЗапрос)
   	Исключение
	КонецПопытки

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

# Примечания

- так лучше:
НастройкиProxy = Новый ИнтернетПрокси(Ложь);
НастройкиProxy.НеИспользоватьПроксиДляЛокальныхАдресов = Истина;
НастройкиProxy.НеИспользоватьПроксиДляАдресов.Добавить("127.0.0.0");
    Попытка
        СоединениеHTTP = Новый HTTPСоединение("127.0.0.0",,,,НастройкиProxy,МиллиСекунды);
        СоединениеHTTP.Получить(Новый HTTPЗапрос());
    Исключение
        Возврат Неопределено;
    КонецПопытки;
Установка отбора Списка по СпискуЗначений
Теги: 1С,Отбор,СписокЗначений

При попытке установить отбор Списка по СпискуЗначений может возникать ошибка времени выполнения "Неверный тип значения". 
При установке отбора ВАЖНО соблюдать последовательность выполнения кода

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

```1c
//ВНИМАНИЕ
// Для корректной установки отбора по списку Значений
// Важно соблюдать последовательность операций
//      ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
//		ЭлементОтбора.Значение = СписокЗначений;
//В противном случае будет будет получена ошибка при выполнении операции
//		ЭлементОтбора.Значение = СписокЗначений;
//
Процедура УстановитьОтборСпискаПоСпискуЗначений(СписокЗначений,ИмяРеквизита)

	ОтборСписка = РегистрСведенийСписок.Отбор;

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

# Примечания

- С подобной проблемой сталкивался несколько раз. И на её решение уходило по несколько часов.
Отладка методов серверных модулей через внешнюю обработку
Теги: 1С,Перезапуск,Отладка,Шаблон

Схема известная. В обработку помещаешь метод, который нужно отладить.
И его дорабатываешь до готовности.
Потом переносишь в конфигурацию.
Если база серверная, то обработку кладешь в сетевую папку.
Такой способ позволяет не тратить время на ожидание перезапуска сеанса для применения изменений конфигурации.
Шаблон для использования в файлах *.st.
Закрытие терминальной сессии
Теги: 1С,splwow64,RDP

При закрытии 1С не всегда происходит завершение терминальной сессии. В памяти висит процесс (splwow64.exe), который не дает закрыть.
Решение удалить процесс перед закрытием 1с. 
В глобальном модуле добавляем строку в  процедуру "ПризавершенииРаботыСистемы"

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

```1c
ЗапуститьПриложение("taskkill /f /im splwow64.exe");
```

# Примечания

- что за костыли.
гугль выдает:
Добавить Splwow64.exe в ключ реестра, чтобы передать ОС, что процесс может быть безопасно преждевременно прекращен автоматически:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Sysprocs
Имя значения: splwow64.exe
Тип данных: REG_DWORD
База: Hex
Данные значения: 0
Создание записи в журнал регистрации
Теги: 1С,журнал регистрации

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

```1c
&НаСервере
Процедура ДобавитьЗаписьВЖурналРегистрации()

    //Индексы хранятся в каталоге 1Cv8Log в файлах с расширением .lgx
    ЗаписьЖурналаРегистрации("Обновление1С", УровеньЖурналаРегистрации.Информация,,,
    "Выполнено", РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);
    //ЗаписьЖурналаРегистрации(<ИмяСобытия>, <Уровень>, <ОбъектМетаданных к которому относится событие>, <Данные>, <Комментарий>, <РежимТранзакции>)
    //Обработчик...

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

&НаСервере
Процедура ДобавитьЗаписьВЖурналРегистрацииЧерезСтруктуру()

   СписокЗаписейЖурнала = Новый СписокЗначений();

   ЗаписьЖурналаНачало = Новый Структура("ИмяСобытия, ПредставлениеУровня, Комментарий,ДатаСобытия");
   ЗаписьЖурналаНачало.ИмяСобытия = "НачалоОбновления1С";
   ЗаписьЖурналаНачало.ПредставлениеУровня = "Информация"; //"Предупреждение", "Ошибка", "Предупреждение", "Примечание".
   ЗаписьЖурналаНачало.Комментарий = "Начато обновление конфигурации до версии 3.7.41";
   ЗаписьЖурналаНачало.ДатаСобытия = ТекущаяДата();
   СписокЗаписейЖурнала.Добавить(ЗаписьЖурналаНачало);

   //... здесь по аналогии журналируем поэтапно сам процесс

   ЗаписьЖурналаКонец = Новый Структура("ИмяСобытия, ПредставлениеУровня, Комментарий,ДатаСобытия");
   ЗаписьЖурналаКонец.ИмяСобытия = "ОкончаниеОбновления1С";
   ЗаписьЖурналаКонец.ПредставлениеУровня = "Информация"; //"Предупреждение", "Ошибка", "Предупреждение", "Примечание".
   ЗаписьЖурналаКонец.Комментарий = "Завершено обновление конфигурации до версии 3.7.41";
   ЗаписьЖурналаКонец.ДатаСобытия = ТекущаяДата();
   СписокЗаписейЖурнала.Добавить(ЗаписьЖурналаКонец);

   ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СписокЗаписейЖурнала);

КонецПроцедуры
```
mxl в таблицу значений
Теги: 1С,ТаблицаЗначений,mxl

Преобразование mxl файла в таблицу значений

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

```1c
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\load\vigr.mxl");
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());//передаем ТЗ
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТЗ = ПЗ.Результат.Выгрузить();
```
Вывод картинки при печати в Табличный документ
Теги: 1С

Вывод картинки на макет, используя функции БСП

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

```1c
  //В свойствах ячейки Параметра Фото1 - на вкладке Макет ПараметрКартинки указать Фото1
  //шрифт Параметра в ячейке делаем Белым, чтобы не было видно "Картинка"
  ФайлКартинки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
		Справочники.Номенклатура.НайтиПоНаименованию(СтрокаТовары.Номенклатура),
		"ФайлКартинки");

		Если ЗначениеЗаполнено(ФайлКартинки.Наименование) Тогда

			ДвоичныеДанныеФайла                   = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлКартинки);
			Если ТипЗнч(ДвоичныеДанныеФайла)      = Тип("Картинка") Тогда
				Картинка                          = ДвоичныеДанныеФайла;
			ИначеЕсли ТипЗнч(ДвоичныеДанныеФайла) = Тип("ДвоичныеДанные") Тогда
				Картинка                          = Новый Картинка(ДвоичныеДанныеФайла);
			Иначе
				Картинка                          = Новый Картинка;
			КонецЕсли;
			ОбластьСтрокаТаблицыТовары.Параметры.Фото1         = Картинка;

		КонецЕсли;
		ТабличныйДокумент.Вывести(ОбластьСтрокаТаблицыТовары);
```
Подчеркнуть текст в макете
Теги: 1С

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

```1c
Функция ПодчеркнутьТекстВМакете(Строка) Экспорт
    Результат = "";
    Для Индекс = 1 По СтрДлина(Строка) Цикл
        Если Найти(" _-", Сред(Строка, Индекс, 1)) = 0 Тогда
            Результат = Результат + Символ(863);
        КонецЕсли;
        Результат = Результат + Сред(Строка, Индекс, 1);
    КонецЦикла;

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

Для создания общей команды для запуска конкретного варианта внешнего отчета.
Сам отчет включается в дополнительные, а в команде можно указать наименование встроенного варианта отчета (СКД) или добавленного пользователем. Если пользовательский вариант будет удален или переименован, будет открываться первый встроенный вариант отчета.
Удалить недопустимые символы XML
Теги: 1С,XML

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

```1c
Функция УдалитьНедопустимыеСимволыXML(Стр) Экспорт
	Позиция = НайтиНедопустимыеСимволыXML(Стр);

	Пока Позиция <> 0 Цикл
		Стр = Лев(Стр, Позиция - 1) + Сред(Стр, Позиция + 1);
		Позиция = НайтиНедопустимыеСимволыXML(Стр);
	КонецЦикла;

	Возврат Стр;
КонецФункции  //УдалитьНедопустимыеСимволыXML()
```

# Примечания

- А где метод НайтиНедопустимыеСимволыXML() ?
Значение перечисления по синониму
Теги: 1С

Получаем значение перечисления по синониму

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

```1c
Функция ЗначениеПеречисления(ИмяПеречисления = Неопределено, Синоним = Неопределено, СообщитьЗначения = Ложь) Экспорт

	НайденныеЭлементы = Новый Массив;
	ПредопределенноеПеречисление = Метаданные.Перечисления.Найти(ИмяПеречисления);
	ШаблонВывода = "Перечисление.%1.%2";

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

	Если СообщитьЗначения Тогда
		Для Каждого ЭлементМассива Из НайденныеЭлементы Цикл
			Сообщить(ЭлементМассива);
		КонецЦикла;
	КонецЕсли;

	Возврат НайденныеЭлементы;

КонецФункции // ЗначениеПеречисления()
```
Найти дату самого первого документа в любой базе
Теги: 1С,Документы,метаданные,первый документ

Как найти дату самого раннего документа в любой базе (или сам документ при желании)

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

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

	ТаблицаПервыхДокументов = Новый ТаблицаЗначений;
	ТаблицаПервыхДокументов.Колонки.Добавить("Дата");

	Для Каждого ВидДокумента Из Метаданные.Документы Цикл

		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	ИмяДокумента.Дата КАК Дата
		|ИЗ
		|	Документ.%ИмяДокумента% КАК ИмяДокумента
		|
		|УПОРЯДОЧИТЬ ПО
		|	Дата";

		Запрос.Текст = СтрЗаменить(Запрос.Текст,"%ИмяДокумента%", ВидДокумента.Имя);

		РезультатЗапроса = Запрос.Выполнить();

		Если РезультатЗапроса.Пустой() Тогда
			Продолжить;
		КонецЕсли;

		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

		ВыборкаДетальныеЗаписи.Следующий();

		НоваяЗапись = ТаблицаПервыхДокументов.Добавить();
		НоваяЗапись.Дата = ВыборкаДетальныеЗаписи.Дата;

	КонецЦикла;

	ТаблицаПервыхДокументов.Сортировать("Дата Возр");

	Если ТаблицаПервыхДокументов.Количество()=0 Тогда
		НоваяЗапись = ТаблицаПервыхДокументов.Добавить();
		НоваяЗапись.Дата = "ЗАМЕНИТЬ НА ВАШУ ДАТА НА ВЫБОР";
	КонецЕсли;

	Возврат ТаблицаПервыхДокументов[0].Дата;

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

# Примечания

- Запрос в цикле. Плохой подход в данной ситуации.

- (1) dr.Ally, да создание текста запроса в цикле было бы скорее всего правильнее и ТЧ не нужно было бы потом мучить

- (2) Yana, для данной задачи это бессмысленно. Очевидно что решение под разовую задачу найди док с кривой датой и дать по шапке
Переопределение основных настроек динамического списка БСП
Теги: 1С

Используем в ПриСозданииНаСервере в форме списка

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

```1c
Список.ПроизвольныйЗапрос = Истина;

// 1. Переопределение настроек динамического списка.
// 1.1 Получение структуры настроек.
ПараметрыСписка   = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
// 1.2 Заполнение структуры настроек.
ПараметрыСписка.ТекстЗапроса = ПолучитьТекстПроизвольногоЗапросаДинамическогоСписка();
ПараметрыСписка.ДинамическоеСчитываниеДанных = Истина;
ПараметрыСписка.ОсновнаяТаблица = "Документ.КорректировкаНазначенияТоваров".
// 2. Установка свойств.
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, ПараметрыСписка);
```
Чтение файла (в таблицу значений) расширения .xlsx с помощью построителя запроса
Теги: 1С

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

```1c
	// Создаем табдок;
	ТабДок = Новый ТабличныйДокумент;

	ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);

	// Получаем данные запросом;
	ПЗ = Новый ПостроительЗапроса;

	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());

	ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

	ПЗ.ЗаполнитьНастройки();

	ПЗ.Выполнить();

	ТаблицаЗначений = ПЗ.Результат.Выгрузить();
```
Быстрое объединение двух таблиц значений
Теги: 1С,ТЗ,объединить,Таблица значений,объединение

Соединяет две разные таблицы значений с одинаковыми колонками в одну целую таблицу значений.
Способ интересен тем, что он вставляет одну таблицу в начало другой таблицы, а не добавляет строки из одной таблицы в конец другой.
Такой способ работает намного быстрее чем стандартный.

# Примечания

- Любопытно.
А на сколько быстрее это происходит?
Запись текста без BOM
Теги: 1С,Обмен,BOM

При попытке записать текстовый файл в кодировке UTF-8 1C добавляет в начало текста три символа BOM (Byte order mark) эти символы не видны в обычном редакторе, однако при обменах могут приводить к ошибке.

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

```1c
//Пример записи Строки в файл
	Стр = "Строка для записи";
	ИмяФайла = "Текст.txt";

//Запись стандартными методами. Добавляет BOM. Размер файла 35 байт
	Текст = Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(Стр);
	Текст.Записать(ИмяФайла, КодировкаТекста.UTF8);

//Запись без BOM. Размер файла 32 байта
	ЗаписатьBOM = Ложь;
	ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(Стр, КодировкаТекста.UTF8, ЗаписатьBOM);
	ДвоичныеДанныеСтроки.Записать(ИмяФайла);
```

# Примечания

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

Функция возвращает ссылку полученную из навигационной ссылки.

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

```1c
Функция ПолучитьСсылкуИзНавигационной(НС) Экспорт

    ПерваяТочка = Найти(НС, "e1cib/data/");
    ВтораяТочка = Найти(НС, "?ref=");

    ПредставлениеТипа   = Сред(НС, ПерваяТочка + 11, ВтораяТочка - ПерваяТочка - 11);
    ШаблонЗначения = ЗначениеВСтрокуВнутр(ПредопределенноеЗначение(ПредставлениеТипа + ".ПустаяСсылка"));
    ЗначениеСсылки = СтрЗаменить(ШаблонЗначения, "00000000000000000000000000000000", Сред(НС, ВтораяТочка + 5));
    Возврат ЗначениеИзСтрокиВнутр(ЗначениеСсылки);

КонецФункции
```
Отобразить заголовки периодов на форме отчета БСП
Теги: 1С,Параметры,Отчеты,Баг,БСП,Исправление,Варианты отчетов,СКД

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

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

```1c
Процедура ОпределитьНастройкиФормы(Параметр, КлючВарианта, НастройкиОтчета) Экспорт

	НастройкиОтчета.События.ПослеЗаполненияПанелиБыстрыхНастроек = Истина;

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

Процедура ПослеЗаполненияПанелиБыстрыхНастроек(ФормаОтчета, ПараметрыОбновления) Экспорт

	ПочинитьЗаголовкиПериодов(ФормаОтчета);

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

Процедура ПочинитьЗаголовкиПериодов(ФормаОтчета)

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

	Для Каждого ЭлементФормы Из ФормаОтчета.Элементы Цикл

		СвойстваЭлемента = Новый Структура("ПоложениеЗаголовка,Заголовок,ПутьКДанным");
		ЗаполнитьЗначенияСвойств(СвойстваЭлемента, ЭлементФормы);

		Если СвойстваЭлемента.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет
			И ЗаголовкиЭлементов.Найти(СвойстваЭлемента.Заголовок) <> Неопределено Тогда
			ЭлементФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
		КонецЕсли;

	КонецЦикла;

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