В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в , в том числе пустой ссылки.
Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.
Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и « ». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.
В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.
ВЫБРАТЬ
КонтактныеЛицаПартнеров.Ссылка
ИЗ
Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеров
ПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.Родитель
ГДЕ
СегментыПартнеров.Ссылка ЕСТЬ NULL
Пустая дата
Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:
Пустая ссылка в запросе 1С
В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).
В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.
Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:
Партнеры.БизнесРегион <> ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)
Пустая строка
Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».
Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.
Что понимается под строкой в 1с
Строки в 1с, как отличить строку от других типов ведь в модуле все символы – текст, а следовательно строка. Каждый непрерывный набор символов обрамленный двойными кавычками («») считается строкой, по умолчанию в конфигураторе он черного цвета.
Сообщить(«Хелло, ворлд! »);
Также следует помнить, что некоторые методы, как системные так и самописные, могут возвращать строковое значение.
Чтобы узнать является ли интересующее нас значение строкой можно сравнить его тип с типом "Строка ":
Если ТипЗнч("Какой-то текст") = Тип("Строка") Тогда Сообщить("Тип значения - Строка"); КонецЕсли;
Существуют несколько специальных функций для работы со строкой преобразующих другие типы в строку и наоборот. Вот несколько примеров:
Строка в Число
Число(«123,45»);Число(«123.45»);
Если в параметре будут недопустимые знаки, например буквы, то это вызовет ошибку.
Строку в Дату
Дата("20101220235959");Время указывать не обязательно(последние 6 символов).
Проверка на пустую строку
ПустаяСтрока() – это функция проверяет содержит ли переданная строка параметром значимые символы(незначимые символы - это в основном невидимые на экране: пробел, перенос строки и т.д.)
ПустаяСтрока(" ");
ПустаяСтрока(" а ");
Число в Строку
Строка(123.45); Формат(1253.25);Для сравнение строк можно просто использовать знак равенства
Если "Четверг" = "Четверг" Тогда
КонецЕсли;
Для соединения строк используется знак плюс(+). Соединение строк в программировании называется конкатенацией.
Хитрость! Если складываются несколько разнотипных переменных то программа будет брать за основу тип первой переменной. Следовательно чтобы точно получить значение строкового типа можно использовать следующую запись:
КакаяТоСтрока = ""+ДеньГода(ТекущаяДата()) +ДеньНедели(ТекущаяДата());
Если Вы получите результат из предыдущего листинга, то вид будет примерно такой:
Как видно не хватает пробела разделяющего день года и день недели, для этого можно добавить пробел (« ») следующим образом:
КакаяТоСтрока = ""+ДеньГода(ТекущаяДата()) + " " + ДеньНедели(ТекущаяДата());
Перенос строки
Для переноса строки можно использовать либо символ переноса:
КакаяТоСтрока = ""+ДеньГода(ТекущаяДата()) + Символы.ПС + ДеньНедели(ТекущаяДата());
либо прямую черту
КакаяТоСтрока = ""+ДеньГода(ТекущаяДата()) + " |"+ ДеньНедели(ТекущаяДата());
В 1С проверка на пустое значение осуществляется специальной функцией. Что бы проверить заполнен ли имеющийся у вас реквизит или переменная следует использовать функцию из глобального контекста ЗначениеЗаполнено(<Значение>) .
В 1С 8 значение считается заполненным (не пустым) если оно отличается от значения по умолчанию для данного типа. Например для ссылочного типа значение по умолчанию — это Пустая ссылка (данного справочника, документа и т.п.). Также пустыми являются переменные и реквизиты содержащие значения Null и Неопределено .
1с проверка на пустое значение. Примеры
Переменная = Справочники.Номенклатура.ПустаяСсылка(); Проверка = ЗначениеЗаполнено(Переменная);
В данном случае переменная Проверка будет содержать значение Ложь . Также функцию ЗначениеЗаполнено(<Значение>) . можно использовать напрямую в условиях.
Пример 1.1
Если ЗначениеЗаполнено(Переменная) Тогда Сообщить("Значение в переменной не является пустым!"); КонецЕсли;
Переменная = Документы.АвансовыйОтчет.НайтиПоНомеру("000000001"); Проверка = ЗначениеЗаполнено(Переменная);
В данном примере, если документ Авансовый отчет с номером 000000001 существует, то в переменной Проверка будет содержаться значение Истина , иначе Ложь .
Использовать функцию ЗначениеЗаполнено нельзя для переменных мутабельных типов, таких как Таблица значений , Дерево значений и т.п. Функция работает для всех конфигураций.
Как же проверить, что в 1с таблица значений пустая? Для этого используется метод Количество()
, с его помощью можно проверить сколько строк содержится в таблице значений.
Пример 3. Пусть МояТаблица — таблица значений определенная выше в коде.
Если МояТаблица.Количество() = 0 Тогда Возврат; КонецЕсли;
Этим же методом можно определить заполненность дерева значений и выборки результата запроса.
Пример 4. Пусть МоеДерево — дерево значений определенное выше в коде.
Если МоеДерево.Строки.Количество() = 0 Тогда Возврат; КонецЕсли;
Как видите, в дереве значений мы проверяем наличие строк первого уровня, если их нет, то дерево пустое.
Пример 5. Пусть Запрос — запрос к базе данных 1С 8, определенный выше.
Средства определения пустых ссылок, дат или строк. Рассмотрим, как проверить на пустую ссылку, дату или строку в запросе 1С.
Определить нулевые данные можно путем использования специальных операторов.
Информацию из базы данных 1С запрашивают (а потом получают) с помощью такого инструмента, как язык запросов (Query, англ.). Они составляются на латинице и кириллице. А одним из ключевых слов-команд (операторов) при получении информации является слово-команда ВЫБРАТЬ (SELECT, англ.) в сочетании с некоторыми конструкциями. Приведём примеры построения интересующих нас по теме запрашиваемых заданий:
Проверка на содержание NULL
Такое задание выполняется оператором ВЫБРАТЬ в сочетании с конструкцией «ЕСТЬ NULL»:
SELECT
ЗаказыОстатки.Заказчик,
ЗаказыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.Заказы.Остатки КАК ЗаказыОстатки
ГДЕ
ЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL
Контроль даты
Пустая дата в запросе 1С вносится построением «ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)»:
SELECT
СчетВходящийПоставщика.Link,
СчетВходящийПоставщика.ДатаПрихода
ИЗ
Документ. СчетВходящийПоставщика КАК СчетВходящийПоставщика
ГДЕ
СчетВходящийПоставщика.ДатаПрихода = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
Ссылочная проверка
Проверка несуществующих внутриссылочных значений (на планы счетов, справочники и пр.) производится с использованием конструкции «VALUE(Справочник.Имя…ПустаяСсылка)»:
Проверка строки
Пустота в строках обнаруживается с применением пробела в кавычках «»:
SELECT
Покупатели.Link
ИЗ
Справочник.Покупатели КАК Покупатели
ГДЕ
Покупатели.Код = «»
Ещё о битых и обычных линках
«Битой» считается ссылка (Link, англ.), ведущая (указывающая) на несуществующий элемент. Под несуществующим понимают такой, которого нет в базе данных. Полезно о таких линках знать хотя бы для того, чтобы получать от системы уведомления в более понятной форме. Да и запись, удаление и открытие нереальных объектов не имеет смысла.
Платформы 1С не обладают внутренними средствами чтобы их отсечь. Ещё нужно понимать, что вне «битых» в системе живут специальные «пустые линки», которые следует различать одни от других.
Это можно выяснить и без запросов к базе данных:
В системе 1С-7.7
Для «битой» - методом Link.Selected() и функцией ПустоеЗначение() возвращается ноль. Для «пустой» - в первом случае ноль, а во втором - единица. Для «нормальной» - единица и ноль. Получается, в 1С-7.7 «битая» - не является несуществующим значением, которое не считается выбранным.
В системе 1С-8.x
Всё по-другому - в обоих случаях (для «битых» и «обычных») метод возвращает Ложь, а функция - Истину. Решение такое: Для «битой» методом Ссылка.ПолучитьОбъект() возвращается функция «Неопределено». Для «пустой» - выбрасывается «Ошибка метода контекста». Для «нормальной» - возвращается значение согласно документации; Выходит, в 1С-8.х «битая» - не будет несуществующей функцией ссылочного типа, которая возвращает Неопределённое значение объекта.
Откуда они берутся
При переходе по несуществующему адресу битой линки пользователю в лучшем случае показано уведомление о том, что объект не найден, в худшем - изображение страницы сервера. Наихудшей их чертой является скрытость. Отсюда - сложность в проверке их корректности. Во время работы с конфигурацией она постоянно дорабатывается, обновляется. Какие-то объекты подлежат удалению, изменяется структура. А ссылка на удалённый элемент остаётся в конструкциях и алгоритмах. Таким образом, несуществующие адреса остаются в системе после удаления самого элемента (вместе с адресом).
В сегодняшней публикации было рассмотрено специальное построение запросов. Приведены примеры конструкций. Это пригодится вам в работе при поиске пустых значений.
Строка — один из примитивных типов данных в системах 1С:Предприятие 8. Переменные с типом строка содержат текст.
Значения переменных типа строка заключаются в двойные кавычки. Несколько переменных данного типа можно складывать.
Пер1
=
"Слово 1"
;
Пер2
=
"Слово 2"
;
Пер3
=
Пер1
+
" "
+
Пер2
;
В итоге Пер3 будет иметь значение «Слово 1 Слово 2″.
Кроме того, в системах 1С:Предприятие 8 предусмотрены функции для работы со строками. Рассмотрим основные:
ВвестиСтроку(<Строка>, <Подсказка>, <Длина>, <Многострочность>) — функция предназначена для вывода диалогового окна, в котором пользователь может указать значение переменной типа Строка . Параметр <Строка> является обязательным и содержит имя переменной, в которую будет записана введенная строка. Параметр <Подсказка> необязательный — это заголовок диалогового окна. Параметр <Длина> необязательный, показывает максимальную длину вводимой строки. По умолчанию равен нулю, что означает неограниченную длину. Параметр <Многострочность> необязательный. Определяет режим ввода многострочного текста: Истина — ввод многострочного текста с разделителями строк; Ложь — ввод простой строки.
Строку можно ввести и, зная код символа в кодировке Unicode:
Символ(<КодСимвола>) — код вводится в виде числа.
Буква= Символ(1103 ) ; // Я
Существует и обратная функция, позволяющая узнать код какого-либо символа.
КодСимвола(<Строка>, <НомерСимвола>) — возвращает номер указанного символа в кодировке Unicode в виде числа.
Функции преобразования регистра текста:
ВРег(<Строка>) — преобразует все символы строки в верхний регистр.
НРег(<Строка>) — преобразует все символы строки в нижний регистр.
ТРег(<Строка>) — преобразует все символы строки в титульный регистр. То есть первые буквы во всех словах преобразуется в верхний регистр, а остальные буквы — в нижний.
Функции поиска и замены символов в строке:
Найти(<Строка>, <ПодстрокаПоиска>) — находит номер символа вхождения подстроки поиска. Например:
Найти ("Строка" , "ока" ) ; // 4
СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>) — находит номер символа вхождения подстроки поиска, номер вхождения указывается в соответствующем параметре. При этом поиск начинается с символа, номер которого указан в параметре НачальнаяПозиция. Поиск возможен с начала или с конца строки. Например:
Номер4 Вхождения= СтрНайти ("Обороноспособность" , "о" , НаправлениеПоиска. СНачала, 1 , 4 ) ; // 7
СтрЗаменить(<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) – находит в исходной строке все вхождения подстроки поиска и заменяет ее на подстроку замены.
СтрЗаменить ("Строка" , "ока" , "" ) ; // Стр
ПустаяСтрока(<Строка>) – проверяет строку на наличие значащих символов. Если значащих символов нет, или вообще никаких символов нет, то возвращается значение Истина . В противном случае — Ложь .
СтрЧислоВхождений(<Строка>, <ПодстрокаПоиска>) – вычисляет число вхождений подстроки поиска в исходной строке.
СтрЧислоВхождений ("учиться, учиться и еще раз учиться" , "учиться" , "" ) ; // 3
СтрШаблон(<Строка>, <ЗначениеПодстановки1>…<ЗначениеПодстановкиN> — подставляет параметры в строку по номеру. Строка должна содержать маркеры подстановки вида: «%1..%N». Нумерация маркеров начинается с 1. Если значение параметра Неопределено , подставляется пустая строка.
СтрШаблон ("Параметр 1 = %1, Параметр 2 = %2" , "1" , "2" ) ; // Параметр 1= 1, Параметр 2 = 2
Функции преобразования строк:
Лев(<Строка>, <ЧислоСимволов>) – возвращает первые сначала символы строки.
Прав(<Строка>, <ЧислоСимволов>) – возвращает последние символы строки.
Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>) – возвращает строку длиной в <ЧислоСимволов>, начиная с символа <НачальныйНомер>.
СокрЛ(<Строка>) — отсекает незначащие символы, стоящие слева от первого значащего символа в строке.
СокрП(<Строка>) — отсекает незначащие символы, стоящие справа от последнего значащего символа в строке.
СокрЛП(<Строка>) – отсекает незначащие символы, стоящие слева от первого значащего символа в строке и справа от последнего значащего символа в строке.
СтрПолучитьСтроку(<Строка>, <НомерСтроки>) – получает строку многострочной строки по номеру.
Прочие функции:
СтрДлина(<Строка>) – возвращает количество символов в строке.
СтрЧислоСтрок(<Строка>) – возвращает число строк в многострочной строке. Строка считается новой, если она отделена от предыдущей символом перевода строки.
СтрСравнить(<Строка1>, <Строка2> ) – сравнивает две строки без учета регистра. Функция работает аналогично объекту СравнениеЗначений . Возвращает:
- 1 — если первая строка больше второй
- -1 — если вторая строка больше первой
- 0 — если строки равны
СтрСравнить("Первая строка" , "Вторая строка" ) ; // 1