Публикации

БСП
Разработки

Переменные среды (windows)

Ищет переменные среды (системные, локальные, временные)
// Функция - Переменные среды
//
// Параметры:
//  Тип	 - Строка - "System" - переменные среды операционной системы.
//					"User" - переменные среды пользователя.
//					"Volatile" - временные переменные.
//					"Process" - переменные среды текущего командного окна.
// 
// Возвращаемое значение:
//   - Соответствие, содержащая переменные среды
//
Функция ПеременныеСреды(Тип = "System") Экспорт
	
	Перем Оболочка;
	
	сПеременныеСреды = Новый Соответствие;
	
	Если ЭтоКлиентWindows() Тогда
		
		Попытка
			Оболочка = Новый COMОбъект("WScript.Shell");
			КоллекцияПеременных = Оболочка.Environment(Тип);
		Исключение
			Сообщить("Не удалось подключить компоненту 'WScript.Shell' по причине: "+ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
			Возврат сПеременныеСреды;
		КонецПопытки;
		
		Для каждого ЭлКоллекции Из КоллекцияПеременных Цикл
			
			Если НЕ ЗначениеЗаполнено(ЭлКоллекции) Тогда
				Продолжить;
			КонецЕсли; 
			
			МассивЧастей = РазложитьСтрокуВМассив(ЭлКоллекции, "=");
			
			Если МассивЧастей.Количество() = 2 Тогда
				сПеременныеСреды.Вставить(МассивЧастей.Получить(0), МассивЧастей.Получить(1));
			КонецЕсли; 
			
		КонецЦикла; 
		
		Оболочка = Неопределено;

	КонецЕсли; 
		
	Возврат сПеременныеСреды;
	
КонецФункции

Чтение значения атрибута узла XML или объекта XDTO

Позволяет произвести чтение значения атрибута узла/объекта xdto по имени, с помощью Фабрики XDTO. В конце пример использования. При чтении XML фабрикой XDTO во всех названиях узлов и свойств имеющих знак тире "-", платформа автоматически меняет тире на нижнее подчеркивание. Этот нюанс учтен в функции.
Функция ЗначениеСвойстваXDTO(ОбъектXDTO, Имя)

	ВариантИмени = СтрЗаменить(Имя, "-", "_");
	
	Значение = Неопределено;
	
	ИмяПоиска = Неопределено;
	
	Если ТипЗнч(ОбъектXDTO) = Тип("ОбъектXDTO") Тогда
		
		Свойства = ОбъектXDTO.Свойства();
		
		Для Каждого Свойство Из Свойства Цикл
			
			Если Свойство.Имя = Имя Тогда 
				
				ИмяПоиска = Имя;
				
				Прервать;
				
			ИначеЕсли Свойство.Имя = ВариантИмени Тогда
				
				ИмяПоиска = ВариантИмени;
				
				Прервать;
				
			КонецЕсли;
			
		КонецЦикла;
		
		Если ИмяПоиска <> Неопределено Тогда 
			
			Если ТипЗнч(ОбъектXDTO[ИмяПоиска]) = Тип("СписокXDTO") Тогда
				
				Значение = ОбъектXDTO.ПолучитьСписок(ИмяПоиска);
				
			Иначе
				
				Значение = ОбъектXDTO.ПолучитьXDTO(ИмяПоиска);
				
			КонецЕсли;
						
			Если ТипЗнч(Значение) = Тип("ЗначениеXDTO") Тогда
				
				Значение = Значение.Значение;
			
			КонецЕсли;
						
		КонецЕсли;
		
	ИначеЕсли ТипЗнч(ОбъектXDTO) = Тип("ЗначениеXDTO") Тогда
		
		Значение = ОбъектXDTO.Значение;
		
	КонецЕсли;

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

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

// ИСПОЛЬЗОВАНИЕ
//
// На входе имеем XML. И нам нужно получить значение атрибута "message"

СтрокаXML = "
| <response>
| <payment message='Техническая ошибка'>
|  <from>
|    <amount>0.00</amount>
|  </from>
| </payment>
| </response>";

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

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

Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

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

Платеж = ЗначениеСвойстваXDTO(Данные, "payment");

Если Платеж <> Неопределено Тогда
	
	Ошибка = ЗначениеСвойстваXDTO(Платеж, "message");  // Ошибка = "Техническая ошибка"

	Сообщить(Ошибка);

КонецЕсли;

TurboConf - расширение Конфигуратора 1С Промо

TurboConf повышает эффективность работы в Конфигураторе 1С и помогает программисту автоматизировать свои задачи.
bolsun
-30%

Сообщение с открытием только что созданного документа

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

Соединяем план и факт

Коллеги добрый вечер. Составляю отчет на СКД "Анализ расхода продуктов питания". Отчёт должен сравнивать фактические расходы продуктов с плановыми показателями. Ниже набросок Запроса (набора данных) ВЫБРАТЬ РасходПродуктовПоКДОбороты.Учреждение, РасходПр...
SDV 35 7

Обращение к имени субконто по COM

Субконто.PredefinedDataName

Менеджер ссылки по менеджеру объектов

Преобразует Справочники.Банки в СправочникСсылка.Банки
Функция МенеджерСсылкиПоМенеджеруМД(МенеджерМД)
    Результат = Неопределено;
    
    ПозицияТочки = Найти(МенеджерМД, ".");
    Результат    = Лев(МенеджерМД,   ПозицияТочки - 2) + "Ссылка" + Сред(МенеджерМД, ПозицияТочки);
    
    Возврат Результат;
КонецФункции

&НаСервере
Процедура МенеджерОбъектаСтрокойПриИзмененииНаСервере()
    МенеджерСсылка = МенеджерСсылкиПоМенеджеруМД(Объект.МенеджерОбъектовСтрокой);
    Элементы.Ссылка.ОграничениеТипа = Новый ОписаниеТипов(МенеджерСсылка);
КонецПроцедуры

Сопоставления объектов проводок в базе-приемнике БП3 по COM-соединению

Функция СчетБазы(База,КодСчета,Предопределенный = Истина)
    Если Предопределенный Тогда
        Результат = База.ПланыСчетов.Хозрасчетный[КодСчета];
    Иначе
        Результат = База.ПланыСчетов.Хозрасчетный.НайтиПоКоду(КодСчета);
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Функция СубконтоБазы(База,ИмяСубконто,Предопределено = Истина,ИмяПВХСубконто = "ВидыСубконтоХозрасчетные")
    Если Предопределено = Истина Тогда
        Результат = База.ПланыВидовХарактеристик[ИмяПВХСубконто][ИмяСубконто];            
    Иначе
        Результат = База.ПланыВидовХарактеристик[ИмяПВХСубконто].НайтиПоНаименованию(ИмяСубконто);
    КонецЕсли;
    Возврат Результат;    
КонецФункции

Процедура УстановитьСубконтоБазы(База,Счет, Субконто, ИмяСубконто, ЗначениеСубконто)
    База.БухгалтерскийУчет.УстановитьСубконто(Счет, Субконто, ИмяСубконто, ЗначениеСубконто);
КонецПроцедуры

Проверка поля на существование

buketoff 32 6
Если Документ.Метаданные().Реквизиты.Найти("ИмяРеквизита") = Неопределено Тогда
     Сообщить("Поле ИмяРеквизита отсутствует");
КонецЕсли;

Открытие настроек профилей безопасности в БСП

РаботаВБезопасномРежимеКлиент.ОткрытьДиалогНастройкиИспользованияПрофилейБезопасности();

Открытие значения текущей строки колонки ТабличногоПоля на УФ

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    ИмяПоля = Сред(Поле.Имя,СтрДлина(Элемент.Имя) + 1);
    ПоказатьЗначение(Новый ОписаниеОповещения, Элемент.ТекущиеДанные[ИмяПоля]);
КонецПроцедуры

Сервер взаимодействия 1С на Python

Разработай сервер взаимодействия для 1C на Python за 5 часов!
bolsun 37 4
-27%

Создание схемы компоновки данных программно

Функция на вход принимает Запрос, Текст запроса, таблицу значений и дерево значений
miha 7 1
// Пример универсальной функции для создания схемы компоновки данных
// Опубликовал Дмитрий Иванов (kambl) в раздел Программирование - Практика программирования
// http://infostart.ru/public/575659/
//
// Если вам приходится часто создавать схему компоновки данных программно или вы начинающий специалист и пытаетесь разобраться, что же за зверь такой СКД, то эта статья может оказаться вам полезной. Функция создает схему компоновки с минимально необходимой структурой данных. С помощью передачи дополнительных параметров есть возможность добавления ресурсов и оформления.
// Появилась необходимость часто прибегать к программному созданию схемы компоновки данных. Было принято решение написать универсальную функцию принимающую различные наборы данных и на выходе возвращающую готовую СКД. Функция на вход принимает Запрос, Текст запроса, таблицу значений и дерево значений.
// Помимо набора данных функция принимает ряд необязательных параметров:
//
//  Структура ресурсов: содержит перечень полей ресурсов, где ключ - ИмяПоля, Значение(Строка) - Агрегатная функция ("Сумма", "Среднее", "Количество",  и т.д.);
//  Флаг АвтоЗаполнениеДоступныхПолей;
//  Строковое Имя макета оформления.
//
// НаборДанных (Типы: Строка, Запрос, ТаблицаЗначений, ДеревоЗначений)
// Искомый набор данных
//
// СтруктураРесурсов (Тип: Структура) - Структура полей ресурсов, где ключ - ИмяПоля, Значение(Строка) - Агрегатная функция
//
// ВноситьПоляВыбора (Тип: Булево) - Флаг добавление полей набора
//
// ИмяСтандартногоМакетаОформления (Тип: Строка) - Имя макета оформления
//
Функция СоздатьСхемуКомпоновкиДанных(НаборДанных, СтруктураРесурсов = Неопределено, АвтоЗаполнениеДоступныхПолей = Истина, ИмяСтандартногоМакетаОформления = "")
	СКД = Новый СхемаКомпоновкиДанных;

	// Заполнение основных данных схемы
	ИсточникДанных = СКД.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя                = "ИсточникДанных";
	ИсточникДанных.ТипИсточникаДанных = "Local";

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

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

		ТипНабора = "Объект";
	Иначе
		Возврат Неопределено;
	КонецЕсли;

	НастройкиПоУмолчанию = СКД.НастройкиПоУмолчанию;

	// Создание структуры.
	// Группировка, детальные записи и автовыбранное поле
	Группировка = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	Группировка.Использование = Истина;

	АвтоПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	АвтоПоле.Использование = Истина;

	КоллекцияКолонок = Новый ТаблицаЗначений;
	КоллекцияКолонок.Колонки.Добавить("Имя");
	КоллекцияКолонок.Колонки.Добавить("ТипЗначения");
	КоллекцияКолонок.Колонки.Добавить("Заголовок");

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

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

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

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

		// Удалим Неопределено и NULL
		Массив = Новый Массив;
		Для Каждого ТекущийТип Из НоваяКолонка.ТипЗначения.Типы() Цикл
			Если ТекущийТип = Тип("Неопределено") ИЛИ ТекущийТип = Тип("NULL") ИЛИ
			     ТекущийТип = Неопределено ИЛИ ТекущийТип = Null Тогда
				Продолжить;
			КонецЕсли;
			Массив.Добавить(ТекущийТип);
		КонецЦикла;
		ПолеНабора.ТипЗначения = Новый ОписаниеТипов(Массив, НоваяКолонка.ТипЗначения.КвалификаторыЧисла,
		                                             НоваяКолонка.ТипЗначения.КвалификаторыСтроки,
		                                             НоваяКолонка.ТипЗначения.КвалификаторыДаты);

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

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

	Возврат СКД;
КонецФункции  // СоздатьСхемуКомпоновкиДанных

Изменение видимости колонок табличной части по параметру свойству таблицы "ПланыВидовРасчета"

Алгоритм позволяет управлять видимостью колон в зависимости от значения в данной колонке. Например, если в строке, в колонке "Вид расчета" введен объект "Прогул", то колонка "Параметр" должна изменить видимость. Не используются функ опции. НаКлиенте...

Создать запись в регистре сведений

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

Код для переноса данных

//Перед загрузкой данных
ТаблицаДокументов = Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить("Ссылка");
ТаблицаДокументов.Колонки.Добавить("Действие");
Параметры.Вставить("ТаблицаДокументов",ТаблицаДокументов);

//После загрузки объекта
Если ИмяТипаОбъекта = "Документ"
    И Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда

    Если Не ОбъектНайден  Тогда
        Объект.Записать();
        ОбъектМодифицирован = Ложь;
    КонецЕсли;

    НоваяСтрока =  Параметры.ТаблицаДокументов.Добавить();
    НоваяСтрока.Ссылка = Объект.Ссылка;

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

После загрузки данных
ТекстСообщенияЗаписи = "";
ТекстСообщенияОшибки = "";

Для каждого СтрокаТч Из Параметры.ТаблицаДокументов Цикл
  
  Если СтрокаТч.Действие = "Отмена"  И Не СтрокаТч.Ссылка.Проведен Тогда
    Если СтрокаТч.Ссылка.ПометкаУдаления Тогда  //Для снятия пометки удаления
      Попытка
        ДокОбъект = СтрокаТч.Ссылка.ПолучитьОбъект();
        ДокОбъект.ПометкаУдаления = Ложь;
        ДокОбъект.Записать();
      Исключение
      КонецПопытки;
    КонецЕсли;
    
    Продолжить;
    
  КонецЕсли;
  
  Если СтрокаТч.Действие = "Проведение" Тогда
    РежимЗаписи = РежимЗаписиДокумента.Проведение;
  Иначе
    РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
  КонецЕсли;
  
  Попытка
    ДокОбъект = СтрокаТч.Ссылка.ПолучитьОбъект();
    Если (СтрокаТч.Действие <> "Удаление" Или  СтрокаТч.Ссылка.Проведен) Тогда
      ДокОбъект.Записать(РежимЗаписи);
      ТекстСообщенияЗаписи = ТекстСообщенияЗаписи +?(РежимЗаписи = РежимЗаписиДокумента.Проведение,
      "Проведен ","Отменено проведение ")
      + Строка(СтрокаТч.Ссылка) + Символы.ПС;
    КонецЕсли;
    
    Если СтрокаТч.Действие = "Удаление" Тогда
      ДокОбъект.ПометкаУдаления = Истина;
      ДокОбъект.Записать();
    ИначеЕсли СтрокаТч.Ссылка.ПометкаУдаления Тогда
      ДокОбъект.ПометкаУдаления = Ложь;
      ДокОбъект.Записать();
    КонецЕсли;
  Исключение    
    
    ТекстСообщенияОшибки = ТекстСообщенияОшибки + Строка(СтрокаТч.Ссылка)+ " : "+ОписаниеОшибки()+ Символы.ПС;
    
  КонецПопытки;
КонецЦикла;

Если Не ПустаяСтрока(ТекстСообщенияЗаписи) Тогда
  Сообщить(ТекстСообщенияЗаписи);
КонецЕсли;

Если Не ПустаяСтрока(ТекстСообщенияОшибки) Тогда
  Сообщить("Ошибки при отмене проведения: "+ Символы.ПС + ТекстСообщенияОшибки);
КонецЕсли;
Параметры.Удалить("ТаблицаДокументов");

Групповое изменение реквизитов, вытащить дополнительный реквизит

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

Стандартное формирование выборок

Функция Наименование1(МассивОбъектов, ПараметрыПечати)
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Ссылка", МассивОбъектов[0]);
	
	Запрос.Текст =
	"ВЫБРАТЬ
	
	
	Возврат Запрос.Выполнить();	
		
КонецФункции

Функция Наименование2(МассивОбъектов, ПараметрыПечати, ОбъектыПечати)
	
	Макет = ПолучитьМакет("Макет");
	
	НастройкиПечатныхФорм = ЗарплатаКадрыПовтИсп.НастройкиПечатныхФорм();
	
	ДокументРезультат = Новый ТабличныйДокумент;
	
	ДокументРезультат.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Приказ";
	ДокументРезультат.ОриентацияСтраницы= ОриентацияСтраницы.Портрет;
	ДокументРезультат.АвтоМасштаб = Истина;
	
	ВалютаУчета = ЗарплатаКадры.ВалютаУчетаЗаработнойПлаты();
	
	ОбластьМакета = Макет.ПолучитьОбласть("ОбластьМакета");
	
	// получаем данные для печати
	ДанныеДляПечати = Наименование1(МассивОбъектов, ПараметрыПечати).Выбрать();
	ПервыйДокумент = Истина;
	Пока ДанныеДляПечати.Следующий() Цикл
	
	//в теле пишем код для вывода

КонецЦикла;
	
	Возврат ДокументРезультат;
	
КонецФункции
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

ДанныеТД = ДанныеТрудовогоДоговора(ДанныеДляПечати.Ссылка, ПараметрыПечати).Выбрать();
		Пока ДанныеТД.Следующий() Цикл
			 ОбластьМакета.Параметры.ТрудовойДоговорДата = Формат(ДанныеТД.РегистраторТрудовойДоговорДата, "ДЛФ=DD");;
			 ОбластьМакета.Параметры.ТрудовойДоговорНомер = ДанныеТД.РегистраторТрудовойДоговорНомер; 
		КонецЦикла;
		
		ТабНомер = ПолучитьТабельныйНомер(ДанныеДляПечати.Ссылка, ПараметрыПечати).Выбрать();
		Пока  ТабНомер.Следующий() Цикл
			  ОбластьМакета.Параметры.ТабельныйНомер = ТабНомер.Код;
		КонецЦикла;

Регистрация сведений о внешнем отчете

Функция СведенияОВнешнейОбработке() Экспорт
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.1.1.1");
	
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Истина;	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Платежный Календарь'");
    НоваяКоманда.Идентификатор = "ПлатежныйКалендарь";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    //НоваяКоманда.Модификатор = "ПФ_MXL";

    
	Возврат ПараметрыРегистрации;

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

Сведения о внешней обработке

navarrow 4
Функция СведенияОВнешнейОбработке() Экспорт
	Команды = ПолучитьТаблицуКоманд();
	ДобавитьКоманду(Команды, 
					"Приказ об увольненни (внешний)", // представление для пользователя 
					"Макет", // Наименование макет печатной формы 
					"ВызовСерверногоМетода", // указание использования серверного метода
					Истина, // ПоказыватьОповещение 
					"ПечатьMXL"); // Модификатор формы, для печатных форм "ПечатьMXL"
		
	МассивНазначений = Новый Массив;
	МассивНазначений.Добавить("Документ.Увольнение");
		
	ПараметрыРегистрации = Новый Структура;
	ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
	ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
	ПараметрыРегистрации.Вставить("Версия", "1.0");
	ПараметрыРегистрации.Вставить("Наименование", "Приказ об увольненни (внешний)");
	ПараметрыРегистрации.Вставить("Информация", "Приказ об увольненни (внешний)");
	Параметрырегистрации.Вставить("Команды", Команды);
		
	Возврат ПараметрыРегистрации;
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
	
	НоваяКоманда = ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление = Представление; 
	НоваяКоманда.Идентификатор = Идентификатор;
	НоваяКоманда.Использование = Использование;
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
	НоваяКоманда.Модификатор = Модификатор;
	
КонецПроцедуры

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

Склонение слов

С помощью онлайн-сервиса
navarrow 4
Функция Просклонять(СклоняемыйТекст, Падеж) 
	Запрос = HTTPЗапросКСервисуСклонения(СклоняемыйТекст);
	Соединение = HTTPСоединениеСервисаСклонений();
	
	Попытка
		Ответ = Соединение.Получить(Запрос);
	Исключение
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка склонения " + Символы.ПС + ОписаниеОшибки());
		Возврат СклоняемыйТекст;
	КонецПопытки;
	
	ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
	Если Ответ.КодСостояния <> 200 Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка склонения " + Символы.ПС + ОписаниеОшибки());
		Возврат СклоняемыйТекст;
	КонецЕсли;
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
	СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);
	ЧтениеJSON.Закрыть();
	
	Возврат СтруктураОтвета[Падеж]; 
КонецФункции

Функция HTTPЗапросКСервисуСклонения(СклоняемыйТекст)
	
	ТекстЗапроса = "/russian/declension?s=" + СклоняемыйТекст;
	
	УстановитьПривилегированныйРежим(Истина);
	ВладелецТокена = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.СклоненияПредставленийОбъектов");
	Токен = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(ВладелецТокена, "ТокенДоступаКСервисуMorpher");
	УстановитьПривилегированныйРежим(Ложь);

	Если ЗначениеЗаполнено(Токен) Тогда
		ТекстЗапроса = ТекстЗапроса + "&token=" + Токен;
	КонецЕсли;
	
	Заголовки = Новый Соответствие;
  	Заголовки.Вставить("User-Agent", "1C Enterprise 8.3");
  	Заголовки.Вставить("Accept", "application/json");
	Заголовки.Вставить("charset", "UTF-8");	
	
	Возврат Новый HTTPЗапрос(ТекстЗапроса, Заголовки);
	
КонецФункции

Функция HTTPСоединениеСервисаСклонений()
	
	АдресСервера = "ws3.morpher.ru";
	
	ИнтернетПрокси = Неопределено;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
		МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер");
		ИнтернетПрокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(АдресСервера);
	КонецЕсли;
	
	Таймаут = 10;
	
	ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);
	Возврат Новый HTTPСоединение(АдресСервера, , , , ИнтернетПрокси, Таймаут, ЗащищенноеСоединение);
	
КонецФункции