Основы 1С: типы значения и их проверка
Запросы 1С:Предприятие 8. Прочие функции
В языке запросов 1С существует большое количество различных функций и операторов, облегчающих построение запроса. Часть из них мы рассмотрели в статьях Функции работы с датами, Группировки в запросах 1С, остальные рассмотрим сейчас.
Функции работы со строками в запросах 1С
Функций и операторов для работы со строковыми данными в запросах 1С немного.
Во-первых, строки в запросах можно складывать. Для этого используется оператор «+»:
Запрос.Текст=»ВЫБРАТЬ
«»Строка: «» + Источник.Наименование
Из Справочник.Источник КАК Источник»;
Во-вторых, можно выделить часть строки. Для этого используется функция ПОДСТРОКА. Функция аналогична функции СРЕД () встроенного языка 1С. У нее три параметра:
- Строка-источник.
- Номер символа, с которого должна начинаться выделяемая строка.
- Количество символов.
Запрос.Текст=»ВЫБРАТЬ
ПОДСТРОКА(«»Строка: «», 4, 3) КАК Результат»; // Результат: ока
И, наконец, существует оператор, которые позволяет сравнить строку с неким шаблоном. Это оператор ПОДОБНО. О его использовании читайте в нашей статье о парамертах и операторах сравнения в запросах 1С.
Функция ЕСТЬNULL
NULL — особый тип данных на платформе 1С:Предприятие. Он же является единственным возможным значением этого типа.
NULL может возникать в запросах в нескольких случаях: при соединениях источников запроса, если не было найдено соответствующего значения в одной из таблиц; при обращении к реквизитам несуществующего объекта; если NULL был указан в списке полей запроса (например при объединении результатов выборки из нескольких таблиц) и т.д.
Поскольку NULL не является ни нулем, ни пустой строкой, ни даже значением Неопределено, его часто бывает полезно заменять на какой-то более полезный тип данных. Для этого и предназначена функция ЕСТЬNULL.
Она имеет два параметра:
- Проверяемое значение.
- Значение, на которое нужно заменить первый параметр, если он оказался равен NULL.
Запрос.Текст=»ВЫБРАТЬ
ЕСТЬNULL(Источник.Остаток, 0) КАК Остаток»; // Если в результате запроса поле остаток=NULL,
// то оно заменится на 0, и с ним можно будет выполнять математические действия
Функции ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ
Эти функции предназначены для получения строковых представлений различных значений. То есть, они преобразуют ссылки, числа, булево и т.д. в обычный текст. Разница между ними в том, что функция ПРЕДСТАВЛЕНИЕ преобразует в текст (строку) любые типы данных, а функция ПРЕДСТАВЛЕНИЕССЫЛКИ — только ссылки, а остальные значения возвращает как есть, не преобразованными.
Запрос.Текст=»ВЫБРАТЬПРЕДСТАВЛЕНИЕ (ИСТИНА) КАК Булево,ПРЕДСТАВЛЕНИЕ (4) КАК Число,ПРЕДСТАВЛЕНИЕ (Источник.Ссылка) КАК Ссылка,
ПРЕДСТАВЛЕНИЕ(ДАТАВРЕМЯ(2016,10,07)) КАК Дата»
;
// Булево = «Да», Число = «4», Ссылка = «Документ Расходный кассовый ордер №… от…»
// Дата=»07.10.2016 0:00:00″
Запрос.Текст=»ВЫБРАТЬПРЕДСТАВЛЕНИЕССЫЛКИ (ИСТИНА) КАК Булево,ПРЕДСТАВЛЕНИЕССЫЛКИ (4) КАК Число,ПРЕДСТАВЛЕНИЕССЫЛКИ (Источник.Ссылка) КАК Ссылка,
ПРЕДСТАВЛЕНИЕССЫЛКИ (ДАТАВРЕМЯ(2016,10,07)) КАК Дата»
;
// Булево = ИСТИНА, Число = 4, Ссылка = «Документ Расходный кассовый ордер №… от…»
// Дата=07.10.2016 0:00:00
Функции ТИП и ТИПЗНАЧЕНИЯ
Функция ТИП возвращает тип данных платформы 1С:Предприятие.
Запрос.Текст=»ВЫБРАТЬТИП (Число) ,ТИП (Строка),
ТИП (Документ.РасходныйКассовыйОрдер)»
;
Функция ТИПЗНАЧЕНИЯ возвращает тип переданного в нее значения.
Запрос.Текст=»ВЫБРАТЬТИПЗНАЧЕНИЯ (5) КАК Число,
ТИП («
«Строчка»») КАК Строка,ТИП (Источник.Ссылка) КАК Справочник
Из Справочник.Источник КАК Источник»
;
//Число=Число, Строка=Строка, Справочник = СправочникСсылка.Источник
Эти функции удобно применять, например, когда нужно выяснить является ли полученное в запросе поле значением какого-то типа. Например, получим контактную информацию контрагентов из регистра сведений КонтактнаяИнформация (там хранятся контакты не только контрагентов, но и организаций, физических лиц и т.д.):
Запрос.Текст=»ВЫБРАТЬКонтактнаяИнформация.ПредставлениеИЗРегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформацияГДЕ
ТИПЗНАЧЕНИЯ(КонтактнаяИнформация.Объект) = ТИП(Справочник.Контрагенты)»
;
Функция ЗНАЧЕНИЕ
Функция Значение позволяет использовать в запросе объекты конфигурации 1С напрямую, без применения параметров запроса.
Дополним предыдущий пример еще одним условием. Необходимо получить только телефоны контрагентов.
Запрос.Текст=»ВЫБРАТЬКонтактнаяИнформация.ПредставлениеИЗРегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформацияГДЕТИПЗНАЧЕНИЯ(КонтактнаяИнформация.Объект) = ТИП(Справочник.Контрагенты)
И КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)»
;
Следует отметить, что эту функцию можно использовать только с предопределенными значениями, т.е. со значениями, к которым можно обратиться напрямую из конфигуратора. То есть функция ЗНАЧЕНИЕ не можно использоваться с элементами справочников, созданными пользователями, но может работать с перечислениями, с предопределенными элементами справочников, со значениями ПустаяСсылка.
Оператор ССЫЛКА
Оператор ССЫЛКА предназначен для проверки значений, получаемых запросом, на принадлежность к определенному ссылочному типу. Эту же задачу можно выполнить с помощью функций ТИП и ТИПЗНАЧЕНИЯ (которые имеют более широкую область применения и были рассмотрены выше).
Например, задачу выбора контактной информации контрагентов можно было решить и так:
Запрос.Текст=»ВЫБРАТЬКонтактнаяИнформация.ПредставлениеИЗРегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформацияГДЕ
КонтактнаяИнформация.Объект ССЫЛКА Справочник.Контрагенты»
;
Оператор ВЫРАЗИТЬ
Оператор ВЫРАЗИТЬ используется в запросах 1С в двух случаях:
- когда нужно изменить характеристики примитивного типа;
- когда нужно из поля с составным типом данных сделать поле с одиночным типом.
К примитивным типам данных относятся: число, строка, дата, булево. Некоторые из этих типов данных имеют дополнительные характеристики. Тип Число имеет длину и точность, тип Строка — длину или неограниченность.
Оператор ВЫРАЗИТЬ позволяет изменять не тип данных, а именно дополнительные характеристики. Например, он может из строки с неограниченной длиной сделать строку с длиной ограниченной. Это бывает полезно, если нужно сгруппировать результаты запроса по такому полю. Выполнять группировку по полям с неограниченной длиной нельзя, поэтому мы его преобразуем в строку с длиной 200 символов.
Для построения грамотного и эффективного запроса, нужно разбираться в его параметрах. Запрос 1С к базе данных – это конструкция, позволяющая извлечь актуальную информацию из набора таблиц и предоставить её пользователю для принятия обоснованного управленческого решения в наиболее оптимальной форме.
Поскольку Запрос 1С является объектом с набором параметров, то определённые приёмы языка запросов позволяют повысить его читабельность, увеличить быстродействие, получить только уникальные записи. Чтобы уметь пользоваться преимуществами встроенного языка, нужно следовать рекомендациям профессионалов.Что такое параметры запроса 1С и как они используются?
Параметры запроса необходимы для того, чтобы можно было придать конструкции требуемую гибкость и быстродействие. Для объявления нужного параметра в языке запроса используется символ «&». Расшифровывается это следующим образом: &ТаблицаЦен (в данном случае именем параметра является значение «ТаблицаЦен»). Чтобы запрос «понял» присваиваемый ему параметр, необходима следующая конструкция:
Рассмотрим на примере присвоения Запросу 1С параметра Текущая дата – выглядеть на языке запросов это будет следующим образом:
Это примитивный тип конструкции, есть и более интересные.
Списочные параметры – работаем с операторами В/В ИЕРАРХИИ
Массив данных и список значений могут быть переданы в качестве параметров языка запроса 1С. К примеру, конструкция может выглядеть следующим образом:
Рассмотрим подробнее значимые отличия операторов «В» и «В ИЕРАРХИИ» и другие функции языка запросов 1С v8.
Функции языка запросов 1Сv8
Язык запросов программы 1С 8-ой версии предполагает, что к полям запроса будут применены специальные функции, которые усилят его эффективность и оптимизируют работу.
«ССЫЛКА»
Ссылочный тип логического оператора «ССЫЛКА» даёт возможность проверить поле составного вида на наличие в нём конкретного типа. Задаётся следующей конструкцией:
«МЕЖДУ»
Функция, которая позволяет конструкции проверить поле по параметру «вхождение значения в указанный диапазон». Синтаксическое выражение:
«В», «В ИЕРАРХИИ»
Конструкция служит для того, чтобы выявлять наличие определённых значений в передаваемых списках. Поиск производится также в подчинённых значениях после разворачивания иерархии элементов вниз. На практике это выглядит следующим образом:
«ПОДРОБНО»
Функция языка запросов 1С даёт возможность провести сравнение выбранной строки с шаблонным вариантом. Параметр применяется в том случае, если строка, по которой производится поиск, чётко не закреплена. Шаблонное решение выстраивается по следующим правилам:
- Если указан символ «%» — последующий набор значений содержит любое число произвольных элементов;
- Нижнее подчёркивание означает единственный произвольный символ (_);
- Элемент (группа элементов), заключённый в квадратные скобки – любой одиночный элемент, являющийся символом внутри скобок;
- «[…]» — любой из одиночных элементов, но не те, что перечисляются следующими за знаком отрицания.
Конструкция вида:
«ЕСТЬNULL»
Данный параметр работает следующим образом: в том случае, если значение поля не определено, то оно равно указанному выражению. С учётом синтаксиса языка запросов 1С получаем:
Относительно NULL существует особое правило: этот параметр требует дополнительной обработки. Для программы 1С 8-я версия определён особый NULL, у которого один элемент. NULL появляется в следующих случаях:
- В результате применения конструкции для соединения данных таблиц, если это не тип внутреннего соединения таблиц;
- Если произошёл выбор реквизитов, значения которых предопределены исключительно для групп справочников;
- По итогам выбора графы, находящейся в журнале документа, если у конкретного используемого документа отсутствуют реквизиты, являющиеся составной частью данной графы.
Все эти параметры – лишь краткий перечень эффективных функций языка Запросов 1С. Для грамотной работы в конфигураторе программы необходимо тщательно изучить все параметры языка запросов. Это не просто позволит получать нужные отчёты из базы данных 1С, но и увеличит быстродействие их обработки.
Похожее
Распечатать статью
Типы значений 1С
В 1С очень много предопределенных типов значений, их можно подразделить на несколько групп.
Группы типов данных
- простые (примитивные) типы
- типы-объекты и их подчиненные
- типы-объекты из метаданных (прикладные типы)
- интерфейсные типы
- прочие типы общего назначения
Простые типы
- Строка (задается значением в кавычках «»)
- Число (Задается десятичным числом)
- Дата (дата и время)
- Булево (Истина,Ложь.
Типы-объекты
- Коллекции значений (Массивы, Структуры, ТаблицыЗначений и другие)
- Интеграционные (Com, файлы, внешние объекты, zip, WS)
- Общего назначения
Объекты из метаданных (прикладные)
- Константы
- Справочники
- Документы
- Перечисления
- Отчеты
- Обработки
- Планы счетов
- Задачи
- Регистры сведений
- Регистры накоплений
- Регистры бухгалтерского учета
- и другие…
Интерфейсные
Связанные с окнами, формами и элементами форм (полей, надписей, табличных данных и других)
Другие варианты подразделения значений
- Значения, которые можно записать в реквизит объекта (в поле информационной базы) и те, которые нельзя
- Объекты, которые можно визуально представить, и те, которые имеют виртуальную сущность
- Типы значений которые, связаны с конфигурацией и ее объектами или работающие обособленно
- Которые могут быть разграничены по правам пользователей- не могут
- Могут достаточно просто преобразовываться — либо требуется вспомогательная конвертация
- Есть свойства и методы — либо отсутствуют
Задание типов значений
Значение может быть установлено:
Непосредственно
Это_Переменная = «Это строковое значение»;
Через создание объекта
Это_Переменная = Новый Цвет;
Через результат вызова системной функции
Это_Переменная = Дата(2016,1,1);
Через обращение к свойству объекта
Это_Переменная_Объект_Цвет = Новый Цвет; Это_Переменная = Это_Переменная_Объект_Цвет.Зеленый;
Составные и простые типы
Если не указано специально, то тип значений не ограничивается.
В случае реквизитов объектов метаданных, тип значений задается на этапе конфигурирования из типов доступных к записи (примитивные, ссылки на объекты, хранилище значений), а так же от вида объекта и контекста(среды, места) исполнения. При этом доступно ограничение реквизита одним типом или несколькими. Например, нам необходимо записывать в одно поле, либо значение «строки», либо «числа».
Для других объектов, тип реквизитов может остаться не ограниченными (произвольного типа), либо ограничен через специальный тип «ОписаниеТипов«
Например, для простого случая
ОписаниеТипа = Новый ОписаниеТипов(«Число,Строка»);
Данный объект также используется для ограничения выбора или внесения данных в диалоговых формах
Приведение значений
Производится автоматически при присвоении к реквизиту (свойству) объекта, если данный реквизит не может хранить данное значение
Также при операциях конкатенации, производится к сначала первому слагаемому, при вычитании, если допустимо, ко втором, а затем уже к результату.
Цвет = Новый Цвет(255,0,0); Цвет2 = Новый Цвет(«2″+59-Цвет.Красный,0,0); //В данном случае произойдет поэтапно //»2″+59 =»259» //259-255 = 4 //Цвет2 = Новый Цвет(4,0,0);
Такие «сложные» преобразования требуется проводить с осторожностью.
Приведение значений через встроенные функции преобразования
ЭтоБудетЧисло = Число(«15″); ЭтоБудетСтрока = Строка(ЭтоБудетЧисло); ЭтоБудетСтрока = Формат(ЭтоБудетЧисло,»»);//возможно указание строки форматирования значения ЭтоБудетДата = Дата(«201601+ЭтоБудетЧисло);//время будет 00:00:00 //Приведение через объект МожетБытьТолькоЧислом = Новый ОписаниеТипов(«Число»); ЭтоБудетЧисло = МожетБытьТолькоЧислом.ПривестиЗначение(«12»);
Следует обратить внимание, что некоторые преобразования система не сможет сделать, и это вызовет ошибку исполнения, поэтому проверка должна производится разработчиком
ЭтоПрисвоениеНеПроизойет = Дата(«12:45:45»);
Проверка типов
Сравнение производится через специальные функции ТипЗнч() и Тип().
Первая возвращает значение передаваемого типа, вторая задает тип для проверки
ЭтоЧисло = 15; //ответ на вопрос: тип значения переменной «ЭтоЧисло» является ли типом «Число» ЭтоБулево = ТипЗнч(ЭтоЧисло) = Тип(«Число»); //Первый знак «=» — присвоение //Второй «=» — сравнение на равенство
Сам объект «Тип» является вспомогательным и не может быть записан в реквизиты
Сравнение значений
Производится:
- при сравнении на равенство по четкому совпадению типа и значения, приведение не производится
- сравнение на > или < (на больше-меньше) допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)
Более подробно на типах останавливаться не буду, лучше их прочувствовать в реальных задачах или узких примерах
Можно дурачить всех все время, — при условии, что реклама ведется правильно, а расходы на нее достаточно велики.
— Джозеф Левин
Примеры программирования с таблицей значений в системе 1С:Предприятие 8
Доброго времени суток, уважаемые читатели! На этом сайте уже были описаны примеры работы с таблицей значений. Например, было написано как объединить две таблицы значений. Сегодня я поделюсь ещё некоторыми примерами программирования с таблицей значений в системе 1С:Предприятие 8.
Отбор по типу значения в таблице значений
Иногда нужно выбрать строки из таблицы значений по типу значения колонки или поля. То есть, если в таблице существует колонка «Субконто», в котором хранятся значения любого типа, например типа «СправочникСсылка.
Номенклатура» и «СправочникСсылка.ОсновныеСредства». Но нам нужны только те строки, в которых типом значения колонки «Субконто» является тип «СправочникСсылка.ОсновныеСредства».
Следующий пример покажет, как нам это осуществить:
ТаблицаЗначений = Новый ТаблицаЗначений;
// Создаём нужные колонки.
ТаблицаЗначений.Колонки.Добавить(«НомерСтроки»);
ТаблицаЗначений.Колонки.Добавить(«Субконто»);
// Строка № 1.
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.НомерСтроки = «1»;
НоваяСтрока.Субконто = Справочники.Номенклатура.НайтиПоКоду(«1»);
// Строка № 2.
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока[«НомерСтроки»] = 2;
НоваяСтрока[«Субконто»] = Справочники.ОсновныеСредства.НайтиПоКоду(«1»);
// Строка № 3.
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока[«НомерСтроки»] = 3;
НоваяСтрока[«Субконто»] = Справочники.ОсновныеСредства.НайтиПоКоду(«2»);
МассивСтрок = Новый Массив;
// Добавим в массив только те строки, в которых типом значения
// колонки «Субконто» является тип «СправочникСсылка.ОсновныеСредства»
Для каждого СтрокаТЗ ИЗ ТаблицаЗначений Цикл
Если СтрокаТЗ.Субконто.Метаданные().Имя = «ОсновныеСредства» Тогда
МассивСтрок.Добавить(СтрокаТЗ);
КонецЕсли;
КонецЦикла;
// Теперь создадим таблицу значению по отбору из массива
ТаблицаОС = ТаблицаЗначений.Скопировать(МассивСтрок, «НомерСтроки,Субконто»);
Для каждого СтрокаТЗ ИЗ ТаблицаОС Цикл
Сообщить(«НомерСтроки — « + СтрокаТЗ.НомерСтроки +
«; Субконто — « + СтрокаТЗ.Субконто);
В результате получим строки из таблицы значений с типом значения «ОсновныеСредства» колонки «Субконто»:
НомерСтроки — 2; Субконто — Насосы К50-32-125 НомерСтроки — 3; Субконто — Насосы К65-50-160
Как в цикле отобрать только одну строку из таблицы значений?
Часто бывает, что нужно пройтись по строкам таблицы значений в которой встречаются строки, например, с одинаковым значением номенклатуры. И при всём этом, например, в середине цикла нужно пропускать строки таблицы значений с одинаковой номенклатурой. Чтобы это получилось можно воспользоваться списком значений.
СписокНоменклатуры = Новый СписокЗначений; Для каждого Строка Из ТаблицаРезультатов Цикл
// Начало какого-то кода…
Если СписокНоменклатуры.НайтиПоЗначению(Строка.Номенклатура) =
Неопределено Тогда
// Если нет такой номенклатуры добавим в список значений и
// продолжим работу дальше…
СписокНоменклатуры.Добавить(Строка.Номенклатура);
Иначе
// Если така номенклатура встречается, то идём на начало цикла
Продолжить;
КонецЕсли;
// Продолжение какого-то кода…
КонецЦикла;
Как проверить наличие колонки в строке таблицы значений?
Самый простой вариант сделать это — использовать конструкцию «Попытка Исключение», например, попытаться получить значение в строке в указанной колонке и если возникнет исключение, то это значит, что колонки нет. Можно написать следующую функцию:
Функция ПроверитьНаличиеКолонки(СтрокаТаблицы, ИмяКолонки) Попытка Значение = СтрокаТаблицы[ИмяКолонки]; // Колонка существует Возврат Истина; Исключение // Колонка отсутствует Возврат Ложь; КонецПопытки; КонецФункции
Однако использование конструкции «Попытка Исключение» не является хорошим тоном в программировании на 1С
(это вызывает трудности отладки и крушение внутри транзакций). Поэтому предлагаю другой путь:
НазваниеКолонки = «Субконто»; Если СтрокаТЗ.Владелец().Колонки.
Найти(НазваниеКолонки) Неопределено Тогда Сообщить(«Колонка с названием — » + НазваниеКолонки + » — существует!»); Иначе Сообщить(«Колонка с названием — » + НазваниеКолонки + » — не существует!»); КонецЕсли;
В нашем примере переменная «СтрокаТЗ» является объектом типа «СтрокаТаблицыЗначений», у которого есть метод «Владелец()». Владельцем строки является «ТаблицаЗначений», которая имеет свойство «Колонки» с типом «КоллекцияКолонокТаблицыЗначений». Таким образом мы получаем объект типа «КоллекцияКолонокТаблицыЗначений», который содержит метод «Найти()». С помощью этого метода мы можем найти колонки таблицы значений по имени. Если указанная колонка есть, то возвращается колонка с типом «КолонкаТаблицыЗначений», но если отсутствует, то возвращается значение «Неопределено». Поэтому в нашем случае будет выведено следующее сообщение:
Колонка с названием — Субконто — существует!
Поиск в таблице значений по двум и более полям
Рассмотрим первый способ — через объекты встроенного языка системы 1С:Предприятие:
ТаблицаЗначений = Новый ТаблицаЗначений;
// Обязательно укажем тип колонки,
// чтобы не было ошибки «Тип не может быть выбран в запросе»
// при выполнении запроса к таблице значений
КС = Новый КвалификаторыСтроки(100);
КЧ = Новый КвалификаторыЧисла(3);
ОписаниеТиповС = Новый ОписаниеТипов(«Строка»,, КС);
ОписаниеТиповЧ = Новый ОписаниеТипов(«Число»,, КЧ);
// Создаём нужные колонки.
ТаблицаЗначений.Колонки.Добавить(«Фамилия», ОписаниеТиповС);
ТаблицаЗначений.Колонки.Добавить(«Возраст», ОписаниеТиповЧ);
// Сотрудник № 1.
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.Фамилия = «Иванов»;
НоваяСтрока.Возраст = 27;
// Сотрудник № 2.
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока[«Фамилия»] = «Сидоров»;
НоваяСтрока[«Возраст»] = 64;
// Осуществляем поиск по таблице через объекты
Отбор = Новый Структура;
Отбор.Вставить(«Фамилия», «Иванов»);
Отбор.Вставить(«Возраст», 27);
Строки = ТаблицаЗначений.
НайтиСтроки(Отбор);
// Возвращает массив
Если Строки.Количество() > 0 Тогда
Сообщить(«*** Первый способ — через объекты встроенного языка ***»);
Сообщить(«Фамилия: « + Строки[0].
Фамилия + » Возраст: « + Строки[0].Возраст);
КонецЕсли;
В результате по первому способу, через объекты встроенного языка, получим:
*** Первый способ — через объекты встроенного языка *** Фамилия: Иванов Возраст: 27
Рассмотрим второй способ — через запросы системы 1С:Предприятие. Здесь воспользуемся таблицой значений, которую мы создали ранее, в первом способе:
Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ТаблицаЗначений.Фамилия, | ТаблицаЗначений.Возраст |ПОМЕСТИТЬ ВТ_ТаблицаЗначений |ИЗ | &ТаблицаЗначений КАК ТаблицаЗначений |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ТаблицаЗначений.
Фамилия, | ВТ_ТаблицаЗначений.Возраст |ИЗ | ВТ_ТаблицаЗначений КАК ВТ_ТаблицаЗначений |ГДЕ | ВТ_ТаблицаЗначений.Фамилия = &Фамилия | И ВТ_ТаблицаЗначений.Возраст = &Возраст»;
Запрос.УстановитьПараметр(«ТаблицаЗначений», ТаблицаЗначений);
Запрос.УстановитьПараметр(«Фамилия», «Сидоров»);
Запрос.
УстановитьПараметр(«Возраст», 64);
Результат = Запрос.Выполнить().Выгрузить();
// Возвращает таблицу значений
Если Результат.Количество() > 0 Тогда
Сообщить(«*** Второй способ — через запросы ***»);
Сообщить(«Фамилия: « + Результат[0].Фамилия +
» Возраст: « + Результат[0].Возраст);
КонецЕсли;
В результате по второму способу, через запросы, получим:
*** Второй способ — через запросы *** Фамилия: Сидоров Возраст: 64
Оба способа помогут нам найти строки в таблице значений по двум полям.
Но как вы уже догадались можно добавить поиск по трём, четырём и более полям.
Почему возникает ошибка «Тип не может быть выбран в запросе» при выполнении запроса к таблице значений?
Если не задать тип значения колонки при её создании как описано в подзаголовке Поиск в таблице значений по двум и более полям, а написать так:
ТаблицаЗначений.Колонки.Добавить(«Фамилия»);
То тогда при выполнении запроса будет выведена ошибка:
Ошибка при вызове метода контекста (Выполнить) Результат = Запрос.Выполнить().Выгрузить(); по причине: {(2, 2)}: Тип не может быть выбран в запросе
Учимся работать с объектом Структура
Структура в языке программирования платформы 1С 8.3 (8.2) — это коллекция некоторых значений в связке с ключом. Эта связка ключа со значением называется «КлючИЗначение». Ключ структуры уникален в рамках данной структуры. Причем к значениям структуры можно обращаться как к свойствам объекта, используя название ключа.
Объект Структура создается с помощью конструктора Новый.
Структура1 = Новый Структура;
Со структурами можно работать и в серверном и клиентском контексте, причем в клиентском контексте с ними можно работать как под толстым клиентом, так и под тонким клиентом.
В значения структуры можно записать переменные любого типа, но использование типов в этом случае очень сильно зависит от контекста и от вида клиента: мы не можем в клиентском контексте задать значение, тип которого работает только в серверном контексте (например, ДокументОбъект.).
Как создать новую структуру, Вы знаете, теперь выясним, как создаются новые элементы данного объекта. Делается это с помощь метода Вставить.
Вот его синтаксис:
Вставить(,);
Параметр Ключ имеет тип значения Строка. Он может иметь любое название, какое захочет разработчик (но помним про ограничения в названиях переменных). Параметр Значение может иметь любой тип.
Структура1 = Новый Структура;
Структура1.Вставить(«Ключ1»,12.3);
Структура1.Вставить(«Ключ2»,33.4);
Обращаю Ваше внимание, что связка «Ключ и значение» уникальна, поэтому если Вы напишете для одной структуры два метода Вставить с одинаковыми ключами и разными значениями, то все равно в структуре будет одна связка «Ключ и значение», причем значение возьмется с последнего метода.
Не всегда обязательно использовать метод Вставить, чтобы добавить пару КлючИЗначение в структуру, иногда это можно сделать в конструкторе. Тогда конструктор будет иметь следующий вид:Структура1 = Новый Структура(Ключ, Значение);
Переделаем предыдущий пример:
Структура1 = Новый Структура(«Ключ1, Ключ2»,12.3,33.4);
В случаях выше мы не стали думать над названиями ключей, Вы же в процессе работы можете давать ключам любые названия, какие захотите. Главное, чтобы тип ключа был Строка.
В структуру можно записывать не только примитивные типы, но также любые другие объекты «1С:Предприятия», вплоть до других структур. Причем значения типов разных ключей структуры могут быть разными.
Если мы посмотрим в отладке конфигуратора на нашу структуру, то увидим, что она представляет собой некоторый список, где напротив каждого ключа есть то значение, которое мы привязали к данному ключу с помощью метода Вставить. Этот ключ является свойством структуры как объекта, и мы можем обращаться к нему.
Сообщить(«Структура1.Ключ1 = » + Строка(Структура1.Ключ1));
Сообщить(«Структура1.Ключ2 = » + Строка(Структура1.Ключ2));
Изменить значение ключа структуры 1С
Если нам необходимо изменить значение какого-нибудь ключа, то мы, используя метод Вставить, указываем в качестве первого параметра ключ, значение которого хотим поменять, а в качестве второго параметра новое значение для данного ключа.
Структура1 = Новый Структура(«Ключ1, Ключ2»,12.3,33.4);
Структура1.Вставить(«Ключ1»,1200);
Или напрямую обращаемся к ключу
Структура1 = Новый Структура(«Ключ1, Ключ2»,12.3,33.4);
Структура1.Ключ1 = 1000;
Обход коллекции структуры 1С
Обход структуры осуществляется с помощью оператора цикла Для каждого…Цикл.
Обойдем уже созданную структуру.
Для Каждого ЭлСтруктуры из Структура1 цикл
Сообщить(Строка(ЭлСтруктуры.Ключ) + » = » + ЭлСтруктуры.Значение);
КонецЦикла;
Безошибочное получение значения элемента
Если при обращении к ключу структуры Вы укажете название несуществующего в данной структуре ключа, то программа выдаст ошибку. Но есть метод объекта Структура, с помощью которого можно обратиться к значению ключа, не боясь вызвать ошибку в случае промаха.
Этот метод – Свойство.
Данный метод является функцией и возвращает Истину, если указанный ключ есть, и Ложь, если указанного ключа нет.
Рассмотрим синтаксис метода:
Свойство(,);
«ИмяКлюча» — название ключа для поиска свойства.
В параметр «ЗаписываемоеЗначение» будет возвращено найденное значение. В том случае, если ключа нет в структуре, то данному параметру присвоится значение Неопределено. Обращаю Ваше внимание, что параметр «ЗаписываемоеЗначение» где-то должен быть определен.
А = 0;
Структура1.Свойство(«Ключ1»,А);
Но если мы напишем так.
А = 0;
Структура1.Свойство(«Ключ10»,А);
То ни какой ошибки не возникнет, и в переменной А присвоится значение Неопределено.
Статьи о других универсальных коллекциях значений в 1С
Соответствия в 1С
Массив в 1С
Список значений в 1С
Таблица значений в 1С
Более подробно о работе со структурой и другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
: https://.com/1c_prosto
Фейсбуке: https://www..com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://.com/signum2009