arefaste/1C_Forums huggingface dataset:
Преобразование строки в число
Теги: 1С,Преобразование,СтрокаВЧисло

Не вызывает исключение

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

```1c
// функция преобразует строку в число, примеры:
// 315 руб. = 315
// 1 007,30 м2 (квадратный метр) = 1007,3
// -12.5% = -12,5
// ,05 = 0,05
// пустая строка или пробелы = 0
Функция грв_СтрокаВЧисло(Знач СтрокаЧисло) Экспорт

	Результат = "";
	Для Индекс = 1 По СтрДлина(СтрокаЧисло) Цикл
		Символ = Сред(СтрокаЧисло, Индекс, 1);
		КодСимвола = КодСимвола(Символ);
		Если ((КодСимвола >= 48 И КодСимвола <= 57) Или (Символ = "-" И Индекс = 1) Или (Символ = ",") Или (Символ = ".") Или (Символ = " ") Или (КодСимвола = 160)) Тогда
			Если КодСимвола <> 32 И КодСимвола <> 160 Тогда
				Результат = Результат + Символ;
			КонецЕсли;
		Иначе
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Результат = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(Результат);

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

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

# Примечания

- Все это можно сделать двумя строками:
		ОписаниеТипа = Новый ОписаниеТипов("Число");
		Результат = ОписаниеТипа.ПривестиЗначение(СтрокаЧисло);

- (1) Сахипов Данил, к сожалению нельзя, в первых 3 приведенных примерах результатом этих 2 строк будет 0
// 315 руб. = 315
// 1 007,30 м2 (квадратный метр) = 1007,3
// -12.5% = -12,5

- (2) RomanVG, Ну тогда так:
Результат = XMLЗначение(Тип("Число"), СтрокаЧисло);
Получить количество строк динамического списка
Теги: 1С,Динамический список,количество,Форма

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

```1c
// Возвращает количество строк динамического списка
//
// Параметры:
//  ЭтаФорма - ФормаКлиентскогоПриложения - Форма клиентского приложения
//  Список	 - строка - имя динамического списка
//
// Возвращаемое значение:
//  Строка - количество строк в динамическом списке
//
Функция ПосчитатьКоличествоВДинамСписке(ЭтаФорма, Список) Экспорт

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

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

	Запрос = Новый Запрос;
	Запрос.Текст = МакетКомпоновки.НаборыДанных.НаборДанныхДинамическогоСписка.Запрос;

	ПозВыбратьНачало = СтрНайти(Запрос.Текст, "ВЫБРАТЬ ", НаправлениеПоиска.СКонца);
	Пока НЕ ПозВыбратьНачало = 1
		и НЕ Сред(Запрос.Текст, ПозВыбратьНачало - 1, 1) = Символы.ПС Цикл
		ПозВыбратьНачало = СтрНайти(Запрос.Текст, "ВЫБРАТЬ ", НаправлениеПоиска.СКонца, ПозВыбратьНачало - 1);
	КонецЦикла;
	ПозВыбратьКонец = СтрНайти(Запрос.Текст, Символы.ПС,, ПозВыбратьНачало);

	СтрокаВЫБРАТЬ = Лев(Запрос.Текст, ПозВыбратьКонец);
	СтрокаИз = Сред(Запрос.Текст, СтрНайти(Запрос.Текст, Символы.ПС + "ИЗ" + Символы.ПС,, ПозВыбратьКонец));

	Если СтрНайти(СтрокаИз, Символы.ПС + "СГРУППИРОВАТЬ") Тогда
		СтрокаИз = Лев(СтрокаИз, СтрНайти(СтрокаИз, Символы.ПС + "СГРУППИРОВАТЬ"));
	КонецЕсли;

	Запрос.Текст = СтрокаВЫБРАТЬ + "Количество(*) КАК Кол" + СтрокаИз;
	Если СтрНайти(Запрос.Текст, Символы.ПС + "УПОРЯДОЧИТЬ ПО",, ПозВыбратьКонец) Тогда
		Запрос.Текст = Лев(Запрос.Текст, СтрНайти(Запрос.Текст, Символы.ПС + "УПОРЯДОЧИТЬ ПО",, ПозВыбратьКонец));
	КонецЕсли;

	Для Каждого парам из МакетКомпоновки.ЗначенияПараметров Цикл
		Запрос.УстановитьПараметр(парам.Имя, парам.Значение);
	КонецЦикла;

	Попытка
		Результат = Запрос.Выполнить();
	Исключение
		ЗаписьЖурналаРегистрации("КоличествоВСписке в Списке " + ЭтаФорма.ИмяФормы, УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
	КонецПопытки;

	Выборка = Результат.Выбрать();
	Выборка.Следующий();

	Возврат Выборка.Кол;

КонецФункции
```
Восстановить положение окна программно
Теги: 1С,положение,Управляемое приложение,Окно

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

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

# Примечания

- Аналог такой формы есть в УПП, - в обработке ДокументооборотСКонтролирующимиОрганами есть форма ПросмотрHTML.
Пример ее использования:
	Содержимое = "<h1>Сообщение с тегами HTML</h1>";
	ФормаПросмотраHTML = Обработки.ДокументооборотСКонтролирующимиОрганами.ПолучитьФорму("ПросмотрHTML");
	//ФормаПросмотраHTML.ИмяФайла = "";
	ФормаПросмотраHTML.Содержимое = Содержимое;
	ФормаПросмотраHTML.ОткрытьМодально();

В реквизите формы "Содержимое" помимо строки с HTML может быть URL.
А если передать в него ДвоичныеДанные или ХранилищеЗначения, то потребуется реквизит ИмяФайла - в который будет записано содержимое и отображено в форме.
Функция преобразует Массив из структур в ТаблицуЗначений
Теги: 1С,ТаблицаЗначений,Структура,Таблица значений,Массив

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

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

    тзДанные = Новый ТаблицаЗначений;

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

		Если тзДанные.Колонки.Количество() = 0 Тогда
            Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
                тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ);
            КонецЦикла;
        КонецЕсли;

        НоваяСтрока = тзДанные.Добавить();
        Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
            НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение;
        КонецЦикла;
    КонецЦикла;

    Возврат тзДанные;

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

Получение указанного порядкового рабочего дня к дате

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

```1c
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000000
	Календарь.ДатаКалендаря КАК ДатаКалендаря
ПОМЕСТИТЬ БанковскиеДниКалендаря
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ
	(Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
			ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))

УПОРЯДОЧИТЬ ПО
	Календарь.ДатаКалендаря

ИНДЕКСИРОВАТЬ ПО
	Календарь.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ДАТАВРЕМЯ(2022, 4, 1) КАК ДатаДокумента,
	5 КАК ДнейОтсрочки
ПОМЕСТИТЬ ТаблицаОплат

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ДАТАВРЕМЯ(2022, 4, 9),
	7
;

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

Сравнение Таблиц Значений  две Таблицы

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

```1c
// Предварительно надо отсортировать обе таблицы по одному и тому же уникальному ключу
	СтрВнутр_СтараяТЗ = ЗначениеВСтрокуВнутр(тзСтарыеПартииГТД.Скопировать());
	СтрВнутр_НоваяТЗ  = ЗначениеВСтрокуВнутр(тзНовыеПартииГТД.Скопировать());

	Если СтрВнутр_СтараяТЗ <> СтрВнутр_НоваяТЗ Тогда
```
Транспонировать таблицу значений
Теги: 1С,Таблица значений

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

```1c
Функция ТранспонироватьТЗ(ТЗ)

	ТЗ2 = Новый ТаблицаЗначений;
	Массив = ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0]); // первая колонка содержит названия новых колонок
	ТЗ2.Колонки.Добавить(ТЗ.Колонки[0].Имя); // старые названия колонок сохраним в первой колонке

	Для Каждого Значения из Массив Цикл
		ТЗ2.Колонки.Добавить(СокрЛП(Значения));
	КонецЦикла;

	Для Сч = 1 По ТЗ.Колонки.Количество() - 1 Цикл
		ТЗ2.Добавить();
		ТЗ2[Сч - 1][ТЗ.Колонки[0].Имя] = ТЗ.Колонки[Сч].Имя;
	КонецЦикла;

	СчетчикСтрок = -1;
	Для каждого стр из Тз Цикл
		СчетчикСтрок = СчетчикСтрок + 1;
		Мас = Новый Массив;
		Для Сч = 1 По ТЗ.Колонки.Количество() - 1 Цикл
			Мас.Вставить(Сч - 1, стр[Сч]);
		КонецЦикла;
		ТЗ2.ЗагрузитьКолонку(Мас, ТЗ2.Колонки[СчетчикСтрок + 1]);
	КонецЦикла;

	Возврат ТЗ2;

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

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

```1c
&НаСервере
Функция ПолучитьТЗизДинамическогоСписка()

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

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

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

	ТабЗначений = Новый ТаблицаЗначений;

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВывода.УстановитьОбъект(ТабЗначений);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

	Возврат ТабЗначений;

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

Предлагаю свой вариант добавления нового поля в текст запроса динамического списка и добавление этого поля на форму.

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

```1c
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ЧастиЗапроса = СтрРазделить(Список.ТекстЗапроса, ",");
	ЧастиЗапроса.Вставить(1, "СправочникКонтрагенты.ПометкаУдаления");
	Список.ТекстЗапроса = СтрСоединить(ЧастиЗапроса, ",");

	НовыйЭлемент  = Элементы.Добавить("СписокПометкаУдаления", Тип("ПолеФормы"), Элементы.Список);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
	НовыйЭлемент.ПутьКДанным = "Список.ПометкаУдаления";

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

# Примечания

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

С помощью построителя запросов

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

```1c
// ТаблицаОтборов - Таблица значений с колонками
// ИмяОтбора - Строка
// ВидСравнения - ВидСравнения
// Значение - Any
// Возвращает отфильтрованную таблицу значений

Функция ОтфильтроватьТаблицуЗначений(ТаблицаЗначенийДляФильтрации, ТаблицаОтборов)

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

	Для Каждого СтрокаКоллекции Из ТаблицаОтборов Цикл
		Отбор                     = Построитель.Отбор.Добавить(СтрокаКоллекции.ИмяОтбора);
		Отбор.ВидСравнения        = СтрокаКоллекции.ВидСравнения;
		Отбор.Использование       = Истина;
		Отбор.Значение            = СтрокаКоллекции.Значение;
	КонецЦикла;

	Возврат Построитель.Результат.Выгрузить();

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

# Примечания

- Доброго времени суток. Почему "ПостроительОтчета", а не "ПосмтроительЗапроса"?

- (1) Дмитрий Бертман, Прошу прощения, это опечатка. Разумеется должен быть ПостороительЗапроса. Исправлено. Спасибо за замечание!
Определить это Linux или Windows
Теги: 1С

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

```1c
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоLinux = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 ИЛИ СистемнаяИнформация.ТипПлатформы.Linux_x86_64;
```
Добавление контекста к сообщению об ошибке в ЖР (Журнале регистрации)
Теги: 1С,ЖурналРегистрации

Данный шаблон можно временно втыкать в расширении (в режиме "вместо"), если отладка не доступна, а подробности падения узнать хочется.
Преобразование unixtime в 1С Дата (Unix Time Stamp)
Теги: 1С,Дата,unixtime

# Примечания

- Откуда у вас такая цифра космическая получилась "637746530810000000"?
637746530810000000 / 86400 (количество секунд в сутках) / 365 (условно количество дней в году) = 20222809830 лет, на какой вы результат рассчитывали добавляя это число?) Чтобы получить 09.12.2021 13:24:41 из дата(1970,1,1,0,0,0) нужно добавить 1 639 056 281. Вы видимо не то значение приняли за время unixtime.

- (1) Zloyka, а вот и нет, от разработчиков узнал что это число дата в unixtime. Это микроконтролер записывает данные при событии.

- (2) Washington, unixtime это количество секунд прошедшее начиная с 01.01.1970.
https://ru.wikipedia.org/wiki/Unix-время
А вот конвертер
https://i-leon.ru/tools/time
Попробуйте конвертировать ваше число)
Ткните вашего разработчика в эту статью, в этот конвертер и в ваше число.
А вот Unix Time в прямом эфире https://www.unixtimestamp.com/index.php

- (2) Washington, timestamp может быть в секундах, милли, микро и наносекундах. Ваш похож на timestamp в наносекундах. Посмотрите документацию по контроллеру. В зависимости от этого уже делить на необходимое количество разрядов.
Как правильно посоветовали выше, есть онлайн конвертеры для проверки.
Вот еще один https://www.epochconverter.com/

- Насколько я понимаю, это не совсем unixtime
Дата1С =  '00010101'+637746530810000000 / 10000000; //09.12.2021 13:24:41
Похоже на   ToUniversalTime() в Microsoft .NET

- (5) Aleks.spb, да, действительно похоже на Ticks. Если выполнить преобразование в DateTime то получается 2021-12-09​T13:24:41
Проверить можно в онлайн конвертере https://tickstodatetime.azurewebsites.net/
Судя по всему у Вас верный ответ ))

- (5) Aleks.spb, Вот спасибо Вам огромное, всё четко работает . А разработчик так и не дал внятного ответа.
Выбор файла управляемое приложение
Теги: 1С,Управляемое приложение,Файл

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

```1c
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр 			= НСтр("ru=’Книга Excel 97 (*.xls)|*.xls|Книга Excel 2007 (*.xlsx)|*.xlsx'");
	Диалог.Заголовок 		= НСтр("ru=’Выберите файл Excel'");
	ОповещениеЗавершения 	= Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект);

	Диалог.Показать(ОповещениеЗавершения);

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

&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Если ВыбранныеФайлы <> Неопределено Тогда

		ПутьКФайлу = ВыбранныеФайлы[0];

	КонецЕсли;

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

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

```1c
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

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

КонецПроцедуры
```
Проверка на роль пользователя
Теги: 1С

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

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

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

	Если Пользователь = Неопределено Тогда
		Пользователь = ПользователиКлиентСервер.ТекущийПользователь();
	КонецЕсли;

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

	Запрос.УстановитьПараметр("Пользователь", Пользователь);
	Запрос.УстановитьПараметр("Роль", ИмяРоли);

	УстановитьПривилегированныйРежим(Истина);
	РезультатЗапроса = Запрос.Выполнить();
	УстановитьПривилегированныйРежим(Ложь);

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

КонецФункции
```
Цены на дату документа продажи
Теги: 1С,Цены,Запрос

Получить цены номенклатуры на дату документа продажи

# Примечания

- Roman Klochkov предложил в группе Telegram вариант через временную таблицу:
ВЫБРАТЬ
    Цены.Период,
    Цены.Номенклатура,
    Цены.Цена
ПОМЕСТИТЬ ВТЦены
ИЗ РегистрСведений.ЦеныНоменклатуры КАК Цены
ГДЕ Цены.ТипЦен = &ТипЦен И Цены.Период > &НачалоПериода И Цены.Период <= &КонецПериода

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    &НачалоПериода,
    Цены.Номенклатура,
    Цены.Цена
ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&НачалоПериода, ТипЦен = &ТипЦен) КАК Цены

;

ВЫБРАТЬ
    Продажи.Период,
    Продажи.Контрагент,
    Продажи.Номенклатура,
    Продажи.КоличествоОборот КАК Количество,
    Продажи.СтоимостьОборот КАК Стоимость,
    ЦеныНоменклатуры.Цена
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦены КАК ЦеныНоменклатуры
        ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И (ЦеныНоменклатуры.Период В
                (ВЫБРАТЬ МАКСИМУМ(Цены.Период)
                ИЗ
                    ВТЦены КАК Цены
                ГДЕ
                    Цены.Период <= Продажи.Период
                    И Цены.Номенклатура = Продажи.Номенклатура))
Пересекаются ли два интервала
Теги: 1С

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

```1c
Пересекаются = Ложь;
Если Макс(Начало1, Начало2) < Мин(Конец1, Конец2) Тогда
    Пересекаются = Истина;
КонецЕсли;
```

# Примечания

- Может лучше так?

Пересекаются = Макс(Начало1, Начало2) < Мин(Конец1, Конец2)
Программно свернуть все уровни группировок табличного документа
Теги: 1С,ТабличныйДокумент

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

```1c
КоличествоУровней = ЭлементыФормы.ПолеТабличногоДокумента1.КоличествоУровнейГруппировокСтрок() - 1;
Для Уровень = 1 По КоличествоУровней  Цикл
    ЭлементыФормы.ПолеТабличногоДокумента1.ПоказатьУровеньГруппировокСтрок(КоличествоУровней - Уровень);
КонецЦикла;

КоличествоУровней = ЭлементыФормы.ПолеТабличногоДокумента1.КоличествоУровнейГруппировокКолонок() - 1;
Для Уровень = 1 По КоличествоУровней Цикл
    ЭлементыФормы.ПолеТабличногоДокумента1.ПоказатьУровеньГруппировокКолонок(КоличествоУровней - Уровень);
КонецЦикла;
```
Как сохранять и восстанавливать настройки системы компоновки данных
Теги: 1С,СКД,XML

Через XML файл

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

```1c
//Сохранение настроек в файл может быть выполнено следующим образом (листинг 6.40):
//Листинг 6.40. Сохранение настроек
Процедура СохранитьНастройки(Кнопка)

    Настройки  = ОтчетОбъект.КомпоновщикНастроек.Настройки;
    НовыйСXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
    Путь = СокрЛП(Константы.ПутьДоФайлов.Получить());

    Запись = Новый ЗаписьXML;

    Запись.ОткрытьФайл(Путь + "\config.xml");
    Запись.ЗаписатьОбъявлениеXML();

    НовыйСXDTO.ЗаписатьXML(Запись, Настройки, НазначениеТипаXML.Явное, ФормаXML.Элемент);

    Запись.Закрыть();

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

//Восстановление настроек из файла может быть выполнено следующим образом (листинг 6.41):
//Листинг 6.41. Восстановление настроек
Процедура ВосстановитьНастройки(Кнопка)

    Чтение = Новый ЧтениеXML;
    НовыйСXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
    Путь = СокрЛП(Константы.ПутьДоФайлов.Получить());

    Чтение.ОткрытьФайл(Путь + "\config.xml");

    Настройки = НовыйСXDTO.ПрочитатьXML(Чтение);

    ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

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

//В константе ПутьДоФайлов хранится путь до файла сохраняемых (восстанавливаемых) настроек.

//(с) Простые примеры разработки
```

# Примечания

- складывать в реквизит объекта данных с типом хранилищезначения?
а с файлом чтобы не связываться - в памяти все компоновать (в Новый ПотокВПамяти())?
получилось бы гораздо интереснее imho
Добавить водяной знак (изображение) в табличный документ
Теги: 1С,Водяной знак,Картинка,ТабличныйДокумент

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

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

```1c
// ТабДок уже должен быть сформирован на момент добавления изображения поверх текста

Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

// Высота и ширина заданы по желанию, можете задать свои значения.
Рисунок.Картинка = БиблиотекаКартинок.Успешно; // Взял любую картинку из конфы для демонстрации. Фон должен быть прозрачный
Рисунок.Высота = 25;
Рисунок.Ширина = 25;
Рисунок.ЦветФона = Новый Цвет(); // Необходимо, чтобы 1С не заливала фон по умолчанию

// Расположить рисунок по центру изображения

Рисунок.Верх = ТабДок.ВысотаТаблицы/2;
Рисунок.Лево = ТабДок.ШиринаТаблицы/2 + Рисунок.Ширина/2;
```
Отправка почты с вложением БСП
Теги: 1С,Файл,Вложения,БСП,Почта

Пример использования функции отправки почты из БСП и преобразования табличного документа в pdf без использования временных файлов. Требуется заполненная системная учетная запись в справочнике УчетныеЗаписиЭлектроннойПочты

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

```1c
Функция ОтправитьТабличныйДокументЭлектроннойПочтойКакPDF(УчетнаяЗаписьПочтыОтправителя, ПочтаПолучателя, ТекстПисьма, ТемаПисьма, АдресТабличногоДокументаВоВременномХранилище)

Отправлено = Ложь;

	Если УчетнаяЗаписьПочтыОтправителя = Неопределено Или УчетнаяЗаписьПочтыОтправителя.Пустая() Тогда

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

	КонецЕсли;

	ТабДок = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);

	ПотокФайла = Новый ПотокВПамяти();
	ТабДок.Записать(ПотокФайла, ТипФайлаТабличногоДокумента.PDF);

	ДвоичныеДанныеФайла = ПотокФайла.ЗакрытьИПолучитьДвоичныеДанные();

	ВременноеХранилищеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, Новый УникальныйИдентификатор);

	Вложения = Новый Массив;

	ОписаниеВложения = Новый Структура("Представление, АдресВоВременномХранилище", ТекстПисьма + ".pdf", ВременноеХранилищеФайла);

	Вложения.Добавить(ОписаниеВложения);

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

	Попытка

		Идентификатор = РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗаписьПочтыОтправителя, ПараметрыПисьма);

		Если ЗначениеЗаполнено(Идентификатор) Тогда

			Отправлено = Истина;

		КонецЕсли;

	Исключение

		ЗаписьЖурналаРегистрации("Отправка письма " + ПочтаПолучателя, УровеньЖурналаРегистрации.Ошибка,,,ОписаниеОшибки());

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

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

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