arefaste/1C_Forums huggingface dataset:
Удалить пространство имен из готового файла xml
Теги: 1С,XDTO,xsl,xslt,xml

также 1C 8 при работе XDTO может добавить атрибут type

фильтр на атрибут выглядит так @*[name(.)!='type']

и добавлен перенос строки, иначе весь XML будет в одну строку
|<xsl:text>
	|</xsl:text>

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

```1c
Функция УдалитьПространство(хмл)	//хмл - полное имя файла
	Х =  Новый COMОбъект("Msxml2.DOMDocument.6.0");
	х.async = 0;
	х.validateOnParse = 0;
	х.resolveExternals=0;
	х.load(хмл);
	xslDoc= Новый COMОбъект("MSXML2.DOMDocument.6.0");
	xslDoc.async = 0;

	xslDoc.loadXML("<?xml version=""1.0"" encoding=""utf-8""?>
	|<xsl:stylesheet version=""1.0""
	|  xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
	|  <xsl:output method=""xml""  encoding=""UTF-8"" indent=""no""/>
	|  <xsl:template match=""/|comment()|processing-instruction()"">
	|    <xsl:copy>
	|<!-- go process children (applies to root node only) -->
	|      <xsl:apply-templates/>
	|    </xsl:copy>
	|  </xsl:template>
	|  <xsl:template match=""*"">
	|    <xsl:element name=""{local-name()}"">
	|      <!-- go process attributes and children -->
	|      <xsl:apply-templates select=""@*[name(.)!='type']|node()""/>
	|    </xsl:element>
	|<xsl:text>
	|</xsl:text>
	|  </xsl:template>
	|
	|  <xsl:template match=""@*"">
	|    <xsl:attribute name=""{local-name()}"">
	|      <xsl:value-of select="".""/>
	|    </xsl:attribute>
	|  </xsl:template>
	|</xsl:stylesheet>
	|");

	xmlDoc= Новый COMОбъект("MSXML2.DOMDocument.6.0");
	// XML = xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""");
	х.transformNodeToObject(xslDoc, xmlDoc);
	//xmlDoc.insertBefore(XML,);

	xslDoc=0;
	х=0;
	xmlDoc.save(хмл);
	xmlDoc=0;
	Возврат 1;
КонецФункции // УдалитьПространство()
```

# Примечания

- Для каких целей применяется? Стандартных средств платформы не достаточно?

- (1) Константин Аванесов, код под разные платформы, один на все ) в основном работа с заранее неизвестными именами пространств.
Скрипт установки модели восстановления Simple для всех баз
Теги: 1С,SIMPLE,Модель восстановления,MSSQL

код выполняется в SQL MS на сервере или в его агенте по расписанию

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

```1c
DECLARE @SqlText VARCHAR(max)  = ''


SELECT @SqlText += 'alter database ['+name+'] set recovery simple' + ';' + CHAR(10) + CHAR(13)
from master.sys.databases
where database_id > 4 and state_desc = 'online' AND recovery_model_desc <> 'SIMPLE'

PRINT @SqlText
EXEC (@SqlText)
```

# Примечания

- Стоит добавить дисклаймер, что установка данного режима на продуктивных базах не желательно. Лучше настроить корректно резервное копирование, чтоб журнал не рос.
Добавить кнопку на форму в командную панель
Теги: 1С,УФ

Добавление кнопки в панель управления формы

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

```1c
Процедура ДобавитьКнопкуНаФормуВПанель(Форма) Экспорт
	НоваяКоманда = Форма.Команды.Добавить("ФормаКоманднаяПанель_КомандаМояКоманда");
	НоваяКоманда.Действие = "Подключаемый_ВыполнитьКоманду";

	Кнопка = Форма.Элементы.Добавить("МояКнопка", Тип("КнопкаФормы"), Форма.Элементы.ФормаКоманднаяПанель);
	Кнопка.Заголовок = "Заголовок кнопки";
	Кнопка.ИмяКоманды = "ФормаКоманднаяПанель_КомандаМояКоманда";
КонецПроцедуры
```
Интерактивный отбор дерева значений
Теги: 1С,Отбор,ДеревоЗначений,Форма

В связи с тем, что у дерева значений на форме, нет интерактивного отбора, реализовываем свой отбор

# Примечания

- Тут изучая список методов 1С, обнаружил для себя метод "КопироватьДанныеФормы", который можно использовать в данной задаче вместо РеквизитФормыВЗначение. Правда он доступен только на сервере и возможно, по факту делает тоже самое что и у меня код, но вы имейте ввиду.
Выгрузить Таблицу значений в массив структур (для передачи сервер - клиент)
Теги: 1С,ТаблицаЗначений,Структура,Массив

Для передачи таблицы значений с сервера на клиент нельзя использовать объект типа таблица значений. Нужно преобразовывать таблицу в массив структур.
Функция для преобразования Таблицы значений (ТаблицаЗначений) в массив структур.

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

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

# Примечания

- Шаблон называется "Выгрузить Таблицу значений в запрос", а описана выгрузка в массив структур?

- (1) Калинин Михаил, Сорян. Сначала писал один заголовок, потом подправил, но не полностью. Спасибо. Исправил.

- Хорошо бы добавить и обратную функцию - ТаблицаЗначенийИзМассиваСтруктур ))

- (3) prog1c, Если не нужны сортировки и поиски, то в этом нет необходимости. Однако, согласен, просто мне не потребовалось.

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

- (5) Little Friend, Не дошли руки поправить ))
ДеревоЗначений вывод на управляемую форму
Теги: 1С,ДеревоЗначений,УФ

Вручную на форме ничего не надо создавать

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

```1c
&НаСервере
Процедура ВывестиДзНаФорму(ДеревоОбъект)

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


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


	// Создание элемента формы типа ТаблицаФормы для отображения дерева
	ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
	ЭлементДерево.ПутьКДанным = "Дерево";
	ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;


	Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
		НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"),
		ЭлементДерево);
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
	КонецЦикла;


КонецПроцедуры
```
Программное добавление нового пользователя
Теги: 1С,ВнешняяОбработка,БСП

Программное добавление нового пользователя в базу, в которой используется стандартная подсистема "Пользователи" БСП.

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

```1c
Процедура СоздатьНовогоПользователя(Имя, Пароль)

    ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы.НайтиПоИмени(Имя);

    Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда

        ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();

        //В списке выбора не показываем
        ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;

        ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;

        ОписаниеПользователяИБ.Вставить("Действие", "Записать");
        ОписаниеПользователяИБ.Имя = Имя;
        ОписаниеПользователяИБ.Пароль = Пароль;


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

        НовыйПользователь.ДополнительныеСвойства.Вставить(
            "ОписаниеПользователяИБ", ОписаниеПользователяИБ);

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

    КонецЕсли;


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

Процедура ДобавитьРолиНовомуПользователю(Имя);
    Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(Имя);
    Пользователь.Роли.Добавить(Метаданные.Роли.АдминистраторСистемы);
    Пользователь.Роли.Добавить(Метаданные.Роли.ПолныеПрава);
    Пользователь.Записать();
КонецПроцедуры
```
Чтение Excel через Табличный документ
Теги: 1С,Excel,ТабличныйДокумент,Чтение

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

```1c
//На клиенте

ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = "Выберите файл";

Если ДиалогВыбора.Выбрать() Тогда
	ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
	Команда1НаСервере(ИмяФайла);

КонецЕсли;


//На сервере

//Вывод в табличный документ

ТабличныйДокумент = Новый ТабличныйДокумент;

ТабличныйДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);

//вывод в таблицу значений

ПЗ = Новый ПостроительЗапроса;

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

ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

ПЗ.ЗаполнитьНастройки();

ПЗ.Выполнить();

ТаблицаЗначений = ПЗ.Результат.Выгрузить();
```
Выгрузка запроса в XML. Выгрузка объекта
Теги: 1С,Выгрузка,XML,Запрос

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

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

	ИмяФайла = "d:\test.xml";

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

	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяФайла,"UTF-8");

	ВыборкаРезультата = Запрос.Выполнить().Выгрузить();
	ЗаписьXML.ЗаписатьНачалоЭлемента("Номенклатура");
	Для каждого Выборка Из ВыборкаРезультата Цикл
		ЗаписатьXML(ЗаписьXML, Выборка.Номенклатура.ПолучитьОбъект());
	КонецЦикла;
	ЗаписьXML.ЗаписатьКонецЭлемента();
	ЗаписьXML.Закрыть();

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

# Примечания

- Результат = Запрос.Выполнить().Выгрузить(); для чего эта строчка?
если дальше по коду есть выборка: ВыборкаРезультата = Запрос.Выполнить().Выгрузить();
только не понял почему переменная называется Выборка, а Вы делаете выгрузку в ТЗ, будет правильнее использовать метод Выбрать();

- (1) metatron, да эта строчка была лишняя. Также предлагаю вариант через выборку, либо если нужно, то с возможностью обхода через ТаблицуЗначений.
&НаСервере
Процедура КомандаВыполнитьНаСервере()
	
	ИмяФайла = "d:\test.xml";
	
	Запрос = Новый Запрос("ВЫБРАТЬ
	| Номенклатура.Код КАК Код,
	| Номенклатура.Наименование КАК Наименование,
	| Номенклатура.Артикул КАК Артикул,
	| Номенклатура.Ссылка КАК Номенклатура
	|ИЗ
	| Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	| Номенклатура.ЭтоГруппа = ЛОЖЬ");
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяФайла,"UTF-8");
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("Номенклатура");
	
	ВыборкаРезультата = Запрос.Выполнить().Выбрать();
	
	Пока ВыборкаРезультата.Следующий() Цикл
		ЗаписатьXML(ЗаписьXML, ВыборкаРезультата.Номенклатура.ПолучитьОбъект());
	КонецЦикла;
	
	//Вариант через ТаблицуЗначений
	
	//ТабРезультаты = Запрос.Выполнить().Выгрузить();
	//
	//Для каждого СтрокаТаб Из ТабРезультаты Цикл
	//	ЗаписатьXML(ЗаписьXML, СтрокаТаб.Номенклатура.ПолучитьОбъект());
	//КонецЦикла;
	
	ЗаписьXML.ЗаписатьКонецЭлемента();
	ЗаписьXML.Закрыть();
	
КонецПроцедуры

- спасибо за совет !
приму к сведению
если у вас будут еще идеи или другие варианты
буду раз услышать )

- Зачем вам поля Код, наименование, артикул в запросе, если они не используются потом нигде?
Зачем писать ЭтоГруппа = ЛОЖЬ, у нее составной тип?
Тут я не уверен: зачем в ЗаписатьXML писать именно СправочникОбъект, ссылка не пройдет? Это же жрет лишний раз оперативку.

- (4) Farovsky, данный код в виде примера,  а то как дальше вы будете его использовать илм корректировать .... только ваша фантазия)

- (4) Если использовать только ссылку, то в файл попадут только данные типа:

а из объекта все значения реквизитов. А код, наименование, артикул действительно лишние в данном случае. А вот условие ЭтоГруппа=Ложь нужно, чтобы выгрузились только элементы справочника.

- (6) SanchoD, а чем хуже Не ЭтоГруппа. ЭтоГруппа = ложь пишут в случаях, когда тип составной.
Проверка заполненности сложных объектов
Теги: 1С,ТаблицаЗначений,СписокЗначений,Массив

Проверяет, содержит ли переменная или коллекция какие-либо данные

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

```1c
Функция СодержитДанные(ЗначениеДляПроверки) Экспорт
	Результат = Ложь;

	Если ЗначениеДляПроверки <> Неопределено Тогда
		Если ТипЗнч(ЗначениеДляПроверки) = Тип("ТаблицаЗначений")
			Или ТипЗнч(ЗначениеДляПроверки) = Тип("Массив")
			Или ТипЗнч(ЗначениеДляПроверки) = Тип("СписокЗначений")
			Тогда

			Если ЗначениеДляПроверки.Количество() > 0 Тогда
				Результат = Истина;
			КонецЕсли;

		Иначе
			Результат = ЗначениеЗаполнено(ЗначениеДляПроверки);
		КонецЕсли

	КонецЕсли;

	Возврат Результат;
КонецФункции
```
Создать объект ОписаниеТипов
Теги: 1С,БСП,ОписаниеТипов

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

```1c
НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаДата", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.Дата));

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаЧисло", ОбщегоНазначения.ОписаниеТипаЧисло(12));

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаСтрока", ОбщегоНазначения.ОписаниеТипаСтрока(100));

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

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

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

```1c
ПараметрыСтроки = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(ТаблицаПоказателей[0]);
```

# Примечания

- Кайф. Наверное даже в пустой конфе будет работать, да?)) Пардон, не увидел тег БСП сразу.
Хотя вопрос смысла выкладывания кода из одной строки, остаётся открытым.
Ждать конструкций типа "Новая Строка = ТаблицаЗначений.Добавить()", "Ссылка = Справочник.Контрагенты.НайтиПоКоду(Код Элемента)" и т.п.?
Значения реквизитов, прочитанных из информационной базы для нескольких объектов
Теги: 1С,БСП

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

```1c
ВидыРасчета = Новый Массив;

Для Каждого СтрокаИсточника Из ТаблицаВычислений Цикл

        ВидыРасчета.Добавить(СтрокаИсточника.ВидНачисления);

КонецЦикла;

ВидыРасчетаИнфо = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(ВидыРасчета, "УчетВремениВЧасах,КатегорияНачисленияИлиНеоплаченногоВремени,ТребуетсяРасчетБазы");
```
Строковые функции. Альтернатива для СтрРазделить, СтрНайти и т.д.
Теги: 1С,Работа со строками,СтрРазделить,Обычное Приложение

# Примечания

- Каким образом РазложитьСтрокуВМассивПодстрок является аналогом СтрЗаменить?
И в какой версии платформы у Вас нет СтрЗаменить()?

- (1) Калинин Михаил, в БП 2 нет.

- (2) Razlagutt, просто изначально в публикации было написано СтрЗаменить 😃
Про СтрРазделить, СтрНайти и т.д. - все верно. Ниже 8.3.6 их нет и будет выдано "Функция не определена!"
Формирование файла CSV с записью в файл на клиенте
Теги: 1С,Обмен,CSV,Файл

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

```1c
&НаКлиенте
Процедура СформироватьCsvФайл(Команда)

	ПутьККаталогу = ОткрытьДиалогВыбораФайла();
	Текст = ВыгрузитьВCSV(ПутьККаталогу.ПолноеИмяФайла);

	Кодировка = КодировкаТекста.ANSI;
	ТекстовыйФайлЗапись = Новый ЗаписьТекста(ПутьККаталогу.ПолноеИмяФайла,Кодировка);
	ТекстовыйФайлЗапись.ЗаписатьСтроку(Текст);
	ТекстовыйФайлЗапись.Закрыть();

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

&НаКлиенте
Функция ОткрытьДиалогВыбораФайла(НачальныйКаталог = Неопределено, МножественныйВыбор = Ложь, Фильтр = Неопределено) экспорт
	СтандартнаяОбработка = Ложь;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДиалогОткрытияФайла.Расширение = "csv";
	Фильтр = "csv|*.csv";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	ДиалогОткрытияФайла.Каталог    = НачальныйКаталог;
	ДиалогОткрытияФайла.Заголовок  = "Выберите каталог...";
	ДиалогОткрытияФайла.МножественныйВыбор          = Ложь;
	ДиалогОткрытияФайла.ПроверятьСуществованиеФайла = Истина;
	ДиалогОткрытияФайла.ПредварительныйПросмотр     = Истина;

	Если Не ДиалогОткрытияФайла.Выбрать() Тогда
		Возврат Неопределено;
	КонецЕсли;

	Возврат ДиалогОткрытияФайла;

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

Функция ВыгрузитьВCSV(имяФайлаCSV);
	Текст = СоздатьДанныеCSV(ТаблицаДокументов,Разделитель);
	Возврат Текст;
КонецФункции

Функция СоздатьДанныеCSV(ТаблицаДокументов, Разделитель)
	Текст = "";
	Для Каждого Запись из ТаблицаДокументов Цикл
		Если Текст = "" тогда
			Текст = СоздатьЗаголовкиCSV(ТаблицаДокументов, Разделитель) + Символы.ПС;
		КонецЕсли;
		Текст = Текст + Запись.snils + Разделитель + Запись.surname
		+ Разделитель + Запись.name + Разделитель + Запись.patronymic + Разделитель
		+ Запись.oid + Разделитель + Запись.compaignId + Разделитель + Формат(Запись.dateOfBirth, "ДЛФ=Д") + Разделитель + Запись.citizenship + Разделитель
		+ Запись.specialty + Разделитель + Запись.financingType + Разделитель + Запись.applicationDate + Разделитель + Запись.targetReception
		+ Разделитель + Запись.testResultType + Разделитель + Запись.testResultOrganization + Разделитель + Запись.testResultYear + Символы.ПС;
	КонецЦикла;
	Возврат Текст;
КонецФункции

// Создаем строку загоовков для CSV-файла
Функция СоздатьЗаголовкиCSV(ТаблицаДокументов, Разделитель)
	НоваяТаблица = ТаблицаДокументов.Выгрузить();
	КолонкиТЗ = НоваяТаблица.Колонки;
	Для каждого Колонка Из КолонкиТЗ Цикл
		СтрКолонки = "" + СтрКолонки + Колонка.Имя + Разделитель;
	КонецЦикла;
	Возврат СтрКолонки;
КонецФункции
```
Таблица значений на УФ с динамическим набором колонок
Теги: 1С,ТаблицаЗначений,УФ

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

```1c
    ТЗ_рез = РеквизитФормыВЗначение("ТЗДокументы");

    МассивРеквизитов = Новый Массив;

    //Удалим ранее созданные колонки в ТЗДокументы
    Для Каждого Колонка Из ТЗ_рез.Колонки Цикл
        МассивРеквизитов.Добавить("ТЗДокументы." + Колонка.Имя);
	КонецЦикла;

	ИзменитьРеквизиты(,МассивРеквизитов);

	//Удалим отображение таблицы на форме и создадим новую
	ЭлементТаблица = Элементы.Найти("ТЗДокументы");
	Если ЭлементТаблица <> Неопределено Тогда
		Элементы.Удалить(ЭлементТаблица);
	КонецЕсли;

	ЭлементТаблица=Элементы.Добавить("ТЗДокументы",Тип("ТаблицаФормы"));
	ЭлементТаблица.ПутьКДанным = "ТЗДокументы";
	ЭлементТаблица.Отображение = ОтображениеТаблицы.Список;

	ТЗ_рез = Данные;

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

    //Создаем элементы на форме для отображения колонок
    ЭлементТЗ = Элементы.ТЗДокументы;
    Для Каждого Колонка ИЗ ТЗ_рез.Колонки Цикл
        НовыйЭлементФормы = Элементы.Добавить("ТЗДокументы"+Колонка.Имя, Тип("ПолеФормы"), ЭлементТЗ);
        НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлементФормы.ПутьКДанным = "ТЗДокументы." + Колонка.Имя;
    КонецЦикла;
```
Подставить свой макет в СКД
Теги: 1С,СКД,Макет

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

```1c
СхемаКомпоновкиДанных          = ПолучитьМакет("МакетСКД");

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

ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных);

КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);

КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
```
Загрузка в 1с из CSV. Обработка-шаблон для импорта из csv
Теги: 1С,Импорт,Обмен,CSV

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

```1c
&НаКлиенте
Процедура ЗагрузитьCSV(Команда)  // выполняется при нажатии на кнопку
	ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); //!!!!!!!!!!!!
ДиалогФыбораФайла.Фильтр="csv файл с разделтелями (*.csv)|*.csv|";

ДиалогФыбораФайла.Заголовок = "Выберите файл";
ДиалогФыбораФайла.ИндексФильтра = 0;
описаниеОповещения = Новый ОписаниеОповещения("ГрузимИзФайла", ЭтотОбъект);

    ДиалогФыбораФайла.Показать(описаниеОповещения);

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



&НаКлиенте
Процедура ГрузимИзФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт // вызываем диалог выбора файла

    Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
      //  Сообщить("Файл выбран!");
//работаем с файлом
    Имяфайла=ВыбранныеФайлы[0];
// Пишем в реестр
    сообщить(имяФайла); // вызываем дальнейшую процедуру обработки
	Путь=имяФайла; // для сохранения xml понадобится
// читаем файл
ЗагружаемыйФайл = Новый ТекстовыйДокумент;
ЗагружаемыйФайл.Прочитать(ИмяФайла);

Если лист="лист1" тогда
	обработатьCSV1(ЗагружаемыйФайл);
	конецЕсли;

    Иначе
        Сообщить("Файл не выбран!");
    КонецЕсли;


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

// процедуру обработатьCSV1(файл) - можно сделать на клиенте
&наСервере
процедура обработатьCSV1(файл)
	для номерстроки=2 по файл.КоличествоСтрок() цикл // первую строку пропускаем т.к. там название полей
	строка=файл.получитьСтроку(номерСтроки);
	массив=РазложитьСтрокуВМассивПодстрок(строка,";"); // строка csv - файла, преобразованная в массив, дальше с этими данными можно делать что угодно

		конецЦикла;
	конецПроцедуры

	// процедуру РазложитьСтрокуВМассивПодстрок - можно сделать на клиенте, если процедура "обработатьCSV1" тоже имеет директиву &наКлиенте
	&наСервере
	Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт

   МассивСтрок = Новый Массив();
   Если Разделитель = " " Тогда
       Стр = СокрЛП(Стр);
       Пока 1=1 Цикл
           Поз = Найти(Стр,Разделитель);
           Если Поз=0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз-1));
           Стр = СокрЛ(Сред(Стр,Поз));
       КонецЦикла;
   Иначе
       ДлинаРазделителя = СтрДлина(Разделитель);
       Пока 1=1 Цикл
           Поз = Найти(Стр,Разделитель);
           Если Поз=0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз-1));
           Стр = Сред(Стр,Поз+ДлинаРазделителя);
       КонецЦикла;
   КонецЕсли;

КонецФункции // глРазложить
```