arefaste/1C_Forums huggingface dataset:
Отбор по таблице значений
Теги: Отбор,таблица значений,ТаблицаЗначений,1С,ТЗ

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

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

```1c
СтруктураОтбора = Новый Структура("Номенклатура,ХарактеристикаНоменклатуры", ЗначениеОтбора.Номенклатура, ЗначениеОтбора.ХарактеристикаНоменклатуры);
РезультатОтбора = ТаблицаЗначений.НайтиСтроки(СтруктураОтбора);
//Если РезультатОтбора.Количество() > 0 Тогда
//	СтрокаОтбора = РезультатОтбора[0];
//КонецЕсли;
Для каждого СтрокаОтбора Из РезультатОтбора Цикл

КонецЦикла;
```
Чтение файлов Excel в таблицу значений (автоматическое наименование столбцов)
Теги: Таблица значений,1С,Excel,чтение Excel

Функция считывает содержимое страницы файла Excel в таблицу значений, автоматически именует столбцы таблицы по первой строке файла. Пробелы заменяются на "".

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

```1c
&НаСервере
Функция ПодготовитьТаблицуСДанными(ФайлАдресВХранилище)

	ИмяФайлаСервер = ПолучитьИмяВременногоФайла(".xlsx");
	ФайлИмпорта = ПолучитьИзВременногоХранилища(ФайлАдресВХранилище);
	ФайлИмпорта.Записать(ИмяФайлаСервер);

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

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

	ТаблицаПромежуточныхДанных = ПЗ.Результат.Выгрузить();

	Возврат	ТаблицаПромежуточныхДанных;

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

# Примечания

- Если в экселевской таблице будут объединённые ячейки, будет беда при использовании построителя - значений будут задваиваться. Я наверное свой метод парсера выложу. Он может слегка медленнее, но там эта ситуация решена

- (2) Bezeus, я жду твой метод)

- ФайлИмпорта (ИмяФайлаСервер) лучше удалять после обработки.

- (2) Bezeus, я тоже жду твой метод)
Чтение XML файла
Теги: XML,ЧтениеXML,1С,XDTO

Чтение XML файла по объектно. (Экономим память, не читаем файл полностью, а отдельными блоками)

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

```1c
ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(ИмяФайлаНаСервере);
	Пока ЧтениеXML.Прочитать() Цикл
		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
			Если ЧтениеXML.Имя = "Товар" Тогда // Считываем номенклатуру в XDTO
				ДанныеТовараXML = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
				НоменклатураОбъект = Справочники.Номенклатура.СоздатьОбъект();
				//  Заполняем реквизиты номенклатруы данными объекта XDTO
				НоменклатураОбъект.Записать();
				Сообщение = Новый СообщениеПользователю;
				Сообщение.Текст = "Создана:" + НоменклатураОбъект.Наименование;
				Сообщение.Сообщить();
			Иначе
				ЧтениеXML.Прочитать();
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	ЧтениеXML.Закрыть();
```
Получение данных динамического списка
Теги: динамический список,СКД,1С

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

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

```1c
	Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
```
Таблица значений
Теги: таблица значений,1С,ТЗ

обход таблицы и работа с ней по условию

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

```1c
//Создаем таблицу значений
	ТабЗнч = Новый ТаблицаЗначений;
	ТабЗнч.Колонки.Добавить("Наименование");
	ТабЗнч.Колонки.Добавить("Значение");

	//Заполняем ТЗ
	Для н=1 По 100 Цикл

		СтрокаТЗ = ТабЗнч.Добавить();
		СтрокаТЗ.Наименование = "Н"+н;
		СтрокаТЗ.Значение = "К"+н;

		//Здесь каждый 10-й элемент делаем дубляжом
		Если (н%10)=0 Тогда
			СтрокаТЗ2 = ТабЗнч.Добавить();
			СтрокаТЗ2.Наименование = "Н"+н;
			СтрокаТЗ2.Значение = "К"+н;
		КонецЕсли;

	КонецЦикла;

	//Перебираем заполненное ТЗ
	Для й=0 По ТабЗнч.Количество()-1 Цикл

		//Не даем провалиться индексу за грани
		Если й>ТабЗнч.Количество()-1 Тогда

			Прервать;

		КонецЕсли;

		//Пропускаем первый элемент
		Если й=0 Тогда

			Продолжить;

		КонецЕсли;

		//Ну и собственно сравниваем значения текущего с предыдущем
		Если ТабЗнч[й].Наименование = ТабЗнч[й-1].Наименование Тогда

			ТабЗнч[й-1].Значение = ТабЗнч[й-1].Значение + ", " + ТабЗнч[й].Значение;

			ТабЗнч.Удалить(й);

		КонецЕсли;

	КонецЦикла;
```
Прибавить к дате день
Теги: 1С,Дата

Прибавить, добавить, дата, день

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

```1c
&НаСервереБезКонтекста
Функция ПрибавитьКДатеДень(Дата, КоличествоДней = 1)

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Дата", Дата);
	Запрос.УстановитьПараметр("КоличествоДней", КоличествоДней);
	Запрос.Текст =
		"ВЫБРАТЬ
		|	ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, &КоличествоДней) КАК Дата";

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

КонецФункции
```
Обход иерархии справочника 2
Теги: 8.3,иерархия,1С,Выборка

Иерархия добавим в массив

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

```1c
Функция ПолучитьВерхнегоРодителяНоменклатуры(мНом)

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

		Выборка = ЗапросПодразделения.Выполнить().Выбрать();
		МассивРодителей = Новый Массив;
		Пока Выборка.Следующий() Цикл

			Если Выборка.Ссылка.ЭтоГруппа Тогда
				МассивРодителей.Добавить(Выборка.Ссылка);
			КонецЕсли;
		КонецЦикла;
Возврат МассивРодителей
```
Заполнение реквизитов формы из ТЧ
Теги: 8.3,1С,Работа с формой

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

```1c
//обход элементов формы и сравнение с реквизитами табличной части ПараметрыСегментации
Для Каждого Стр Из Объект.ПараметрыСегментации Цикл

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

			Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда

				Если Элемент.Имя = Стр.ЗаголовокПоля Тогда

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

			ИначеЕсли ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда

				//Получаем наименование табличной части из макета
				Позиция = Найти(Стр.ЗаголовокПоля,".");
				Если Позиция <> 0 Тогда

					ТЧИмя = Лев(Стр.ЗаголовокПоля, Позиция-1);
					Если Элемент.Имя = ТЧИмя Тогда

						ЗаголовокПоля = СтрЗаменить(Стр.ЗаголовокПоля,Лев(Стр.ЗаголовокПоля,Позиция),"");
						УстановитьЗначениеЭлементаТабличнойЧасти(ТЧИмя,ЗаголовокПоля,Стр.ЗначениеПоля);

					КонецЕсли;

				КонецЕсли;

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;


&НаСервере
Процедура УстановитьЗначениеЭлемента(ИмяЭлемента,ЗначениеЭлемента)

	ПутьКДаннымЭлемента = ВернутьПутьКДаннымЭлемента(ИмяЭлемента);
	Если Лев(ПутьКДаннымЭлемента,7) = "Объект." Тогда

		ПутьКДаннымЭлемента = СтрЗаменить(ПутьКДаннымЭлемента,"Объект.","");
		Объект[ПутьКДаннымЭлемента] = ЗначениеЭлемента;

	Иначе

		ЭтаФорма[ПутьКДаннымЭлемента] = ЗначениеЭлемента;

	КонецЕсли;

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


&НаСервере
Процедура УстановитьЗначениеЭлементаТабличнойЧасти(ТЧИмя,ИмяЭлемента,ЗначениеЭлемента)

	ПутьКДаннымТЧ = ВернутьПутьКДаннымЭлемента(ТЧИмя);

	Если Лев(ПутьКДаннымТЧ,7) = "Объект." Тогда

		ПутьКДаннымТЧ = СтрЗаменить(ПутьКДаннымТЧ,"Объект.","");
		Если Объект[ПутьКДаннымТЧ].Количество() = 0 Тогда

			СтрокаТЧ = Объект[ПутьКДаннымТЧ].Добавить();
			СтрокаТЧ[ИмяЭлемента] = ЗначениеЭлемента;

		Иначе

			СтрокаТЧ = Объект[ПутьКДаннымТЧ].Получить(0);
			СтрокаТЧ[ИмяЭлемента] = ЗначениеЭлемента;

		КонецЕсли;

	Иначе

		Если ЭтаФорма[ПутьКДаннымТЧ].Количество() = 0 Тогда

			СтрокаТЧ = ЭтаФорма[ПутьКДаннымТЧ].Добавить();
			СтрокаТЧ[ИмяЭлемента] = ЗначениеЭлемента;

		Иначе

			СтрокаТЧ = ЭтаФорма[ПутьКДаннымТЧ].Получить(0);
			СтрокаТЧ[ИмяЭлемента] = ЗначениеЭлемента;

		КонецЕсли;

	КонецЕсли;

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

&НаСервере
Функция ВернутьПутьКДаннымЭлемента(ИмяЭлемента)

	Возврат Элементы[ИмяЭлемента].ПутьКДанным;

КонецФункции
```
Подключение к Firebird
Теги: FB,SQL,1С,Firebird

Firebird

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

```1c
	Если ЭлементыФормы.ФайлИмпорта.Значение = "" Тогда
		Предупреждение("Неуказан файл");
		Возврат;
	КонецЕсли;
	СтрокаПодключения =  "Driver=Firebird/InterBase(r) driver;" ;
	СтрокаПодключения = СтрокаПодключения + "Dbname=Localhost:"+ ЭлементыФормы.ФайлИмпорта.Значение + ";";
	СтрокаПодключения = СтрокаПодключения + "UID=SYSDBA;PWD=masterkey;CHARSET=WIN1251";
	// Подключаемся к базе данных
	Connection = Новый COMОбъект("ADODB.Connection");
	Connection.ConnectionTimeout = 15;
	Connection.CursorLocation = 3;
	Connection.ConnectionString = СтрокаПодключения;
	Connection.Open();
	Сообщить("Соединение успешно уставнолено !!!");
```
Количество дублей элементов справочника
Теги: 1С,запрос,дубли

Запрос позволяет получить количество элементов с разными ссылками, но одинаковым наименованием

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

```1c
ВЫБРАТЬ
        Товары.Наименование КАК Наименование,
        КОЛИЧЕСТВО(Товары.Ссылка) КАК КоличествоДублей
ИЗ
        Справочник.Товары КАК Товары
СГРУППИРОВАТЬ ПО
        Товары.Наименование
ИМЕЮЩИЕ КОЛИЧЕСТВО(Товары.Ссылка) > 1
```
Обработка Журнала Регистрации
Теги: Регистрации,sqlite,1С,Журнал

Работа с журналом регистрации sqlite

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

```1c
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DRIVER=SQLite3 ODBC Driver;Database=" + ФайлЖурналаРегистрации + ";BigInt=1;";
ВнешниеИсточникиДанных.ЖурналРегистрации.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.ЖурналРегистрации.УстановитьСоединение();

Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
               |    ЗаписиЖурнала.Код,
               |    ЗаписиЖурнала.Важность,
               |    ЗаписиЖурнала.Дата,
               |    ЗаписиЖурнала.СтатусТранзакции,
               |    ЗаписиЖурнала.ДатаТранзакции,
               |    ЗаписиЖурнала.ИдентификаторТранзакции,
               |    ЗаписиЖурнала.Пользователь,
               |    ЗаписиЖурнала.Пользователь.Код,
               |    ЗаписиЖурнала.Пользователь.Наименование,
               |    ЗаписиЖурнала.Компьютер.Код,
               |    ЗаписиЖурнала.Компьютер.Наименование,
               |    ЗаписиЖурнала.Приложение.Код,
               |    ЗаписиЖурнала.Приложение.Наименование,
               |    ЗаписиЖурнала.Событие.Код,
               |    ЗаписиЖурнала.Событие.Наименование,
               |    ЗаписиЖурнала.Комментарий,
               |    ЗаписиЖурнала.Данные,
               |    ЗаписиЖурнала.ПредставлениеДанных,
               |    ЗаписиЖурнала.РабочийСервер,
               |    ЗаписиЖурнала.РабочийСервер.Код,
               |    ЗаписиЖурнала.РабочийСервер.Наименование,
               |    ЗаписиЖурнала.ОсновнойПорт,
               |    ЗаписиЖурнала.ВспомогательныйПорт
               |ИЗ
               |    ВнешнийИсточникДанных.ЖурналРегистрации.Таблица.ЗаписиЖурнала КАК ЗаписиЖурнала";

ТаблицаДанных = Запрос.Выполнить().Выгрузить();
ВнешниеИсточникиДанных.ЖурналРегистрации.РазорватьСоединение();

//ОбычнаяДата = '00010101000000' + 635453673444260/10000; //03.09.2014 18:55:44
```
Распределить Сумму Пропорционально Коэффициентам
Теги: Коэффициент,1С,Пропорция,Распределить

Функция РаспределитьСуммуПропорциональноКоэффициентам

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

```1c
// Выполняет пропорциональное распределение суммы в соответствии
// с заданными коэффициентами распределения.
//
// Параметры:
//  РаспределяемаяСумма - Число - сумма, которую надо распределить;
//  МассивКоэффициентов - Массив - коэффициенты распределения;
//  Точность - Число - точность округления при распределении. Необязателен.
//
// Возвращаемое значение:
//  Массив - массив размерностью равный массиву коэффициентов, содержит
//           суммы в соответствии с весом коэффициента (из массива коэффициентов).
//           В случае если распределить не удалось (сумма = 0, кол-во коэффициентов = 0,
//           или суммарный вес коэффициентов = 0), тогда возвращается значение Неопределено.
//

Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач РаспределяемаяСумма, Коэффициенты, Знач Точность = 2) Экспорт

    Если Коэффициенты.Количество() = 0 или Не ЗначениеЗаполнено(РаспределяемаяСумма) Тогда
        Возврат Неопределено;
    КонецЕсли;

    ИндексМаксимальногоКоэффициента = 0;
    МаксимальныйКоэффициент = 0;
    РаспределеннаяСумма = 0;
    СуммаКоэффициентов  = 0;
    Для Индекс = 0 По Коэффициенты.Количество() - 1 Цикл
        Коэффициент = Коэффициенты[Индекс];
        АбсолютноеЗначениеКоэффициента = ?(Коэффициент > 0, Коэффициент, -Коэффициент);
        Если МаксимальныйКоэффициент < АбсолютноеЗначениеКоэффициента Тогда
            МаксимальныйКоэффициент = АбсолютноеЗначениеКоэффициента;
            ИндексМаксимальногоКоэффициента = Индекс;
        КонецЕсли;
        СуммаКоэффициентов = СуммаКоэффициентов + Коэффициент;
    КонецЦикла;
    Если СуммаКоэффициентов = 0 Тогда
        Возврат Неопределено;
    КонецЕсли;
    Результат = Новый Массив(Коэффициенты.Количество());
    Для Индекс = 0 По Коэффициенты.Количество() - 1 Цикл
        Результат[Индекс] = Окр(РаспределяемаяСумма * Коэффициенты[Индекс] / СуммаКоэффициентов, Точность, 1);
        РаспределеннаяСумма = РаспределеннаяСумма + Результат[Индекс];
    КонецЦикла;
    // Погрешности округления отнесем на коэффициент с максимальным весом.
    Если Не РаспределеннаяСумма = РаспределяемаяСумма Тогда
        Результат[ИндексМаксимальногоКоэффициента] = Результат[ИндексМаксимальногоКоэффициента] + РаспределяемаяСумма - РаспределеннаяСумма;
    КонецЕсли;
    Возврат Результат;
КонецФункции
//в последней строчке делай = общая сумма - уже распределили
```
часть строки
Теги: часть строки,1С,разделитель,ЧастьСтроки

Функция ЧастьСтроки позволяет получить подстрокй из строки с разделителями по номеруу или "последняя"

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

```1c
//******************************************************************************
&НаКлиентеНаСервереБезКонтекста
Функция ЧастьСтроки(Знач ИсхСтрока,Разделитель,НомерЧасти) Экспорт
	ИсхСтрока=СтрЗаменить(ИсхСтрока,Разделитель,Символы.ПС);
	Если Строка(НомерЧасти)="последняя" Тогда
		Возврат СтрПолучитьСтроку(ИсхСтрока,СтрЧислоСтрок(ИсхСтрока));
	Иначе
		Возврат СтрПолучитьСтроку(ИсхСтрока,НомерЧасти);
	КонецЕсли;
КонецФункции
```
Выделенные строки
Теги: 1С,Строки выделенные

Работа с выделенными строками

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

```1c
ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки;
Сумма = 0;
Для Каждого Строка Из ВыделенныеСтроки Цикл
         Сумма = Сумма + Элементы.Список.ДанныеСтроки(Строка).Сумма;
КонецЦикла;
```
Соединение и запрос данных из другой базы 1с
Теги: 1С,V82.COMConnector

делаем запрос в УТ из сторонней базы для поиска документа

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

```1c
//Подключение к внешней базе
&НаСервере
 Функция ПодключитьВнешнийИсточник(СтрокаСоединения, ОбъектПодключения="V82.COMConnector")
	 Попытка
		 Connector = Новый COMОбъект("V82.COMConnector");
		 COM = Connector.connect(СтрокаСоединения);
		 Возврат COM;
	 Исключение
		  Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
		  Возврат Неопределено;
	 КонецПопытки;

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


&НаКлиенте
Процедура Подключение(Команда)
	ПодключениеСервер();
КонецПроцедуры


//Подключение и Выгрузка данных из сторонней базы
&НаСервере
Процедура ПодключениеСервер()
	 Соединение = ПодключитьВнешнийИсточник("Srvr=""ИмяСервера"";Ref=""ИмяБазы"";Usr=""Пользователь"";Pwd=""Пароль"";");
	 Запрос = Соединение.NewObject("Запрос");
	 Запрос.Текст = "ВЫБРАТЬ
		|	РеализацияТоваровУслуг.Номер
		|		ИЗ
		|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		|		ГДЕ
		|	РеализацияТоваровУслуг.Номер =  &Номер";
	Запрос.УстановитьПараметр("Номер",Номер);
	РезультатЗапроса = Запрос.Выполнить().Выгрузить(); //Получили COM объект
	Преобразование = ЗначениеИзСтрокиВнутр(Соединение.ЗначениеВСтрокуВнутр(РезультатЗапроса));  //преобразовали COM объект

	Для каждого стр из Преобразование Цикл
		Сообщить(стр.номер);
	КонецЦикла;

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

# Примечания

- (1) Bezeus, А зачем тогда они это создали?

- (2) iCortezik, для использования на клиенте и для тех случае, когда речь не идёт о linux. Сейчас 2020 год на дворе, на секундочку. Скоро уберут поддержку ftp в браузерах, а вы о com-коннекторах рассуждаете 😃 Раньше вариантов было гораздо меньше, но сейчас уже крайне неактуально.
Связанные документы
Теги: 1С,Связанные документы критерии отбора

Поиск по критериям отбора связанных документов по ссылке
ВыбДок - документ для которого ищем связные

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

```1c
СвязанныеДокументы = КритерииОтбора.СвязанныеДокументы.Найти(ВыбДок);
Для Каждого ТекСвязанныйДокумент из СвязанныеДокументы Цикл
Сообщить(ТекСвязанныйДокумент);
КонецЦикла;
```

# Примечания

- Этот метод не выводит всю цепочку связанных документов. Выведет только пару связанных документов. Далее этим методом нужно перебрать все полученные документы по цепочке и зафиксировать всю цепочку в списке значений. Затем вывести готовый список значений.
Демонстрация асинхр. вызова 01
Теги: 1С

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

```1c
&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
    ОбратныйВызов = Новый ОписаниеОповещения("ПредупреждениеЗавершение", ЭтотОбъект);
    ПоказатьПредупреждение(ОбратныйВызов, "Закрытие формы обрабатывается отдельно");
КонецПроцедуры
&НаКлиенте
Процедура ПредупреждениеЗавершение(ДополнительныеПараметры) Экспорт
    // какие-то действия
КонецПроцедуры
```
Ограничение, одним видом документов, запроса из регистра
Теги: 1С

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

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

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

```1c
// Возвращает менеджер объекта по переданной ссылке.
// Не обрабатываются точки маршрутов бизнес-процессов.
Функция МенеджерОбъектаПоСсылке(Ссылка) Экспорт

	ИмяОбъекта = Ссылка.Метаданные().Имя;

	ТипСсылки = ТипЗнч(Ссылка);

	Если Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат Справочники[ИмяОбъекта];

	ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат Документы[ИмяОбъекта];

	ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат БизнесПроцессы[ИмяОбъекта];

	ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат ПланыВидовХарактеристик[ИмяОбъекта];

	ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат ПланыСчетов[ИмяОбъекта];

	ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат ПланыВидовРасчета[ИмяОбъекта];

	ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат Задачи[ИмяОбъекта];

	ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат ПланыОбмена[ИмяОбъекта];

	ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда

		Возврат Перечисления[ИмяОбъекта];

	Иначе

		Возврат НеОпределено;

	КонецЕсли;

КонецФункции
```
Отправка сообщений от имени бота Telegram
Теги: HttpСоединение,JSON,ПрочитатьJSON,Telegram,ЧтениеJSON,1С

Отправка сообщений от имени бота Telegram

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

```1c
Перем ТекстСообщения;
chat_id=ЭлементыФормы.СправочникСписок.ТекущиеДанные.chat.id;
//chat_id это идентификатор диалога,
//в переменной хранится id пользователя (объект User) с которым ведётся диалог
//https://core.telegram.org/bots/api#user
ВвестиСтроку(ТекстСообщения);
Если НЕ ЗначениеЗаполнено(ТекстСообщения) тогда возврат конецесли;

Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса=Константы.token.Получить()+"/sendMessage";
Запрос.Заголовки=Новый Соответствие();

Соединение = Новый HTTPСоединение("api.telegram.org",,,,,5,Новый ЗащищенноеСоединениеOpenSSL);
ТекстЗапроса="";
ТекстЗапроса=ТекстЗапроса+"&chat_id="+Формат(chat_id,"ЧГ=");
ТекстЗапроса=ТекстЗапроса+"&text="+КодироватьСтроку(ТекстСообщения,СпособКодированияСтроки.КодировкаURL);
//КодироватьСтроку() отсутствует в 8.2 ищите сами как сделать url encode
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос.УстановитьТелоИзСтроки(ТекстЗапроса);
Ответ=Соединение.ОтправитьДляОбработки(Запрос);//POST
КодСостояния=Ответ.КодСостояния;
СтрокаОтвета=Ответ.ПолучитьТелоКакСтроку();

Если КодСостояния=200 тогда
	ЧтениеОтвета=Новый ЧтениеJSON;
	ЧтениеОтвета.УстановитьСтроку(СтрокаОтвета);
	РезультатСтруктура=ПрочитатьJSON(ЧтениеОтвета);
	Если РезультатСтруктура.ok=Истина тогда
		СтруктураMessage=РезультатСтруктура.result;
		//СтруктураMessage это обычная Структура
		//сервер возвращает нам наше сообщение упакованое в объект Message
		//описание объекта Message тут https://core.telegram.org/bots/api#message
	КонецЕсли;
Иначе
	Сообщить("КодСостояния "+КодСостояния);
	Сообщить(СтрокаОтвета);
КонецЕсли;
```
Получение сообщений для бота Telegram
Теги: HttpСоединение,JSON,ПрочитатьJSON,Telegram,ЧтениеJSON,1С

Получение сообщений для бота Telegram

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

```1c
Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса=Константы.token.Получить()+"/getUpdates";
Запрос.Заголовки=Новый Соответствие();

Соединение=Новый HTTPСоединение("api.telegram.org",,,,,5,Новый ЗащищенноеСоединениеOpenSSL);
update_id=Константы.update_id.Получить();
Если ЗначениеЗаполнено(update_id) тогда
	ТекстЗапроса="&offset="+Формат(update_id+1,"ЧГ=");
	Запрос.Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded");
	Запрос.УстановитьТелоИзСтроки(ТекстЗапроса);
	Ответ=Соединение.ОтправитьДляОбработки(Запрос);//POST

	//то же самое GET-запросом
	//Запрос.АдресРесурса=Запрос.АдресРесурса+"?offset="+Формат(update_id+1,"ЧГ=");
	//Ответ=Соединение.Получить(Запрос);//GET
Иначе
	Ответ=Соединение.Получить(Запрос);//GET
КонецЕсли;
КодСостояния=Ответ.КодСостояния;
СтрокаОтвета=Ответ.ПолучитьТелоКакСтроку();

Если КодСостояния=200 тогда
	ЧтениеОтвета=Новый ЧтениеJSON;
	ЧтениеОтвета.УстановитьСтроку(СтрокаОтвета);
	РезультатСтруктура=ПрочитатьJSON(ЧтениеОтвета);
	Если РезультатСтруктура.ok=Истина тогда
		Для сч=1 по РезультатСтруктура.result.Количество() цикл
			ОбъектUpdate=РезультатСтруктура.result[сч-1];
			Константы.update_id.Установить(ОбъектUpdate.update_id);
			СтруктураMessage=ОбъектUpdate.message;
			//СтруктураMessage это обычная Структура
			//описание объекта Message тут https://core.telegram.org/bots/api#message
		КонецЦикла;
	КонецЕсли;
Иначе
	Сообщить("КодСостояния "+КодСостояния);
	Сообщить(СтрокаОтвета);
КонецЕсли;
```