1c переменная не определена длительныеоперации

Обновлено: 06.07.2024

Здравствуйте, коллеги! Сегодня поговорим о проблеме неопределенных переменных в 1С. Рядовой пользователь с данной ошибкой сталкиваться не должен, но если уж и произошло подобное при работе в типовой конфигурации 1С, которая никак не модифицировалась, возможно, у нас наклевывается проблема самого релиза, которая иссякнет при обновлении. В таком случае стоит связаться со специалистом, чтобы найти выход из ситуации.

Если же Вы сами занимаетесь разработкой и столкнулись с ошибкой, «Переменная не определена в 1С», то следует обратится к конфигуратору, найти, что за переменная и в какой именно момент не определена. Есть несколько вариантов решения, но нужно подбирать их с умом, ибо вполне возможно, что после неправильного исправления в одном месте, Вы получите кучу ошибок в других местах.

1. Проверка на определения 1С 8.3

Можно прописать перед ошибкой следующий код:

Если Не НашаПеременная = Неопределено Тогда

Соответственно, закрыв «Если» после, но тут как уже писалось нужно действовать аккуратно, возможно данная конструкция напрочь сломает весь последующий код. Гораздо лучше найти, где объявляется переменная и устранить ошибку.

2. Поиск объявления переменной 1С 8.3

Вполне возможен вариант, что ее просто забыли включить в передаваемые параметры функции или она не доступна в данном виде клиента. Такое случается, когда, например, обращаются из тонкого клиента к метаданным. В этом случае стоит переписать функцию или, возможно, объявить новую, но уже на сервере, которая вернет необходимые тонкому клиенту данные.

3. Обычная опечатка в программе 1С 8.3 Предприятие

Чтобы быстро в программе 1С 8.3 Предприятие проверить опечатка ли спровоцировала ошибку, просто скопируем переменную из объявления и вставим ее имя в то место, где случается ошибка. Можно сделать следующим образом, чтобы избежать таких ошибок в будущем:

Обычная опечатка в 1С

опечатка в программе 1С

Теперь, когда курсор останавливается на идентификаторе, все другие его упоминания будут выделены, как на следующем изображении:

Использование общих модулей "Длительные операции" позволяет перенести всю тяжесть исполнения ресурсоемких процедур на сторону сервера, не мешая при этом работе клиентского приложения, инициировавшего этот процесс, т.е. не мешая дальнейшей работе пользователя в приложении. Описанная возможность реализуется в модулях БСП за счет исполнения "тяжелых" процедур на сервере в фоновом режиме (запуску фоновых заданий под каждую процедуру).

Ниже приведены процедуры, позволяющие реализовать в любой форме возможность выполнения необходимой вам длительной операции в фоновом режиме. Для этого в форме обязательно должны содержаться два реквизита "АдресХранилища" (типа строка) и "ИдентификаторЗадания" (типа уникального идентификатора), в модуле формы должна быть объявлена клиентская переменная "ПараметрыОбработчикаОжидания". Помимо этого экспортная процедура длительной операции должна содержать в себе два параметра "СтруктураПараметров" (типа структуры) и "АдресХранилища" (типа строка), результат исполнения должен быть помещен во временное хранилище, а адрес в нем должен быть присвоен параметру "АдресХранилища".

Далее кратко рассмотрим назначение процедур, размещенных в модуле формы, из которой будет инициироваться запуск длительной операции.

Процедура является обработчиком команды, отображаемой на форме, инициирующей запуск длительной операции. В ней производится передача исполнения на сервер и получение результата выполнения. В случае, если результат для отображения пользователю еще не готов, то наша операция "квалифицируется" как длительная, и производится подключение обработчика ожидания для периодической проверки выполнения фонового задания, исполняющего нашу длительную операцию.

Собственно сама серверная процедура, которая запускает необходимую нам длительную операцию, вызов которой будет произведен из "ИмяМодуля.ИмяЭкспортнойПроцедуры". Также в этой процедуре заполняется структура параметров, необходимых для исполнения длительной операции, и запоминается идентификатор фонового задания, под которым выполняется длительная операция.

Процедура обработчика ожидания мониторит выполнение запущенного нами фонового задания, в случае успеха - результат выполнения длительной операции извлекается из временного хранилища по адресу "АдресХранилища", в противном случае обработчик ожидания подключается заново для следующей очередной проверки.

Использование процедур общих модулей "Длительные операции", входящих в состав БСП, позволяет довольно удобным и быстрым способом осуществить в конфигурации выполнение необходимых длительных ресурсоемких операций, инициируемых пользователями системы, на стороне сервера в фоновом режиме, что делает работу пользователей в приложении более комфортной и производительной ( не блокируется весь пользовательский интерфейс на время выполнения длительной операции и возможность параллельного запуска нескольких длительных операций).

В этой статье мы разберем, как обрабатывать длительные операции в 1С асинхронно, то есть таким образом, чтобы дать пользователю возможность продолжить работу, не дожидаясь завершения операции. А также перенести всю нагрузку по выполнению таких операций на сервер.

Для таких операций разработчики систем 1С рекомендуют использовать Фоновые задания. В последних версиях типовых конфигураций они оформляются окошком с котом.

Обработка длительных операций в фоновом режиме или "Как сделать кота"

Мы рассмотрим вариант, в котором дополнительно выводится прогресс выполнения операций в процентах.

В нашем примере длительная операция запускается нажатием кнопки на форме, поэтому на форме были созданы:

  • сама кнопка,
  • команда, привязанная к этой кнопке,
  • клиентская процедура, запускаемая командой.
ДлительнаяОперация = ПолучитьПлатежныеОперацииНаСервере ( ) ; //Подключение обработчика завершения фонового задания. ПараметрыОжидания = ДлительныеОперацииКлиент . ПараметрыОжидания ( ЭтотОбъект ) ; ПараметрыОжидания . ВыводитьПрогрессВыполнения = Истина; ОповещениеОЗавершени и = Новый ОписаниеОповещения ( "ПолучитьПлатежныеОперацииЗавершение" , ЭтотОбъект ) ; ДлительныеОперацииКлиент . ОжидатьЗавершение ( ДлительнаяОперация , ОповещениеОЗавершении , ПараметрыОжидания ) ;

Клиентская процедура запускает фоновое задание на сервере и подключает обработчик ожидания завершения этого задания. Содержимое серверной функции, запускающей фоновое задание, приведем далее. При подключении обработчика ожидания устанавливаются несколько параметров:

НаименованиеЗадания = НСтр ( "ru = 'Получение платежных операций'" ) ; ВыполняемыйМетод = "Обработки.аш_ФормированиеБухгалтерскихДокументов.ПолучитьПлатежныеОперации" ; ПараметрыПроцедуры . Вставить ( "_Объект" , новый Структура ( "Период, ОтборПравил, СформированныеДокументы, ИдентификаторФормы" , Объект . Период , Объект . ОтборПравил . Выгрузить ( ) , Объект . СформированныеДокументы . Выгрузить ( ) , УникальныйИдентификатор ) ) ; ПараметрыВыполнения = ДлительныеОперации . ПараметрыВыполненияВФоне ( УникальныйИдентификатор ) ; ПараметрыВыполнения . НаименованиеФоновогоЗадания = НаименованиеЗадания ; ПараметрыВыполнения . Вставить ( "ИдентификаторФормы" , УникальныйИдентификатор ) ; Возврат ДлительныеОперации . ВыполнитьФункцию ( УникальныйИдентификатор , ВыполняемыйМетод , ПараметрыПроцедуры ) ;

Данная серверная функция запускает выполнение фонового задания. В этой функции нужно определить:

После этого необходимо создать экспортную функцию, которая будет выполняться в фоновом режиме. Эта функция описана в переменной ВыполняемыйМетод и в нашем случае расположена в модуле менеджера обработки. Функция содержит один обязательный параметр. В нашем случае он называется Параметры, и в него передается структура из переменной ПараметрыПроцедуры.

Функция ПолучитьПлатежныеОперации ( Параметры ) Экспорт //Здесь должен находиться код, определяющий выполнение длительной процедуры //Пример передачи прогресса выполнения фонового задания ДлительныеОперации . СообщитьПрогресс ( Окр ( Процент , 0 ) ) ;

Если мы хотим отразить в окне длительной операции прогресс выполнения, то периодически (например, при каждой итерации некоего цикла) нужно рассчитывать процент выполнения и передавать его в клиентское окно с помощью процедуры ДлительныеОперации.СообщитьПрогресс(Процент).

Функция возвращает некий результат, который будет помещен во временное хранилище. Оттуда мы его получим и обработаем в процедуре, вызываемой при завершении фонового задания. Эта процедура клиентская, экспортная, создается на форме, с которой запускалась длительная операция.

Процедура ПолучитьПлатежныеОперацииЗавершение ( Результат , ДополнительныеПараметры ) Экспорт ПоказатьПредупреждение ( , Результат . КраткоеПредставлениеОшибки ) ; ДлительныеОперацииЗавершениеНаСервере ( Результат . АдресРезультата ) ;

Эта процедура имеет два обязательных параметра: Результат и ДополнительныеПараметры. В переменной Результат содержится статус выполнения задания и адрес временного хранилища с самим результатом, возвращенным в нашем случае функцией ПолучитьПлатежныеОперации() из модуля менеджера обработки.

В данной процедуре мы прежде всего проверяем, не равна ли переменная Результат значению Неопределено (это значение возвращается, если пользователь отменил длительную операцию). Если нет, то проверяем, не было ли ошибок при выполнении фонового задания. Если ошибок не было, то запускаем процедуру, в которую передаем адрес временного хранилища с результатом длительной операции.

Разработчики платформы 1С: предприятие 8.3 рекомендуют в управляемых приложениях избегать длительных вызовов из клиентского кода в серверный. Они считают, что все длительные серверные вызовы, которые могут выполняться более 8 секунд в обычных сценариях работы пользователя, следует выполнять асинхронно, с помощью фонового задания.

В демоверсии БСП 3.0 разработана демонстрационная обработка _ДемоДлительнаяОперация , позволяющая понять общий подход к асинхронному выполнению длительных серверных операций с помощью фонового задания:


Интерфейс обработки вылядит так:


Следует отметить, что если код, выполняющий длительную обработку данных расположить в общем модуле , а не в модуле менеджера , то необходимо использовать процедуру-обертку в общем модуле, которая будет вызывать процедуру модуля менеджера через ОбщегоНазначения.ВыполнитьМетодКонфигурации(). Т.к. фоновые задания могут работать только с процедурами и функциями общих модулей, например,

В библиотеке стандартных подсистем многие длительные операции расположены в общем модуле. Путем глобального поиска процедуры ОбщегоНазначения.ВыполнитьМетодКонфигурации() можно посмотреть программный код.

Обратите внимание, что вызов длительной обработки данных происходит асинхронно, с помощью объекта описания оповещения .

В теле процедуры ВыполнитьДействиеЗавершение выводится результат, который получается из временного хранилища. Иными словами, при получении от сервера информации о том, что фоновое задание завершено, полученный результат загружается из временного хранилища и обрабатывается.

Следует отметить, что асинхронное выполнение длительных серверных операций рекомендуется выполнять при формировании отчетов, которых, как правило, занимает длительное время.

Если выбрать скорость выполнения с задержкой, обрабатывается демонстрационный цикл из 20 итераций для эмуляции выполнения длительной операции. На время выполнения этого цикла пользователю отображается индикатор:


Если за время ожидания выполнения длительного задания оно не завершилось, то управление возвращается на клиент, и в клиентском коде подключается обработчик ожидания, в котором периодически проверяется состояние фонового задания. При этом интервал опроса задания увеличивается от 1 до 15 секунд с фиксированным коэффициентом 1.4;

В Библиотеке стандартных подсистем имеются вспомогательные функции и процедуры в общих модулей :

  • ДлительныеОперации
  • ДлительныеОперацииКлиент

Все эти функции и процедуры содержат в заголовке краткое описание их назначений.

Практический пример

Практический пример выполнения функции в фоновом задании в конфигурации библиотеки стандартных подсистем можно найти в модуле менеджера спраочника Учетные записи электронной почты. Там расположена функция, которая выполняет поиск настроек и возвращает их:

В форме справочника Учетные записи электронной почты выполняется вызов этой функции в фоновом задании в три этапа:

Читайте также: