Описаниетипов булево

Заполнение таблицы значений из других источников

Чтобы заполнить таблицу значений существует несколько вариантов

    1. Скопировать данные из другой таблицы значений используя метод

НоваяТЗ = СтараяТЗ.Скопировать();

Также используя метод «Скопировать» можно указать строки и колонки которые нужно скопировать в новую таблицу значений, причем колонки задаются строкой, а строки внутри массива.

МассивСтрок = Новый Массив;
МассивСтрок.Добавить(СтараяТЗ);//строка 1
МассивСтрок.Добавить(СтараяТЗ);//строка 3
МассивСтрок.Добавить(СтараяТЗ);//строка 8
СтрокаКолонки = «Номенклатура, Количество»;
НоваяТЗ = СтараяТЗ.Скопировать(МассивСтрок, СтрокаКолонок);
//В параметрах можно указывать не массив, а структуру отбора, этот метод более универсальный
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить(«Номенклатура», ВыбраннаяНоменклатура);
СтруктураОтбора.Вставить(«Количество», 10);//единственный недостаток это сравнение только на равно 🙂
НоваяТЗ = СтараяТЗ.Скопировать(СтруктураОтбора, «Номенклатура»);//получим ТЗ с номенклатурами в одной колонке, у которой количество было 10

    1. Создать перебирая «Старую» таблицу

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

В данном примере метод «ЗаполнитьЗначенияСвойств» брал каждое свойство «СтаройСтроки» и искал их в «НовойСтроке», если находил, то записывал. Т.к. мы копировали колонки из «СтаройТЗ», то у нас такие совпадения точно были. Раньше такого метода не было и приходилось самим искать одинаковые имена колонок и записывать. Например, внутри предыдущего кода мог располагаться ещё один цикл по колонкам. Конечно не оптимально, но зато наглядно.

Для Каждого СтараяКолонка Из СтараяТЗ Цикл
Если НоваяТЗ.Колонки.Найти(СтараяКолонка.Имя) <> Неопределено Тогда
НоваяСтрока = СтараяСтрока;
КонецЕсли;
КонецЦикла;

Теги: 1С:Предприятие • Квалификаторы • ОписаниеТипов • ТипыДанных

Слова «ОписаниеТипов» и «Квалификаторы» вызывают трудность понимания на начальном этапе использования. По сути это простые вещи — с толку может сбивать их название.

Что такое Квалификаторы?

В 1С есть простые типы: Число, Строка, Дата. Но иногда необходимо уточнить, что переменная будет не просто числом, а например, числом длиной 12 символов и 2 разрядами после запятой, при этом неотрицательное. В простых типах это сделать невозможно т.к. тип не имеет соответствующих свойств. Для таких случаев и нужен объект «Квалификатор».

Знак = ДопустимыйЗнак.Неотрицательный; КвалификаторЧисло = Новый КвалификаторыЧисла(12, 2, Знак);

У каждого простого типа есть свой квалификатор:

КвалификаторСтрока = Новый КвалификаторыСтроки(100); КвалификаторВремя = Новый КвалификаторыДаты(ЧастиДаты.Время);

Что такое Описание типов?

ОписаниеТипов — это объект, который содержит массив допустимых типов, но т.к. в массиве нет возможности указать дополнительные данные, то отдельно для простых типов (Число, Строка, Дата) можно уточнить свойства квалификаторами.

Новый ОписаниеТипов(Типы, КвалификаторыЧисла, КвалификаторыСтроки, КвалификаторыДаты)

  • Типы (обязательный, тип Массив, Строка). Массив значений типа Тип, состоящий из типов, которые будут использованы в объекте, или строка, содержащая имена типов, разделенных запятыми.
  • КвалификаторыЧисла (необязательный, тип КвалификаторыЧисла). Квалификаторы числа, описывающие допустимые значения числового типа. Если параметр не указан, то числа хранить нельзя.
  • КвалификаторыСтроки (необязательный, тип КвалификаторыСтроки). Квалификаторы строки, описывающие допустимые значения строкового типа. Если параметр не указан, то используется неограниченная длина строки.
  • КвалификаторыДаты (необязательный, тип КвалификаторыДаты). Квалификаторы даты, описывающие допустимые значения типа Дата. Если параметр не указан, то используются обе части даты (дата + время).

Создает описание типов на основании заданных типов и квалификаторов для типов Число, Строка, Дата.

У описания типов есть четыре параметра, первый — обязательный, в нем указываются типы. Остальные — необязательные, в них указываются квалификаторы. Для создания описания типов существует несколько вариантов.

Указание типа строкой:

ОписаниеТипов = Новый ОписаниеТипов(«СправочникСсылка.Склад»);

Можно указать несколько типов, разделяя их запятыми:

ОписаниеТипов = Новый ОписаниеТипов(«СправочникСсылка.Склад, ДокументСсылка.РеализацияТоваров»);

Можно передать массив типов:

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

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

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

Для наглядности посмотрим на ограничение типов в реквизитах объекта конфигурации. По сути, это один механизм:

Поиск: 1С:Предприятие • Квалификаторы • Описание типов • Типы данных

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

Код 1C v 8.х Процедура ПоискНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ДокументоОборот.Этап,
| ДокументоОборот.Отдел,
| ДокументоОборот.ФИО,
| ДокументоОборот.ДатаВремя КАК Дата_Время,
| ДокументоОборот.Документы,
| ДокументоОборот.Примечание,
| ДокументоОборот.Доставка
|ИЗ
| РегистрСведений.ДокументоОборот КАК ДокументоОборот
|ГДЕ
| ДокументоОборот.Документы ПОДОБНОДокументы
| И ДокументоОборот.Доставка.Дата МЕЖДУДатаН ИДатаК
|
|УПОРЯДОЧИТЬ ПО
| ДокументоОборот.ДатаВремя»;
Запрос.УстановитьПараметр(«Документы», «%»+СокрЛП(Строка(СтрокаПоиска))+»%»);
Запрос.УстановитьПараметр(«ДатаК», КонПериода);
Запрос.УстановитьПараметр(«ДатаН», НачПериода);
Рез=Запрос.Выполнить();
НайденДок = рез.Выгрузить();
ЭлементыФормы.НайденДок.СоздатьКолонки();

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

Пример формы:

Код вывода результата запроса на управляемую форму:

Код 1C v 8.2 УП &НаСервере
Процедура СоздатьТаблицуФормы(Знач ИмяПоляТаблицыФормы, Знач ИмяРеквизитаДанныеФормыКоллекция, Знач ТаблицаЗначений)
// Если руками не создали эелемент формы Таблица, то создается программно
Если Элементы.Найти(ИмяПоляТаблицыФормы) = Неопределено Тогда
ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы, Тип(«ТаблицаФормы»),);
ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция;
КонецЕсли;
УдаляемыеРеквизиты = Новый Массив;
РеквизитыДляУдаления = ПолучитьРеквизиты(ИмяРеквизитаДанныеФормыКоллекция);
Для Каждого РеквизитУдаления Из РеквизитыДляУдаления Цикл
УдаляемыеРеквизиты.Добавить(ИмяРеквизитаДанныеФормыКоллекция+».»+РеквизитУдаления.Имя);
// Удаляем элементы формы
Элементы.Удалить(Элементы);
КонецЦикла;
// Добавление реквизитов в таблицу формы
ДобавляемыеРеквизиты = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяРеквизитаДанныеФормыКоллекция, Колонка.Заголовок));
КонецЦикла;
ИзменитьРеквизиты(ДобавляемыеРеквизиты,УдаляемыеРеквизиты);
// Добавление элементов форму
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы + Колонка.Имя, Тип(«ПолеФормы»), Элементы);
ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция + «.» + Колонка.Имя;
ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
КонецЦикла;
ЗначениеВРеквизитФормы(ТаблицаЗначений, ИмяРеквизитаДанныеФормыКоллекция);
КонецПроцедуры
&НаСервере
Процедура ВПоискНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РеализацияТоваровУслугСерии.Серия КАК Серия,
| РеализацияТоваровУслугСерии.Ссылка КАК Реализация,
| РеализацияТоваровУслугСерии.Ссылка.ЗаказКлиента КАК ЗаказКлиента,
| РеализацияТоваровУслугСерии.Ссылка.Контрагент КАК Контрагент,
| РеализацияТоваровУслугСерии.Ссылка.Договор КАК Договор

|ИЗ
| Документ.РеализацияТоваровУслуг.Серии КАК РеализацияТоваровУслугСерии
|ГДЕ
| РеализацияТоваровУслугСерии.Серия В
| (ВЫБРАТЬ
| СерииНоменклатуры.Ссылка КАК Ссылка
| ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ГДЕ
| СерииНоменклатуры.Наименование ПОДОБНОНаименование)
|
|УПОРЯДОЧИТЬ ПО
| Серия
|АВТОУПОРЯДОЧИВАНИЕ»;
Запрос.УстановитьПараметр(«Наименование», «%»+НомерФН+»%»);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
СоздатьТаблицуФормы(«ТЗ»,»ТЗ»,ТаблицаЗапроса);
КонецПроцедуры
&НаКлиенте
Процедура ВПоиск(Команда)
ВПоискНаСервере();
КонецПроцедуры

В данной статье я хочу рассказать о сериализации данных в 1С.

А сейчас немного о самом определении: Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.

Когда нам нужно сохранить значения, для дальнейшего его хранения или передачи, в этом случае нам без нее не обойтись, но стоит учитывать, что сериализация данных применима для тех объектов 1С, в описании которых есть пометка «Сериализуется”.

Уточним, что серилиазация может применятся не только в рамках одной информационной базы, но и о XML – сериализация. Последняя является отдельной возможностью, и применяется между различными информационными базами данных.

Для начала, рассмотрим сериализацию в рамках одной информационной базы.
Для сохранения значений во время сеанса работы в ИБ используются методы ЗначениеВФайл() и ЗначениеИзФайла().

Пример кода ЗначениеВФайл() Путь = «D:\1с\ТестФайл.txt»; Попытка Если ЗначениеВФайл(Путь, ТаблицаЗначений) Тогда Предупреждение(«Выгрузка успешно завершена!»); Иначе Предупреждение(«Возникли проблемы при выгрузке!»); КонецЕсли; Исключение Предупреждение(«Возникли проблемы при выгрузке! «+ОписаниеОшибки()); КонецПопытки; Пример кода ЗначениеИзФайла () ИмяФайла = Новый Файл(ВыбранныйФайл); Если ИмяФайла.Существует() Тогда ТаблицаЗначений = ЗначениеИЗФайла(ВыбранныйФайл); КонецЕсли;

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

Пример кода СохранитьЗначение() //Сохранение поля типа дата СохранитьЗначение(«НачалоПериода», НачалоПериода); //Сохранение ссылочного поля СохранитьЗначение(«Контрагент», Контрагент); //Сохранение табличной части СохранитьЗначение(«ТабличнаяЧасть», ТабличнаяЧасть.Выгрузить()); Пример кода ВосстановитьЗначение() //Получаем значения сохраненных параметров ЗначениеНачалоПериода = ВосстановитьЗначение(«НачалоПериода»); ЗначениеКонтрагент = ВосстановитьЗначение(«Контрагент»); ЗначениеТабличнаяЧасть = ВосстановитьЗначение(«ТабличнаяЧасть»); //Восстанавливаем значения через вспомогательную процедуру с проверкой типа //и возвращаемого значения УстановитьЗначение(ЗначениеНачалоПериода, НачалоПериода); УстановитьЗначение(ЗначениеКонтрагент, Контрагент); УстановитьЗначение(ЗначениеТабличнаяЧасть, ТабличнаяЧасть); КонецПроцедуры Процедура УстановитьЗначение(СохраненноеЗначение, Значение) Если СохраненноеЗначение<>Неопределено Тогда Если Типзнч(СохраненноеЗначение) = Тип(«ТаблицаЗначений») Тогда Значение.Загрузить(СохраненноеЗначение); Иначе Значение = СохраненноеЗначение; КонецЕсли; КонецЕсли; КонецПроцедуры

Если необходимо сохранить значения в строку и восстановить значения из строки, то для этого используются методы ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Эти методы реализованы в основном для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать их в большинстве случаев не рекомендуется. Для сохранения значений в базу данных рекомендуется использовать, описанный выше, объект типа ХранилищеЗначения, а для получения некоторого строкового идентификатора ссылочного значения можно использовать возможность получения уникального идентификатора ссылки (метод УникальныйИдентификатор()) и соответственно преобразование его к строке.

Пример кода ЗначениеВСтрокуВнутр() СсылкаВВидеСтроки = ЗначениеВСтрокуВнутр(СсылкаНаОрганизацию); СтруктураВВидеСтроки = ЗначениеВСтрокуВнутр(Новый Структура(«ОрганизацияСсылка,КодОрганизации», СсылкаНаОрганизацию,СсылкаНаОрганизацию.Код)) Пример кода ЗначениеИзСтрокиВнутр () СсылкаНаОрганизацию= ЗначениеИзСтрокиВнутр(СсылкаВВидеСтроки); СтруктураИзСтроки = ЗначениеИзСтрокиВнутр(СтруктураВВидеСтроки); Если Типзнч(СтруктураИзСтроки) = Тип(«Структура») Тогда СсылкаНаОрганизацию = СтруктураИзСтроки.ОрганизацияСсылка; КодОрганизации = СтруктураИзСтроки.КодОрганизации; КонецЕсли;

А теперь немного о XML–сериализации.

Рассмотрим сериализацию на примере объектов xml, потому что они используются чаще всего.

Есть глобальный метод ЗаписатьXML() предназначенный для этого.

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

К простым типам данных относятся типы, значения которых представляются подсистемой XML-сериализации в виде элементов XML только с текстовым содержимым:

К первому относятся:

  • Число;
  • Строка;
  • Дата;
  • Булево;
  • ДвоичныеДанные;
  • Null;
  • УникальныйИдентификатор;
  • ХранилищеЗначения;
  • все ссылки на объекты базы данных;
  • ссылки на перечисления, определяемые в метаданных.

Значения сложных типов представляются в виде элементов XML, содержащих вложенные элементы:

  • Тип;
  • ОписаниеТипов;
  • КонстантаМенеджерЗначения.<имя константы>;
  • все объекты базы данных;
  • наборы записей регистров, последовательностей, перерасчетов;
  • УдалениеОбъекта;

Пример кода Функция ПолучитьПримерXML(Значение) ЗаписьПримерXML = Новый ЗаписьXML; ЗаписьПримерXML.УстановитьСтроку(); ЗаписатьXML(ЗаписьПримерXML, Значение); Возврат ЗаписьПримерXML.Закрыть(); КонецФункции

Для всех остальных типов, для которых невозможно использовать метод ЗаписатьXML() – будем преобразовывать сначала значения в XDTO, а затем уже используем выше описанный метод.

Рассмотрим на примере подробнее:

У нас есть таблица значений, которую мы хотим записать в XML.

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

Надеюсь, статья была полезна. Спасибо, что прочли.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *