Что такое values в 1с
Перейти к содержимому

Что такое values в 1с

  • автор:

Типы значений в 1С 8.3

В данной статье мы подробно рассмотрим основные типы значений в 1С – примитивные, ссылочные, системные типы значений, а также познакомимся с основными приемами работы с типами значений.

Содержание

Вместо предисловия

Статья не ставит целью пересказ встроенной справки или руководства разработчика. Подразумевается, что читатели самостоятельно могут посмотреть необходимую информацию в синтакс-помощнике, глоссарии терминов 1С, или другой документации.

Примитивные типы значений в 1С

Значения примитивных типов не содержат в себе ничего, кроме литерала своего типа. Например, значение типа число может определяться литералом 12345, типа строка – “12345”, типа булево – Истина, и т.д.

Всего примитивных типов в 1С шесть:

  1. Число
  2. Строка
  3. Дата
  4. Булево
  5. Неопределено
  6. NULL

Значения примитивных типов могут преобразовываться к другим типам. Для явного преобразования используются соответствующие методы глобального контекста – например, Строка(12345) приведет число к строке, Дата(“20210101”) – преобразует строку в дату 01.01.2021, и др.

Но самое интересное начинается при неявном преобразовании типов. Значения преобразуются по определенным правилам. Так, например, второй операнд и последующие преобразуются к первому операнду выражения, до тех пор, пока это подразумевается используемыми операторами Т.е. если первым идет число, последующие операнды также будут преобразовываться к числу, если строка – к строке.
Но если в выражении попадается оператор, который работает только с конкретным типом, то будет повторное преобразование к этому типу.

Значение типа Неопределено – это специальное значение, которое используется как значение по умолчанию для полей составных типов, а также для обозначения неуказанного значения. Объявленные переменные, в которые еще не поместили значение, будут иметь тип Неопределено.

Значение Null – это литерал, обозначающий отсутствие значения в выборке данных. Прежде всего это значение используется при работе с запросами, например, при левом соединении двух таблиц, отсутствующие значения в левой таблице будут заменены значениями Null. Также значение Null будет иметь реквизит иерархического справочника для элемента-группы, если в свойствах реквизита указано, что данный реквизит используется только для элементов. Аналогично для реквизитов, которые используются только для групп, их значения в обычных элементах справочника будут равны Null.

Прикладные типы значений

Прикладные типы значений создаются платформой, когда разработчик добавляет новые прикладные объекты – документы, справочники, регистры и т.д. При этом при создании одного прикладного объекта становятся доступны сразу несколько прикладных типов данных. Например, при добавлении в конфигурацию справочника “Пользователи”, платформа создаст следующие типы:

  • СправочникСсылка.Пользователи
  • СправочникОбъект.Пользователи
  • СправочникМенеджер.Пользователи
  • СправочникСписок.Пользователи
  • СправочникВыборка.Пользователи

Каждый прикладной тип служит для определенной функциональности – например, ссылка нужна для доступа к свойствам конкретного элемента на чтение, объект – для возможности редактировать свойства это элемента, выборка – для перебора коллекции элементов, и т.п.

Изначально прикладные типы платформой не поддерживаются, и существуют только в конкретном прикладном решении. Следует иметь в виду, что при создании двух разных справочников, даже с одинаковым набором реквизитов, например “Покупатели” и “Поставщики”, для платформы это будут разные типы данных, несмотря на одинаковый реквизитный состав, и унаследованную базовую функциональность типа “Справочники”.

Интерфейсные типы данных в 1С

К интерфейсным типам относятся типы данных, позволяющие организовать интерактивное взаимодействие прикладного решения с пользователем. Прежде всего, это типы, связанные с формами и их элементами, например “КнопкаФормы”, “ПолеФормы” и др. Также к интерфейсным типам данных относятся значения, позволяющие работать с избранным, историей, окном клиентского приложения, и т.д.

Общие типы данных

Платформа предоставляет специфичные объекты языка, отвечающие за различную функциональность: ТабличныйДокумент, Диаграмма, ПостроительЗапроса, Картинка и др.

В отличие от примитивных типов, значения общих типов представляют собой совокупность значений свойств конкретного объекта. Каждое значение общего типа называется “экземпляром объекта”, и создается ключевым словом Новый – Новый ТекстовыйДокумент, Новый ХранилищеЗначения, и т.д.

Универсальные коллекции значений

Для работы с временными наборами данных в течение сеанса работы пользователя используются универсальные коллекции, такие как Массив, ТаблицаЗначений, Структура и др. Они не являются объектами базы данных, и в ней не хранятся. Универсальные коллекции используются для сбора, группировки, анализа и обработки данных.
Значения типа универсальной коллекции создаются при помощи ключевого слова Новый, например – Новый СписокЗначений, Новый ДеревоЗначений.
Платформа также предоставляет разработчику связанные типы значений, такие как КолонкаТаблицыЗначений, СтрокаДереваЗначений, КлючИЗначение, для работы с содержимым универсальных коллекций.

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

Составные типы значений

Реквизиты объектов конфигурации могут иметь составной тип. Например, для реквизита “Платежный документ” может быть указаны типы “Приходная накладная”, “Авансовый отчет”, “Оприходование товаров”. В этом случае разработчик указывает, что реквизит имеет составной тип, и отмечает нужные типы на этапе конфигурирования, а пользователь в процессе эксплуатации может выбрать в реквизит значение одного из доступных типов. Следует иметь в виду, что в каждый конкретный момент времени значение имеет только один конкретный тип. Если значение составного типа не указано, тип будет Неопределено. Одновременно двух типов значение составного типа быть не может.

Проверка типа конкретного значения

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

Для такой проверки используется два метода глобального контекста: Тип и ТипЗнч.

Пример. Реквизит Плательщик имеет составной тип – плательщиками могут быть Сотрудники и Контрагенты. Нам нужно проверить, что выбранное значение реквизита является элементом справочника Контрагенты:

Таблица значений 1с. Описание и примеры использования

ТаблицаЗначений — это программный объект встроенного языка, позволяющий строить произвольные наборы данных в памяти компьютера, отображать их в табличном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать).

Таблицы состоят из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.

Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.

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

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

Создание таблицы значений

Как и большинство объектов встроенного языка, новая таблица значений может быть создана с помощью оператора Новый :

Колонки таблицы значений

Прежде чем начать работу с таблицей значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:

  1. Имя — идентификатор колонки (может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания);
  2. Заголовок — представление колонки в диалогах (может содержать произвольные символы);
  3. ТипЗначения — тип значения содержимого ячеек в этой колонке. Если тип не задан, в ячейке можно хранить значения произвольного типа;
  4. Ширина — ширина колонки в диалогах;

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

Для того, чтобы определить наличие колонки с нужным именем используется метод Найти():

Перебор колонок выполняется следующим образом:

Для удаления колонки используется метод Удалить():

Свойства колонки таблицы значений

Имя Тип Описание
Имя Строка символьный идентификатор колонки, по которому к ней можно обращаться из кода
Заголовок Строка строковое представление колонки на форме
ТипЗначения ОписаниеТипов свойство органичивает пространство доступных значений, которые можно указать в данной колонке
Ширина Число ширина колонки на форме (выражается в количестве символов)

Методы коллекции колонок таблицы значений

Вставить() Вставляет новую колонку в указанную позицию коллекции
Добавить() Добавляет новую колонку в конец коллекции
Количество() Возвращает количество колонок в коллекции
Найти() Ищет колонку в коллекции по имени
Очистить() Удаляет все колонки из коллекции
Сдвинуть() Сдвигает колонку влево или вправо
Удалить() Удаляет колонку из коллекции

Строки таблицы значений

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

Добавление и удаление строк

Для добавления новой строки используется метод Добавить() объекта ТаблицаЗначений . Метод возвращает объект СтрокаТаблицыЗначений , с которым доступны дальнейшие манипуляции:

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

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

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

Перебор строк таблицы значений

Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :

Поиск строк

В отличие от платформы 1С:Предприятие 7.7 в 8-ке расширен функционал работы с таблицей значений. Поиск можно выполнять не только по значению в колонке (в этом случае будет возвращена первая найденная строка), но и по набору свойств (в этом случае возвращается массив строк):

Все методы таблицы значений:

Вставить() Вставляет строку на указанное место
ВыбратьСтроку() Позволяет интерактивно выбрать строку в диалоговом окне
ВыгрузитьКолонку() Выгружает значения ячеек указанной колонки в массив значений
Добавить() Добавлет новую строку в таблицу значений
ЗагрузитьКолонку() Загружает значения в ячейки указанной колонки из массива
ЗаполнитьЗначения() Заполняет ячейки указанных колонок определенным значением
Индекс() Возвращает индекс строки таблицы значений
Итог() Возвращает просуммированный итог по колонке таблицы значений
Количество() Возвращает количество строк в таблице значений
Найти() Выполняет поиск строки по значению
НайтиСтроки() Выполняет поиск строк по указанным параметрам
Очистить() Очищает строки таблицы значений
Получить() Возвращает строку по ее индексу
Свернуть() Выполняет сжатие строк и колонок таблицы значений
Сдвинуть() Сдвигает строку вверх или вниз по таблице
Скопировать() Создает новую таблицу значений копированием текущей
СкопироватьКолонки() Создает новую пустую таблицу значений путем копирования колонок текущей таблицы
Сортировать() Выполняет сортировку строк таблицы значений по указанным колонкам
Удалить() Удаляет строку таблицы значений

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

Что такое values в 1с

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

Особенностью языка 1С является объектная модель работы с базой данных. Она основывается на объектах 1С. Таким образом справочник – это объект 1С и когда Вы его считываете из базы данных, Вы получаете данные сразу из нескольких таблиц, упакованные в структуру, описанную в конфигурации (реквизиты, табличные части и прочее), см. урок про объектную модель представления данных 1С.

Обращаться к объекту 1С можно напрямую или через ссылку. Обращение через ссылку может производится фоново, достаточно незаметно для программиста.

Например:

Запрос = Новый Запрос(«ВЫБРАТЬ Ссылка, Наименование Из Справочник.Контрагенты»);

//разово выполнили запрос на сервере и переслали результат на компьютер пользователя
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();

//обратились к результату запроса, который находится в памяти компьютера пользователя
Наименование = Выборка.Наименование;
ИНН = Выборка.Ссылка.ИНН;

//ИНН мы в запросе не считывали, при обращении через ссылку к ИНН фоново генерируется полное считывание объекта справочника по ссылке в локальную память компьютера (бывает краткое, но ИНН не входит в кешируемые поля)

Как мы видим, при незнании этих особенностей – одно лишнее движение может значительно увеличить разовые обращения к базе данных и как следствие снизить производительности программы и загрузку сети.

Поговорим про особенности работы со значениями в 1С.

Значение 1С — переменные

1. Итак, переменная, это поле, не добавленное в конфигурации, а которое мы определяем прямо в модуле программы 1С (модули 1С).

Под константным значением понимается значение 1С, указанное в коде напрямую. Например:

Переменная1 = 22; //22 – это константа
Переменная2 = «Привет!»; //«Привет» — это константа

2. Переменные в 1С не типизированы. Это значит, что одной и той же переменной можно назначать любые значения. Например:

Переменная = 22;
Переменная = «Привет!»; //назначаем той же переменной новое значение 1С – строку, а не число

3. Во многих языках программирования обязательно «объявлять» переменную. Это значит нужно указать сначала, что есть такая переменная, а только потом ей пользоваться:

Перем Переменная1;
Переменная1 = 20;

В 1С это делать можно, но не обязательно. Будет работать и такой способ (обращение и создание сразу):

Переменная1 = 20;

4. Строгого контроля наличия переменной нет. Если мы забыли создать переменную, но уже обращаемся к ней, то ее значение 1С будет равно «Неопределено».

//здесь переменной еще нет
Если Чтото = 20 Тогда
//мы ее создаем только, если Чтото=20
Переменная1 = 100;
КонецЕсли;

//мы обращаемся в любом случае, даже если Чтото=1 и мы не входили в условие
Если Переменная1 = Неопределено Тогда
//здесь что-то выполняем

В описанном случае, если мы не попали в первое условие, то переменной как бы нет. На самом деле она есть и равна «Неопределено».

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

Значение 1С — реквизиты объектов 1С

Реквизиты объектов 1С – это поля справочника или документа. Они добавляются и редактируются в конфигураторе в окне конфигурации. Мы уже обсуждали их в уроке про реквизиты 1С.

Реквизиты объектов 1С – типизированы. Это значит, что при добавлении поля Вы явно указываете его тип – строка или число или еще что-то. Значение 1С по умолчанию у такого реквизита будет аналогично выбранному типу (для числа – 0, для строки – пустая строка, для ссылочных типов — справочник, документ и т.п. – пустая ссылка).

Реквизиты могут иметь несколько вариантов типов. В этом случае Вы ставите галочку «Несколько типов» и указываете одновременно варианты. У этого поля по прежнему может быть только одно значение 1С, но вариантов значения теперь больше. По умолчанию у такого реквизита будет значение 1С «Неопределено».

При назначении значения реквизиту производится проверка на соответствие типа. Если тип не соответствует, 1С пытается преобразовать значение 1С (например, число 22 в строку «22»). Если преобразовать не получается, то устанавливается значение 1С по умолчанию.

Преобразование производится и при изменении типа реквизита. Например, Вы создали реквизит, пользователи с ним работали (заполняли в документах). И через пол года Вы решили изменить тип реквизита. Реквизит не будет очищен, будет произведена попытка преобразовать значения (по аналогичной схеме).

Значение 1С — объект 1С

Объект 1С – это набор реквизитов и табличных частей плюс методы (функции). Обычно объект 1С сам умеет себя считывать из базы данных и записывать. Объекты 1С бывают разных видов (справочники, документы и т.п.).

Хранится объект 1С как одна строка в таблице SQL (для шапки) и несколько строк в других таблицах SQL (для каждой табличной части, если таковые есть). Идентифицируется объект 1С по автоматически генерируемому идентификатору – GUID.

Аналог объекта 1С – это экземпляр класса в других языках программирования, со своим конструктором, деструктором, методами и свойствами.

Так как объекты 1С тесно связаны с данными, то конструирование объекта 1С возможно путем создания нового объекта или считывания из базы данных.

Создаем новый объект справочника:

//новый, метод зависит от вида объекта
НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();

Получение существующего объекта всегда производится из ссылки на него (см. далее). Любым образом получаем ссылку (поиск, выборка, запрос и т.п.), а у ссылки вызываем метод:

//получаем ссылку поиском
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду(«111»);
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();

При получении или создании объекта 1С, он создается один раз в памяти компьютера. При попытке его назначения одной или другой переменной, это будет один и тот же объект. Таким образом переменная не значит сам объект, а значит ссылку на него.

//переназначаем полученный/созданный объект другой переменной
Переменная = НоменклатураОбъект;
НоменклатураОбъект.ИНН = «22»; //изменяем поле объекта через одну переменную

Если Переменная.ИНН = «22» Тогда //при обращении через другую переменную мы имеем тот же объект, и у него тоже изменился ИНН
//здесь что-то делаем..

Каждый объект в базе данных имеет свою «версию». Это идентификатор, который позволяет определить последнее изменение объекта (но не его дату, просто факт – было изменение или нет). При получении объекта из базы данных, при считывании, объект запоминает свою версию. При попытке записи обратно, объект проверяет, что версия все еще та же (не изменилась другим пользователем) и при изменении – откажется записываться (то есть нужно заново считывать, изменять, записывать).

Значение 1С — ссылка 1С

Каждый объект имеет идентификатор (GUID) и он позволяет однозначно найти объект в базе данных (т.е. он уникальный).

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

Допустим у Вас есть в конфигурации справочник Номенклатура. В документ Накладная Вы добавляете поле с типом справочника. При заполнении документа пользователь выберет товар. В поле сохранится идентификатор товара (то есть — ссылка).

Все механизмы встроенного языка 1С, которые оперируют поиском – возвращают ссылку на найденный объект. Например:

//Поиск элемента справочника стандартным механизмом по коду
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду(«111»);

//Поиск элемента справочника стандартным механизмом по наименованию
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию(«111»);

//Перебор всех элементов справочника (точнее ссылок на все элементы)
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
НоменклатураСсылка = Выборка.Ссылка;
КонецЦикла;

Если элемент справочника не найден – все эти методы возвращают «пустую» ссылку (то есть не указывающую ни на какой элемент). Проверить пустую ссылку можно следующим образом:

Если НоменклатураСсылка.Пустая() Тогда
//здесь что-то делаем..

Имея во встроенном языке ссылку на объект, Вы можете обратиться к любому полю объекта (т.е. реквизиту) на чтение. Чтобы изменить реквизит – Вам нужно из ссылки получить объект (см. выше). Например:

Важная особенность: когда у Вас есть ссылка – у Вас есть только идентификатор. Когда Вы обращаетесь через ссылку к полю, происходит считывание объекта в память компьютера. Вариант считывания зависит от того, к какому полю обратились. При обращении сначала к одному полю, а потом к другому – будет произведено два считывания.

  • Краткое кеширование (обращение к типовым полям)
    Считываются только типовые поля (код, наименование, номер, дата и т.п.)
  • Полное кеширование (обращение к нетиповым полям)
    Считываются все поля.

Кеширование производится в память компьютера, точнее в ограниченное количество памяти компьютера. Память под кеширование организована в виде очереди и при переполнении затираются считанные ранее элементы.

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

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

Вы получите ответы на вопросы: что такое список значений; для чего используется список значений; как работать с его элементами.

В первую очередь, список значений — это динамическая структура данных, она хранит в себе элементы, которые являются структурами с четырьмя полями: значение; картинка; пометка; представление. Важное уточнение в том, что список значений не сохраняется в конфигурации информационной базы 1С, а нужен для работы с данными “на лету”.

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

Объект списка значений используется для отметки 1С значений из списка на форме, для преобразования таблицы значений в список значений (одну колонку или строку), для отбора в запросе, для заполнения полей выбора, ввода. В основном, это интерфейсные задачи. Список применений не ограничивается тем, что перечислено выше. В целом, список значений позволяет хранить и обрабатывать данные.

Как было написано выше, список содержит не значения, а структуры, полям которых можно задавать значения. Каждая такая структура имеет тип: «ЭлементСпискаЗначений».

Перейдем в режим 1С:Предприятие.

Допустим у нас имеется документ, реквизит, подготовленный для демонстрации списка значений и фиксированный массив из 5 случайных чисел.

Реквизит «СпЗнч» обновляется по нажатию кнопки «ЗаполнитьСписок».

2. Как создать список значений в конфигурации системы 1С? Возможности списка значений

Чтобы создать список значений на основе массива воспользуемся методом «ЗагрузитьЗначения()».

Создание массива

Пример вывода массива

Теперь добавим к уже существующим элементам списка значений 1С еще два, разными способами.


Добавление значений

В первом случае заполняются все поля элемента списка значений 1С, кроме «Картинка», во втором указывается только значение.


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

Значит ли это то, что при создании объекта 1С без заполнения представления, оно заполняется автоматически при создании объекта? Проверим это.


Выходит, что поле не заполняется автоматически.

Также на рисунку демонстрируется работа метода «НайтиПоЗначению(Строка)».

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

3. Поиск и перебор элементов списка значений 1С

Перебор осуществляется с помощью циклов.

Первый способ — это обход списка по индексу.


Первый пример обхода списка

Вторым способом является использование конструкции «Для Каждого».


Второй пример обхода списка

Вывод обхода вторым способом

Для поиска элемента можно использовать структуру, которая заполняется, если элемент найден.

Поиск перебором

Результат поиска

Для поиска, помимо перебора с условием в цикле, могут использоваться функции: НайтиПоЗначению (Значение), НайтиПоИдентификатору (ID).

Пример работы поиска по значению уже был представлен.

ID – обычно представляет собой число, порядковый номер задается по мере добавления элементов списка значений 1С.

В этой статье была описана универсальная коллекция: список значений. Были представлены основные возможности коллекции, а также рассмотрены способы поиска в списке значений и перебора элементов списка значений 1С.

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

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