Публикации

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создать запись в РС

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция Просклонять(СклоняемыйТекст, Падеж) 
	Запрос = 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Соединение(АдресСервера, , , , ИнтернетПрокси, Таймаут, ЗащищенноеСоединение);
	
КонецФункции

Открытие активизация формы

    ПутьКФорме = "ПланОбмена.ИмяПланаОбмена.Форма.ФормаВыгрузкиНоменклатуры";
    
    ОткрываемаяФорма = ПолучитьФорму(ПутьКФорме,,,ПутьКФорме);
    Если ОткрываемаяФорма.Открыта() Тогда
        ОткрываемаяФорма.Активизировать();
    Иначе
        ОткрываемаяФорма.Открыть();
    КонецЕсли;

Функция возвращает иерархию типов свойств для ТипОбъектаXDTO

Упрощает создание Объектов XDTO. // Возвращает иерархию/дерево типов свойств для ТипОбъектаXDTO // Упрощает создание Объектов XDTO. // Создание объектов XDTO без использования Иерархии свойств: //////////////////////////////////////////////////////////...
SDV 34 7

ФабрикаXDTO

Коллеги помогите, пожалуйста, разобраться. Реализую выгрузка данных в сервис ЕГИССО в формате XML. Имеем архив со схемами xsd: http://www.pfrf.ru/files/id/docman/2020/XSD-shema_10.06.S_versii_1.0.6.zip В 1С создал свою ФабрикуXDTO из массива схем и потихон...
SDV 34 7

Вывести на печать произвольную таблицу значений (ТЗ)

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

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

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

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


Документ Регистратор При Проверке Записи

Получить ссылку на объект записи для которого нужно проверять исключение из правил Используется когда нужно для какого-то вида документа сделать особую проверку на запрет изменения данных При проведении документа с исключением инициируются так же изменен...

Заполнение "пустых" строк табличной части

Данный алгоритм предназначен для заполнения строк табличной части элементами по условию пустоты. Если в табличной части существуют "пустые записи" ( в данном примере строки в колонках которых значение не заполнено), то они заполнятся при выборе из формы. Например строки с номерами 2, 5, 12 не заполнены. При пользовательском выборе элементов, значения вставятся соответственно в 2, 5, 12. А не в конец списка. С точки зрения клиент-сервер, алгоритм не совсем оптимизирован, но достаточно универсален.
&НаКлиенте
Процедура Подбор(Команда)
	
	ПараметрыФормы = Новый Структура("МножественныйВыбор, ЗакрыватьПриВыборе",Истина,Ложь);
	ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",ПараметрыФормы,Элементы.ТаблицаЗначений);
	// реквизиты: 
	//Таблица значение - ТаблицаЗначений ( Одна колонка "Материал" )
	//Команда - " Подбор "
	
КонецПроцедуры

&НаКлиенте
Функция ПоискПустыхСтрок(Таблица,КоличествоЗначений)
	
	МассивПустыхСтрок = Новый Массив(); // В данном массиве будут храниться индексы пустых записей 
	СчетчикПустых = 0;
	
	Для Каждого Строка Из Таблица Цикл
		Если  (НЕ ЗначениеЗаполнено(Строка.Материал)) И (СчетчикПустых<КоличествоЗначений)  Тогда  // Проверяем на заполненность значение в колонке (текущей строки) в цикле И проверяем нужно ли дальше идти по циклу, ведь нам нужно лишь определенное кол пустых строк 
			СчетчикПустых = СчетчикПустых+1; 
			МассивПустыхСтрок.Добавить(Таблица.Индекс(Строка)); // Если значение в определенной колонке "пустое", то добавляем в массив  - индекс текущей строки в цикле 
		ИначеЕсли СчетчикПустых=КоличествоЗначений Тогда // Если кол пустых строк и кол значений введенных пользователем равно, то выходим из цикла и не ищем дополнительные пустые строки 
			Возврат МассивПустыхСтрок;
		КонецЕсли;	
	КонецЦикла;
	
	Возврат МассивПустыхСтрок; 
	
КонецФункции 

&НаКлиенте
Процедура ТаблицаЗначенийОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
		
	МассивПустыхСтрок = ПоискПустыхСтрок(ТаблицаЗначений,ВыбранноеЗначение.Количество()); // передаем саму таблицу, а также Кол выбранных элементов для того, чтобы не искать все пустые строки, а лишь определенное кол
	
	Для Индекс = 0 По ВыбранноеЗначение.ВГраница() Цикл
		Если Индекс < МассивПустыхСтрок.Количество() Тогда // Если выбранных значений меньше, чем пустых строк, то ..., иначе, исключительный случай, когда все пустые строки заполнились  
			Строка = ТаблицаЗначений.Вставить(МассивПустыхСтрок[Индекс]); // Вставляем запись вместо пустой, вытесняя пустую запись вниз ( увеличиваем индекс пустой записи на 1, так как работает функция ВСТАВИТЬ() )
			Строка.Материал = ВыбранноеЗначение[Индекс]; // Заполняем реквизит табличной части выбранным значением 
			ТаблицаЗначений.Удалить(МассивПустыхСтрок[Индекс]+1); // Удаляем пустую запись, которая ниже добавленной на 1 
		Иначе
			Строка = ТаблицаЗначений.Добавить(); // Тот самый случай, когда кол выбранных записей больше, чем пустых строк. В этом случаи  добавляем записи в конец табличной части
			Строка.Материал = ВыбранноеЗначение[Индекс];
		КонецЕсли;
	КонецЦикла;
	
	
КонецПроцедуры

Функция СодержимоеАрхива() и вспомогательная функция Путь()

Распаковывает архив во временную папку и даёт доступ к содержимому, если путь к исходному архиву не указан, то открывается диалог выбора пути.
SDV 34 7
// Возвращает путь к распакованному архиву и его содержимое
//
// Параметры:
//  Архив - ЧтениеZipФайла, Строка, Неопределено - Архив; Путь к архиву; Если неопределенно, то спросит путь у пользователя
//  Пароль - Строка
// Возвращаемое значение:
//   Структура   -  содержит:
//	* ВременныйПуть - Строка - путь к папке куда будет извлечено содержимое архива
//	* Архив  - ЧтениеZipФайл
// Пример:
//	НаборСхемXML = Новый НаборСхемXML;
//	СодержимоеАрхива = СодержимоеАрхива();
//	Для Каждого ЭлементАрхива из СодержимоеАрхива.Архив.Элементы Цикл
//		Если ЭлементАрхива.Расширение = "xsd" Тогда
//			СхемаXML = СхемаXMLИзФайла(СодержимоеАрхива.ВременныйПуть +"/"+ ЭлементАрхива.ПолноеИмя);
//			НаборСхемXML.Добавить(СхемаXML);
//		КонецЕсли;
//	КонецЦикла;
Функция СодержимоеАрхива(Архив = Неопределено, Пароль = Неопределено)    Экспорт 

	Если ТипЗнч(Архив ) = Тип("ЧтениеZipФайла") Тогда
		Архив = Архив;
	ИначеЕсли  ТипЗнч(Архив) = Тип("Строка") Тогда
		Архив = Новый ЧтениеZipФайла(Архив, Пароль);
	ИначеЕсли Архив = Неопределено Тогда 
		Путь = Путь("Выберите архив, содержащий схемы XML:", "(*.zip)|*.zip", РежимДиалогаВыбораФайла.Открытие);
		Если Путь  = Неопределено Тогда
			Возврат Неопределено;
		КонецЕсли;
		Архив = Новый ЧтениеZipФайла(Путь, Пароль);
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
	Результат = Новый Структура("Архив", Архив);
	Результат.Вставить("ВременныйПуть",   КаталогВременныхФайлов() + "ZIP_" + Формат(ТекущаяДатаСеанса(),  "ДФ=yyyyMMddHHmmss"));
	Архив.ИзвлечьВсе(Результат.ВременныйПуть);
	Возврат Результат;
КонецФункции // СодержимоеАрхива()

// Функция - открывает диалог выбора пути, возвращает результат выбора.
//
// Параметры:
//  Заголовок     - Строка - НПР: "Укажите путь к базе Поставщиков"
//  Фильтр         - Строка -    НПР: "(*.txt)|*.txt"
//  Режим         - РежимДиалогаВыбораФайла - НПР: РежимДиалогаВыбораФайла.Открытие
//  ИсходныйПуть - Строка - НПР: Путь чтобы выбор начинался в определённом месте
//
// Возвращаемое значение:
//  Строка, Неопределено -  В случае успеха Путь в виде Строки, иначе Неопределено
//
// Пример:
//  Элемент.Значение = Путь("Выберите путь к файлу с данными (xls):","(*.xls*)|*.xls*", РежимДиалогаВыбораФайла.Открытие, Элемент.Значение)
Функция Путь(Заголовок, Фильтр, Режим, ИсходныйПуть = Неопределено) Экспорт
    Результат = Неопределено;
    ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (Режим);
    //выбор начнётся по исходному пути?!
    Если ИсходныйПуть <> Неопределено Тогда
        Если Режим =  РежимДиалогаВыбораФайла.ВыборКаталога Тогда
            ДиалогОткрытияФайла.Каталог = ИсходныйПуть;
        ИначеЕсли  Режим = ДиалогОткрытияФайла.ПолноеИмяФайла  Тогда
            ДиалогОткрытияФайла.ПолноеИмяФайла = ИсходныйПуть;
        КонецЕсли;
    КонецЕсли;
    ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок          = Заголовок;
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    Успех = ДиалогОткрытияФайла.Выбрать();
    Если Успех Тогда
        Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда
            Результат = ДиалогОткрытияФайла.Каталог;
        Иначе
            Результат = ДиалогОткрытияФайла.ПолноеИмяФайла;
        КонецЕсли;
    Иначе
        Результат = Неопределено;
    КонецЕсли;
    Возврат Результат;
КонецФункции


Получить дату из строки формата YYYY-MM-DDThh:mm:ss ISO 8601

Функция ПолучитьДатуВеб(СтрДата)
	
	Рез = Дата(1,1,1);
	
	//2018-03-19T23:59:59
	СтрГод = Сред(СтрДата, 1, 4);
	СтрМесяц = Сред(СтрДата, 6, 2);
	СтрЧисло = Сред(СтрДата, 9, 2);
	СтрЧас = Сред(СтрДата, 12, 2);
	СтрМинута = Сред(СтрДата, 15, 2);
	СтрСекунда = Сред(СтрДата, 18, 2);
	
	Попытка
		Рез = Дата(Число(СтрГод), Число(СтрМесяц), Число(СтрЧисло), Число(СтрЧас), Число(СтрМинута), Число(СтрСекунда));
	Исключение
	КонецПопытки;
	
	Возврат Рез;
	
КонецФункции

Найти с/ф полученный

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

Найти с/ф выданный

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