arefaste/1C_Forums huggingface dataset:
Функция восстановления значения при чтении JSON (ЧтениеJSON)
Теги: 1С,ЧтениеJSON,Функции восстановления значения чтения,ДесериализацияJSON

Функция восстановления из JSON может использоваться для того, чтобы преобразовать данные JSON в типы платформы 1С, которые либо 1. не могут являться результатом автоматического преобразования, либо 2. чтобы просто изменить получаемые данные, если есть такая необходимость. В данном примере из json файла где ИНН, КПП контрагента - пустая строка, заменим на значение - Пустая строка ИНН (КПП)

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

```1c
// Структура JSON файла:
{
 "Info": [
  {
   "Наименование": "Global Trade Company GmbH",
   "НаименованиеПолное": "Global Trade Company GmbH",
   "ИНН": "",
   "КПП": "",
   "ЮрФизЛицо": "Юридическое лицо",
   "ТекущаяДата": "2023-09-03T16:45:44Z",
   "ДанныеАдреса": "Страна - 1; Город  - 1; Индекс - 1"
  },
  {
   "Наименование": "Kikinda (Сербия)",
   "НаименованиеПолное": "Kikinda (Сербия)",
   "ИНН": "",
   "КПП": "",
   "ЮрФизЛицо": "Юридическое лицо",
   "ТекущаяДата": "2023-09-03T16:45:44Z",
   "ДанныеАдреса": "Страна - 2; Город  - 2; Индекс - 2"
  },
  {
   "Наименование": "Koenig Holding GmbH",
   "НаименованиеПолное": "Koenig Holding GmbH",
   "ИНН": "",
   "КПП": "",
   "ЮрФизЛицо": "Юридическое лицо",
   "ТекущаяДата": "2023-09-03T16:45:44Z",
   "ДанныеАдреса": "Страна - 3; Город  - 3; Индекс - 3"
  },
  {
   "Наименование": "АВИКА",
   "НаименованиеПолное": "АВИКА",
   "ИНН": "4825005381",
   "КПП": "482201001",
   "ЮрФизЛицо": "Юридическое лицо",
   "ТекущаяДата": "2023-09-03T16:45:44Z",
   "ДанныеАдреса": "Страна - 4; Город  - 4; Индекс - 4"
  },
  {
   "Наименование": "АвтБанк АКБ",
   "НаименованиеПолное": "АКБ АвтБанк",
   "ИНН": "",
   "КПП": "",
   "ЮрФизЛицо": "Юридическое лицо",
   "ТекущаяДата": "2023-09-03T16:45:44Z",
   "ДанныеАдреса": "Страна - 5; Город  - 5; Индекс - 5"
  }
 ]
}

//Код в модуле формы:
&НаСервере
Функция ФункцияВосстановленияСериализуемогоЗначения(Свойство, Значение, ДополнительныеПараметры) Экспорт

	 Если Свойство = "ИНН" ИЛИ Свойство = "КПП" Тогда
	 	 Если ПустаяСтрока(Значение) Тогда
			Возврат "Пустая строка " + Свойство;
		 КонецЕсли;
	 КонецЕсли;

КонецФункции // ()

&НаСервере
Процедура ВыполнитьЧтениеДанныхНаСервере()

	// Проверка наличия файла по пути;
	ПутьНаСервере1  = "C:\Users\SystemX\Desktop\TestJSON_1.json";

	ФайлJSON = Новый Файл(ПутьНаСервере1);

	Если НЕ ФайлJSON.Существует() Тогда
		ОбщегоНазначения.СообщитьПользователю("Файл отсутствует по пути: " + ПутьНаСервере1);
	    Возврат;
	КонецЕсли;

	ЧтениеJSON = Новый ЧтениеJSON();
	Попытка
	   ЧтениеJSON.ОткрытьФайл(ПутьНаСервере1, "UTF-8");
	Исключение
	КонецПопытки;

	ПрочитанноеЗначение = ПрочитатьJSON(ЧтениеJSON, Ложь,,, "ФункцияВосстановленияСериализуемогоЗначения", ЭтотОбъект);

	ЧтениеJSON.Закрыть();

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

&НаКлиенте
Процедура ВыполнитьЧтениеДанных(Команда)
	ВыполнитьЧтениеДанныхНаСервере();
КонецПроцедуры
```
Вывод табличного документа в типовое окно печати для УФ
Теги: 1С,БСП,ТабличныйДокумент,Печать

Использование типового окна печати для вывода табличного документа (выдержка с Инфостарт https://infostart.ru/1c/articles/394727/)

# Примечания

- Может так?
&НаКлиенте
	Процедура КомандаПечати(Команда) 
		ТабличныйДокументДляПечати = ПолучитьТабличныйДокумент(); 
		Коллекция = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("Макет");

		//структура в массиве
		СтруктураКоллекции = Коллекция.Получить(0);
		СтруктураКоллекции.ТабличныйДокумент =ТабличныйДокументДляПечати ;
		СтруктураКоллекции.СинонимМакета = "Имя файла"; //Для сохранения, отправки по почте

		УправлениеПечатьюКлиент.ПечатьДокументов(Коллекция,,ЭтаФорма);

	КонецПроцедуры
Заполнить контрагента по ИНН, Получить данные по ИНН
Теги: 1С,JSON,HTTP,API,ИНН,Контрагента,Контрагент

Пример процедуры для получение данных юридического лица по ИНН используя  бесплатное API. Данный способ был реализован на YouTube канале "IRONSKILLS".

# Примечания

- В турбоконфе есть опция проверки орфографии. Рекомендую автору =)
Вывод месяца строкой из даты
Теги: 1С,Строка,Дата,Месяц

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

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

```1c
&НаСервере
Функция ФорматМесяц(ДатаИсходная)
	Месяц = Нрег(Формат(ДатаИсходная, "ДЛФ=DD"));
	Месяц = СтрЗаменить(Месяц, Лев(Месяц, СтрНайти(Месяц, " ")), "");
	Месяц = Лев(Месяц, СтрНайти(Месяц, " "));

	Возврат Месяц;
КонецФункции //ФорматМесяц
```

# Примечания

- а вот такая строка разве не подойдет для решения задачи:
Месяц = Нрег(Формат(ДатаИсходная, ""ДФ=MMMM""));
Возврат Месяц;
Сортировка ДанныеФормыДеревоЗначений с изменением направления
Теги: 1С,ДанныеФормыДеревоЗначений

Сортировка дерева значений с изменением направления

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

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

    КоллекцияСтрок = КоллекцияСортировки.ПолучитьЭлементы();

    СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки, ПоВозрастанию);

    Если ВключатьПодчиненные Тогда

        Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл

            СортироватьДанныеФормыДерево(ТекущаяСтрока, КолонкаСортировки, ВключатьПодчиненные, ПоВозрастанию);

        КонецЦикла;

    КонецЕсли;

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

&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки, ПоВозрастанию = Истина)

    ПараметрыЗначений     = Новый Соответствие;
    СортированныеЗначения = Новый СписокЗначений;

    Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл

        ТекущееЗначение = ТекущаяСтрока[КолонкаСортировки];

        ПараметрыЗначения = ПараметрыЗначений.Получить(ТекущееЗначение);

        Если ПараметрыЗначения = Неопределено Тогда

            ПараметрыЗначения = Новый Массив;
            ПараметрыЗначений.Вставить(ТекущееЗначение, ПараметрыЗначения);
            СортированныеЗначения.Добавить(ТекущееЗначение);

        КонецЕсли;

        ПараметрыЗначения.Добавить(ТекущаяСтрока);

    КонецЦикла;

    СортированныеЗначения.СортироватьПоЗначению(?(ПоВозрастанию, НаправлениеСортировки.Возр, НаправлениеСортировки.Убыв));
    НовыйИндекс = 0;

    Для Каждого ТекущееЗначение Из СортированныеЗначения Цикл

        МассивСтрок = ПараметрыЗначений.Получить(ТекущееЗначение.Значение);

        Для Каждого ТекущаяСтрока Из МассивСтрок Цикл

            ТекущийИндекс = КоллекцияСтрок.Индекс(ТекущаяСтрока);
            ШагСдвига     = НовыйИндекс - ТекущийИндекс;

            Если НЕ ШагСдвига = 0 Тогда

                КоллекцияСтрок.Сдвинуть(ТекущийИндекс, ШагСдвига);

            КонецЕсли;

            НовыйИндекс = НовыйИндекс + 1;

        КонецЦикла;

    КонецЦикла;

КонецПроцедуры
```
СоздатьЭлементФормы
Теги: 1С,Создание,Форма,Добавить,Элементы,Программно

Создает элемент на форме. Возможно вставить перед выбранным элементом

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

```1c
Функция СоздатьЭлементФормы(Форма, ИмяЭлемента, ТипЭлемента, РодительЭлемента, ЭлементПеред = Неопределено) Экспорт

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

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

КонецФункции
```
Предупреждение-оповещение
Теги: 1С,Предупреждение,Показать,Оповещение

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

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

```1c
ПоказатьПредупреждение(
		Неопределено, "ТекстПредупреждения", 3, "Заголовок");
```
Убрать префикс и лидирующие нули
Теги: 1С,Номер,Строка,RegExp

Префиксация объектов

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

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

	RegExp = Новый COMОбъект("VBScript.RegExp");
	RegExp.MultiLine = Истина;
	RegExp.Global = Истина;
	RegExp.IgnoreCase = Истина;

	Шаблон = "№ 0*(\d+)";

	RegExp.Pattern = Шаблон;
	Matches=RegExp.Execute(Строка);

	Возврат Matches;

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

# Примечания

- И эта вся ерунда будет работать только на виндовс.
Есть же нормальное 1с решение. Зачем изобретать велосипед?
Функция УдалитьЛидирующиеНулиИзНомераОбъекта(Знач НомерОбъекта) Экспорт
	
	ПользовательскийПрефикс = ПользовательскийПрефикс(НомерОбъекта);
	
	Если НомерСодержитСтандартныйПрефикс(НомерОбъекта) Тогда
		
		Если НомерСодержитПятизначныйПрефикс(НомерОбъекта) Тогда
			Префикс = Лев(НомерОбъекта, 5);
			Номер = Сред(НомерОбъекта, 6 + СтрДлина(ПользовательскийПрефикс));
		Иначе
			Префикс = Лев(НомерОбъекта, 3);
			Номер = Сред(НомерОбъекта, 4 + СтрДлина(ПользовательскийПрефикс));
		КонецЕсли;
		
	Иначе
		
		Префикс = "";
		Номер = Сред(НомерОбъекта, 1 + СтрДлина(ПользовательскийПрефикс));
		
	КонецЕсли;
	
	// Удаляем лидирующие нули слева в номере.
	Номер = СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(Номер, "0");
	
	Возврат Префикс + ПользовательскийПрефикс + Номер;
КонецФункции

- (1) Сахипов Данил, Я понимаю что вы открыли для себя БСП и все остальное вам кажется "ерундой", но протестируйте на больших данных, в файловой базе, оба метода.

- (2) tech_log, код должен не зависеть от ОС. И это в данном случае важнее, чем скорость. Завтра вы переносите ваше решение на Линукс и куча функционала отвалится.

- (3) SerjGreat, Это просто шаблончик для регулярки, это не реально работающий код.  Знаете сколько у меня внешних сервисов завязано на винде...  При переносе на линукс, префиксация это последнее, что меня будет беспокоить)).

- (2) tech_log, а как это Вы умудрились в одном предложении соединить "большие данные" с "файловая база" и, как следствие, ставить это в пику бсп-шной функции?

- (5) Razlagutt, ИП Торгует на вайлберис книгами 300к номенклатуры в файловой. Это не я умудряюсь, это обстоятельства. Надо было убрать в наименовании текст "Книга". БСП за ночь не смогла А регулярка смогла.

- (6) tech_log, сочувствую.
Отправка сформированного отчета на почту (в виде html текста)
Теги: 1С,Почта,Отчет

Сохраняем табличный документ как html текст, отправляем на почту используя протокол smtp. Плюс в том, что при открытии сообщения на почте сразу будем видеть отчет (не прибегая к скачиванию файла и тп)

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

```1c
	// Описание ПочтовогоПрофиля;
	ПочтовыйПрофиль  = Новый ИнтернетПочтовыйПрофиль;

	// SMTP (отправляем сообщение);
	ПочтовыйПрофиль.АдресСервераSMTP = "smtp.yandex.com";
	//ПочтовыйПрофиль.АдресСервераIMAP = "imap.yandex.com";

	ПочтовыйПрофиль.ПользовательSMTP = "xxxxx.xxxxxx@yandex.ru";
	ПочтовыйПрофиль.ПарольSMTP 	= "tcbbrwraduriuusz";

	ПочтовыйПрофиль.Пользователь = "xxxxx.xxxxxx@yandex.ru";
	ПочтовыйПрофиль.Пароль = "tcbbrwraduriuusz";

	ПочтовыйПрофиль.ПортSMTP = 465;
	//ПочтовыйПрофиль.ПортIMAP = 993;
	ПочтовыйПрофиль.Таймаут = 30; // мс;

	ПочтовыйПрофиль.ИспользоватьSSLSMTP = Истина;
	ПочтовыйПрофиль.ИспользоватьSSLIMAP = Истина;

	// ИнтернетПочта;
	Почта = Новый ИнтернетПочта;

	ПодключеноУспешно = Ложь;
	Попытка
		Почта.Подключиться(ПочтовыйПрофиль, ПротоколИнтернетПочты.IMAP);
		ПодключеноУспешно = Истина;
	Исключение
	КонецПопытки;

	// Проверка;
	Если НЕ ПодключеноУспешно Тогда
    	        ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации(ОписаниеОшибки(),
                     УровеньЖурналаРегистрации.Ошибка,,,  "Сообщение- не было отправлено!");
		Возврат;
	Иначе

		АдресФайлаВложения = ПолучитьИмяВременногоФайла(".txt");

		// Формирование отчета;
		ТаблДок = Новый ТабличныйДокумент;
                // Формируем отчет (какой хотим);
		Отчеты.ABCXYZАнализНоменклатуры.Создать().СкомпоноватьРезультат(ТаблДок);
		ТаблДок.Записать(АдресФайлаВложения, ТипФайлаТабличногоДокумента.HTML);

		ТекстHTML = "";
			ТекДок = Новый ТекстовыйДокумент;
			ТекДок.Прочитать(АдресФайлаВложения);
		ТекстHTML = ТекДок.ПолучитьТекст();

		// Формирование сообщения;
		ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
		ПочтовоеСообщение.Тема 		= СтрШаблон("Отчет ""Остатки товаров организаций"" от %1", Формат(ТекущаяДата(), "ДЛФ=DD"));
		ПочтовоеСообщение.Важность 	= ВажностьИнтернетПочтовогоСообщения.Наивысшая;
		ПочтовоеСообщение.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
		//
		ПочтовоеСообщение.Отправитель.Адрес = "xxxxx.xxxxxx@yandex.ru";
		ПочтовоеСообщение.Получатели.Добавить("xxxxx.xxxxxx@yandex.ru");

		//ИнтернетПочтовоеВложение  = ПочтовоеСообщение.Вложения.Добавить(АдресФайлаВложения, "Остатки товаров организаций");

		Попытка
			СоответствиеОтвет = Почта.Послать(ПочтовоеСообщение,, ПротоколИнтернетПочты.SMTP);
		Исключение
		КонецПопытки;

	КонецЕсли;
```
CОМ подключение к базе-приемнику
Теги: 1С,COM

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

```1c
// Параметры:
//
// ПутьКБазе - Строка
// ПользовательБазы - Строка
// ПарольБазы - Строка
// ДополнительныеПараметры - Структура
//
// Возвращаемое значение:
//
// Значение - СОМ Объект
// Значение - Неопределено
// -
Функция ВыполнитьПодключениеКБазе(ПутьКБазе = Неопределено,
								  ПользовательБазы = Неопределено,
								  ПарольБазы = Неопределено,
								  ДополнительныеПараметры = Неопределено) Экспорт

	  БазаПриемник = Неопределено;

	  // Статические параметры подключения;
	  ПользовательБазы = "Савинская З.Ю. (Системный программист)";
	  ПарольБазы = "";
	  ПутьКБазе = "D:\1С_dev\1C_Bases\HRM_Demo";

	  // Подключаемся через СОМ;
	  СОМСоединение = Новый COMОбъект("V83.ComConnector");
	  ПараметрыДоступа = СтрШаблон("File=""%1"";Usr=""%2"";Pwd=""%3"";", ПутьКБазе, ПользовательБазы, ПарольБазы);

	  Попытка
		  БазаПриемник = СОМСоединение.Connect(ПараметрыДоступа);
	  Исключение
	  КонецПопытки;

	  Возврат БазаПриемник;

КонецФункции // ()
```
Сериализация массива объектов в xml (файл)
Теги: 1С,XML,XDTO

МассивОбъектов (Массив с элементами типа СправочникОбъект, ДокументОбъект, и т.п.);

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

```1c
	// 1. Сериализуем массив объектов;
	ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(МассивОбъектов);

	// 2. Инициализируем ЗаписьXML;
	ЗаписьXML = Новый ЗаписьXML;

	// 3. Открываем (создаем) файл для записи XML;
	ИмяФайлаXML = ПолучитьИмяВременногоФайла(".xml");
	ЗаписьXML.ОткрытьФайл(ИмяФайлаXML, "UTF-8", Ложь);

	// 4. Выполняем запись;
	ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);

	// 5. Закрываем запись;
	ЗаписьXML.Закрыть();
```
Галка "Подпись и печать" в свою внешнюю печатную форму
Теги: 1С,Печатная форма,БП

Рабочий код для БП 3
В макет "ПФ_MXL_Макет" копируем нужные рисунки (...факсимиле) из любой типовой формы

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

```1c
// Интерфейс для выполнения команд обработки.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

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

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

Функция ПолучитьПечатныеФормы(МассивОбъектов, ОбъектыПечати) Экспорт

	ПараметрыПечати = Новый Структура;
	ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);

	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.АвтоМасштаб			= Истина;
	ТабличныйДокумент.ОриентацияСтраницы	= ОриентацияСтраницы.Портрет;
	ТабличныйДокумент.КлючПараметровПечати	= "ПАРАМЕТРЫ_ПЕЧАТИ_ВПФ_123";

	ПервыйДокумент = Истина;
	Для каждого Объект Из МассивОбъектов Цикл

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

		ПервыйДокумент = Ложь;

		// Запомним номер строки, с которой начали выводить текущий документ.
		НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;

		ТабличныйДокумент.Вывести(ПечатьОдногоОбъекта(Объект));

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

		ЗапросШапка.УстановитьПараметр("Ссылка", Объект);

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

		// В табличном документе зададим имя области, в которую был
		// выведен объект. Нужно для возможности печати покомплектно.
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ВыборкаШапка.Документ);

		УправлениеПечатьюБП.ДополнитьДокументПодписьюИПечатью(ТабличныйДокумент, ВыборкаШапка, ОбъектыПечати, ПараметрыПечати);

	КонецЦикла;

	Возврат ТабличныйДокумент;

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

Функция ПечатьОдногоОбъекта(СсылкаНаОбъект)

	Макет = ПолучитьМакет("ПФ_MXL_Макет");
	ТабДокумент = Новый ТабличныйДокумент;
	ТекущаяОбласть = Макет.ПолучитьОбласть("Шапка");
	ТекущаяОбласть.Параметры.Заполнить(СсылкаНаОбъект);

	Возврат ТабДокумент;

КонецФункции // Печать
```
ТЗ в массив структур (для себя)
Теги: 1С

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

```1c
&НаСервереБезКонтекста
Функция ПреобразоватьВМассивСтруктур(Таблица)

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

	Для каждого СтрокаТЗ Из Таблица Цикл

		// Строка;
		СтруктураДанных = Новый Структура;

		Для каждого КолонкаТЗ Из Таблица.Колонки Цикл
        	ИмяКолонки = КолонкаТЗ.Имя;
			СтруктураДанных.Вставить(ИмяКолонки, СтрокаТЗ[ИмяКолонки]);
		КонецЦикла;

		МассивСтруктур.Добавить(СтруктураДанных);

	КонецЦикла;

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

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

# Примечания

- Проверил быстродействие. ТаблЗначений содержит 100 колонок и 50000 строк.
П2 = ПреобразоватьВМассивСтруктур(ТаблЗначений);	23,776287 секунды
П1 = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблЗначений);	 3,925674 секунды

- (1) Radik13, спасибо за тест
Заготовка на внешнюю обработку (минимум)
Теги: 1С,ВнешняяОбработка,ВнешнийОтчет,Шаблон

Просто вставить в текст модуля объекта внешней обработки...
доработанная версия
Теперь после вставки из шаблона нужно просто в соответствующих функциях указать соответствующие данные обработки. Вмешательства больше никуда не потребуется. Только при доработках менять версию в функции ВерсияОбработки и добавлять строки описаний версии в функции ОписаниеВерсии. Функцию ОписаниеВерсии можно использовать для вывода информации о версиях, например в подсказку надписи версии ```Элементы.ВерсияОбработки.Подсказка = ТекстПодсказки;```
Преобразование объекта в структуру
Теги: 1С,Структура,Конвертация

Функция ОбъектВСтруктуру принимает на вход объект и возвращает структуру с данными полученными из этого объекта

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

```1c
Функция ОбъектВСтруктуру(ОбъектДанных)

	ОбъектКакСтрукутра = Новый Структура;

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

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

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

	Возврат ОбъектКакСтрукутра;

КонецФункции
```
Удалить повторяющиеся элементы массива
Теги: 1С,свертка,Массив,Управление торговлей

Удаление повторяющихся элементов массива в УТ 11. Повзоляет удалить повторяющиеся элементы массива, в отличии от ОбщегоНазначенияКлиентСервер.СвернутьМассив() - делает это с любым по структуре массивом

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

```1c
ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(Массив);
```
Определение внешнего IP адреса (external IP adress)
Теги: 1С,JSON,OneScript.Web,HttpСоединение,Http

1. Используя нативную оболочку powershell;
2. Используя HTTPs взаимодействие 1С.

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

```1c
1. Используем powershell , копируем в консоль: return (Invoke-WebRequest -uri "https://api.ipify.org/").Content
2. 1С (функция - возвращает внешний айпи строкой).

Функция УзнатьВнешнийIPАдресПользователя() Экспорт

	// headers;
	Заголовки  = Новый Соответствие;
	Заголовки.Вставить("Accept", "*/*");
	Заголовки.Вставить("Accept-Encoding", "gzip, deflate, br");
	Заголовки.Вставить("Connection", "keep-alive");
	Заголовки.Вставить("Content-type", "application/json");

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

	// http query;
	ssl = Новый ЗащищенноеСоединениеOpenSSL();

	хост = "api.ipify.org";
	http_соединение = Новый HTTPСоединение(хост,443,,,,,ssl);
	http_запрос = Новый HTTPЗапрос("/", Заголовки);

	Ответ = http_соединение.Получить(http_запрос);
	ТелоСтрокой = Ответ.ПолучитьТелоКакСтроку();

	Возврат ТелоСтрокой;

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

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

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

```1c
// Возвращает таблицу значений на основе текста (формат в примере использования).
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/11
//
// Параметры:
//  Текст - Строка
//
// Возвращаемое значение:
//  ТаблицаЗначений
//
// Пример:
// 	Содержимое =
// 	"Фамилия   |Имя       |Отчество
// 	|
// 	|Смирнов   |Александр |Владимирович
// 	|Иванова   |Мария     |Петровна
// 	|Кузнецов  |Дмитрий   |Александрович";
//
// 	Таблица = ТаблицаЗначенийИзСтроки(Содержимое);
// 	//Таблица будет содержать 3 колонки Фамилия, Имя, Отчество и 3 строки
//
Функция ТаблицаЗначенийИзСтроки(Знач Текст) Экспорт

	Таблица = Новый ТаблицаЗначений();
	ЗаполнитьТаблицуЗначенийИзСтроки(Текст, Таблица, Истина);

	Возврат Таблица;

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

// Заполнить таблицу значений из строки (формат в примере использования)
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/11
//
// Параметры:
//  Текст   - Строка
//  Таблица - ТаблицаЗначений, Неопределено - Таблица или переменная, в которую она будет помещена
//  ДополнятьКолонками - Булево - Нужно ли дополнять колонками таблицу
//
// Пример:
// 	Содержимое =
// 	"Фамилия   |Имя       |Отчество
// 	|
// 	|Смирнов   |Александр |Владимирович
// 	|Иванова   |Мария     |Петровна
// 	|Кузнецов  |Дмитрий   |Александрович";
//
// 	Таблица = Новый ТаблицаЗначений();
// 	Таблица.Колонки.Добавить("Фамилия");
// 	Таблица.Колонки.Добавить("Имя");
//
// 	ЗаполнитьТаблицуЗначенийИзСтроки(Содержимое, Таблица, Истина);
// 	//Таблица будет содержать 3 колонки Фамилия, Имя, Отчество и 3 строки
//
Процедура ЗаполнитьТаблицуЗначенийИзСтроки(Знач Текст, Знач Таблица = Неопределено, Знач ДополнятьКолонками = Ложь) Экспорт

	Если Таблица = Неопределено Тогда
		Таблица = Новый ТаблицаЗначений();
	КонецЕсли;

	ЧислоСтрок   = СтрЧислоСтрок(Текст);
	ИменаКолонок = Новый Массив; // Массив из Строка
	Разделитель  = "|";

	Для НомерСтроки = 1 По ЧислоСтрок Цикл

		СтрокаТекста = СтрПолучитьСтроку(Текст, НомерСтроки);
		Если ПустаяСтрока(СтрокаТекста) Тогда
			Продолжить;
		КонецЕсли;

		ЧастиСтроки = СтрРазделить(СтрокаТекста, Разделитель, Истина);
		ЗаполненыКолонки = ЗначениеЗаполнено(ИменаКолонок);

		Если ЗаполненыКолонки Тогда
			СтрокаТаблицы = Таблица.Добавить();
		КонецЕсли;

		Для ИндексЧасти = 0 По ЧастиСтроки.Количество() - 1 Цикл

			ЧастьСтроки = СокрЛП(ЧастиСтроки[ИндексЧасти]);

			Если ПустаяСтрока(ЧастьСтроки) Тогда
				Продолжить;
			КонецЕсли;

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

		КонецЦикла;

	КонецЦикла;

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