Экранирование спецсимволов XML

Часто требуется сформировать XML код напрямую без использования объектов ЗаписьXML и ДокументDOM и это требует замены спецсимволов в текстовых строках, ниже приведена функция, позволяющая выполнить замену:

Функция ЗаменитьСпецСимволы(_стр)

стр=СтрЗаменить(_стр, «&», «&»);
стр=СтрЗаменить(стр, «»»», «"»); // кавычка
стр=СтрЗаменить(стр, «<«, «&lt;»);
стр=СтрЗаменить(стр, «>», «&gt;»);
стр=СтрЗаменить(стр, «‘», «&apos;»);
Возврат стр;

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

Получение всех типов

Динамическое создание элементов или таблиц значений иногда требует задания всех типов, для этого ниже приведен код возвращающий описание таковых:

// Заполняем массив доступных типов. Из этого массива будет выбираться тип редактируемого значения.
МассивДоступныхТипов = Новый Массив;
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов(«Число»,Новый КвалификаторыЧисла(22, 5, ДопустимыйЗнак.Любой))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов(«Строка»,,Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов(«Дата»,,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов(«Булево»)));

// Добавляем ссылки на справочники
Для Каждого ЭлементТипа Из Справочники.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на документы
Для Каждого ЭлементТипа Из Документы.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на перечисления
Для Каждого ЭлементТипа Из Перечисления.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на ПланыВидовХарактеристик
Для Каждого ЭлементТипа Из ПланыВидовХарактеристик.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на ПланыСчетов
Для Каждого ЭлементТипа Из ПланыСчетов.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на БизнесПроцессы
Для Каждого ЭлементТипа Из БизнесПроцессы.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на точки маршрута
Для Каждого ЭлементТипа Из БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на Задачи
Для Каждого ЭлементТипа Из Задачи.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на ПланВидовРасчета
Для Каждого ЭлементТипа Из ПланыВидовРасчета.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

// Добавляем ссылки на ПланОбменаСсылка
Для Каждого ЭлементТипа Из ПланыОбмена.ТипВсеСсылки().Типы() Цикл
   МассивДоступныхТипов.Добавить(ЭлементТипа);
КонецЦикла;

Возврат новый ОписаниеТипов(МассивДоступныхТипов);

Динамическое добавление колонки в дерево на управляемой форме 1Сv8.3

Для примера возьмем существующее на форме дерево с именем реквизита «Дерево», пусть в него надо добавить еще одну колонку с названием «Узел» тип строка. С динамическим добавлением элементов на управляемую форму можно разобраться на примере следующего алгоритма действий, все происходит на сервере:

  1. Получить значение реквизита — ДеревоЗначений
  2. Добавить колонку в дерево значений
  3. Добавить реквизит (колонку) дерева на форму (невидимая часть, справа в редакторе форм)
  4. Выгрузить дерево значений в реквизит формы
  5. Добавить на форму элемент колонку дерева (видимая часть, слева в редакторе форм)

Пример кода:

// 1. получаем дерево как програмный объект
ДеревоОбъект = РеквизитФормыВЗначение(«Дерево»);
// 2. добавляем колонку
ДеревоОбъект.Колонки.Добавить(«Узел», Новый ОписаниеТипов(«Строка»));
// 3. создаем РЕКВИЗИТ КОЛОНКИ (невидимая часть, справа в редакторе форм)
МассивДобавляемыхРеквизитов = Новый Массив;
// реквизит принадлежит дереву
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Узел», Новый ОписаниеТипов(«Строка»), «Дерево»));
// добавляем реквизит в форму (невидимая часть, справа в редакторе форм)
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

// 4. заполняем дерево (реквизит формы) занчением
ЗначениеВРеквизитФормы(ДеревоОбъект, «Дерево»);
// 5. добавляем НА ФОРМУ (видимая часть, слева в редакторе форм)
// назовем ДеревоУзел, принадлежит элементу дерева, связан с добавленной колонкой «Узел»
НовыйЭлемент = Элементы.Добавить(«ДеревоУзел», Тип(«ПолеФормы»), Элементы.Дерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = «Дерево.Узел»;

Как проверить тип колонки таблицы значений

Колонка таблицы значений может иметь один или несколько типов, для проверки необходимо использовать функцию СодержитТип() колонки таблицы значений:

Для Каждого КолонкаТЧ из ТЗ.Колонки цикл
   Если КолонкаТЧ .ТипЗначения.СодержитТип(Тип(«ХранилищеЗначения»))
      Тогда
      ПропуститьКолонку = истина;
   КонецЕсли;
КонецЦикла;

 

Получение таблицы динамического списка

Динамический список удобен для использования в интерфейсе, но когда дело касается получения данных, отображаемых в списке для программной обработки, то приходится пользоваться средствами СКД, как это делать приведено ниже:

&НаСервере
Функция Получить_ТЗ_Из_ДинамическогоСписка()
// получаем схему
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
// получаем настройки
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
// можем добавлять произвольные отборы дополнительно
// НовыйЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
// НовыйЭлементОтбора .ЛевоеЗначение = …
// УстанавливаемыйЭлементОтбора.ВидСравнения = …
//УстанавливаемыйЭлементОтбора.ПравоеЗначение =
// УстанавливаемыйЭлементОтбора.Использование = Истина;

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

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

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

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

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

Как узнать когда был создан документ в 1С v8 без журнала регистрации

Иногда необходимо знать дату создания документа, ошибочно полагать, что поле «Дата» содержит именно дату создания, тут можно проанализировать идентификатор объекта:

Функция ДатаСозданияСсылки(Ссылка)
// любая ссылка хранит в себе уникальный идентификатор
ГУИД = Ссылка.УникальныйИдентификатор();
// идентфикатор хранит в себе дату и время создания
Строка16 = Сред(ГУИД, 16, 3) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
Разрядность = СтрДлина(Строка16);
ЧислоСек = 0;
// время создания хранится в секундах 
// от 15 октября 1582 года 
// в шестнадцатиричной системе
Для Позиция = 1 По Разрядность Цикл
     ЧислоСек = ЧислоСек +
          Найти(«123456789abcdef»,Сред(Строка16Позиция1))*
          Pow(16Разрядность — Позиция);

КонецЦикла;
ЧислоСек = ЧислоСек / 10000000;
// вычисляем смещение от начальной точки
датаТ = Дата(1582, 10, 15, 04, 00, 00) + ЧислоСек;
// составляем только дату 
датаТ = Дата( Год(датаТ), Месяц(датаТ), День(датаТ), 00, 00, 00);
Возврат датаТ;

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

Диалог сохранения файла в интерфейсе Такси

Фирма 1С решила отказаться от модальных форм в интерфейсах web и Такси, это значит, что попытка просто сохранить файл через диалог потребует больше усилий чем раньше. В примере ниже надо НА КЛИЕНТЕ просто создать текстовый файл и сохранить его куда укажет пользователь:

&НаКлиенте
Процедура НажатиеКнопкиСохранитьФайл() 

// создаем на клиенте текстовый файл
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«txt»);
// создаем документ который надо записать
ТД = новый ТекстовыйДокумент;
ТД.ДобавитьСтроку(«Некоторый текст»);
ТД.Записать(ИмяВременногоФайла);
// помещаем файл в хранилище
Адрес
= ПоместитьВоВременноеХранилище(новый ДвоичныеДанные(ИмяВременногоФайла ));
// описание события после выбора файла пользователем
ОписаниеОповещения = Новый ОписаниеОповещения(«ОбработкаСохраненияФайлов», ЭтаФорма);
// место хранения файла в 1С
Файл = Новый ОписаниеПередаваемогоФайла(,Адрес);
// создаем перечень файлов
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(Файл);
// создаем диалог сохранения файла
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
// выводим диалог на экран, после выбора файла 
// вызовется процедура ОбработкаСохраненияФайлов
НачатьПолучениеФайлов(ОписаниеОповещения,ПолучаемыеФайлы, ДиалогОткрытияФайла, Истина);

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

&НаКлиенте
Процедура ОбработкаСохраненияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
// какие-то действия
// …

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