1с проверить существование переменной
Приветствую, коллеги! В данной статье поговорим о том, как сделать проверку на «пустое» значение в 1С. Ведь бывает, что программисту, когда он описывает алгоритм по обработке, нужно узнать есть ли что-то в переменной или эта переменная «пустая». Далее будет приведена классификация «пустых» значений и функции для проверки их наличия или отсутствия.
1. Значение «Неопределено» и значение типа “NULL”
Если разбираться по-научному, то в системе 1С не существует понятия «пустое» значение. Правильнее называть его значением «Неопределено» (переменная такого типа). Вышеупомянутый тип используют в качестве значения переменных (реквизитов, столбцов таблиц и так далее), у которых, согласно стандартным настройкам, тип является составным. То есть когда в одной переменной содержится какое-то количество типов значений, то данная переменная будет иметь тип «Неопределено». То есть, данной переменной можно присваивать вышеуказанное значение, как то, которое обозначает не принадлежность значения любому иному доступному типу. Данный тип остаётся, пока внутри переменной значение не переменится. Из всех утверждений выше следует, что тип «Неопределено» предупреждает о том, что в переменной отсутствует значение любого из определённых типов, простым слогом – оно «пустое».
Следует рассмотреть ещё значение типа «NULL» – его наличие означает, что значение отсутствует.
Подытожим: два данных значения – это специальные типы, предназначены для особых случаев.
В большем количестве типов есть стандартные значения, которые были установлены в системе по умолчанию, по сути это то значение, которое автоматически присваивается переменной даже в случае, когда её не заполнили. Как пример: для чисел – это будет значение «0», для даты – дата «00010101», для строк – строка без символов.
Замечание: для типа «ссылка» есть значение пустой ссылки.
2. Вариации проверок на пустое значение
Универсальный метод проверки применим в случаях, когда тип переменной известен или не известен.
В случае, когда разработчик знает тип переменной, которая подлежит проверке, проводится сравнение значения переменной с пустым значением для заданного типа. Чтобы узнать пустое значение у типа, используется функция «ПолучитьПустоеЗначение()». На скриншоте ниже приведён пример проверки с известным типом переменной:
Рис. 1 Проверка на пустое значение с известным типом переменной
Если разработчику не известен тип переменной, но проверить на пустое значение нужно, используется функция «ПустоеЗначение()», как показано на скриншоте ниже:
Рис. 2 Проверка на пустое значение с неизвестным типом переменной
Функция «ЗначениеЗаполнено()» используется для проверки содержания значения, которое ей передали. Это можно увидеть по общей форме функции:
Рис. 3 Функция ЗначениеЗаполнено
Для типа «ссылка» проверка немного отличается от тех, которые были описаны выше. Чтобы узнать содержится ли в ссылке «пустое» значение нужно воспользоваться методом «ПустаяСсылка()». Работает он аналогично функции «ЗначениеЗаполнено()», только для ссылок.
В данной статье было рассмотрены общие понятия «пустое» значение в 1С и то, каким типам оно соответствует. Также были приведены 4 разных способа проверки на «пустое» значение, из которых можно легко избрать самый сподручный для конкретного типа и конкретного кода программы.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Пол-года назад необходимо было из внешнего отчета проверить, определена ли в глобальном модуле переменная глКаталогПечФорм (ну, типа, универсальный отчет, сам подстраивается под механизмы конфигурации).
Хотелось простой конструкции типа:
Однако при открытии отчета в конфигурации без глКаталогПечФорм, отчет вываливал ошибку компиляции.
Бред, конечно, но работает! Правда, неверно определяется случай, когда переменная есть, а значение ей не присвоено, но эту проблему обойти уже легче.
В процессе обсуждения этой статьи Abadonna предложил ещё более лаконичный вариант:
Обход упомянутой проблемы с неициализированной переменной
Специальные предложения
Попытка
ы = глКаталогПечФорм;
Исключение
Сообщить("Переменной нету");
КонецПопытки;
2clappa.
А почему ты, кстати, пишешь, что бредово? Наоборот, супер-красивым способом объявил переменную внутри никогда не выполняемого условия.
Ну, как сказать. Язык программирования - это ведь тоже язык. Подразумевающий логику. А тут. Многие поймут смысл этой конструкции?
Типа, чтобы попросить у прохожего прикурить, я должен спросить его: "Который час?". И кодовую фразу эту знаем во всём мире только он, я и Пит (который вообще всё знает, но никому не скажет).
Короче, решение некоторых задач на 1С напоминает старые добрые квесты, честное слово.
. но эту проблему обойти уже легче
Ну так обойди! А так - статья не закончена.
>Подразумевающий логику. А тут. Многие поймут смысл этой конструкции?
Логика тут железная:
1. Чтобы обойти синтаксис-контроль мне надо как-то объявить переменную, но так чтобы она не поменяла значения
2. Я поставлю никогда не выполнимое условие, внутри которого ее и объявлю методом присваивания
Те, кто этой логики не поймут срочно должны менять профессию ;)
>.. но эту проблему обойти уже легче
>Ну так обойди! А так - статья не закончена.
А вот ЭТУ проблему как раз НЕ обойти
Кстати, приколитесь:
сидит рядом со мной дедушка-программист (63 года), который вовсю программит в DOS-Klipper, а в Клиппере ему почему-то проблематично поставить комментарии сразу на блок операторов.
Он уж давно изобрел такой способ закомментровать
if 0>1
strr=natr+' '+s_fakt[ii,2]+' '+s_fakt[ii,3]+' ';
+s_fakt[ii,4]+s_fakt[ii,5]+s_fakt[ii,6]+s_fakt[ii,7]+' ';
+s_fakt[ii,8]+s_fakt[ii,9]+s_fakt[ii,10]+s_fakt[ii,11]
endif
А объявление локальной переменной разве не перекроет глобальную? Путь даже локальная объявлена вот так, но ведь объявлена. И в другом месте обращение будет к ней, а не к глобальной.
2Альф.
Метод автора я не проверя, а вот в таком виде
Процедура Сформировать()
глКаталогПечФорм=глКаталогПечФорм;
Если ПустоеЗначение(глКаталогПечФорм)=1 Тогда
Сообщить("Переменной нет");
Иначе
Сообщить(глКаталогПечФорм);
КонецЕсли;
КонецПроцедуры
в стандартной бухгалтерии успешно печатает
C:\1SBDB\ExtForms\PrnForms\
а в пустой базе
Переменной нет
Да! Добавил еще одну процедурку
Процедура ЕщеРаз()
Сообщить(глКаталогПечФорм);
КонецПроцедуры
всё успешно выводится.
Если бы переменная приняла локальный контекст, по идее,
после отработки Сформировать() при выполнении ЕщеРаз() должно было ругнуться, что
переменная не обнаружена. А раз работает, значит как была глобальной, так и осталась
Гл. переменная есть, а значение не присвоено - как раз не обойти, но в большинстве случаев и не надо.
2Support
Случайно заметил: нажал Новые комментарии внизу, страница обновилась, НО порядок остался тот же (новые вверху)
Для особо непонятливых надо было дописать в процедуре Проверка()
перед КонецПроцедуры ---> Сообщить(глКаталогПечФорм):
сегодня проверил метод, не работает.
когда объявляешь переменную, она объявляется локальной переменной,
и даже конструкция А=А не вызывает глобальную.
2 support
> когда объявляешь переменную, она объявляется локальной переменной,
и даже конструкция А=А не вызывает глобальную.
Хм. Ты как объявляешь переменную? "Перем А"? Это ни к чему.
Сама конструкция А=А объявляет локальную переменную "А", при условии, что она не объявлена как глобальная.
На этом и строится весь "фокус".
Сама конструкция А=А объявляет локальную переменную "А", И НЕ ВАЖНО, что она объявлена как глобальная.
Это будет локальная переменная. Тоже самое, что объявить ее в начале процедуры
Перем А;
> Сама конструкция А=А объявляет локальную переменную "А", И НЕ ВАЖНО, что она объявлена как глобальная.
Не логично. Это что получается? Если я напишу А=А; А=Б;, то у меня "локальная" переменная А будет равна Б, но глобальная "А" останется неизменной? Не верю.
Не понял о чем спор:
Гл модуль:
Перем глА Экспорт;
глА=5;
Отчет:
глА=глА;
Сообщить(глА); // сообщает 5
Гл модуль:
//Перем глА Экспорт; - не объявили
глА=5;
Отчет:
глА=глА;
Сообщить(глА); // сообщает пусто
Как-то странно ты проверял.
Мало того! Если в первом отчете:
Процедура Сформировать()
глА=глА;
Сообщить(глА); // сообщает 5
глА=10; // присвоили 10
КонецПроцедуры
то при запуске после него другого отчета:
Процедура Сформировать()
Сообщить(глА); // сообщает 10
КонецПроцедуры
Код |
---|
Показать полностью |
Просмотры 16003
Загрузки 0
Рейтинг 27
Создание 18.02.07 00:00
Обновление 18.02.07 00:00
№ Публикации 16943
Тип файла Нет файла
Конфигурация Конфигурации 1cv7
Операционная система Не имеет значения
Страна Россия
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)
Код открыт Не указано
См. также
27.01.2016 88063 Serginio 116
"Виртуальный" работник на платформе 1C v7.7
В статье расписаны примеры из жизни использования "Виртуального" работника. Разобраны вопросы, возникающие при работе с ним.
28.11.2021 715 user707242_Gold_karas 16
ЗаполнитьЗначенияСвойств - заставляем работать в 7.7
Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?
24.07.2014 22915 tomvlad 5
Чтение строк файла CSV в список значений с помощью метода ИзСтрокиСРазделителями
Чтение строк файла CSV в список значений с помощью метода ИзСтрокиСРазделителями
04.04.2013 20514 ivisor_fil 11
Динамическая фильтрация в справочнике при вводе наименования
Позволяет в открытой форме списка, выбора или подбора справочника производить динамическую фильтрацию по набранному наименованию.
02.07.2012 17330 maxpiter 62
28.11.2011 8174 sdin101 9
Ликбез 7.7: нумерация страниц отчета
"Колонтитулы" без колонтитулов.
28.04.2011 22438 Арчибальд 19
Некоторые ошибки и «проблемные» особенности реализации встроенного языка платформы 1С:Предприятие 7.7
Описание некоторых ошибок и особенностей реализации встроенного языка, которые создают «подводные камни» при программировании, а также возможных способов обхода этих проблем из собственного опыта работы на платформе 1С:Предприятие 7.7.
08.04.2011 50101 AleksR 102
Вариант реализации динамического табло в 1С 7.7
Позволяет отображать на экране (монитора или большого телевизора) результат работы требуемого отчета при изменении определенных данных без необходимости интерактивного участия пользователя
14.03.2011 9476 1с2с 19
Разбор строки CSV при помощи RegExp
Вроде бы все просто, пока не встретилось что-то наподобие "111;111""";111
27.05.2010 14475 Berrimor 16
(V 7.7) Справка по работе с метаданными (с примерами)
Когда то, мне очень потребовалось ПРОГРАММНО узнать ЕСЛИ ли на конфигурации пароль. и на этом этапе я познакомился с МЕТАДАННЫМИ 1С. Метаданные в 1С - это специальные данные, описывающие структуру базы данных. Почти все, что мы видим в графическом представлении в конфигураторе может быть получено программным путем при работе в 1С в режиме «Предприятие». Исключение составляют только наборы прав и интерфейсы. В программе получение метаданных происходит через объект «Метаданные».
Здравствуйте, коллеги! Сегодня поговорим о проблеме неопределенных переменных в 1С. Рядовой пользователь с данной ошибкой сталкиваться не должен, но если уж и произошло подобное при работе в типовой конфигурации 1С, которая никак не модифицировалась, возможно, у нас наклевывается проблема самого релиза, которая иссякнет при обновлении. В таком случае стоит связаться со специалистом, чтобы найти выход из ситуации.
Если же Вы сами занимаетесь разработкой и столкнулись с ошибкой, «Переменная не определена в 1С», то следует обратится к конфигуратору, найти, что за переменная и в какой именно момент не определена. Есть несколько вариантов решения, но нужно подбирать их с умом, ибо вполне возможно, что после неправильного исправления в одном месте, Вы получите кучу ошибок в других местах.
1. Проверка на определения 1С 8.3
Можно прописать перед ошибкой следующий код:
Если Не НашаПеременная = Неопределено Тогда
Соответственно, закрыв «Если» после, но тут как уже писалось нужно действовать аккуратно, возможно данная конструкция напрочь сломает весь последующий код. Гораздо лучше найти, где объявляется переменная и устранить ошибку.
2. Поиск объявления переменной 1С 8.3
Вполне возможен вариант, что ее просто забыли включить в передаваемые параметры функции или она не доступна в данном виде клиента. Такое случается, когда, например, обращаются из тонкого клиента к метаданным. В этом случае стоит переписать функцию или, возможно, объявить новую, но уже на сервере, которая вернет необходимые тонкому клиенту данные.
3. Обычная опечатка в программе 1С 8.3 Предприятие
Чтобы быстро в программе 1С 8.3 Предприятие проверить опечатка ли спровоцировала ошибку, просто скопируем переменную из объявления и вставим ее имя в то место, где случается ошибка. Можно сделать следующим образом, чтобы избежать таких ошибок в будущем:
Теперь, когда курсор останавливается на идентификаторе, все другие его упоминания будут выделены, как на следующем изображении:
Специалист компании ООО «Кодерлайн»
Дягилев Дмитрий Вадимович
Вас могут заинтересовать следующие статьи:
Здравствуйте, коллеги! Сегодня поговорим о проблеме неопределенных переменных в 1С. Рядовой пользователь с данной ошибкой сталкиваться не должен, но если уж и произошло подобное при работе в типовой конфигурации 1С, которая никак не модифицировалась, возможно, у нас наклевывается проблема самого релиза, которая иссякнет при обновлении. В таком случае стоит связаться со специалистом, чтобы найти выход из ситуации.
Если же Вы сами занимаетесь разработкой и столкнулись с ошибкой, «Переменная не определена в 1С», то следует обратится к конфигуратору, найти, что за переменная и в какой именно момент не определена. Есть несколько вариантов решения, но нужно подбирать их с умом, ибо вполне возможно, что после неправильного исправления в одном месте, Вы получите кучу ошибок в других местах.
1. Проверка на определения 1С 8.3
Можно прописать перед ошибкой следующий код:
Если Не НашаПеременная = Неопределено Тогда
Соответственно, закрыв «Если» после, но тут как уже писалось нужно действовать аккуратно, возможно данная конструкция напрочь сломает весь последующий код. Гораздо лучше найти, где объявляется переменная и устранить ошибку.
2. Поиск объявления переменной 1С 8.3
Вполне возможен вариант, что ее просто забыли включить в передаваемые параметры функции или она не доступна в данном виде клиента. Такое случается, когда, например, обращаются из тонкого клиента к метаданным. В этом случае стоит переписать функцию или, возможно, объявить новую, но уже на сервере, которая вернет необходимые тонкому клиенту данные.
3. Обычная опечатка в программе 1С 8.3 Предприятие
Чтобы быстро в программе 1С 8.3 Предприятие проверить опечатка ли спровоцировала ошибку, просто скопируем переменную из объявления и вставим ее имя в то место, где случается ошибка. Можно сделать следующим образом, чтобы избежать таких ошибок в будущем:
Теперь, когда курсор останавливается на идентификаторе, все другие его упоминания будут выделены, как на следующем изображении:
Специалист компании ООО «Кодерлайн»
Дягилев Дмитрий Вадимович
Вас могут заинтересовать следующие статьи:
Универсальная замена метода "Свойство()"
Возможно у мноих из вас возникала задача проверять наличие определенного элемента на форме, или имеется ли на области макета нужный параметр. К сожалению, стандартных методов, позволяющих выполнить эту задачу, платформа не предоставляет.
Для значений типа "Структура" доступен метод "Свойство()":
Если же мы попытаемся таким же образом узнать о существовании какого-либо элемента формы или параметра на области макета (как пример), то это вызовет следующую ошибку:
По подробной информации об ошибке видно, что коллекция элементов управляемой формы (переменная "Элементы") не имеет метода "Свойство()". Тоже самое относится к абсолютому большинству коллекций, которые поддерживает платформа.
Для некоторых коллекций, таких как "КолонкиТабличногоПоля", "КоллекцияЭлементовМетаданных" для использования доступен метод "Найти()", в качестве первого параметра которому предеатеся имя элемента для поиска. Методы возвращают найденный элемент или "Неопределено", если значение не найдено. Таким образом, с помощью метода найти можно унать наличие того или иного свойства для тех коллекций, которые поддерживают работу с ним.
Но что делать, если коллекция не поддерживает работу с подобными методами, описанными выше. В таких случая нужен совсем иной способ работы с этими типами данных.
Сегодня в статье будет идти речь об универсальном подходе, позволяющим определить наличие свойства у значения любого типа данных 1С:Предприятие 8.x.
Как это реализовать
Предлагаю написать универсальную функцию для определения наличия свойства у любого типа значения и затем перейти к использованию ее на небольшом примере.
Работа предлагаемого подхода основывается на использовании метода "ЗаполнитьЗначенияСвойств()" и переменной с типом "Структура". На следующем листинге приведен програмный код данной функции:
В принципе все понятно из коментариев на листинге. Единственным моментом, на что следуюет обратить внимание, является то, что если свойство будет найдено, а его значение при этом равно NULL, то функция все равно скажет, что такого свойства нет. В таких случаях нужно создавать дополнительную проверку.
Практический пример
В качестве примера в тестовой конфигурации добавим документ "ТестовыйДокумент" с несколькими реквизитами. На его форму добавлены соответствующие элементы формы.
В поле "Имя элемента" вводится имя элемента формы. По кнопке найти отрабатывает созданная нами ранее функция. После выполнения команды, программа уведомляет пользователя об успешности поиска. На следующем листинге приведен программный код обработчика команды и вызываемая процедура поиска свойств.
Тестовую конфигурация Вы можете скачать по ссылке .
Подведем итог
Описанный в статье подход позволяет проверять наличия свойст в коллекциях любого типа. Элементы формы, коллекция метаданных, параметры макета и много другое. Отрицательного влияния на производительность не имеет. Работает на любой версии платформы.
P.S. По замечанию alcom привожу программный код с использованием GUID'а.
Определив объекты метаданных, занимающих большой объем можно лишние данные вычищать, внести изменения в конфигурацию или в бизнес процесс.
Читайте также: