1с ошибка в операторе препроцессора
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. Директивы компиляции:
&НаКлиенте (&AtClient)
&НаСервере (&AtServer)
&НаСервереБезКонтекста (&AtServerNoContext)
следует применять только в коде модулей управляемых форм и в коде модулей команд. В остальных модулях рекомендуется применять инструкции препроцессору.
В серверных или клиентских общих модулях контекст исполнения очевиден, поэтому смысла в директивах компиляции нет. В общих модулях с признаками клиент и сервер применение директив компиляции затрудняет понимание, какие же процедуры (функции) доступны в конечном итоге.
В противном случае невозможно гарантировать корректную работу клиент-серверных процедур и функций в различных режимах работы платформы 1С:Предприятие.
Правильно: разделить на две одноименные функции в серверном и клиентском модуле с различной реализацией. В общем случае, когда у них имеется определенная общая часть, одинаковая для клиента и сервера, то для того чтобы избежать дублирования кода, этот общий код (и только его) следует оставить в клиент-серверном общем модуле и вызывать его из клиентской и серверной функций, соответственно. Тем самым надежно достигается различное поведение в клиентском и серверном контекстах без использования инструкций препроцессора.
3. Не следует разрывать инструкциями препроцессора и областями отдельные грамматические конструкции, выражения, а также объявления и места вызова процедур и функций.
Данные ошибки диагностируются автоматически с помощью среды разработки 1C:Enterprise Development Tools (EDT).
Правильно использовать инструкции препроцессора без разрыва конструкций.
Как устранить Ошибку
В файле ReadMe.txt, который входит в пакет обновления релиза сказано:
Внимание!
Текущая версия конфигурации «Бухгалтерия предприятия» предназначена
для использования с версией системы 1С:Предприятие не ниже 8.3.8.1747
При работе с операционной системой Microsoft Windows 10 необходимо использовать версию 8.3 платформы «1С:Предприятие».
Работа конфигурации в режимах совместимости «Версия 8.3» и «Версия 8.2.х» поддерживается.
Это означает, что
необходимо установить любую платформу линейки 8.3.х.хххх, но не ниже рекомендуемой 8.3.8.1747
Не путайте платформу с конфигурацией (редакцией, релизом)!
После установки новой платформы (8.3.х.хххх) запустите свою рабочую ИБ и ошибка исчезнет.
Начальные данные:
1. Платформа 8.2.15
2. Конфигурация самописная для управляемого приложения.
Есть общий модуль, у которого поставлены следующие галки: Клиент, Сервер, Вызов сервера.
В этом модуле расположена следующая функция:
При этом 1с пишет, что функция "Получить()" не обнаружена.
На сколько я понимаю, содержимое общего модуля в соответствии с установленными галками компилируется как на стороне клиента, так и на стороне сервера, при этом инструкцией препроцессора я указал, что функция "Получить()" должна быть скомпилирована только на стороне сервера (на клиенте она мне не нужна), при этом я пытаюсь вызвать ее со стороны клиента на что мне дает право галка "Вызов сервера".
Что я делаю не так, почему 1с не видит эту функцию?
Потому, что инструкцией препроцессора Вы блокировали объявление этой функции на клиенте. Перед вызовом функции с клиента Вам необходимо передать исполнение на сервер.
(2) asved.ru, к сожалению, под рукой у меня сейчас документации по платформе нет, но на сколько я помню, галка "Вызов сервера" управляет доступностью серверных функций, расположенных в общем модуле, для их вызова из клиентских процедур.
Если у общего модуля я уберу галку "Клиент" - серверная функция вызывается без проблем, т.е. тут вопрос в том, почему с установленной галкой "Клиент" функция невидима (т.е. 1с не пытается вызвать ее на сервере, хотя она там присутствует), а при отключенной галке - функция становится видна.
На форумах я единственное что вычитал только то, что это особенность работы модулей форм, и особого внятного ответа на этот вопрос не нашел, т.е. я так понимаю, что в общем модуле с тремя установленными галками "Клиент", "Сервер" и "Вызов сервера" использование инструкций препроцессора и директив компиляции смысла не имеет.
(3) Zigfridish, мои 5 копеек. :)
Суть галочек в следующем:
Галочки "Клиент" и "Сервер" - означают что общий модуль может вызываться и из клиентской части и из сервеной. И помоему там диркетивы (&Клиент или &Сервер) не важны (просто из соответсвующего места должны вызываться соотвествующие процедуры) и при помоще интсрукции компиляции
разрешаются всякие колизии связанные с вызовом процедур.
Галочка "ВызовСервере" действительно позволяет выполнять вызов процедур из клиентской части, но выполняться они при этом будут на серевере. Т.е. можно поставить галочки Сервер и Вызов и споконо вызывать ее из клиента.
Вобщем попробуй убрть галочку Клиент. Тогда будет вызываться сервер и инстукция отработает нормально
Кажется так, если не путаю (у меня тоже нет документации под рукой :)
(4) Ягг, если я оставлю только две галки "Сервер" и "Вызов сервера" - смысл использования директив компиляции и инструкций в общем модуле пропадает, т.к. он весь полностью будет скомпилирован на сервере.
Так вот мне и хочется, чтобы в модуле присутствовали как клиентские, так и серверные процедуры, и чтобы я мог их разграничить с помощью инструкций препроцессора (часть из них скомпилировать на сервере, часть - на клиенте, а некоторые из них - на обеих сторонах).
(6) Zigfridish, тогда оставь обе галки, но суть в том что если модуль будет вызываться из клиентсокого контектса, то нужно вызывать только доступные процедуры. и наоборот.
В товвоем случае ты вызываешь общий модуль из клиента, при этом он и считается выполняемым на клиенте. Раз так то инструкция "Если сервер" естесвенно счиатет что это не сервер (это клиентский контекст) и не компилирует кусок.
Вобщем, тогда оставиль Клиент и Сервер и убери инструкцию препроцессора. Но учти, что процедура вэтом случае выполняется имено в клиентском контексте.
(9) Ягг, дело в том, что эта функция общего модуля не может исполняться на клиенте (у меня в ней используется запрос к базе), поэтому я ее и оградил инструкцией, чтобы она присутствовала и исполнялась только на сервере, и чтобы ее можно было вызвать из клиентской части (галка "Вызов сервера").
Помню даже в какой-то желтой книге видел подобную фразу по последовательности действий, которые выполняет 1с при вызове серверной функции с клиента: "сначала производится поиск вызываемой функции на клиенте, т.к. на клиенте она отсутствует - производится ее поиск на сервере, после чего на сервере происходит ее исполнение и по окончании процесса управление передается на клиента". Вот как то так
(10) Zigfridish, эээ. боюсь так не выйдет. Если стоит галочка "Клиент" и модуль вызывается из клиента, то априори считается что общий модуль выполняется в контексте клиента (система сама определит контекст по месту вызова). Тогда надо переносить какую-ту часть процедуры другой общий модуль. Другому модулю ставить галочку "Сервер" и "Вызов сервера" и на него уже ссылаться.
Может конечно меня кто поправит но по моему так.
ЗЫ. Допишу что бы не было разночтений (еще раз). Если стоят обе галки, о контекст будет определяться по месту вызова.
(12) Zigfridish, вообще, есть объекты "Команды" (Общие команды) она в какой-то степени имеет и серверную и клиентскую часть (место выполнения по директиве &НаСервере и т.д.). Но вобще-то они (КОМАНДЫ) для этого не предназначены и будут заморочки с передачей параметров и прочим.
Но попробуй, может найдется какое-то приемлимое рещение, если очень охото все вместе, но по хорошему лучше разносить :)
В догонку: можно еще попробовать использовать какую-нибуь "формальную" управляемую форму. С ней пожалуй меньше возьни чем с Командой в данном случае.
(6)Так может правильней сделать два общих модуля с разным набором галочек?
Если запуск инструкций все равно разграничиваешь командами препроцессора.
(5) red80, я эту книгу читал, и насколько помню, то в ней не рассматриваются примеры использования инструкций препроцессора в общих модулях.
Почему же тогда при отключенной галке "Клиент" предварительная передача исполнения на сервер в модуле формы не требуется (я могу напрямую из клиентской процедуры формы обратиться к серверной функции общего модуля)?
С помощью инструкций препроцессора можно указать где именно будет выполняться код на встроенном языке: на сервере, на клиенте, в вебклиенте и т.д.
Данный кусок кода будет присутствовать в скомпилированном модуле только при выполнении на сервере, в режиме обычного приложения или при подключении через COM (внешнее соединение).
Процесс выполнения кода на встроенном языке 1с:
1. Обработка исходного кода препроцессором
2. Компиляция модуля во внутренний байт-код 1С
3. Исполнение байт-кода на виртуальной машине 1С (интерпретация)
При этом один и тот же модуль может быть скомпилирован как на сервере, так и на клиенте. С помощью инструкций препроцессора можно указать должен ли присутствовать в скомпилированном модуле тот или кусок кода.
Инструкции препроцессора
Возможные варианты инструкций препроцессора:
- Клиент
- НаКлиенте
- НаСервере
- Сервер
- ТонкийКлиент
- ВебКлиент
- МобильныйАвтономныйСервер
- МобильноеПриложениеКлиент
- МобильноеПриложениеСервер
- МобильныйКлиент
- ТолстыйКлиентОбычноеПриложение
- ТолстыйКлиентУправляемоеПриложение
- ВнешнееСоединение
Клиент и НаКлиенте — одно и то же. Сервер и НаСервере — одно и то же.
Также есть инструкции для выделения областей в модуле и для директивы «Изменение и контроль» в расширениях. В данной статье они не будут рассмотрены.
Инструкции препроцессора и директивы компиляции
Директивы компиляции используются в модулях форм и команд. Они определяют где будет скомпилирована процедура: на клиенте или на сервере. Директивы компиляции начинаются с символа &.
Сначала выполняются инструкции препроцессора, а уже потом определяются директивы компиляции. Например:
Данный кусок кода будет присутствовать в серверном модуле формы, но не будет скомпилирован. В клиентском модуле формы его даже не будет.
Часто инструкции препроцессора по ошибке называют директивы препроцессора. Но правильно все-таки инструкции препроцессора.
Исполнение процедур и функций
В файловой базе данных инструкции препроцессора будут игнорироваться, куски кода не будут вырезаны при компиляции.
Здравствуйте, не знала куда написать, по-этому создала новую тему.
Помогите пожалуйста что 1Ске от меня надо?
Во вложении принт-скрин ошибки, выдает при закрытии месяца, сразу оговорюсь резервы в организации не создаются.
Заранее спасибо.
Миниатюры
Вы не весь экран, а только окно с ошибками скопируйте.
Там, кстати, текст, можно просто текст скопировать, а не картинку.
Ну в-общем 1Ска мне выдает вот это:
Оляныч, платформу обновляй на 8.3, уверена что ошибка уйдет.. там же при обновлении предупреждает вроде ,какая платформа подходящая
Оляныч, платформу обновляй на 8.3, уверена что ошибка уйдет.. там же при обновлении предупреждает вроде ,какая платформа подходящая
Ну вот блин, а если я не хочу пока на 8,3 переходить, это что ж получается как принудительная перемена платформы, пока 8,2 обновляется, зачем мне на 8,3 перепрыгивать?
Оляныч, тебя никто не заставляет обновлять конфигурацию на бух 3.0, обнови только платформу на 8.3 и прекрасно работай в своей бухии 2.0, не забудь перед обновлением сделать копию базы
Оляныч, тебя никто не заставляет обновлять конфигурацию на бух 3.0, обнови только платформу на 8.3 и прекрасно работай в своей бухии 2.0, не забудь перед обновлением сделать копию базы
Помогите,пожалуйста, нет администратора, та же пароль найти не могу, все само обновлялось.
Бухгалтерия предприятия (базовая), редакция 2.0 (2.0.66.20)
Где взять обновление? и какое))) 30 марта
помогите, пожалуйста)))
Пойду на др компьютере делать))) скачала базу. Времени просто нет. Спасибо за отклик.
Если не получится буду просить еще помощи)))
Щёлкаете по ярлыку запуска 1С. В списке баз становитесь на проблемную базу, нажимаете кнопку "Изменить" (справа от списка баз). Откроется окно редактирования свойств базы. Жмёте кнопку "далее", пока не дойдёте до последней страницы. На ней самое нижнее поле - версия 1СПредприятия. Меняете 8.2 на 8.3. Жмёте "Готово". Профит!
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. Директивы компиляции:
&НаКлиенте (&AtClient)
&НаСервере (&AtServer)
&НаСервереБезКонтекста (&AtServerNoContext)
следует применять только в коде модулей управляемых форм и в коде модулей команд. В остальных модулях рекомендуется применять инструкции препроцессору.
В серверных или клиентских общих модулях контекст исполнения очевиден, поэтому смысла в директивах компиляции нет. В общих модулях с признаками клиент и сервер применение директив компиляции затрудняет понимание, какие же процедуры (функции) доступны в конечном итоге.
В противном случае невозможно гарантировать корректную работу клиент-серверных процедур и функций в различных режимах работы платформы 1С:Предприятие.
Правильно: разделить на две одноименные функции в серверном и клиентском модуле с различной реализацией. В общем случае, когда у них имеется определенная общая часть, одинаковая для клиента и сервера, то для того чтобы избежать дублирования кода, этот общий код (и только его) следует оставить в клиент-серверном общем модуле и вызывать его из клиентской и серверной функций, соответственно. Тем самым надежно достигается различное поведение в клиентском и серверном контекстах без использования инструкций препроцессора.
3. Не следует разрывать инструкциями препроцессора и областями отдельные грамматические конструкции, выражения, а также объявления и места вызова процедур и функций.
Данные ошибки диагностируются автоматически с помощью среды разработки 1C:Enterprise Development Tools (EDT).
Правильно использовать инструкции препроцессора без разрыва конструкций.
Как устранить Ошибку
В файле ReadMe.txt, который входит в пакет обновления релиза сказано:
Внимание!
Текущая версия конфигурации “Бухгалтерия предприятия” предназначена
для использования с версией системы 1С:Предприятие не ниже 8.3.8.1747
При работе с операционной системой Microsoft Windows 10 необходимо использовать версию 8.3 платформы “1С:Предприятие”.
Работа конфигурации в режимах совместимости «Версия 8.3» и «Версия 8.2.х» поддерживается.
Это означает, что
необходимо установить любую платформу линейки 8.3.х.хххх, но не ниже рекомендуемой 8.3.8.1747
Не путайте платформу с конфигурацией (редакцией, релизом)!
После установки новой платформы (8.3.х.хххх) запустите свою рабочую ИБ и ошибка исчезнет.
Читайте также: