1с как выполнить действие
Эта статья расскажет о способах написания пауз на встроенном языке 1С:Предприятие 8, их достоинствах и недостатках. Также Вы узнаете, какой способ является самым оптимальным с точки зрения потребляемых ресурсов компьютера.
Использование пауз в 1С — стародавняя головная боль. До сих пор этот механизм никак не реализован на уровне платформы. Поэтому программистам приходится изобретать велосипеды и ходить по граблям.
1). Использование целочисленных циклов
Самый старый (встречал такие шедевры еще на платформе 1с:Предприятие 7.7), самый грубый и самый ресурсоемкий способ — использование цикла, ограниченного целым числом:
Грубый — потому что невозможно точно предсказать, сколько будет длиться цикл, ведь скорость его выполнения напрямую зависит от вычислительной мощности компьютера. Ресурсоемкий — потому что процесс 1С занимает 100% ресурсов ПК.
Его мы однозначно отметаем!
2). Использование цикла с датой
Другой древний способ, чуть более точный, но такой же ресурсоемкий — использование цикла, ограниченного датой:
По-прежнему, точность данного алгоритма оставляет желать лучшего, т.к. погрешность может составлять 100 и более миллисекунд. Да и быстродействие не на высоте.
Его мы тоже отметаем!
3) Использование обработчиков ожидания
При работе с формами для реализации повторяющихся во времени действий, можно воспользоваться механизмом обработчиков ожидания:
В данном примере мы определили экспортную процедуру ОбработчикОжидания() модуля формы, а затем подключили ее на повторный вызов каждые 500 миллисекунд, используя метод ПодключитьОбработчикОжидания().
Из плюсов метода: точность и низкое потребление ресурсов ПК. Из недостатков этого метода можно отметить ограниченность его использования только клиентской частью приложения (на сервере обработчики ожидания не работают). Кроме того, его невозможно использовать для вставки в выполняемый код, т.к. обработчики 1С задействованы только в свободное от основных вычислений время.
4) Использование скриптов WShell
Паузу можно реализовать с помощью VBScript и методов COM-объекта WScript.Shell . Ниже приведена готовая процедура, лишенная описанных ранее недостатков:
Но у приведенной процедуры есть свои недостатки: вряд ли удастся использовать ее на платформе Linux или веб-клиенте.
Доброго времени суток.
На форме переназначаю элементу типовое действие(событие) "ПриИзменении", связку элемент+имя типового метода предварительно сохраняю при помощи ПолучитьДействие("ПриИзменении").
После выполнении нетипового действия для элемента нужно вызвать типовой метод.
Очень просится использовать Выполнить(), но в синтаксис-помощнике имеется грустный повод этого не делать:
Примечание:
В режиме запуска веб-клиент оператор не поддерживается, при его вызове будет сгенерировано исключение.
Расширения использовать не могу по условиям задачи.
Что же делать-то?
возможно, существует какой-то хитрый способ?
Если у оригинального метода один параметр (элемент формы) и в параметры оригинального метода можешь добавить еще один параметр (доп. параметры), то через описание оповещения сделай, указывая имя оригинального метода.
Ну и ВыполнитьОбработкуОповещения читай в СП.
Если ты по условиям задачи не можешь модифицировать код формы, то можешь курить бамбмук по причине требований к расположению обработчика действия.
(7) Согласен. Жесткое расположение кода обработчика - отдельная неприятная песня.
Что означает Экспорт + ЭтотОбъект.Обработчик(. )?
(6) По условиям задачи я могу модифицировать код формы, но только добавляя новые методы, не модифицируя типовые.
(8) Если ты можешь добавлять свой код в контекст формы, то какая религия запрещает тебе просто вызвать эту процедуру, находящуюся в этом же контексте?
(9) А религия простая - при очередном обновлении типовой конфигурации, типовая процедура может испариться без следа.
Или же возникнет новая в одном из элементов, к которому я добавил свои события.
(11) ну-ну. Видимо вы давно не занимались обновлениями типовых объектов, снятых с поддержки кривыми руками.
(12) Желание добавить к наследию кривых рук порождения разума того-же радиуса - бесценно. Наблюдаю в немом восхищении.
(11) Автор молодец, а вы говорите хрень. Он хочет сделать УНИВЕРСАЛЬНОЕ решение, чтобы использовать некий обработчик, который не сломается после очередного обновления.
(13)Вы забываете, что методы реализации конкретной прикладной задачи программистом бывают ограничены постановкой. У вас не так? Вы рубите что хотите? Сочувствую вашим клиентам.
И, что бы закончить вашу неконструктивную ветку, ежу понятно что оптимумом было бы использование расширений.
Теперь о том, как решается такая задача при помощи Выполнить().
Собственно, осталось совсем немножко подумать.
Предложение Cyberhawk сработало бы, будь у метода ПриИзменении(Элемент) два параметра (если закрыть глаза на то, что придет в параметр "Элемент" вместо элемента).
Например ПоказатьПредупреждение() требует в описании оповещения процедуры с одним параметром, но оно выводит что-то на экран, к сожалению.
Вот если бы можно было бы как-то дернуть определенное интерактивное событие определенного элемента программно, всё бы получилось.
(14) Универсализм - говно. На тебе сценарий - в одном из обновлений приезжает:
Процедура ПодразделениеПриНачалеВыбора(.
КонецПроцедуры
Гениальный код тихо курит в сторонке, печатаются документы, предприятие работает. И через полгодика выясняется, что что-то не так.
Измененный код падает сразу, на вызове несуществующего, вызывается специалист, выписывается животворящий, и все снова работает.
Не надо закладывать теракт. "Сочувствую вашим" и дальше по тексту.
(20) А у WEB-клиента есть JS, где нельзя произвольный код так исполнять. Интересный запрет, правда? :)
(22) Это тот подход, где простыню кода можно день листать? :) Программная генерация формы, кеширование методов событий в свойствах самих элементах формы. И Выполнить()? :)
(17) тепло! но, теперь мешает ограничение на обязательное наличие Экспортности процедуры для Оповещения. Типовая процедура, сюрприз, не экспортная.
Коллеги, правда что-ли нету правильной платформенной методы?
На что постановщики продавливаются охотнее? На использование расширений? Использование внешних библиотек?
Система позволяет расширить практически любой программный модуль, относящийся к управляемому приложению. Невозможно расширять глобальные серверные модули. Также следует помнить, что расширение привилегированного общего модуля будет выполняться в непривилегированном режиме (если иное не разрешено профилем безопасности). Кроме того, предоставляется возможность создавать собственные общие модули, которые не могут быть привилегированными и глобальными серверными. Работа с собственным общим модулем в расширении ничем не отличается от работы с общим модулем обычной конфигурации.
Работа с расширенным программным модулем имеет существенные особенности, которые будут рассмотрены в данном разделе.
При разработке расширяющего модуля следует учитывать, что этот модуль будет находиться в одном пространстве имен с расширяемым модулем. В связи с этим, из расширяющего модуля имеется возможность использовать расширяемый контекст (переменные и методы) напрямую. Также следует помнить, что созданные в расширении экспортные методы и переменные автоматически попадают в публичный контекст расширяемого модуля.
В расширяющем модуле имеется возможность:
- Создавать собственные методы и переменные (если это допускает расширяемый модуль).
- Назначать собственные обработчики на события, которые не обрабатываются в расширяемой конфигурации.
- Перехватывать любой метод расширяемого модуля (в том числе и методы обработчиков событий), при этом имеется возможность:
- полностью заменить оригинальный метод собственным;
- создать методы, которые будут вызваны перед или после расширяемого метода.
Создание собственного метода или переменной в расширяющем модуле ничем не отличается от создания метода или переменной в расширяемой конфигурации, при работе без расширений. Однако при создании собственных методов или переменных рекомендуется предварять их имена префиксом, который позволит однозначно идентифицировать принадлежность метода или переменной тому или иному расширению, а также избежать конфликта имен с расширяемой конфигурацией.
Перехват методов расширяемой конфигурации (включая назначение обработчиков) реализуется с помощью специального механизма аннотаций (см. здесь). Всего имеется три различных возможности перехвата вызова метода, которые позволяет реализовать практически любую схему исполнения расширяемого и расширяющего программного кода.
В общем случае, аннотированный метод из программного модуля расширения выглядит следующим образом:
В данном примере Перед одна из трех возможных аннотаций, ИмяМетода имя расширяемого метода, Префикс_Имя имя расширяющего метода. Префикс_ это префикс расширения, который желательно указывать для всех методов расширения. Расширяться может как процедура, так и функция. Имя расширяющего метода должно подчиняться обычным правилам формирования имен процедур и функций. В частности, оно должно быть уникально.
Если расширяемый метод содержит какие-либо параметры, то:
- Все расширяющие методы обязаны иметь в точности такое же описание, как и расширяемый метод, с точностью до ключевых слов Знач в описаниях параметров методов.
- Значения параметров разделяются между всеми расширяющими методами из всех расширений и собственно расширяемым методом. Это значит, что если какой-либо расширяющий метод изменит значение параметра, все методы, которые получат управление после этого метода, получат измененное значение этого параметра.
- В расширяющем методе не имеет смысла указывать значения по умолчанию для параметров расширяемого метода. Значения по умолчанию будут определяться из описания расширяемого метода.
Также следует отметить, что если расширяется обработчик события, то расширяющий метод выполниться до того, как сработают подписки на «расширяемое» событие (см. здесь).
Исполнение до расширяемого метода (аннотация Перед)
Если метод аннотирован таким образом, это означает, что вначале будет выполнен метод расширения, а затем расширяемый метод.
Рис. 688. Схема исполнения «Перед»
Исполнение после расширяемого метода (аннотация После)
Если метод аннотирован таким образом, это означает, что вначале будет выполнен расширяемый метод, а затем метод расширения.
Рис. 689. Схема исполнения «После»
Обрамление расширяемого метода (аннотации Перед и После)
Если в расширяющем модуле созданы расширяющие методы, которые отмечены аннотациями Перед и После , то это означает, что вначале будет вызван метод, который отмечен аннотацией Перед , затем расширяемый метод и зачем метод расширения, отмеченный аннотацией После .
Рис. 690. Схема исполнения «Перед» и «После»
Замена метода (аннотация Вместо)
Под перехватом вызова метода понимается ситуация, когда метод, созданный в расширении, полностью замещает собой расширяемый метод. Другими словами, вызов метода расширяемой конфигурации приведет к исполнению метода расширения. Имя замещаемого метода указывается в качестве параметра аннотации. Рекомендуется использовать данный способ только в том случае, когда нет возможности использовать другие способы расширения методов.
Для расширяемых функций возможно применение только этого способа расширения.
Рис. 691. Схема исполнения «Вместо»
Чтобы иметь возможность модифицировать результат работы расширяемого метода, предусмотрен метод глобального контекста ПродолжитьВызов(). В качестве параметров метода должны быть указаны фактические параметры, которые переданы в расширяющий метод.
Рис. 692. Схема исполнения «Вместо» совместно с ПродолжитьВызов()
В исходном тексте пример будет выглядеть следующим образом:
В общем случае, редактирование программного модуля в расширении мало отличается от редактирования модуля в расширяемой конфигурации или модуля в конфигурации, где вообще нет расширений (подробнее о редактировании модулей см. здесь). В качестве основных отличий можно указать процесс заимствования метода из какого-либо программного модуля расширяемой конфигурации.
Для того чтобы добавить какой-либо метод в расширение, необходимо поместить курсор в требуемый метод (включая строку с именем метода) и выбрать команду Добавить в расширение . Если при выполнении данной команды в конфигураторе открыто одно расширение, то именно это расширение будет использовано. Во всех остальных случаях будет предложен выбор из расширений, которые добавлены для данной информационной базы.
При выполнении команды Добавить в расширение происходит следующее:
- Если объект, из модуля которого добавляется метод, отсутствует в выбранном расширении этот объект автоматически добавляется в расширение.
- Если расширяется метод из модуля, отличного от модуля формы:
- Разработчику предлагается выбрать аннотацию для метода ( Перед , После или Вместо ). При этом полужирным шрифтом выделяются те расширения метода, которые уже существуют в расширении.
- Если выбран существующий метод в расширении, то выполняется переход к этому методу. При этом возможна корректировка объявления метода, если оно стало отличаться от расширяемого метода.
- Если выбран несуществующий способ расширения, то будет создан новый метод в расширении, который будет предваряться соответствующей аннотацией.
- Для функций недоступны аннотации Перед и После
- Для процедуры недоступно:
- Аннотация Вместо , если уже существуют методы с аннотациями Перед или После
- Аннотация Перед / После , если уже существует метод с аннотацией Вместо
Следует учитывать, что если расширяемый метод обрамлен инструкциями препроцессора, то эти инструкции не будут перенесены в расширение.
При проверке соответствия описания расширяемого метода и метода расширения проверяются следующие характеристики методов:
- Количество параметров и признак передачи параметров «по значению» (ключевое слово Знач ).
- Метод является процедурой или функцией. Если определение метода изменяется с процедуры на функцию, а до этого процедура была расширена с применением аннотаций Перед / После , то аннотация будет заменена на аннотацию Вместо
- Если в модуле расширения присутствуют несколько методов с одинаковым именем, но которые обрамлены разными инструкциями препроцессора, то в расширении будет обновляться всегда первый из перечня таких методов.
Еще одной особенностью редактирования программного модуля в расширении является то, что имеется возможность перехода к расширяемому методу непосредственно из расширения. Для этого следует поместить курсор на имя расширяемого метода в аннотации, а затем воспользоваться стандартной командой редактора Перейти к определению
При разработке расширений следует исходить из следующих предположений:
Далее будут рассмотрены несколько примеров работы результирующей конфигурации при различных способах расширения.
Если оба расширения одинаково обрамляют (аннотации Перед и После ) расширяемый метод, то исполнение схема исполнения встроенного языка будет выглядеть следующим образом:
Рис. 693. Схема взаимодействия. Пример 1
При попытке вызвать метод Расширяемая() (в основной конфигурации), встроенный язык будет исполняться в следующем порядке:
- Будет вызван метод, отмеченный аннотацией Перед("Расширяемая") из Расширения2
- Затем будет вызван метод, отмеченный аннотацией Перед("Расширяемая") из Расширения1
- Затем будет вызван метод Расширяемая() из расширяемой конфигурации.
- Затем, в обратном порядке (относительно списка расширений, т. е. Расширение1 и Расширение2 ), будут вызваны методы, отмеченные аннотациями После("Расширяемая")
Т.е. вначале вызываются те методы расширений, которые разработчик отметил как вызываемые до исполнения расширяемого метода, затем исполняется собственно расширяемый метод, а затем вызываются те методы, которые разработчик отметил как вызываемые после исполнения расширяемого метода.
Если в каждом расширении расширяемый метод перехватывается полностью, то схема выполнения будет выглядеть следующим образом:
Рис. 694. Схема взаимодействия. Пример 2
Так произошло потом, что метод, отмеченный аннотацией Вместо , полностью заменяет собой расширяемый метод. Следует особо отметить, что если в этом примере поменять порядок регистрации расширений (первым будет Расширение2 , а последним Расширение1 ), то единственным выполнившимся методом будет метод из Расширения1
В связи с таким поведением «замещающего» метода расширения, рекомендуется не допускать ситуаций, когда какой-то метод расширяемой конфигурации расширяется с замещением (аннотация Вместо) более чем в одном одновременно работающим расширении. Другими словами, если в расширении, в модуле документа Документ1 замещается обработчик события ОбработкаПроведения , то рекомендуется не допускать ситуации, когда в информационной базе работает еще хотя бы одно расширение, которое каким-либо образом перехватывает обработчик события ОбработкаПроведения в документе Документ1 . Однако, если в «замещающем» методе расширения есть безусловный вызов метода ПродолжитьВызов() , то одновременное существование нескольких расширений с таким способом расширения вполне допустимо.
Факт того, что расширение успешно подключено к расширяемой конфигурации, не означает, что все расширяющие методы, которые находятся в расширении, будут выполняться. Работоспособность методов расширения может быть изменена настройками профиля безопасности (подробнее см. здесь), который использует информационная база.
Если прикладное решение работает в файловом варианте или в клиент-серверном варианте без профилей безопасности, то при подключении расширения:
- В обычном режиме исполнения встроенного языка допустимо расширять как клиентские, так и серверные методы. Без ограничения места расположения методов.
- В безопасном режиме исполнения встроенного языка будут расширяться только клиентские методы и серверные обработчики форм, которые установлены через панель свойств. К остальным серверным методам (аннотированные серверные методы модулей формы и серверные общие модули) расширение применяться не будет.
Возможность расширения серверных общих модулей в клиент-серверном варианте регулируется профилем безопасности. Подробное описание см. здесь.
ps: оригинальные изображения взяты из источников
upd(ответ на комментарии Cyberhawk и Yashazz):
"Отказ=Истина", выставленный в одной подписке, не мешает срабатывать другой (т.е. процесс не прерывается)
утверждение верно для ОДНОГО события (в случае наличия нескольких подписок на одно и то же событие). Например, если есть 3 подписки на событие ПриЗаписи документа ПКО, то Отказ=Истина выставленный в одной из них не помешает срабатыванию других двух.
Отказ для каждого события проверяется в двух местах
1. После выполнения обработчика в модуле объекта/менеджера, включая все расширения.
2. После обработки всех подписок, включая все их расширения.
Т.е. если в п.1 выставили Отказ, то п.2 уже выполняться не будет. Думаю стоит это добавить в статью.(с) tormozit
Те, кто хоть раз работал с отладчиком VBA, мечтают о том, чтобы и в 1С можно было изменять значения переменных и переходить на любую точку кода.
Все не обещаю, но некоторые возможности доступны с помощью косметических вмешательств в конфигурацию.
Применение этих функций основано на том, что в табло отладчика в режиме Конфигуратора или 1С:Предприятия можно вызывать доступные в контексте точки останова функции. Примеры нужно вводить в табло Ctrl+Alt+W или в окно просмотра значения выражения Shift+F9 и сразу же получать результат.
Функция ДУ
Эта функция позволяет в любой момент выполнить любой код на языке 1С над любыми данными, переданными ей.
Примеры:
= Сообщает некий текст= Присваивает переменной Отказ значение истина
= В отладчике нельзя вызвать процедуру, но можно это сделать через ДУ:
Функция Присвоить
Всем известно, что в 1С80 нельзя по хоту отладки менять значения переменных.
Однако есть выход!
В общем модуле объявите функцию:Теперь вы можете в любой момент присвоить значение переменной.
Отладка в типовой конфигурации
А что же делать, если вам досталась отладка конфигурации, в которой нет этих замечательных функций?
Все очень просто. Создайте внешнюю обработку, занесите в ее модуль эти функции с ключевым словом экспорт и вызывайте их например так:
Манипуляции со стеком.
Для меня было приятной неожиданностью, когда я обнаружил, что можно смотреть переменные на разных уровнях стека.
Нужно открыть окно стека (Ctrl+F3), перейти на нужны уровень и ввести в табло имя переменной.
Лучше всего это рассмотреть на примере рекурсивной функции:Поставьте в этой функцию точку останова и вы увидите что на разных уровнях стека переменная А принимает разные значения.
Прерывание работы программы
К сожалению, в 1С 80 можно прекратить работу некоторого кода только прекратив работу всего 1С:Предприятия. Так сказать, для борьбы с головной болью нужно отрубить голову. :)
Но не все так плохо.С помощью функции Присвоить вы можете присвоить какому-нибудь критическому объекту программы значение Неопределено или ноль и как только программа попробует получить реквизит или метод этого объекта возникнет ошибка и работа кода прекратится.
Например вы находитесь в точке:Теперь, как только выполнение кода дойдет до строки с "Если", возникнет ошибка и выполнение прекратится.
Упреждающий просмотр
Иногда при отладке сложновложенных функций неизвестно, имеет ли смысл отлаживать данную конкретную функцию по шагам, или лучше выполнить ее не заходя внутрь для детальной отладки.
В таких случаях удобно посмотреть в окошке просмотра значения, какое значение возвращает данная фунцкия и если она возвращает значение, которое нам интересно, выполнить отладку.
Изменение кода на лету
Если у вас много кода выполняется в операторе Выполнить, то лучше этот код занести в некоторую переменную, чтобы при случае можно было изменить этот код. Расскажу случай из практики.
Отлаживал я как-то одну обработку по обмену данными - там было много кусков кода, выполняющихся через Выполнить. Вот беда случилась - загружали мы большой файл (многометровый) и так обидно, если грузится он час, а потом вылетает на какой-нибудь мелкой ошибке в коде, которая была не выявлена на этапе отладки, всегда в самых неожиданных местах.
Маялись мы маялись, а потом придумали - все вызовы Выполнить были вынесены в одну функцию, куда передавался код для выполнения и параметры. Это нам и сослужило хорошую службу.
Мы вставили Выполнить в Попытка-Исключение и если происходило исключение, предлагали программисту вживую изменить код. Если он соглашался, открывался диалог ввода кода, где он мог заменить старый код на новый. И перед выполнение кода мы проверяли, имеется ли он в списке замен. Если имеется, то мы перед выполнением подменяли старый код на новый. Так нам удалось быстро загрузить данные.
Отладка на сервере
Чтобы съэкономить вам нервы, сообщаю, что отлаживать код, который выполняется на сервере (в трехзвенке), невозможно. Поэтому если у вас программа в файловом варианте останавливается на точке останова, а в серверном - нет, не пугайтесь, так и задумано. Ведь код выполняется на сервере приложений и не может поэтому отлаживаться на клиенте.
Условная точка останова
Не все знают, что в 1С 80 есть условная точка останова - точка останова по условию. Однако это очень полезный механизм.
Трассировка
Для этих целей в 1С можно использовать условную точку останова, т.к. условие проверяется на каждом проходе кода через условную точку останова.
На указанной строке ставим точку останова с условием:
Сумма:1
Сумма:3
Сумма:6
Сумма:10
Сумма:15
Сумма:21
Сумма:28
Сумма:36
Сумма:45
Сумма:55Управление кодом
Предположим у нас есть такой код:
В таком случае мы можем применять программное управление кодом.
На начале оператора Если ставим условную точку останова:Т.е. если А=1 то мы присваиваем А значение 2, и присваиваем 1 в противоположном случае.
Это позволяет, не меняя конфигурацию, постоянно перенаправлять код на нужную нам ветку.
Можно просто поставить условную точку останова, которая будет присваивать А нужное значение:Обозримая трассировка
Если вы вставляете в код много функций Сообщить для трассировки хода выполнения программы, то потом порой бывает проблематично найти все такие трассировочные вызовы.
Если трассировка временно не нужна, ее нужно убрать так:
Теперь достаточно открыть эту внешнюю обработку и десктоп настроится. В следующий раз эта обработка уже будет в списке недавно открытых файлов.
Более простой вариант для ленивых - в табло написать вычисление выражений (например с помощью ДУ), которые откроют нужные документы и журналы. Легко и быстро!
Еще один простой вариант - использование истории отборов. Тогда вам нужно только сделать отбор по нужному документу, обязательно закрыть 1С крестиком, а не через прекращение отладки (чтобы сохранились условия отбора), а затем после запуска 1с зайти в нужный список и нажать историю отбора.
Отладка клиент-серверной базы
Использование внешней обработки
Часто, когда код базы менять нельзя, а поиграться хочется или когда код выполняется на сервере и нет возможности его отладить, помогает использование внешней обработки.
Для этого нужно скопировать код во внешнюю обработку и поотлаживать уже внешнюю обработку, по ходу меняя код и просматривая переменные.Подсовывание тестовых данных
Иногда в базе сложно получить пример, при котором выполняется некое экзотическое условие.
В таком случае проще подсунуть тестовые данные.
Например, если в коде обрабатывается некоторая таблица значений, можно прямо в коде прописать очистку этой таблицы значений и заполнение ее новыми данными, при которых выполняется это экзотическое условие.
Для тех, кто не любит портить код ради отладки, можно посоветовать с помощью функции ДУ вызвать внешнюю обработку, которая заполнит таблицу значений как нам надо (например считает ее из макета).Отладка блокировок
Иногда нужно посмотреть, как ведут себя два параллельных процесса.
Простейший способ отладки таких ситуаций - вставить в коде вызов процедуры Предупреждение().
Например, в событии ПриЗаписи объекта вставляем вызов Предупреждение("Идет запись объекта. ").
Тогда если открыть другую сессию и попытаться записать объект, выдастся предупреждение, что объект заблокирован.Если такая отладка вызывается часто, рекомендую такой способ вызова сразу двух сессий 1С.
Из отладчика нажимаете F5 (Запустить отладку), запускается 1С:Предприятие. Отключаетесь от отладки этого 1С Предприятия - "Отладка"->"Отключиться", затем еще раз нажимаете Ф5. В итоге вторая сессия у вас подключена к отладчику. Запускаете код с предупреждением в первой сессии и отлаживаетесь во второй.Ускорение отладки
Отладчик снижает скорость работы программы.
Поэтому можно поступить так - отключить отладчик, а в нужном месте вывести Предупреждение();
Когда выведется предупреждение, можно опять подключить отладчик, поставить точку останова и начать отладку.В Конфигураторе, нажимаем правой кнопкой на конфигурацию:
Модуль управляемого приложения
Модуль управляемого приложения является аналогом модуля приложения, но используется для управляемого приложения. 1С:Предприятие 8 исполняется в режиме управляемого приложения, если запущен тонкий клиент, Веб-клиент или толстый клиент и при этом установлен режим управляемого приложения либо на всю конфигурацию, либо у конкретного пользователя. В модуле управляемого приложения могут располагаться объявления переменных, процедуры, функции и тело модуля.
Кроме того, в модуле управляемого приложения могут располагаться предопределенные процедуры ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы, ПриЗавершенииРаботыСистемы, ОбработкаВнешнегоСобытия. Все процедуры и функции отрабатывают на клиенте. В процедурах и функциях модуля управляемого приложения доступны экспортные процедуры и функции общих модулей управляемого клиента, а также общих неглобальных серверных модулей. Процедуры, функции и переменные модуля управляемого приложения доступны из клиентской части модулей форм и команд.Добавляем нужный нам код, например:
Код 1C v 8.2 УП
При закытии программы
Код 1C v 8.2 УП
Есть еще процедуры Перед:
Код 1C v 8.2 УП
В 1С 8.1 Конфигурация - Модуль приложения
Код 1C v 8.хТак же есть процедуры Перед:
Код 1C v 8.х
В 1С 7.7 Конфигурация - Глобальный модуль
Код 1C v 7.xПохожие FAQ
Еще в этой же категории
Полнотекстовый поиск в 1С (что это и пример использования) 23
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений 21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, " ЧЦ=10; ЧДЦ=2" ); // ЗначФормат = " 123 456,79" ЗначФормат = Формат(123456.789, " ЧГ=0; ЧДЦ=2" ); // Знач Обработчики событий при записи объектов. Зачем и что за чем? 12
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания УстановитьСсылкуНового 11
Установить ссылку нового это специальный механизм программиста, который позволяет присваивать новому объекту нужную ссылку. В основном это задача обмена, во многих типовых обменах используется синхронизация по UID объекта. Рассмотрим этот метод на к МоментВремени, получение остатков до и после проведения 9
" Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М Посмотреть все в категории Встроенные ФункцииЧитайте также: