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
Случайно заметил: нажал Новые комментарии внизу, страница обновилась, НО порядок остался тот же (новые вверху) Добавил про обход проблемы с неинициализированной переменной Ха! Молодец!
Один мой знакомый, имя в виду слово "мудр", говорил так: "ну ты и мудёр" ;)
+1 Для особо непонятливых надо было дописать в процедуре Проверка()
перед КонецПроцедуры ---> Сообщить(глКаталогПечФорм):
автор, надо просто сделать
глКаталогПечФорм=глКаталогПечФорм; сегодня проверил метод, не работает.
когда объявляешь переменную, она объявляется локальной переменной,
и даже конструкция А=А не вызывает глобальную.
2 support
> когда объявляешь переменную, она объявляется локальной переменной,
и даже конструкция А=А не вызывает глобальную.
Хм. Ты как объявляешь переменную? "Перем А"? Это ни к чему.
Сама конструкция А=А объявляет локальную переменную "А", при условии, что она не объявлена как глобальная.
На этом и строится весь "фокус".
Это будет локальная переменная. Тоже самое, что объявить ее в начале процедуры
Перем А;
> Сама конструкция А=А объявляет локальную переменную "А", И НЕ ВАЖНО, что она объявлена как глобальная.
Не логично. Это что получается? Если я напишу А=А; А=Б;, то у меня "локальная" переменная А будет равна Б, но глобальная "А" останется неизменной? Не верю.
Гл модуль:
Перем глА Экспорт;
глА=5;
Отчет:
глА=глА;
Сообщить(глА); // сообщает 5
Гл модуль:
//Перем глА Экспорт; - не объявили
глА=5;
Отчет:
глА=глА;
Сообщить(глА); // сообщает пусто
Как-то странно ты проверял. Мало того! Если в первом отчете:
Процедура Сформировать()
глА=глА;
Сообщить(глА); // сообщает 5
глА=10; // присвоили 10
КонецПроцедуры
то при запуске после него другого отчета:
Процедура Сформировать()
Сообщить(глА); // сообщает 10
КонецПроцедуры Найти другой способ головоломно.
Буду знать как обманывать синтаксис :) Можно в процедуре "Проверка()" обойтись без встроенной функции ПолучитьПустоеЗначение():
Код |
---|
Показать полностью |
Просмотры 15833
Загрузки 0
Рейтинг 27
Создание 18.02.07 00:00
Обновление 18.02.07 00:00
№ Публикации 16943
Тип файла Нет файла
Конфигурация Конфигурации 1cv7
Операционная система Не имеет значения
Страна Россия
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)
Код открыт Не указано
Чат (мессенджер) для управляемых форм 1С 8.3 (Расширение)См. также
27.01.2016 85835 Serginio 116
Печать таблицы значений в 1С 7.7 при отладке
Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.
30.06.2021 1402 Zoltan_Black 11
Расчет страховых взносов в 1С 7.7 "Учет и отчетность предпринимателя, ред. 1.2" с апреля 2020
В этой статье описано, какие небольшие изменения можно внести в модуль документа Начисление налогов с ФОТ, чтобы правильно рассчитывались страховые взносы с 1 апреля 2020 г.
09.04.2020 13900 Юджин58 39
Дистрибьюция 7.7. Часть 1. Жизненный цикл заявки покупателя. Одна заявка покупателя, много адресов доставки.
Описан способ работы с учетом расписания с приоритетными покупателями - торговыми сетями (основными покупателями) в торговой или комплексной учетной системе на 1С 7.7. Множественная заявка покупателя на несколько торговых точек.
14.10.2019 5140 ksnik 14
1С:Предприятие 7.7. Оптимизация. Промо
Разгоняем 1С:Предприятие 7.7. Выжимаем последние соки.
31.01.2009 49399 alexk-is 110
Заполнение реквизитов документов из предыдущего документа
Функция для автоматического заполнения реквизитов документов.
04.02.2019 5632 drevilo 2
Доначисление страховых взносов на обязательное страхование от НС и ПЗ в Бухгалтерии 7.7 и УСН 7.7 для Договора подряда
Во всех источниках, которые мне встречались, написано, что Страховые взносы НС и ПФ нужно начислять, если это указано в Договоре подряда.
06.09.2017 10526 pentanom 0
Проверка часового пояса
При использовании терминалок для удаленных баз, иногда при входе в базу данных необходимо исключить возможность входа пользователей с компьютеров с другим часовым поясом. Например, работают в Новосибирской базе с временем UTC +6 и пытаются зайти в базу с UTC +3.
16.05.2016 11549 kudenzov 3
Как уменьшить количество заблокированных объектов Промо
История о том как я решил пересобрать форму справочника клиентов и чем это все закончилось.
12.01.2012 15782 ShEvOvIcH 18
[ПОЛЕЗНЯШКА, 7.7] Как посчитать итоги по документам черным запросом с изподвывертом?
Мелкая полезняшка, считает запросом итоговую сумму документов и количество документов.
12.03.2016 20274 CheBurator 18
09.03.2016 33554 Serginio 22
Экспорт нескольких MXL таблиц в один XLS файл, на отдельные листы. Простой алгоритм
Статья посвящена распространённому вопросу - как сохранить несколько таблиц (отчетов) в формате MXL, с которым работает 1С, на отдельные листы одного Excel файла. Освещается простой алгоритм решения проблемы штатными средствами, без использования внешних модулей и библиотек (не относящихся к 1С и Excel).
23.11.2015 17865 etmarket 14
Технология обновления нетиповых конфигураций 1С:Предприятия 7.7 Промо
Данная статья рассчитана на уже подготовленного пользователя, владеющего некоторыми навыками программирования и работы в конфигураторе. Статью можно использовать как поэтапное руководство к действию. Статья была написана для повышения качества работ выполняемых сотрудниками компании Информ Сервис при обновлении нетиповых конфигураций. Я надеюсь, что эта информация окажется полезной и для вас.
12.12.2008 64153 alexk-is 25
Процедура расшифровки ячейки таблицы в отчетах 1С 7.7
Хочу поделиться с вами универсальной процедурой для расшифровки ячеек печатной формы отчетов в 1С 7.7.
24.09.2015 18916 Anzhey 14
Универсальный способ сравнения таблиц
На эту тему уже есть статьи, но этот способ нигде не описан. Хотя я его использую с тех пор, как занимаюсь программированием. Его преимущество в простоте и универсальности: можно применять на 1С, SQL, а также в любом другом языке программирования.
05.07.2015 19796 json 2
Числа прописью в родительном падеже в 7.7? Легко!
Вывод числительных прописью в родительном падеже штатными средствами в три строчки кода.
20.06.2015 13276 gimalaj 3
Последовательный выпуск полуфабрикатов
Автоматический выпуск вложенных полуфабрикатов любой степени вложенности для ПУБ.
03.06.2015 12646 @Sonya 3
Хитрости сохранения табличного документа в Excel для дальнейшей работы с ним
Все пользователи 1С всех версий (начиная с 7-й) сталкиваются с проблемой нормальной работы с данными, сохраненными в Excel файл. Есть некоторые хитрости, которые позволяют облегчить работу с сохраненными данными из 1С в формат Excel.
16.01.2015 101036 shmellevich 40
21.08.2014 14936 iolko 8
Исправление в типовой комплексной конфигурации глобальной функции глВсеРеквизитыДокументаЗаполнены()
В типовых конфигурациях глобальная функция глВсеРеквизитыДокументаЗаполнены() не работает с реквизитами табличной части. Данная статья содержит текст исправленной функции, корректно проверяющей табличную часть.
20.08.2014 8313 hvv2002 0
ЗаполнитьЗначенияСвойств - заставляем работать в 7.7
Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?
24.07.2014 22681 tomvlad 5
Контекстный поиск в 7.7
Процедура контекстного поиска в журнале документов.
18.04.2014 10256 cushe 2
Проверка ИНН v.7.7
Проверка ИНН v.7.7
08.03.2014 9851 kras_71 1
Полезные функции. Склонение (должность и фамилия подписантов). Любой язык
Уехал директор в командировку, отпуск. , оставил доверенность на хозяйственные операции на другого сотрудника. Все договора и другие документы в обмороке - "подписант" теперь другой, по тексту тоже много правок. Пересмотрел много публикаций, вариантов много, не приглянулось. Сделал свой "Баян" . У меня всего-то крутится пять фигурантов . Нет простого, наглядного и всепогодного варианта без языкового барьера. Всем процессом управляет пользователь.
03.03.2014 18397 kompas-dm 5
Подготовка сведений для ПФР ЗиК 339. СЗВ-6-4 две незначительные ошибки.
Подготовка сведений для ПФР ЗиК 339. СЗВ-6-4 две незначительные ошибки: 1.При переносе сотрудника из одной пачки в другую у него теряются сведения о выплатах. 2.Неактивна кнопка сортировки сотрудников.
Здравствуйте, коллеги! Сегодня поговорим о проблеме неопределенных переменных в 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, то функция все равно скажет, что такого свойства нет. В таких случаях нужно создавать дополнительную проверку.
Практический пример
В качестве примера в тестовой конфигурации добавим документ "ТестовыйДокумент" с несколькими реквизитами. На его форму добавлены соответствующие элементы формы.
В поле "Имя элемента" вводится имя элемента формы. По кнопке найти отрабатывает созданная нами ранее функция. После выполнения команды, программа уведомляет пользователя об успешности поиска. На следующем листинге приведен программный код обработчика команды и вызываемая процедура поиска свойств.
Тестовую конфигурация Вы можете скачать по ссылке .
Подведем итог
Описанный в статье подход позволяет проверять наличия свойст в коллекциях любого типа. Элементы формы, коллекция метаданных, параметры макета и много другое. Отрицательного влияния на производительность не имеет. Работает на любой версии платформы.
Читайте также: