1с переменная не определена работасдиалогами
Начиная с версии 8.3.3 платформы в модуле управляемой формы, модуле команды и общем модуле появилось ключевое слово ЭтотОбъект , которое ссылается на текущий контекст модуля. В более ранних версиях платформы ключевое слово ЭтотОбъект использовалось только в модуле объекта или в модуле обычной формы и ссылалось на текущий объект. С какой стати решили использовать то же слово для модулей вместо более благозвучных ЭтотМодуль и ЭтаФорма — непонятно. Оставим это на совести разработчиков. Нам же нужно разобраться с ошибкой.
Итак, если вы разработали управляемую форму на платформе 8.3.3 или выше и пытаетесь использовать ее на платформе 1С:Предприятие 8.2 или 8.3.2 и ниже, помните, что в них ключевого слова ЭтотОбъект нет! Поэтому вызов, подобный этому, будет генерировать ошибку:
Чтобы избавиться от ошибки, можно:
- Обновить платформу до версии 8.3.3 или выше (Если используется стандартная конфигурация, возможно, потребуется обновить еще и версию конфигурации. Если конфигурация самописная, возможно, потребуется тестирование всех модулей и форм с последующим проведением рефакторинга);
- Избавиться от использования ключевого слова ЭтотОбъект , проведя рефакторинг кода;
Добавить комментарий Отменить ответ
Рубрики
Свежие записи
- Функция ПолучитьСклоненияСтроки()
- Ошибка «Тип не определен (ФормаКлиентскогоПриложения)»
- Процедура ПодключитьОбработчикОповещения()
- Недопустимое значение параметра номер 1 ПодключитьОбработчикОжидания()
- Процедура ОтключитьОбработчикОжидания()
- Процедура ПодключитьОбработчикОжидания()
- Что такое Символы.ПС в 1с 8?
- Свойство Символы.* глобального контекста
- Процедура ПолучитьЗаголовокСистемы()
- Процедура УстановитьЗаголовокКлиентскогоПриложения()
Свежие комментарии
- Александр К. к записи Функция ЗначениеЗаполнено()
- Олег к записи Функция ЗначениеЗаполнено()
- Александр К. к записи Как преобразовать таблицу значений в структуру?
- Михаил к записи Как преобразовать таблицу значений в структуру?
- Александр К. к записи Как получить формат даты месяц год?
Здравствуйте, коллеги! Сегодня поговорим о проблеме неопределенных переменных в 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 Предприятие проверить опечатка ли спровоцировала ошибку, просто скопируем переменную из объявления и вставим ее имя в то место, где случается ошибка. Можно сделать следующим образом, чтобы избежать таких ошибок в будущем:
Теперь, когда курсор останавливается на идентификаторе, все другие его упоминания будут выделены, как на следующем изображении:
Специалист компании ООО «Кодерлайн»
Дягилев Дмитрий Вадимович
Вас могут заинтересовать следующие статьи:
Помог совет хорошего человека alex0402 на дружественном форуме:
1) почистить кеш;
2) удалить базу из списка и добавить снова.
Проблема решена, тему можно закрывать.
fisher8282 , интересно стало, что же за дружественный форум? Везде написал, что помог и везде этот секретный дружественный форум?
Уже не интересно.
Помог совет хорошего человека alex0402 на дружественном форуме:
1) почистить кеш;
2) удалить базу из списка и добавить снова.
это, т.е. этот вопрос, просто несерьёзно.
Чистка кэша - стандартные действия, которые надо делать после/при обновлении.
И все делают
Если Вы воспользуетесь обновлятором 1С (есть такая б/п программа в интернете), то там эти действия - чистка кэша - встроены в процесс (автоматического) обновления
А, если бы Вы (с)делали хоть какие-то действия - например, подняли бы копию базы (из другой папки) для изучения-анализа, то и чистить (удалять-добавлять из списка) не пришлось бы.
И вопроса не было бы
Помог совет хорошего человека alex0402 на дружественном форуме:
1) почистить кеш;
2) удалить базу из списка и добавить снова.
это просто несерьёзно.
Это стандартные действия, которые надо делать после/при обновлении
Если Вы воспользуетесь обновлятором 1С (есть такая б/п программа в интернете), то там эти действия - чистка кэша - встроены в процесс (автоматического) обновления
А, если бы Вы (с)делали хоть какие-то действия - например, подняли бы копию базы (из другой папки) для изучения-анализа, то и чистить (удалять-добавлять из списка) не пришлось бы.
И вопроса не было бы
Не судите строго, я свой уровень изначально озвучил - Пользователь. Прежде после обновления проблем не возникало.
По поводу "Обновлятора 1С" почитаю, спасибо.
По поводу копии "из другой папки" - не было копии после обновления, была только до (понятно, что оплошность, согласен). Элементарная ошибка заключалась также в том, что я вновь созданный образ размещал в той же папке, где и располагалась база ранее, и в этой связи "работал" старый кеш.
Цитата |
---|
fisher8282 , интересно стало, что же за дружественный форум? Везде написал, что помог и везде этот секретный дружественный форум? |
Да не секретный он: forum-1c_ru. Обычно не приветствуют ссылки на другой ресурс.
forum-1c_ru/index.php?topic=67815
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Работа с Диалогами в языке 1С 8.3, 8.2 (в примерах
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю). |
Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
Режим = РежимДиалогаВопрос.ДаНетОтмена;
Ответ = Вопрос(«Документ будет записан», Режим, 0);
Если Ответ = КодВозвратаДиалога.Отмена Тогда
Сообщить(«Документ не проведен, заказы поставщикам не созданы»);
Возврат;
КонецЕсли;
Если Ответ = КодВозвратаДиалога.Нет Тогда
Сообщить(«Документ не проведен, заказы поставщикам не созданы»);
Возврат;
КонецЕсли;
Если Ответ = КодВозвратаДиалога.Да Тогда
Записать(Новый Структура(«РежимЗаписи», РежимЗаписиДокумента.Запись));
КонецЕсли;
В статье будут рассмотрены причины отказа от дальнейшей поддержки модальных окон в платформе «1С:Предприятие» и типовые сценарии перевода имеющегося функционала на новую модель.
Развитие продуктов «1С» и платформы «1С:Предприятие»
Одним из основных векторов развития платформы «1С:Предприятие» является возможность ее успешного использования в среде Интернет.
Эта среда имеет ряд ограничений, которые отсутствуют в среде настольных приложений:
- Ограничения программ, используемых для работы в Интернете (браузеров),
- Ограничения, связанные с качеством связи между клиентским приложением и сервером.
Приложения, предназначенные для работы через Интернет, должны быть построены с учетом этих ограничений, поэтому их модель отличается от настольных приложений.
Все интернет-приложения создаются с использованием асинхронной (событийно-управляемой) модели управления логикой, в отличие от принятой в настольных приложениях синхронной (последовательной) модели.
Изначально платформа «1С:Предприятие» создавалась для построения настольных бизнес-приложений, использующих синхронную модель. Однако, с развитием SaaS-решений потребовался постепенный переход на асинхронную логику.
Проблемы поддержки модальных окон в среде Интернет
Модальные окна являются элементом синхронной модели. Они блокируют исполнение логики приложения, позволяя выполнять ее участки последовательно, друг за другом, в зависимости от результата, полученного от пользователя.
Такие окна не входят в стандарт веб-разработки, поэтому не поддерживаются всеми браузерами, при помощи которых пользователь получает доступ к приложениям «1С».
Для разработки качественных веб-приложений требуются асинхронные средства обеспечения взаимодействия с пользователем.
Такие средства были добавлены в платформу «1С:Предприятие» в версии 8.3.3.
Несколько терминов и определений
Далее в статье будут использоваться следующие термины:
- Модальное окно – окно, блокирующее весь интерфейс приложения, при этом исполнение кода останавливается до момента получения ответа пользователя. Например, окно модальной формы.
- Модальный метод – метод глобального контекста или объекта платформы, при выполнении которого происходит открытие модального окна. Например, методы Вопрос() , ОткрытьМодально() .
- Блокирующее окно – окно, блокирующее весь интерфейс или его часть, но при этом исполнение кода не останавливается. Например, форма, блокирующая владельца.
Общие принципы при переходе на асинхронную модель построения бизнес-логики
В синхронной модели код, зависящий от выбора пользователя, выполняется последовательно.
В асинхронной модели мы можем получить результат только обрабатывая события, которые возникают, когда пользователь делает свой выбор. При этом на время ожидания выбора код приложения не останавливается и оно продолжает работать.
Таким образом, получается, что такой код разбивается на две процедуры:
- Процедура, которая создает блокирующее окно, ожидающее действия пользователя,
- Процедура – обработчик оповещения о том, что пользователь сделал свой выбор и мы можем использовать результат его действий для дальнейшей работы.
Новые асинхронные средства платформы для взаимодействия с пользователем
Для реализации асинхронной модели в первую очередь требуется возможность описания процедур-обработчиков оповещений, которые будут вызваны системой при завершении выбора пользователя.
Для этого в платформу был добавлен новый тип объектов – ОписаниеОповещения .
Этот объект имеет конструктор со следующими параметрами:
- ИмяПроцедуры – Указывает имя процедуры-обработчика оповещения, которая будет выполнена после получения ответа пользователя,
- Модуль -Указывает в каком модуле расположена эта процедура. Этот параметр может иметь следующие типы:
- УправляемаяФорма – процедура расположена в модуле управляемой формы,
- ОбщийМодуль – процедура расположена в общем неглобальном клиентском модуле,
- КомандаКомандногоИнтерфейса – процедура расположена в модуле команды.
Для получения значения модуля у вышеперечисленных объектов добавлено общее свойство ЭтотОбъект.
- ДополнительныеПараметры – значение любого типа, которое будет передано в процедуру-обработчик оповещения при ее вызове.
При вызове указанной процедуры системой ей через параметры передается результат выбора пользователя и значение ДополнительныеПараметры . В некоторых случаях результат выбора может отсутствовать (метод ПоказатьПредупреждение() ) или передаваться несколькими параметрами (метод НачатьПомещениеФайла() ).
Для перехода на асинхронную модель в платформу были добавлены методы, аналогичные модальным методам, но, в отличие от них, не блокирующие поток исполнения. Эти методы уже не являются элементами синхронной логики, поэтому могут беспрепятственно использоваться при разработке веб-приложений.
Группа этих методов отличается следующим:
- Их имена начинаются со слова Показать либо Начать, например ПоказатьВопрос() вместо Вопрос() , НачатьПомещениеФайла() вместо ПоместитьФайл() , и так далее,
- Первым параметром принимают объект ОписаниеОповещения, указывающий на процедуру модуля, которая будет выполнена после того как пользователь сделает выбор в блокирующем окне,
- Не возвращают значения, вместо этого результат выбора пользователя будет передан в процедуру модуля, описанную объектом ОписаниеОповещения.
Также были добавлены возможности работы с управляемыми формами в асинхронной модели. Однако, для них не создавалось новых методов, а были доработаны уже имеющиеся средства:
- Добавлено свойство формы ОписаниеОповещенияОЗакрытии , которое указывает на процедуру модуля, которая будет вызвана при ее закрытии. Также это значение можно установить при помощи нового параметра метода ОткрытьФорму() ,
- Добавлен вариант режима открытия окна формы – БлокироватьВеcьИнтерфейс , при использовании которого открываемая форма заблокирует все окна, а не только окно родителя.
Дополнительно реализован новый метод глобального контекста ВыполнитьОбработкуОповещения(), который позволяет вручную осуществить вызов процедуры-обработчика. Это позволяет реализовать общую процедуру, выполняющую опрос пользователя, которая вызывается из разных мест.
Особенности реализации асинхронной бизнес-логики
Следует отметить, что поначалу асинхронная модель может показаться сложнее привычной синхронной. На самом деле, понимая основные различия этих моделей, разработка асинхронных приложений становится не многим труднее.
Это подтверждается тем фактом, что все современные веб-приложения построены именно с использованием асинхронной модели и их количество постоянно растет.
Типовые сценарии при переходе на асинхронную модель
Вопрос пользователю в команде формы
Наиболее частым сценарием является получение информации от пользователя во время исполнения какой-либо команды.
Допустим, существует следующий код, написанный в рамках синхронной модели:
В рамках асинхронной модели с использованием новых средств этот код будет выглядеть следующим образом:
Процедура ДобавитьХарактеристику ( Команда )
//Выберем вид характеристики
Оповещение = Новый ОписаниеОповещения (
"ДобавитьХарактеристикуЗавершение" ,
ЭтотОбъект ) ;
ОткрытьФорму ( "ПланВидовХарактеристик.ВидыХарактеристик.ФормаВыбора" ,
, , , , , Оповещение , РежимОткрытияОкнаФормы . БлокироватьВеcьИнтерфейс ) ;
КонецПроцедуры
Процедура ДобавитьХарактеристикуЗавершение ( ВидХарактеристики , Параметры ) Экспорт
Если ВидХарактеристики = Неопределено Тогда
Возврат ;
КонецЕсли ;
//Проверим наличие
Если ОписаниеХарактеристик . НайтиСтроки (
Новый Структура ( "ВидХарактеристики" , ВидХарактеристики ) ) . Количество ( ) > 0 Тогда
ПоказатьПредупреждение ( , НСтр ( "ru = ‘Характеристика уже существует!’" , "ru" ) ) ;
Возврат ;
КонецЕсли ;
//Добавим вид характеристики на форму
ДобавитьХарактеристикуНаСервере ( ВидХарактеристики ) ;
КонецПроцедуры
Следует обратить внимание, что процедура-обработчик объявлена экпортируемой. Это связано с тем, что эта процедура будет вызвана не кодом самого модуля, а системным кодом платформы, поэтому модуль должен предоставить к ней доступ.
Вопрос пользователю при закрытии формы
Более сложной является ситуация, когда нужно о чем-то спросить пользователя во время обработчика события, например события закрытия формы. В асинхронной модели мы не можем сразу получить результат выбора, чтобы указать дальнейшие действия системе при помощи значения параметра Отказ .
В таких случаях доступен следующий алгоритм:
- Создать в форме переменную, которая будет хранить ответ пользователя при ее закрытии,
- Если ответа получено еще не было (переменная содержит Неопределено ), то в обработчике ПередЗакрытием нужно показать окно выбора пользователю, например, при помощи метода ПоказатьВопрос() и прервать закрытие формы, установив Отказ=Истина ,
- В процедуре-обработчике выбора следует установить переменной результат выбора и вызвать метод Закрыть() формы,
- Если переменная содержит какое-либо значение, то это значит, что идет процесс закрытия, инициированный на предыдущем шаге, результат выбора от пользователя уже получен и обработчик ПередЗакрытием может использовать его значение.
Ниже приведен пример кода, реализующего этот алгоритм:
Вопрос пользователю во вложенных процедурах
Теперь рассмотрим случай, когда выбор пользователя осуществляется в некоторой общей процедуре, вызываемой из разных мест другими процедурами. Получается, что в асинхронной модели такая процедура не может сразу вернуть результат, а должна как-то уведомлять вызывающие ее процедуры о том, что результат получен и можно продолжать работу.
Предположим, существует общая функция, которая возвращает текст, в зависимости от ответа пользователя:
В асинхронной модели эту функцию и ее вызовы следует реализовывать следующим образом:
Таким образом, вызовы процедур можно связывать в цепочки, передавая им результат при помощи метода ВыполнитьОбработкуОповещения().
Заключение
В статье были рассмотрены новые средства, позволяющие реализовывать более качественные приложения с использованием асинхронной модели, принятой в среде Интернет.
Несмотря на наличие таких средств, видно, что большое количество диалогов может усложнять программный код. К тому же, в веб-приложениях диалоги выбора используются гораздо реже, чем в настольных, поскольку снижают общее удобство использования.
Читайте также: