arefaste/1C_Forums huggingface dataset:
Скопировать содержимое документа из Источник в Приемник
Теги: 1С,Документы

Если есть спецы по стандартам  кода, с удовольствием "выслушаю" критику и внесу исправления

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

```1c
&НаСервере
Процедура СкопироватьСодержимоеДокумента(Приемник, Источник, Исключения="")
	Попытка
		МетаданныеДокумента = Источник.Метаданные();
	Исключение
		МетаданныеДокумента = Приемник.Метаданные();
	КонецПопытки;
	//: Приемник = Документы.ЧекККМ.СоздатьДокумент();

	// Удалим из строки исключений наименования свойств, которые отсутствуют в реквизитах документа
	Исключения_ = ОбработатьСтрокуРеквизитов(Исключения, МетаданныеДокумента.Реквизиты);

	ЗаполнитьЗначенияСвойств(Приемник, Источник, , Исключения_);

	Для Каждого ТекТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
		ТекТЧИмя = ТекТЧ.Имя;

		// Удалим из строки исключений наименования свойств, которые отсутствуют в реквизитах табличной части
		Исключения_ = ОбработатьСтрокуРеквизитов(Исключения, МетаданныеДокумента.ТабличныеЧасти[ТекТЧИмя].Реквизиты);

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

Функция ОбработатьСтрокуРеквизитов(СтрокаРеквизитов, РеквизитыМетаданные)

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

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

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

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

```1c
Функция ЕстьЛиКолонкаВСтрокеТЗ(ИмяКолонки, СтрокаТаблицыЗначений)
	УИД = Новый УникальныйИдентификатор();
	ВременнаяСтруктура = Новый Структура(ИмяКолонки, УИД);
	ЗаполнитьЗначенияСвойств(ВременнаяСтруктура, СтрокаТаблицыЗначений);
	Возврат ВременнаяСтруктура[ИмяКолонки] <> УИД;
КонецФункции
```

# Примечания

- У строки ТЗ есть свойство "Владелец", по которому можно добраться и до колонок...

- (1) max.im, Владелец доступен, начиная с версии 8.1.
Может кто-то на 8.0 сидит еще ))
Защита кода 1С. Основные методы защиты конфигураций и обработок
Теги: 1С,Обфускатор,Обфускация,Защита конфигураций 1С,Защита расширений 1С,Защита,Защита обработок 1С

В этой статье мы рассмотрим различные способы защиты кода разработок 1С 8.3 от взлома и нелицензионного использования.
Добавление данных по регистру в документ "Перенос данных" в ЗУП
Теги: 1С,ЗУП

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

```1c
&НаСервере
Процедура ДелоНаСервере()

	Док = Документы.ПереносДанных.СоздатьДокумент();
	Док.Дата = ТекущаяДата();
	Док.ПериодРегистрации = Период.ДатаНачала;

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

	Запрос.УстановитьПараметр("ДатаНачала", Период.ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", Период.ДатаОкончания);

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

	ДокументОбъект = Док;

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

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

	Пока Выборка.Следующий() Цикл
		СтрокаНз = Нз.Добавить();
		СтрокаНз.Период = Выборка.ДатаНачала;
		СтрокаНз.Активность = Истина;
		СтрокаНз.Сотрудник = Выборка.СотрудникГоловнойСотрудник;
		СтрокаНз.ПорядокРасчета = Перечисления.ПорядокРасчетаСреднегоЗаработкаОбщий.Постановление2010;
		СтрокаНз.ОтработаноДней = Выборка.ОтработаноДней;
		СтрокаНз.ОтработаноЧасов = Выборка.ОтработаноЧасов;
	КонецЦикла;

	ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
	Сообщение = Новый СообщениеПользователю();
	Сообщение.Текст = "Создан документ " + ДокументОбъект;
	Сообщение.КлючДанных = ДокументОбъект.Ссылка;
	Сообщение.ПутьКДанным = "Объект";
	Сообщение.Сообщить();


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

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

```1c
&НаКлиенте
Функция ПолучитьМассивПринтеров()

    МассивПринтеров = Новый Массив;

    Попытка
        objWMIService = ПолучитьCOMОбъект("winmgmts:\\.\root\CIMV2");
    Исключение
        ТекстСообщения = НСтр("ru = 'Список принтеров не доступен!'");
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
        Возврат МассивПринтеров;
    КонецПопытки;

    Выборка = objWMIService.ExecQuery("SELECT * FROM Win32_Printer",,48);

    Для Каждого objItem Из Выборка Цикл
        МассивПринтеров.Добавить(objItem.Caption);
    КонецЦикла;

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

# Примечания

- Сергей Пилиповец, в группе ВК, предложил еще такой вариант:

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

Принтеры = Новый COMОбъект("WScript.Network");

Prn = Принтеры.EnumPrinterConnections();

нн = 0;

КоличествоПринтеров = Prn.Count() - 1;

Пока нн < КоличествоПринтеров Цикл
    СписокПринтеров.Добавить(Prn.Item(нн + 1));
    нн = нн + 2;
КонецЦикла;
Индикатор отчета для Обычных форм
Теги: 1С,Обычные формы,Индикатор

Статус показать вывести выводить обработка обработки индикатор индикация прогресса

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

```1c
Процедура СформироватьОтчет(Кнопка)
    Элем = ЭлементыФормы.Добавить(Тип("Индикатор"), "Инд1", Истина);
    Элем.Верх = ЭтаФорма.Высота - 20;
    Элем.Высота = 25;
    Элем.Ширина = 150;
    Элем.ОтображатьПроценты = Истина;
    Элем.МинимальноеЗначение = 1;
    Элем.МаксимальноеЗначение = 100;
    Состояние( "Выводим данные отчета");

    Для сч = 1 по 100 Цикл
        Для ф=1 по 1000 Цикл
           //спим

        КонецЦикла;
       //ваш алгоритм обновления индикатора

        Элем.Значение = сч;
        ЭтаФорма.Обновить();
    КонецЦикла;

    ЭлементыФормы.Удалить(Элем);
КонецПроцедуры
```

# Примечания

- Для ф=1 по 1000 Цикл
	 //спим

КонецЦикла;

Это зачем?
Как узнать, чем занято место на диске (Windows)
Теги: 1С,Утилиты,Администрирование

Как быстро найти, что занимает больше всего места на диске.

# Примечания

- Еще очень понравилась программа SpaceSniffer http://www.uderzo.it/main_products/space_sniffer/index.html
Маленькая, портативная, шустрая и бесплатная

Скачана почти 4млн раз ))
Общие элементы массивов
Теги: 1С,Массив

Функция возвращает общие элементы (пересечение) двух массивов

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

```1c
Функция ОбщиеЭлементыМассивов(Массив1, Массив2)

	Результат = Новый Массив;

	Для каждого ЭлементМассива Из Массив1 Цикл
		Если Массив2.Найти(ЭлементМассива) <> Неопределено И
				Результат.Найти(ЭлементМассива) = Неопределено Тогда
			Результат.Добавить(ЭлементМассива);
		КонецЕсли;
	КонецЦикла;

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

КонецФункции // ОбщиеЭлементыМассивов()
```

# Примечания

- Зачем здесь второй цикл?

- (1) mailrum2004, Действительно не понятно зачем 😉 Если задача получить общие для двух массивов элементы, то первый цикл, прекрасно выполнит свою работу.

- Добавил вариант без второго цикла, т.к. он действительно не нужен. Но может мы ошибаемся и автор объяснит его назначение ))
Функция ОбщиеЭлементыМассивов(Массив1, Массив2)

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

КонецФункции // ОбщиеЭлементыМассивов()

- Второй цикл действительно не нужен ))
Поправил
Ключ менеджера записи регистра сведений
Теги: 1С,Ключ,Менеджер записи,Ключ записи,Желтый Чайник 1С,Запись,Регистр сведений

Возвращает ключ менеджера записи регистра сведений на основе данных измерений

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

```1c
// Возвращает ключ менеджера записи регистра сведений на основе данных измерений
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/33
//
// Параметры:
//  ДанныеЗаписи	- РегистрСведенийМенеджерЗаписи, Структура, Произвольный - коллекция с данными записи
//  ИмяРегистра		- Строка - Имя регистра. Если не передано, то метаданные регистра берутся из ДанныеЗаписи
//
// Возвращаемое значение:
//  РегистрСведенийКлючЗаписи
//
// Пример:
//
//	ДанныеЗаписи = Новый Структура;
//	ДанныеЗаписи.Вставить("Измерение", "Тест");
//
//	Результат = КлючМенеджераЗаписиРегистраСведений(
//		ДанныеЗаписи, Метаданные.РегистрыСведений.ЖЧТ_РегистрСведений.Имя);
//
Функция КлючМенеджераЗаписиРегистраСведений(Знач ДанныеЗаписи, Знач ИмяРегистра = "") Экспорт

	Если ПустаяСтрока(ИмяРегистра) Тогда
		МетаданныеРегистра = Метаданные.НайтиПоТипу(ТипЗнч(ДанныеЗаписи));
	Иначе
		МетаданныеРегистра = Метаданные.РегистрыСведений[ИмяРегистра];
	КонецЕсли;

	ЗначенияКлюча = Новый Структура("Период", '00010101');

	Для Каждого ОписаниеИзмерения Из МетаданныеРегистра.Измерения Цикл
		ЗначенияКлюча.Вставить(ОписаниеИзмерения.Имя);
	КонецЦикла;

	ЗаполнитьЗначенияСвойств(ЗначенияКлюча, ДанныеЗаписи);

	Возврат РегистрыСведений[МетаданныеРегистра.Имя].СоздатьКлючЗаписи(ЗначенияКлюча);

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

# Примечания

- а если регистр не периодический - зачем период?
Добавить таблицу в менеджер временных таблиц
Теги: 1С,Запрос,Запросы,Менеджер временных таблиц,Желтый Чайник 1С,МенеджерВременныхТаблиц

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

```1c
// Добавляет таблицу в менеджер временных таблиц
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/31
//
// Параметры:
//  МенеджерВременныхТаблиц	 - МенеджерВременныхТаблиц - Менеджер, в который нужно добавить таблицу
//  ИмяТаблицы				 - Строка - Имя временной таблицы
//  ДанныеТаблицы			 - ТаблицаЗначений - Данные таблицы
//
// Пример:
//	ДобавитьТаблицуВМенеджерВременныхТаблиц(Запрос.МенеджерВременныхТаблиц, "ВТ_ТЗ", ТаблицаЗначений);
//
Процедура ДобавитьТаблицуВМенеджерВременныхТаблиц(Знач МенеджерВременныхТаблиц, Знач ИмяТаблицы, Знач ДанныеТаблицы) Экспорт

	ТекстЗапроса = "ВЫБРАТЬ * ПОМЕСТИТЬ %1 ИЗ &ТЗ КАК ТЗ";
	ТекстЗапроса = СтрШаблон(ТекстЗапроса, ИмяТаблицы);
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("ТЗ", ДанныеТаблицы);
	Запрос.Выполнить();

КонецПроцедуры
```
Узнать версию платформы
Теги: 1С,COM

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

```1c
СисИнфо = Новый СистемнаяИнформация;

Если Лев(СисИнфо.ВерсияПриложения, 3) = "8.2" Тогда
	V8Com = Новый COMОбъект("V82.Application");
Иначе
	V8Com = Новый COMОбъект("V83.Application");
КонецЕсли;
```
Проверка изменения полей регистра сведений ПередЗаписью, кеширование средствами БСП
Теги: 1С,Регистр сведений,БСП,Перед записью

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

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

```1c
Процедура ПередЗаписью(Отказ, Замещение)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	ИмяИсточника = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Новый Структура("Пользователь, Отборы", ИмяПользователя(), Отбор.Задача.Значение));

	Если ЭтотОбъект.Количество() = 0 Тогда

		ОбщегоНазначения.СкопироватьВБуферОбмена(ПолучитьНачальныеДанные(Отбор.Задача.Значение), ИмяИсточника);

	Иначе

		БуферОбмена = ОбщегоНазначения.СтрокиИзБуфераОбмена();
		Если БуферОбмена.Источник = ИмяИсточника Тогда // новая запись
			НачальныеДанные = БуферОбмена.Данные;
		Иначе
			НачальныеДанные = Неопределено;
		КонецЕсли;

		ТекущаяДата = ТекущаяДата();

		Для каждого Запись Из ЭтотОбъект Цикл

			ТекНачальныеДанные = ?(НачальныеДанные = Неопределено, Неопределено, НачальныеДанные.Найти(Запись.Задача, "Задача"));

			Если ТекНачальныеДанные = Неопределено Тогда // запись создана
				Запись.ДатаСоздания = ТекущаяДата;
				Продолжить;
			КонецЕсли;

			Если ЗначениеЗаполнено(Запись.Ссылка)
				И НЕ Запись.Ссылка = ТекНачальныеДанные.Ссылка Тогда // получена новая ссылка
				Запись.ДатаПолученияСсылки = ТекущаяДата;
			КонецЕсли;

		КонецЦикла;

		// очистим буфер обмена
		ОбщегоНазначения.СкопироватьВБуферОбмена(Неопределено, ИмяИсточника);

	КонецЕсли;

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

Функция ПолучитьНачальныеДанные(Задачи)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	*
	|ИЗ
	|	РегистрСведений.ЗадачиДляОбмена КАК ЗадачиДляОбмена
	|ГДЕ
	|	ЗадачиДляОбмена.Задача В (&Задачи)";

	Запрос.УстановитьПараметр("Задачи", Отбор.Задача.Значение);

	Возврат Запрос.Выполнить().Выгрузить();

КонецФункции
```
Разложить массив по типам объектов
Теги: 1С,Структура,Массив

Функция раскладывает массив в структуру

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

```1c
Функция РазложитьМассивПоТипамОбъектов(МассивОбъектов)
	СтруктураТипов 	= Новый Структура;

	Для Каждого Объект Из МассивОбъектов Цикл

		МетаданныеДокумента = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
		Если МетаданныеДокумента <> Неопределено Тогда

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

	КонецЦикла;

	Возврат СтруктураТипов;

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

Возвращает имена колонок таблицы, по которым во всех строках пустые значения

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

```1c
// Возвращает имена колонок таблицы, по которым во всех строках пустые значения
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/30
//
// Параметры:
//  ТаблицаЗначений - ТаблицаЗначений - Таблица, в которой нужно найти пустые колонки
//
// Возвращаемое значение:
//  Массив из Строка - Коллекция имен пустых колонок
//
// Пример:
// 	ТЗ = Новый ТаблицаЗначений;
// 	ТЗ.Колонки.Добавить("К1");
// 	ТЗ.Колонки.Добавить("К2");
// 	ТЗ.Добавить();
//
// 	Результат = ПустыеКолонкиТаблицыЗначений(ТЗ); //"К1,К2"
//
// 	ТЗ[0].К1 = 1;
// 	Результат = ПустыеКолонкиТаблицыЗначений(ТЗ); //"К2"
//
// 	ТЗ[0].К2 = 1;
// 	Результат = ПустыеКолонкиТаблицыЗначений(ТЗ); //""
//
Функция ПустыеКолонкиТаблицыЗначений(Знач ТаблицаЗначений) Экспорт

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

	Для Каждого ТекущиеДанные Из ТаблицаЗначений Цикл

		ЗаполненныеКолонки = Новый Массив; // Массив из Строка
		Для Каждого ИмяКолонки Из Результат Цикл

			Если ЗначениеЗаполнено(ТекущиеДанные[ИмяКолонки]) Тогда
				ЗаполненныеКолонки.Добавить(ИмяКолонки);
			КонецЕсли;

		КонецЦикла;

		Для Каждого ЗаполненнаяКолонка Из ЗаполненныеКолонки Цикл
			Результат.Удалить(Результат.Найти(ЗаполненнаяКолонка));
		КонецЦикла;

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

	КонецЦикла;

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

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

Порой нужно проверить что переменная имеет именно то описание типа что требуется в документации

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

```1c
чАртикул = 100000000000;
ТипДанныхДолженБыть  = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный));

РезультатПриведения  = ТипДанныхДолженБыть.ПривестиЗначение(чАртикул);

булПроверка = РезультатПриведения = чАртикул;
```
Как получить атрибут ХМЛ
Теги: 1С,ЕГАИС,УТМ,ХМЛ

# Примечания

- Кажется при живом ДокументDOM в платформе пользоваться Msxml2 это очень странно. Уж не говоря о том, что в этой задаче и DOM то оверкил, нужно потоковое чтение использовать.
Отображает PDF документ в HTML поле на форме через WebKit
Теги: 1С,HTML,pdf,УФ

Осторожнее с пересылкой кода через мессенджеры/форумы, могут испортиться теги.

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

```1c
//Процедура отображает PDF документ в HTML поле на форме через WebKit:
//
// Параметры:
//  HTMLДокумент - Поле HTML документа - поле, в которое надо вывести pdf.
//
//	ДвоичныеДанные - Двоичные данные - pdf документ.
//
Процедура ОтобразитьPDF(HTMLДокумент, ДвоичныеДанные) Экспорт

	СтрокаPDFФайла = ПолучитьBase64СтрокуИзДвоичныхДанных(ДвоичныеДанные);

	HTMLДокумент = "<!DOCTYPE html>
				|<html>
				|	<head>
				|		<meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" />
				|		<meta name=""viewport"" content=""width=device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=no"">
				|		<script src=""https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.4.456/pdf.min.js""></script>
				|		<script src=""https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.4.456/pdf.worker.min.js""></script>
				|		<canvas id=""the-canvas""></canvas>
				|		<script>
				|			var currPage = 1; //Pages are 1-based not 0-based
				|			var numPages = 0;
				|			var thePDF = null;
				|
				|			var loadingTask = pdfjsLib.getDocument({data: atob(`" + СтрокаPDFФайла + "`)});
				|			loadingTask.promise.then(function(pdf) {
				|
				|			     thePDF = pdf;
				|			     numPages = pdf.numPages;
				|
				|			     pdf.getPage(1).then(handlePages);
				|
				|			     function handlePages(page) {
				|			        var scale = 1.5;
				|
				|			        var viewport = page.getViewport({scale: scale});
				|
				|			        var canvas = document.createElement( ""canvas"" );
				|			        canvas.style.display = ""block"";
				|			        var context = canvas.getContext('2d');
				|			        canvas.height = viewport.height;
				|			        canvas.width = viewport.width;
				|
				|			        var renderContext = {
				|			              canvasContext: context,
				|			              viewport: viewport
				|			        };
				|			        var renderTask = page.render(renderContext);
				|
				|			         document.body.appendChild( canvas );
				|
				|			        currPage++;
				|			        if ( thePDF !== null && currPage <= numPages )
				|			        {
				|			            thePDF.getPage( currPage ).then( handlePages );
				|			        }
				|			       };
				|
				|			});
				|		</script>
				|	</body>
				|</html>";

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

# Примечания

- Здравствуйте! Добавьте, пожалуйста, в Вашу публикацию , .
Показать вопрос
Теги: 1С,ПоказатьВопрос

Диалог подтверждения действия пользователем

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

```1c
&НаКлиенте
Процедура КомандаСпроситьУПользователя(Команда)

	Оповещение = Новый ОписаниеОповещения("КомандаСпроситьУПользователяЗавершение", ЭтаФорма, Неопределено);
	ТекстВопроса = "Будет выполнено некое действие. Продолжить?";
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);

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

&НаКлиенте
Процедура КомандаСпроситьУПользователяЗавершение(Результат, ДополнительныеПараметры = Неопределено) Экспорт

	Если Результат = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;

        // Сделать что нужно

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

# Примечания

- Добавьте пожалуйста в создание оповещения структуру ДополнительныеПараметры , чтобы не дописывать каждый раз
Вызов процедур или функций модуля объекта из модуля формы
Теги: 1С,Форма,УФ

Когда из модуля формы нужно вызвать экспортную процедуру или функцию из его же модуля объекта

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

```1c
&НаСервере
Процедура ПодключитьсяНаСервере()

	ТекОбъект = РеквизитФормыВЗначение("Объект");//Для отчета "Отчет"
	ТекОбъект.ЭкспортныйВызовИзМодуляОбъекта();

	//если содержимое Объект поменялось и нужно обновить его на форме, то делаем:
	ЗначениеВРеквизитФормы(ТекОбъект, "Объект");

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

# Примечания

- &НаСервере
Перем ОбработкаОбъект;
&НаСервере
Функция ОбработкаОбъект()
  Если ОбработкаОбъект = Неопределено Тогда    
    СтруктураОбработки = ПолучитьИзВременногоХранилища(Объект.ОбщийКонтекстКлиентСервер.АдресОбработкаОбъект);    
    Если СтруктураОбработки <> Неопределено Тогда
      ОбработкаОбъект = СтруктураОбработки.ОбработкаОбъект;
    КонецЕсли;    
    Если ОбработкаОбъект = Неопределено Тогда      
      ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
      Попытка
        ПоместитьВоВременноеХранилище(Новый Структура("ОбработкаОбъект", ОбработкаОбъект), Объект.ОбщийКонтекстКлиентСервер.АдресОбработкаОбъект);
      Исключение
      КонецПопытки;      
    Иначе
      ОбработкаОбъект.ОбщийКонтекстКлиентСервер = Объект.ОбщийКонтекстКлиентСервер;
    КонецЕсли;    
  КонецЕсли;    
  Возврат ОбработкаОбъект;  
КонецФункции
Скриншот сеанса средствами 1С
Теги: 1С,Сеанс,Желтый Чайник 1С,Скриншот,Пользователь

Процедура сохраняет скриншот текущего сеанса пользователя по переданному адресу.
Работает из клиента 1С на УФ (начиная с версии 8.3.17)

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

```1c
// Процедура сохраняет скриншот текущего сеанса пользователя по переданному адресу
// Работает начиная с версии 8.3.17.
//
// Параметры:
//  ПолныйПуть	 - Строка	 - Полный путь к файлу
//
&НаКлиенте
Процедура СохранитьСкриншотСеанса(ПолныйПуть = "")

	#Если НЕ ВебКлиент Тогда

	ВременныйФайл = ПолучитьИмяВременногоФайла(".zip");

	ОтчетОбОшибке = Новый ОтчетОбОшибке(ИнформацияОбОшибке());
	ОтчетОбОшибке.Записать(ВременныйФайл, Ложь);

	КаталогФайлов = КаталогВременныхФайлов() + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
	ЧтениеАрхива  = Новый ЧтениеZipФайла(ВременныйФайл);
	ЧтениеАрхива.ИзвлечьВсе(КаталогФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);

	ПутьСкриншота = КаталогФайлов + "\screenshot.png";
	КопироватьФайл(ПутьСкриншота, ПолныйПуть);

	УдалитьФайлы(ВременныйФайл);
	УдалитьФайлы(КаталогФайлов);

	#КонецЕсли

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

# Примечания

- Как оказалось, для получения скриншота в настройках базы должно быть указано:
"Управление настройками обработки ошибок" - "Снимок окон приложения" установить в "Отправлять".
Не переносите код таким образом
Теги: 1С,Нюанс,Код,Совет,Желтый Чайник 1С,Ошибка,Стандарт

Как нельзя переносить текст кода

# Примечания

- А я бы еще имена сделал покороче и поинформативнее. Чтобы не было длинных и бессмысленных названий)