Обмен ошибка при вызове метода контекста выбрать

Ошибка при вызове метода контекста (Выбрать)

Я
   Эльчин

17.09.13 — 14:37

Ошибка: Ошибка при вызове метода контекста (Выбрать)

            СсылкаОсн = Документы.РеализацияТоваровУслуг.Выбрать(,,Отбор).Ссылка;    

по причине:

Недопустимое значение параметра (параметр номер ‘3’)

******************************************************************

помогите найти ошибку:

Отбор = Новый Структура(«Дата, Контрагент, СуммаДокумента»);

Отбор.Дата = ОснДокДата;

Отбор.СуммаДокумента = Число(ОснСумма);

Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(СтрКлиент, Истина).Ссылка;

Отбор.Контрагент = Контрагент;

СсылкаОсн = Документы.РеализацияТоваровУслуг.Выбрать(,,Отбор).Ссылка;

буду очен благодарен если поможете(извините из за ошибок в тексте)

   ДенисЧ

1 — 17.09.13 — 14:38

ну как бэ очевидно, что не будет она тебе по СуммеДокумента отбор строить…

Запрос напиши.

   Defender aka LINN

2 — 17.09.13 — 14:39

(0) Юзай запросы

   Rie

3 — 17.09.13 — 14:40

(0) Какой Отбор.СуммаДокумента?

   НЕА123

4 — 17.09.13 — 14:40

Отбор> (необязательный)

Тип: Структура.

Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться только поля «Дата» и реквизиты документа, для которых в конфигураторе признак индексирования установлен в значение «Индексировать» или в значение «Индексировать с доп. упорядочиванием».

Важно! Структура может содержать только один элемент.

Если параметр не указан, то отбор не используется.

   Sabbath

5 — 17.09.13 — 14:44

(0) Запросом правильней и красивей. Вообще, как-то странно выглядит задача или реализация)

   Эльчин

6 — 17.09.13 — 14:45

мне нужен выбрать документ по три признака: Дата, Контрагент и СуммаДокумента. как понял запрос единственный вариант, да?

   Rie

7 — 17.09.13 — 14:46

(6) Да.

   Эльчин

8 — 17.09.13 — 14:46

спасибо всем

   Sabbath

9 — 17.09.13 — 14:49

(6) (7) Если не слишком извращаться то да, запрос. Вообще для задач, где нужно что-то выбрать по различным условиям используются запросы :)

   Defender aka LINN

10 — 17.09.13 — 15:42

(6) А, типа, Выбрать() — не запрос, да?

   Sabbath

11 — 17.09.13 — 15:46

(10) типа запрос, но не Запрос = Новый Запрос :)

Ну и это не просто запрос, а выборка

   Defender aka LINN

12 — 17.09.13 — 15:56

(11) SQL-серверу расскажи :)

  

Нуф-Нуф

13 — 17.09.13 — 15:57

юзай запросы! будь мужиком, блеать!

TurboConf — расширение возможностей Конфигуратора 1С

Содержание:

1.       Устранение ошибки использования синхронных методов

2.       Механизм устранения ошибки использования синхронных методов

В данной статье будет рассмотрена ошибка 1С «Использование синхронных методов на клиенте запрещено». Стоит отметить, что синхронные методы в 1С – это те методы, которые не позволяют использовать код, пока сами не завершатся.  

1.    Устранение ошибки использования синхронных методов

Ошибка использования синхронных методов в системе 1С выводится в следующем виде:

Рис. 1 Использование синхронных методов на клиенте запрещено

Чтобы исправить ошибку, связанную с запретом использования синхронных методов на клиенте, необходимо открыть конфигуратор в 1С и перейти по пути «Конфигурация → Открыть конфигурацию»:

Рис. 2 Открытие конфигурации при использовании синхронных методов

Откроется окно, в нём необходимо кликнуть на пункт «Конфигурация» и выбрать в выпадающем списке «Свойства»:

Рис. 3 Выбор свойств конфигурации



Рис. 4 Свойства конфигурации

Пролистываем список свойств до пунктов «Режим использования модальности» и «Режим использования синхронных вызовов расширений платформы»:

Рис. 5 Режимы использования модальности и использования синхронных вызовов расширенной платформы

Далее в настройках режимов следует выбрать «Использовать»:

Рис. 6 Активация использования режима синхронных вызовов

Далее выбираем пункт «Конфигурация» и сохраняем её:

Рис. 7 Кнопка для сохранения конфигурации

Ошибка «Использование синхронных методов запрещено» полностью была устранена.  

2.   Механизм устранения ошибки использования синхронных методов

А теперь подробнее рассмотрим сам механизм устранения ошибки.

Был включен модальный режим в конфигурации. Так как согласно стандартным настройкам он выключен, команды «ВвестиСтроку», «ОткрытьЗначение», «ВвестиДату», «ВвестиЧисло» были недоступны, потому что являются модальными. В случае вызова данных команд происходит блокировка доступа для пользования программой: появляется всплывающее окно, и дальнейшая работа не является возможной до тех пор, пока оно не закроется. Появление подобных всплывающих окон довольно негативно сказывается при работе системы 1С, особенно через сеть Интернет. Как раз по этой причине модальный режим и отключён по умолчанию. Но в нашем случае при наличии ошибки «Использование синхронных методов на клиенте запрещено», если не ведётся работа в Интернете, данный способ довольно удобен и прост.

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

Специалист компании «Кодерлайн»

Айдар Фархутдинов

Почему возникает ошибка «Использование синхронных методов на клиенте запрещено»?

Если в процессе выполнения уроков у вас появилась такая ошибка — исправить её очень легко.

Вернитесь в конфигуратор и выберите пункт меню «Конфигурация» -> «Открыть конфигурацию»:

В открывшемся окне нажмите правой кнопкой на пункте «Конфигурация» и выберите из раскрывшегося меню пункт «Свойства»:

Откроется окно со свойствами конфигурации (справа):

Пролистайте его в самый низ и найдите там пункт «Режим использования модальности»:

Установите его значение в «Использовать»:

Внимание! Обратите внимание, что если вы используете платформу 1С, отличную от той, что мы скачивали в первом уроке (более поздней версии), то у вас также будет присутствовать поле «Режим использования синхронных вызовов…». Его также нужно установить в «Использовать».

Наконец, выберите пункт меню «Конфигурация» -> «Сохранить конфигурацию»:

Готово! Теперь ошибки больше не возникнет.

Пояснения ниже — для тех кому интересно, что мы сделали.

Мы включили режим использования модальности в нашей конфигурации. По умолчанию этот режим выключен и это не позволяет нам использовать такие команды как ВвестиЧисло, ВвестиСтроку, ВвестиДату, ОткрытьЗначение.

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

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

Мы же можем смело включать его, так как пишем учебные примеры, не рассчитанные на работу в интернете.

С уважением,
Владимир Милькин

Использование синхронных методов на клиенте запрещено!

Я

  

alexsandrinia

21.05.15 — 13:35

выходит ошибка

Ошибка при вызове метода контекста (Выбрать)

    Если Диалог.Выбрать() Тогда

по причине:

Использование синхронных методов на клиенте запрещено!

как понять и исправить?

  

Волшебник

Модератор

1 — 21.05.15 — 13:36

нужно использовать асинхронные методы

  

alexsandrinia

2 — 21.05.15 — 13:37

(1) изменить свойства конфигурации?

  

Fragster

3 — 21.05.15 — 13:37

просто разработчики платформы не осилили эмуляцию модальности

  

ДенисЧ

4 — 21.05.15 — 13:38

(2) Использовать в коде асинхронные вызовы

  

Котокот

5 — 21.05.15 — 13:39

(0) Самописка? Или типовая, которая давно не обновлялась? Или есть доработки?

  

Fragster

6 — 21.05.15 — 13:40

теперь, например, для того, чтобы вычислить рекурсивно размер каталога — надо очень сильно извратиться.

  

Fragster

7 — 21.05.15 — 13:41

всю боль можно ощутить, посмотрев пару очень затянутых видео http://www.1c-uc3.ru/video.html

  

alexsandrinia

8 — 21.05.15 — 13:41

  

Волшебник

Модератор

9 — 21.05.15 — 14:03

ДиалогВыбораЦвета (ColorChooseDialog)

Выбрать (Choose)

Синтаксис:

Выбрать()

Возвращаемое значение:

Тип: Булево.

Истина — цвет выбран; Ложь — в противном случае.

Описание:

Открывает диалог выбора цвета.

Доступность:

Тонкий клиент, толстый клиент, внешнее соединение.

Примечание:

Если для конфигурации свойство РежимИспользованияМодальности установлено в НеИспользовать, следует использовать метод Показать.

ДиалогВыбораЦвета (ColorChooseDialog)

Показать (Show)

Синтаксис:

Показать(<ОписаниеОповещенияОЗакрытии>)

Параметры:

<ОписаниеОповещенияОЗакрытии> (необязательный)

Тип: ОписаниеОповещения.

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

•    <Цвет> — Цвет — цвет выбран; Неопределено — в противном случае;

•    <ДополнительныеПараметры> — значение, которое было указано при создании объекта ОписаниеОповещения.

Если параметр не указан или имеет тип Неопределено, то по завершении никакая процедура вызвана не будет.

Описание:

Открывает немодальный диалог выбора цвета.

Доступность:

Тонкий клиент, толстый клиент.

  

alexsandrinia

10 — 21.05.15 — 14:11

так как мне открыть диалоговое окно и выбрать файл?

  

Fish

11 — 21.05.15 — 14:28

(10) ДиалогВыбораФайла (FileDialog)

Показать (Show)

Синтаксис:

Показать(<ОписаниеОповещения>)

Параметры:

<ОписаниеОповещения> (обязательный)

Тип: ОписаниеОповещения.

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

<ВыбранныеФайлы> – массив выбранных имен файлов или Неопределено, если выбор не осуществлен.

<ДополнительныеПараметры> — значение, которое было указано при создании объекта ОписаниеОповещения.

Описание:

Начинает отображение диалога выбора файла.

Доступность:

Тонкий клиент, веб-клиент, толстый клиент.

  

pietro

12 — 21.05.15 — 14:47

&НаКлиенте

Процедура Команда4(Команда)

    

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    Диалог.Заголовок = «Выберите файл с фотографией»;

    Диалог.ПолноеИмяФайла = «»;

    Диалог.ПредварительныйПросмотр = Истина;

    Диалог.Фильтр =

    «Все картинки (*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf)|*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf|»

    + «Формат bmp (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle|»

    + «Формат JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|»

    + «Формат TIFF (*.tif)|*.tif|»

    + «Формат GIF (*.gif)|*.gif|»

    + «Формат PNG (*.png)|*.png|»

    + «Формат icon (*.ico)|*.ico|»

    + «Формат метафайл (*.wmf;*.emf)|*.wmf;*.emf|»; // картинки

    
    Гуарда = Новый ОписаниеОповещения(«ГуардаМостро», ЭтотОбъект);

    
    Диалог.Показать(Гуарда);

    
КонецПроцедуры

&НаКлиенте

Процедура ГуардаМостро(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

    

    Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда

        Сообщить(«Файл выбран!»);

    Иначе

        Сообщить(«Файл не выбран!»);

    КонецЕсли;

    
КонецПроцедуры

  

alexsandrinia

13 — 21.05.15 — 14:57

(12) у меня ничего не происходит, диалоговое окно не появляется с выбором файла…

  

alexsandrinia

14 — 21.05.15 — 14:58

(12)извиняюсь, строку забыл одну указать, заработало)

  

Котокот

15 — 22.05.15 — 14:25

(8) Раз самописка, то просто переписать под асинхронные вызовы.

  

Бубка Гоп

16 — 22.05.15 — 14:30

1с не оставит нас без работы никогда. Спасибо ей огромное.

  

Infsams654

17 — 22.05.15 — 15:08

(8) в свойствах конфигурации «Режим использования модальности» — Использовать.

  

alexsandrinia

18 — 22.05.15 — 15:09

(17) без этого никак?

  

Infsams654

19 — 22.05.15 — 15:11

(18) уже писали как. Переписать под асинхронные вызовы. Пример (12)

  

Serginio1

20 — 22.05.15 — 15:23

  

Котокот

21 — 25.05.15 — 12:54

(18) Перепишите, так правильней с точки зрения клиент-сервера, айяксов и т.д.

  

Господин ПЖ

22 — 25.05.15 — 13:14

пилять… как писать теперь? с вопросами и оповещениями от них все ясно…

а если просто файлы в каталоге удалить? и дождавшись конца пойти дальше по коду?

оповещение срабатывает «самым последним» когда уже выходишь из функции приписанной к команде форме обратно в форму

  

Cyberhawk

23 — 25.05.15 — 13:19

(22) разбить функцию на несколько, иногда да, встаешь в ступор, глядя на привычный код

+ в типовых уже видел наверное «ОписаниеОповещения1», «ОписаниеОповещенияПродолжение1», «ОписаниеОповещенияПродолжение2» и т.д.

  

Господин ПЖ

24 — 25.05.15 — 13:24

>разбить функцию на несколько

да я пытаюсь…

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

форма открыта, у меня в реквизите формы есть имя каталога…

способ так себе, но хоть как-то…

а если я по кнопке вызываю процедуру генерации файлов в каталоге? мне сначала надо зачистить то что было в каталоге, потом генерить новые файлы

как это «разносить»? Читаю ИТС — яснее не становится

  

Cyberhawk

25 — 25.05.15 — 13:27

В последующие описания оповещения можно передавать параметры из предыдущих

  

Cyberhawk

26 — 25.05.15 — 13:28

Ну, типа — из модуля формы на клиенте вызываешь серверную процедуру с описанием оповещения, далее в этом описании оповещения вызываешь еще одну серверную процедуру, но только если в доп. параметрах есть признак успеха

«Использование модальных окон в данном режиме запрещено» — такая ошибка сейчас начинает беспокоить пользователей и программистов 1С с приходом нового интерфейса платформы 1С 8.3 — « «.

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

Модальные и всплывающие (pop-up) окна считаются плохим тоном и уже давно перестали быть нормальным при разработке софта. Пользователи привыкли к работе «в одном окне».

Особенно часто мы видим ошибку модальности у следующих методов 1С:

  • Вопрос;
  • Предупреждение;
  • ОткрытьЗначение.

Разработчики платформы 1С 8 с выходом нового интерфейса «такси» приняли верное решение — попытаться переучить разработчиков прикладных решений на новый лад. Они включили в новую платформу возможность — «режим использования модальности».

Быстрое исправление проблемы

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

Для этого зайдите в систему в режиме , откройте конфигурацию:

В открытой конфигурации вызовите контекстное меню, нажав на корень конфигурации правой кнопкой, выбрав «Свойства»:

Получите 267 видеоуроков по 1С бесплатно:

Откроются свойства конфигурации, где в подвале есть интересующее нас свойство — «Режим использования модальности», выберите режим «Использовать»:

После этого сохраните и примените изменения, нажав клавишу «F7».

Правильное решение задачи

Правильный способ решения этой проблемы — доработать конфигурацию или внешнюю обработку под новые требования.

Предупреждение, вопрос, диалоговые окна и другие модальные окна — всё это необходимо переписывать на новый лад.

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

Например:

  • Предупреждение — ПоказатьПредупреждение;
  • Вопрос — ПоказатьВопрос (подробно — );
  • — ПоказатьВводЧисла.

При этом появился специализированный объект — ОписаниеОпевещения.

Пример замены:

Строка =
«»
;

ВвестиСтроку(Строка,
«Введите строковое значение»
)

Сообщить(«Вы ввели »
+
Строка)
;

Необходимо заменить на:

Строка =
«»
;

ОписаниеОповещения =
Новый
ОписаниеОповещения(«ТестовыйВводСтроки»
,
ЭтаФорма)
;

ПоказатьВводСтроки(ОписаниеОповещения,
Строка,
«Введите строковое значение»
)
;

При этом добавить подобную процедуру на клиенте, которая отработает, когда значение будет введено пользователем:

&НаКлиенте

Процедура
ТестовыйВводСтроки(ПолученноеЗначение,
ПереданныеПараметры) Экспорт

Сообщить(«Вы ввели »
+
Строка)
;

КонецПроцедуры

Формы, которые разрабатываются внутри конфигурации, открываются точно так же. Достаточно заменить метод «ОткрытьФормуМодально» на «ОткрытьФорму», прописав описание оповещения и нужную для него новую процедуру.

Чтобы открывающейся формой закрыть доступ к вызываемой форме, достаточно в свойстве формы указать в свойстве «РежимОткрытияОкна» значение «Блокировать окно владельца»:

Почему возникает ошибка «Использование синхронных методов на клиенте запрещено»?

Если в процессе выполнения уроков у вас появилась такая ошибка — исправить её очень легко.

Вернитесь в конфигуратор и выберите пункт меню «Конфигурация» -> «Открыть конфигурацию»:

В открывшемся окне нажмите правой кнопкой на пункте «Конфигурация» и выберите из раскрывшегося меню пункт «Свойства»:

В открытой конфигурации вызовите контекстное меню, нажав на корень конфигурации правой кнопкой, выбрав «Свойства»:

Получите 267 видеоуроков по 1С бесплатно:

Откроются свойства конфигурации, где в подвале есть интересующее нас свойство — «Режим использования модальности», выберите режим «Использовать»:

После этого сохраните и примените изменения, нажав клавишу «F7».

Правильное решение задачи

Правильный способ решения этой проблемы — доработать конфигурацию или внешнюю обработку под новые требования.

Предупреждение, вопрос, диалоговые окна и другие модальные окна — всё это необходимо переписывать на новый лад.

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

Например:

  • Предупреждение — ПоказатьПредупреждение;
  • Вопрос — ПоказатьВопрос (подробно — );
  • — ПоказатьВводЧисла.

При этом появился специализированный объект — ОписаниеОпевещения.

Пример замены:

Строка =
«»
;

ВвестиСтроку(Строка,
«Введите строковое значение»
)

Сообщить(«Вы ввели »
+
Строка)
;

Необходимо заменить на:

Строка =
«»
;

ОписаниеОповещения =
Новый
ОписаниеОповещения(«ТестовыйВводСтроки»
,
ЭтаФорма)
;

ПоказатьВводСтроки(ОписаниеОповещения,
Строка,
«Введите строковое значение»
)
;

При этом добавить подобную процедуру на клиенте, которая отработает, когда значение будет введено пользователем:

&НаКлиенте

Процедура
ТестовыйВводСтроки(ПолученноеЗначение,
ПереданныеПараметры) Экспорт

Сообщить(«Вы ввели »
+
Строка)
;

КонецПроцедуры

Формы, которые разрабатываются внутри конфигурации, открываются точно так же. Достаточно заменить метод «ОткрытьФормуМодально» на «ОткрытьФорму», прописав описание оповещения и нужную для него новую процедуру.

Чтобы открывающейся формой закрыть доступ к вызываемой форме, достаточно в свойстве формы указать в свойстве «РежимОткрытияОкна» значение «Блокировать окно владельца»:

Почему возникает ошибка «Использование синхронных методов на клиенте запрещено»?

Если в процессе выполнения уроков у вас появилась такая ошибка — исправить её очень легко.

Вернитесь в конфигуратор и выберите пункт меню «Конфигурация» -> «Открыть конфигурацию»:

В открывшемся окне нажмите правой кнопкой на пункте «Конфигурация» и выберите из раскрывшегося меню пункт «Свойства»:

Откроется окно со свойствами конфигурации (справа):

Пролистайте его в самый низ и найдите там пункт «Режим использования модальности»:

Установите его значение в «Использовать»
:

Внимание!
Обратите внимание, что если вы используете платформу 1С, отличную от той, что мы скачивали в первом уроке (более поздней версии), то у вас также будет присутствовать поле «Режим использования синхронных вызовов…». Его также нужно установить в «Использовать».

Наконец, выберите пункт меню «Конфигурация» -> «Сохранить конфигурацию»:

Пролистайте его в самый низ и найдите там пункт «Режим использования модальности»:

Установите его значение в «Использовать»
:

Внимание!
Обратите внимание, что если вы используете платформу 1С, отличную от той, что мы скачивали в первом уроке (более поздней версии), то у вас также будет присутствовать поле «Режим использования синхронных вызовов…». Его также нужно установить в «Использовать».

Наконец, выберите пункт меню «Конфигурация» -> «Сохранить конфигурацию»:

Готово! Теперь ошибки больше не возникнет.

Пояснения ниже — для тех кому интересно, что мы сделали.

Мы включили режим использования модальности в нашей конфигурации. По умолчанию этот режим выключен и это не позволяет нам использовать такие команды как ВвестиЧисло, ВвестиСтроку, ВвестиДату, ОткрытьЗначение.

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

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

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

Исправление проблемы происходит после изменения настроек или кода 1С.

Такая информативность позволит вернуть работоспособность программе 1С , а также в дальнейшем избежать серьёзных промахов, провоцирующих возникновение проблем.

Возникает в 1С и такая ошибка «Использование синхронных методов на клиенте запрещено». Не следует паниковать и при её возникновении, достаточно сориентироваться в последовательности ваших действий, изучив ценные рекомендации опытных пользователей.

Внесение изменений в настройки программы

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

Первоначально кликните по строке «Конфигуратор». После этого в открытом контекстном меню перейдите на последнюю строку «Свойства», кликните по ней. Теперь откроется окно, в котором можно самостоятельно вносить некоторые изменения в настройки, включая корректировку и в режим работы программы.

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

Теперь закройте все открытые окна и попробуйте выполнить все желаемые действия заново. Вероятность того, что у вас всё получится высока.

Изменение кода

К сожалению, не всегда удаётся исправить ошибку «Использование синхронных методов на клиенте запрещено» после внесения изменений в настройки программы. Иногда приходится осуществлять более ответственные мероприятия. В частности, вносить изменения в код программы. Опытные пользователи рекомендуют воспользоваться асинхронным методом входа, если синхронный вдруг стал запрещённым.

Откройте код программы. Название процедуры (Процедура ОткрытьЛиФайл1()) и его конец (КонецПроцедуры) оставьте без изменения, а само тело процедуры измените кардинально.

Прописать придётся всего лишь три строки:

Оповещение = Новый ОписаниеОповещения («ЗаписатьЛиЕще»,ЭтотОбъект);
ТекстВопроса = «Записать?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);

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

В статье будут рассмотрены основные причины отказа от модальности в платформе «1С:Предприятие» и основные методы преобразования участков кода на новую асинхронную модель.

Применимость

В статье рассматриваются асинхронная модель построения бизнес-логики, добавленная платформу «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.

Отказ от использования модальных окон в платформе 1С:Предприятие 8.3

При разработке конфигурации на платформе 1С:Предприятие 8 периодически возникает потребность приостановить работу программы до того момента, когда пользователь примет какое-либо решение или выполнит какие-либо действия.

Например, при нажатии на кнопку заполнения табличной части у пользователя следует спросить, нужно ли очистить табличную часть, чтобы не произошло потери ранее введенных данных.

Такое поведение может обеспечить, например, следующий код:

&НаКлиенте
Процедура
ЗаполнитьТовары
(Команда
)

Ответ
=
Вопрос
(“Табличная
часть
будет
очищена.
Продолжить?”
,
РежимДиалогаВопрос.ДаНет
);

Если
Ответ
=
КодВозвратаДиалога.Да
Тогда

//алгоритм заполнения
КонецЕсли
;

КонецПроцедуры

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

Также к приостановке выполнения кода и блокировке интерфейса приводит открытие модальных окон при помощи вызова метода ОткрытьМодально().

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

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

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

Проблемы также возникают при работе на мобильных устройствах. Так, например, модальные окна не поддерживаются на iPad.

Для решения указанных проблем следует использовать блокирующие окна вместо модальных. Для пользователя визуально все выглядит так же: окно блокирует интерфейс веб-клиента.

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

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

У корневого элемента конфигурации существует свойство “Режим использования модальности”, которое определяет, можно ли в конфигурации открывать модальные окна.

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

Теперь закройте все открытые окна и попробуйте выполнить все желаемые действия заново. Вероятность того, что у вас всё получится высока.

Изменение кода

К сожалению, не всегда удаётся исправить ошибку «Использование синхронных методов на клиенте запрещено» после внесения изменений в настройки программы. Иногда приходится осуществлять более ответственные мероприятия. В частности, вносить изменения в код программы. Опытные пользователи рекомендуют воспользоваться асинхронным методом входа, если синхронный вдруг стал запрещённым.

Откройте код программы. Название процедуры (Процедура ОткрытьЛиФайл1()) и его конец (КонецПроцедуры) оставьте без изменения, а само тело процедуры измените кардинально.

Прописать придётся всего лишь три строки:

Оповещение = Новый ОписаниеОповещения («ЗаписатьЛиЕще»,ЭтотОбъект);
ТекстВопроса = «Записать?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);

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

В статье будут рассмотрены основные причины отказа от модальности в платформе «1С:Предприятие» и основные методы преобразования участков кода на новую асинхронную модель.

Применимость

В статье рассматриваются асинхронная модель построения бизнес-логики, добавленная платформу «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.

Отказ от использования модальных окон в платформе 1С:Предприятие 8.3

При разработке конфигурации на платформе 1С:Предприятие 8 периодически возникает потребность приостановить работу программы до того момента, когда пользователь примет какое-либо решение или выполнит какие-либо действия.

Например, при нажатии на кнопку заполнения табличной части у пользователя следует спросить, нужно ли очистить табличную часть, чтобы не произошло потери ранее введенных данных.

Такое поведение может обеспечить, например, следующий код:

&НаКлиенте
Процедура
ЗаполнитьТовары
(Команда
)

Ответ
=
Вопрос
(“Табличная
часть
будет
очищена.
Продолжить?”
,
РежимДиалогаВопрос.ДаНет
);

Если
Ответ
=
КодВозвратаДиалога.Да
Тогда

//алгоритм заполнения
КонецЕсли
;

КонецПроцедуры

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

Также к приостановке выполнения кода и блокировке интерфейса приводит открытие модальных окон при помощи вызова метода ОткрытьМодально().

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

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

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

Проблемы также возникают при работе на мобильных устройствах. Так, например, модальные окна не поддерживаются на iPad.

Для решения указанных проблем следует использовать блокирующие окна вместо модальных. Для пользователя визуально все выглядит так же: окно блокирует интерфейс веб-клиента.

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

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

У корневого элемента конфигурации существует свойство “Режим использования модальности”, которое определяет, можно ли в конфигурации открывать модальные окна.

Если выбран вариант “Использовать”, то модальные окна можно открывать. Если выбран вариант “Не использовать”, то модальные окна недопустимы. При попытке вызвать метод, открывающий модальное окно, система выводит сообщение об ошибке:

При таком значении свойства “Режим использования модальности” допустимы только блокирующие окна.

Если выбран вариант “Использовать с предупреждениями”, то при открытии модальных окон в окно сообщений выводится текст:

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

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

Поэтому разработчикам придется переписать программный код, использующий модальные окна, с учетом этой особенности.

Код нужно разделить на две части:

  • открытие блокирующего окна;
  • обработка выбора пользователя.

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

&НаКлиенте
Процедура
ЗаполнитьТовары
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(,
ЭтотОбъект
);

РежимДиалогаВопрос.ДаНет
);

КонецПроцедуры

&НаКлиенте
Процедура
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
Результат
=
КодВозвратаДиалога.Да
Тогда

//алгоритм заполнения
КонецЕсли
;

КонецПроцедуры

После выполнения процедуры ПоказатьВопрос() система не останавливается, ожидая ответ пользователя, исполнение кода продолжается.

Пользователь сможет сделать выбор только после завершения работы всей процедуры. При этом будет вызвана экспортная процедура ЗаполнитьТоварыВопросЗавершение(). Ее название мы передали в конструктор объекта ОписаниеОповещения.

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

В рассмотренном примере вызываемая процедура расположена в модуле управляемой формы, поэтому мы передали в параметр ЭтотОбъект.

Рассмотрим вызов процедуры, расположенной в общем модуле. Для этого добавим новый общий модуль ОбработкаОповещений, установим для него флаг “Клиент (управляемое приложение)”, а признак “Глобальный” не устанавливаем. Расположим в этом модуле процедуру ЗаполнитьТоварыВопросЗавершение().

Тогда обработчик команды заполнения будет выглядеть так:

&НаКлиенте
Процедура
ЗаполнитьТовары
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(“ЗаполнитьТоварыВопросЗавершение”
,
ОбработкаОповещений
);

ТекстВопроса
=
“Табличная
часть
будет
очищена.
Продолжить?”
;

ПоказатьВопрос
(Оповещение
,
ТекстВопроса
,
РежимДиалогаВопрос.ДаНет
);

КонецПроцедуры

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

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

Этот объект (любого типа) будет передан в процедуру, описанную в ОписаниеОповещения, последним параметром.

На примере рассмотренного выше участка кода это можно сделать так:

&НаКлиенте
Процедура
ЗаполнитьТовары
(Команда
)

Параметр1
=
0
;

Параметр2
=
0
;

СписокПараметров
=
Новый
Структура
(“Параметр1
,
Параметр2″
,
Параметр1
,
Параметр2
);

Оповещение
=
Новый
ОписаниеОповещения
(“ЗаполнитьТоварыВопросЗавершение”
,
ЭтотОбъект
,
СписокПараметров
);

ПоказатьВопрос
(Оповещение
,
“Табличная
часть
будет
очищена.
Продолжить?”
,
РежимДиалогаВопрос.ДаНет
);

КонецПроцедуры

&НаКлиенте
Процедура
ЗаполнитьТоварыВопросЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
Результат
=
КодВозвратаДиалога.Да
Тогда

//анализируем ДополнительныеПараметры.Параметр1
//анализируем ДополнительныеПараметры.Параметр2
КонецЕсли
;

КонецПроцедуры

Если нужно передать только одно значение, то структуру можно не использовать, а присвоить это значение параметру ДополнительныеПараметры конструктора объекта ОписаниеОповещения.

Рассмотрим несколько примеров работы с блокирующими окнами.

Задача 1. Открытие другой формы

Из формы документа по нажатию на кнопку “Открыть параметры” нужно открыть форму, на которой расположены два флажка Параметр1 и Параметр2, которые должен установить пользователь. После закрытия формы вывести в строку сообщений значения параметров.

Создаем общую форму “ФормаПараметров”, на которой размещаем реквизиты Параметр1 и Параметр2, а также команду ЗакрытьФорму:

Обработчик команды выглядит следующим образом:

Обработчик
команды
выглядит
следующим
образом:
&НаКлиенте
Процедура
ЗакрытьФорму
(Команда
)

СписокПараметров
=
Новый
Структура
(“Параметр1, Параметр2”
,
Параметр1
,
Параметр2
);

Закрыть
(СписокПараметров
);
КонецПроцедуры

Для формы свойство РежимОткрытияОкна устанавливаем в “Блокировать весь интерфейс”:

На форме документа располагаем команду ОткрытьПараметры, обработчик которой описываем следующим образом:

&НаКлиенте
Процедура
ОткрытьПараметры
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(“ОткрытьПараметрыЗавершение”
,
ЭтотОбъект
);

ОткрытьФорму
(“ОбщаяФорма.ФормаПараметров”
,
,
,
,
,
,
Оповещение
);

КонецПроцедуры

&НаКлиенте
Процедура
ОткрытьПараметрыЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
ТипЗнч
(Результат
)
=
Тип
(“Структура”
)
Тогда

Для
каждого
КлючЗначение
Из
Результат
Цикл

Сообщение
=
Новый
СообщениеПользователю
;

Сообщение.Текст
=
“Ключ:
“”
” + КлючЗначение.Ключ + “””
,
значение
=

+
КлючЗначение.Значение
;

Сообщение.Сообщить
();

КонецЦикла
;

КонецЕсли
;

КонецПроцедуры

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

Для увеличения нажмите на изображение.

Режим открытия окна можно также указывать в последнем параметре процедуры ОткрытьФорму.

&НаКлиенте
Процедура
ОткрытьПараметры
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(“ОткрытьПараметрыЗавершение”
,
ЭтотОбъект
);

ОткрытьФорму
(“ОбщаяФорма.ФормаПараметров”
,
,
,
,
,
,
Оповещение
,

РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
);

КонецПроцедуры

Задача 2. Вопрос при закрытии формы

При закрытии окна обработки задавать пользователю вопрос, действительно ли он хочет закрыть окно.

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

&НаКлиенте
Перем
НужноЗакрыватьФорму
;

&НаКлиенте
Процедура
ПередЗакрытием
(Отказ
,
СтандартнаяОбработка
)

Если
НЕ
НужноЗакрыватьФорму
=
Истина
Тогда

Отказ
=
Истина
;

Оповещение
=
Новый
ОписаниеОповещения
(“ПередЗакрытиемЗавершение”
,
ЭтотОбъект
);

ПоказатьВопрос
(Оповещение
,
“Вы
действительно
хотите
закрыть
окно?”
,

РежимДиалогаВопрос.ДаНет
);

КонецЕсли
;

КонецПроцедуры

&НаКлиенте
Процедура
ПередЗакрытиемЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
Результат
=
КодВозвратаДиалога.Да
Тогда

НужноЗакрыватьФорму
=
Истина
;

Закрыть
();

Иначе

НужноЗакрыватьФорму
=
Неопределено
;

КонецЕсли
;

КонецПроцедуры

В процедуре ПередЗакрытием формы пользователю задается вопрос, флаг Отказ выставляется в Истина, закрытие формы отменяется.

После утвердительного ответа на вопрос переменная НужноЗакрыватьФорму устанавливается в Истина, форма закрывается повторно.

Задача 3. Ввод числового значения

При нажатии на кнопку на форме обработки открывать стандартный диалог ввода числа.

Для этого необходимо воспользоваться методом ПоказатьВводЧисла() вместо ВвестиЧисло(), который открывает блокирующее окно вместо модального.

&НаКлиенте
Процедура
ВводЧисла
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(“ВводЧислаЗавершение”
,
ЭтотОбъект
);

ПоказатьВводЧисла
(Оповещение
,
0
,
“Введите
количество”
,
15
,
3
);

КонецПроцедуры

&НаКлиенте
Процедура
ВводЧислаЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Сообщение
=
Новый
СообщениеПользователю
;

Сообщение.Текст
=
“Вы
ввели
количество

+
Результат
;

Сообщение.Сообщить
();

КонецЕсли
;

КонецПроцедуры

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

Задача 4. Выбор цвета

При нажатии на кнопку на форме обработки при помощи стандартного диалога выбора цвета пользователь указывает необходимый цвет. Этот цвет установить для фона нажимаемой кнопки.

Добавим на форму команду ВыборЦвета со следующим обработчиком:

&НаКлиенте
Процедура
ВыборЦвета
(Команда
)

ДиалогВыбораЦвета
=
Новый
ДиалогВыбораЦвета
;

Оповещение
=
Новый
ОписаниеОповещения
(“ВыборЦветаЗавершение”
,
ЭтотОбъект
);

ДиалогВыбораЦвета.
Пока
зать
(Оповещение
);

КонецПроцедуры

&НаКлиенте
Процедура
ВыборЦветаЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
НЕ
Результат
=
Неопределено
Тогда

Элементы.ВыборЦвета.ЦветФона
=
Результат
;

КонецЕсли
;

КонецПроцедуры

При таком значении свойства “Режим использования модальности” допустимы только блокирующие окна.

Если выбран вариант “Использовать с предупреждениями”, то при открытии модальных окон в окно сообщений выводится текст:

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

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

Поэтому разработчикам придется переписать программный код, использующий модальные окна, с учетом этой особенности.

Код нужно разделить на две части:

  • открытие блокирующего окна;
  • обработка выбора пользователя.

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

&НаКлиенте
Процедура
ЗаполнитьТовары
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(,
ЭтотОбъект
);

РежимДиалогаВопрос.ДаНет
);

КонецПроцедуры

&НаКлиенте
Процедура
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
Результат
=
КодВозвратаДиалога.Да
Тогда

//алгоритм заполнения
КонецЕсли
;

КонецПроцедуры

После выполнения процедуры ПоказатьВопрос() система не останавливается, ожидая ответ пользователя, исполнение кода продолжается.

Пользователь сможет сделать выбор только после завершения работы всей процедуры. При этом будет вызвана экспортная процедура ЗаполнитьТоварыВопросЗавершение(). Ее название мы передали в конструктор объекта ОписаниеОповещения.

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

В рассмотренном примере вызываемая процедура расположена в модуле управляемой формы, поэтому мы передали в параметр ЭтотОбъект.

Рассмотрим вызов процедуры, расположенной в общем модуле. Для этого добавим новый общий модуль ОбработкаОповещений, установим для него флаг “Клиент (управляемое приложение)”, а признак “Глобальный” не устанавливаем. Расположим в этом модуле процедуру ЗаполнитьТоварыВопросЗавершение().

Тогда обработчик команды заполнения будет выглядеть так:

&НаКлиенте
Процедура
ЗаполнитьТовары
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(“ЗаполнитьТоварыВопросЗавершение”
,
ОбработкаОповещений
);

ТекстВопроса
=
“Табличная
часть
будет
очищена.
Продолжить?”
;

ПоказатьВопрос
(Оповещение
,
ТекстВопроса
,
РежимДиалогаВопрос.ДаНет
);

КонецПроцедуры

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

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

Этот объект (любого типа) будет передан в процедуру, описанную в ОписаниеОповещения, последним параметром.

На примере рассмотренного выше участка кода это можно сделать так:

&НаКлиенте
Процедура
ЗаполнитьТовары
(Команда
)

Параметр1
=
0
;

Параметр2
=
0
;

СписокПараметров
=
Новый
Структура
(“Параметр1
,
Параметр2″
,
Параметр1
,
Параметр2
);

Оповещение
=
Новый
ОписаниеОповещения
(“ЗаполнитьТоварыВопросЗавершение”
,
ЭтотОбъект
,
СписокПараметров
);

ПоказатьВопрос
(Оповещение
,
“Табличная
часть
будет
очищена.
Продолжить?”
,
РежимДиалогаВопрос.ДаНет
);

КонецПроцедуры

&НаКлиенте
Процедура
ЗаполнитьТоварыВопросЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
Результат
=
КодВозвратаДиалога.Да
Тогда

//анализируем ДополнительныеПараметры.Параметр1
//анализируем ДополнительныеПараметры.Параметр2
КонецЕсли
;

КонецПроцедуры

Если нужно передать только одно значение, то структуру можно не использовать, а присвоить это значение параметру ДополнительныеПараметры конструктора объекта ОписаниеОповещения.

Рассмотрим несколько примеров работы с блокирующими окнами.

Задача 1. Открытие другой формы

Из формы документа по нажатию на кнопку “Открыть параметры” нужно открыть форму, на которой расположены два флажка Параметр1 и Параметр2, которые должен установить пользователь. После закрытия формы вывести в строку сообщений значения параметров.

Создаем общую форму “ФормаПараметров”, на которой размещаем реквизиты Параметр1 и Параметр2, а также команду ЗакрытьФорму:

Обработчик команды выглядит следующим образом:

Обработчик
команды
выглядит
следующим
образом:
&НаКлиенте
Процедура
ЗакрытьФорму
(Команда
)

СписокПараметров
=
Новый
Структура
(“Параметр1, Параметр2”
,
Параметр1
,
Параметр2
);

Закрыть
(СписокПараметров
);
КонецПроцедуры

Для формы свойство РежимОткрытияОкна устанавливаем в “Блокировать весь интерфейс”:

На форме документа располагаем команду ОткрытьПараметры, обработчик которой описываем следующим образом:

&НаКлиенте
Процедура
ОткрытьПараметры
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(“ОткрытьПараметрыЗавершение”
,
ЭтотОбъект
);

ОткрытьФорму
(“ОбщаяФорма.ФормаПараметров”
,
,
,
,
,
,
Оповещение
);

КонецПроцедуры

&НаКлиенте
Процедура
ОткрытьПараметрыЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
ТипЗнч
(Результат
)
=
Тип
(“Структура”
)
Тогда

Для
каждого
КлючЗначение
Из
Результат
Цикл

Сообщение
=
Новый
СообщениеПользователю
;

Сообщение.Текст
=
“Ключ:
“”
” + КлючЗначение.Ключ + “””
,
значение
=

+
КлючЗначение.Значение
;

Сообщение.Сообщить
();

КонецЦикла
;

КонецЕсли
;

КонецПроцедуры

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

Для увеличения нажмите на изображение.

Режим открытия окна можно также указывать в последнем параметре процедуры ОткрытьФорму.

&НаКлиенте
Процедура
ОткрытьПараметры
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(“ОткрытьПараметрыЗавершение”
,
ЭтотОбъект
);

ОткрытьФорму
(“ОбщаяФорма.ФормаПараметров”
,
,
,
,
,
,
Оповещение
,

РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
);

КонецПроцедуры

Задача 2. Вопрос при закрытии формы

При закрытии окна обработки задавать пользователю вопрос, действительно ли он хочет закрыть окно.

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

&НаКлиенте
Перем
НужноЗакрыватьФорму
;

&НаКлиенте
Процедура
ПередЗакрытием
(Отказ
,
СтандартнаяОбработка
)

Если
НЕ
НужноЗакрыватьФорму
=
Истина
Тогда

Отказ
=
Истина
;

Оповещение
=
Новый
ОписаниеОповещения
(“ПередЗакрытиемЗавершение”
,
ЭтотОбъект
);

ПоказатьВопрос
(Оповещение
,
“Вы
действительно
хотите
закрыть
окно?”
,

РежимДиалогаВопрос.ДаНет
);

КонецЕсли
;

КонецПроцедуры

&НаКлиенте
Процедура
ПередЗакрытиемЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
Результат
=
КодВозвратаДиалога.Да
Тогда

НужноЗакрыватьФорму
=
Истина
;

Закрыть
();

Иначе

НужноЗакрыватьФорму
=
Неопределено
;

КонецЕсли
;

КонецПроцедуры

В процедуре ПередЗакрытием формы пользователю задается вопрос, флаг Отказ выставляется в Истина, закрытие формы отменяется.

После утвердительного ответа на вопрос переменная НужноЗакрыватьФорму устанавливается в Истина, форма закрывается повторно.

Задача 3. Ввод числового значения

При нажатии на кнопку на форме обработки открывать стандартный диалог ввода числа.

Для этого необходимо воспользоваться методом ПоказатьВводЧисла() вместо ВвестиЧисло(), который открывает блокирующее окно вместо модального.

&НаКлиенте
Процедура
ВводЧисла
(Команда
)

Оповещение
=
Новый
ОписаниеОповещения
(“ВводЧислаЗавершение”
,
ЭтотОбъект
);

ПоказатьВводЧисла
(Оповещение
,
0
,
“Введите
количество”
,
15
,
3
);

КонецПроцедуры

&НаКлиенте
Процедура
ВводЧислаЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Сообщение
=
Новый
СообщениеПользователю
;

Сообщение.Текст
=
“Вы
ввели
количество

+
Результат
;

Сообщение.Сообщить
();

КонецЕсли
;

КонецПроцедуры

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

Задача 4. Выбор цвета

При нажатии на кнопку на форме обработки при помощи стандартного диалога выбора цвета пользователь указывает необходимый цвет. Этот цвет установить для фона нажимаемой кнопки.

Добавим на форму команду ВыборЦвета со следующим обработчиком:

&НаКлиенте
Процедура
ВыборЦвета
(Команда
)

ДиалогВыбораЦвета
=
Новый
ДиалогВыбораЦвета
;

Оповещение
=
Новый
ОписаниеОповещения
(“ВыборЦветаЗавершение”
,
ЭтотОбъект
);

ДиалогВыбораЦвета.
Пока
зать
(Оповещение
);

КонецПроцедуры

&НаКлиенте
Процедура
ВыборЦветаЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт

Если
НЕ
Результат
=
Неопределено
Тогда

Элементы.ВыборЦвета.ЦветФона
=
Результат
;

КонецЕсли
;

КонецПроцедуры

Для объектов ДиалогВыбораЦвета (а также ДиалогРедактированияСтандартногоПериода, КонструкторФорматнойСтроки, ДиалогРасписанияРегламентногоЗадания, ДиалогВыбораШрифта) метод Показать() открывает блокирующее окно.

После закрытия окна будет вызвана процедура, в первый параметр которой будет передано выбранное значение (цвет, шрифт и т.д.) или значение Неопределено, если пользователь отказался от выбора.

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

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

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

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

Какой практический вывод можно сделать из этой информации? А вывод довольно простой – если по какой-то причине в вашей конфигурации до сих пор существуют модальные вызовы, то в этих местах в в веб-клиенте будет выдаваться окно с сообщением об ошибке. Хочется предостеречь от попыток “нагуглить” какое-то быстрое решение данной проблемы, т.к. основная масса советов сводится к такому рецепту: в конфигураторе на уровне конфигурации в свойстве «Режим использования модальности» поставить значение «Использовать». Естественно, в данный момент, это работать не будет только из-за того, что сами современные браузеры уже не поддерживают модальные вызовы.

И у вас есть всего два пути, каким образом решить описанную выше проблему:

  1. Обновить платформу до релиза 8.3.10+ (8.3.11), установить свойство конфигурации «Режим совместимости» в «Не использовать» и переписать фрагменты кода, использующие модальные методы на асинхронную модель построения бизнес-логики
  2. Рекомендовать вашим клиентам пользоваться устаревшими браузерами, где модальные вызовы еще поддерживались (Mozilla Firefox версии 37 и ниже, Chrоme ниже 37 версии и т.д.).

Кстати, начиная с релиза 8.3.11, больше не поддерживаются веб-браузеры Microsoft Internet Explorer версий 8 и 9.

С веб-браузерами в свете модальности мы разобрались, теперь настала пора прояснить ситуацию и с остальными клиентами.

Начиная с версии 8.3.5 свойство «Режим использования модальности» в тонком и толстом клиентах учитывается, только если указан параметр командной строки /EnableCheckModal. Этот параметр автоматически подставляется в командную строку только при запуске приложения из конфигуратора. Если же этот параметр не указан, то генерация исключений не происходит и соответствующие предупреждения не показываются. Т.е. на практике в случае использования толстого и тонкого клиента никакого кардинального изменения в работе при использовании режима модальности не наблюдается – модальные вызовы будут работать так же, как и работали ранее, при этом не выдавая никаких предупреждений, как в веб-клиенте.

Чтобы расставить все точки над “i”, заметим, что начиная с редакции 8.3.9 в толстом клиенте игнорируется свойство конфигурации «Режим использования синхронных вызовов расширений платформы и внешних компонент», при этом соответствующие синхронные методы работают без генерации исключений и вывода предупреждений. Указанное игнорируемое свойство было добавлено в редакции 8.3.5 с целью поддержки асинхронной работы с внешними компонентами, криптографией и расширениями для работы с файлами в веб-браузере Google Chrome. Понятно, что к толстому клиенту это никакого отношения не имеет, и поэтому “тихое” игнорирование данного свойства просто исключило лишние проверки использования синхронных методов при использовании конфигурации.

Кстати! Из-за того, что платформа уверенно движется в сторону веба, с версии 8.3.8 разработчики ввели определенные ограничения на программный код, который связан с логикой закрытия формы или приложения, исполняемый в толстом и тонком клиентах. Обязательно прочтите нашу статью, подробно освещающую этот нюанс. Кроме того, в курсе «Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3 », есть глава, посвященная отказу от модальности, и вы можете почерпнуть массу полезной и актуальной информации по этой теме.

Коллеги, существуют две вещи которые можно читать бесконечно: ленту вконтакте и список изменений в очередном релизе платформе, поэтому, давайте подводить окончательные итоги;)

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

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

Вместо заключения

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

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

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

Исправляем ситуацию

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

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


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

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

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

{Справочник.НаимСпр.Форма.ФормаСписка}: Ошибка при вызове метода контекста (Выбрать): Недопустимое значение параметра (параметр номер «3») Выборка=Справочники.НаимСпр.Выбрать(,,Новый Структура(«ДатаИмпорта, Фирма», ЭлементыФормы.СправочникСписок.ТекущиеДанные.ДатаИмпорта, Неопределено)); Поля ДатаИмпорта и Фирма справочника индексированы

Структура может содержать только один элемент, о чем есть примечание в синтакс-помощнике. Для отбора по нескольким условиям используй запрос.

спасибо, зачем делали структуру непонятно. все равно спасибо

Тэги:

Комментарии доступны только авторизированным пользователям

Довольно часто начинающие 1С разработчики сталкиваются с ошибками, которых достаточно легко избежать. Ниже мы рассмотрим топ 11 ошибок и способы их исправления. Также доступна видеоверсия статьи

Содержание

Поле объекта не обнаружено

1С ошибка Поле объекта не обнаружено

Для объектов ДиалогВыбораЦвета (а также ДиалогРедактированияСтандартногоПериода, КонструкторФорматнойСтроки, ДиалогРасписанияРегламентногоЗадания, ДиалогВыбораШрифта) метод Показать() открывает блокирующее окно.

После закрытия окна будет вызвана процедура, в первый параметр которой будет передано выбранное значение (цвет, шрифт и т.д.) или значение Неопределено, если пользователь отказался от выбора.

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

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

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

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

Какой практический вывод можно сделать из этой информации? А вывод довольно простой – если по какой-то причине в вашей конфигурации до сих пор существуют модальные вызовы, то в этих местах в в веб-клиенте будет выдаваться окно с сообщением об ошибке. Хочется предостеречь от попыток “нагуглить” какое-то быстрое решение данной проблемы, т.к. основная масса советов сводится к такому рецепту: в конфигураторе на уровне конфигурации в свойстве «Режим использования модальности» поставить значение «Использовать». Естественно, в данный момент, это работать не будет только из-за того, что сами современные браузеры уже не поддерживают модальные вызовы.

И у вас есть всего два пути, каким образом решить описанную выше проблему:

  1. Обновить платформу до релиза 8.3.10+ (8.3.11), установить свойство конфигурации «Режим совместимости» в «Не использовать» и переписать фрагменты кода, использующие модальные методы на асинхронную модель построения бизнес-логики
  2. Рекомендовать вашим клиентам пользоваться устаревшими браузерами, где модальные вызовы еще поддерживались (Mozilla Firefox версии 37 и ниже, Chrоme ниже 37 версии и т.д.).

Кстати, начиная с релиза 8.3.11, больше не поддерживаются веб-браузеры Microsoft Internet Explorer версий 8 и 9.

С веб-браузерами в свете модальности мы разобрались, теперь настала пора прояснить ситуацию и с остальными клиентами.

Начиная с версии 8.3.5 свойство «Режим использования модальности» в тонком и толстом клиентах учитывается, только если указан параметр командной строки /EnableCheckModal. Этот параметр автоматически подставляется в командную строку только при запуске приложения из конфигуратора. Если же этот параметр не указан, то генерация исключений не происходит и соответствующие предупреждения не показываются. Т.е. на практике в случае использования толстого и тонкого клиента никакого кардинального изменения в работе при использовании режима модальности не наблюдается – модальные вызовы будут работать так же, как и работали ранее, при этом не выдавая никаких предупреждений, как в веб-клиенте.

Чтобы расставить все точки над “i”, заметим, что начиная с редакции 8.3.9 в толстом клиенте игнорируется свойство конфигурации «Режим использования синхронных вызовов расширений платформы и внешних компонент», при этом соответствующие синхронные методы работают без генерации исключений и вывода предупреждений. Указанное игнорируемое свойство было добавлено в редакции 8.3.5 с целью поддержки асинхронной работы с внешними компонентами, криптографией и расширениями для работы с файлами в веб-браузере Google Chrome. Понятно, что к толстому клиенту это никакого отношения не имеет, и поэтому “тихое” игнорирование данного свойства просто исключило лишние проверки использования синхронных методов при использовании конфигурации.

Кстати! Из-за того, что платформа уверенно движется в сторону веба, с версии 8.3.8 разработчики ввели определенные ограничения на программный код, который связан с логикой закрытия формы или приложения, исполняемый в толстом и тонком клиентах. Обязательно прочтите нашу статью, подробно освещающую этот нюанс. Кроме того, в курсе «Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3 », есть глава, посвященная отказу от модальности, и вы можете почерпнуть массу полезной и актуальной информации по этой теме.

Коллеги, существуют две вещи которые можно читать бесконечно: ленту вконтакте и список изменений в очередном релизе платформе, поэтому, давайте подводить окончательные итоги;)

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

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

Вместо заключения

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

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

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

Исправляем ситуацию

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

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


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

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

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

{Справочник.НаимСпр.Форма.ФормаСписка}: Ошибка при вызове метода контекста (Выбрать): Недопустимое значение параметра (параметр номер «3») Выборка=Справочники.НаимСпр.Выбрать(,,Новый Структура(«ДатаИмпорта, Фирма», ЭлементыФормы.СправочникСписок.ТекущиеДанные.ДатаИмпорта, Неопределено)); Поля ДатаИмпорта и Фирма справочника индексированы

Структура может содержать только один элемент, о чем есть примечание в синтакс-помощнике. Для отбора по нескольким условиям используй запрос.

спасибо, зачем делали структуру непонятно. все равно спасибо

Тэги:

Комментарии доступны только авторизированным пользователям

Довольно часто начинающие 1С разработчики сталкиваются с ошибками, которых достаточно легко избежать. Ниже мы рассмотрим топ 11 ошибок и способы их исправления. Также доступна видеоверсия статьи

Содержание

Поле объекта не обнаружено

Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки “Поле объекта не обнаружено”. Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.

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

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

  • Удалили табличную часть, к которой обращаемся в коде?
  • Переименовали реквизит, а в коде не исправили?
  • Заменили значение со ссылки на неопределено?

Вуаля – платформа выдаст ошибку “Поле объекта не обнаружено”!

Как исправить? Исходя из природы ошибки – переименовать реквизит на нужное имя, отредактировать код, или использовать правильные обращения к стандартным свойствам объекта.

Например, у объекта “СообщениеПользователю” нет свойства “Таблица”, и следующий код приведет к ошибке:

Сообщение = Новый СообщениеПользователю;
Сообщение.Таблица = “Ошибка”;

Индекс находится за границами массива

1С ошибка Индекс находится за пределами массива

Что означает такое сообщение системы? Как правило, с данной ошибкой разработчик сталкивается при некорректной работе с коллекциями. Самые частые случаи появления ошибки “Индекс находится за границами массива”.

  • Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов – с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
  • Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
  • Ошибочное увеличение счетчика в цикле “Для”

 Как исправить? Для удаления элементов из коллекции по условию – использовать обратный цикл. Добавлять условие на соответствие счетчика цикла и индекса массива. Не увеличивать счетчик внутри кода цикла Для … Цикл … КонецЦикла

Обращение к процедуре как к функции

ОШибка

Суть этой ошибки в том, что процедура не может возвращать значение. И если мы в коде используем вызов процедуры справа от знака присваивания, это приведет к ошибке.

Данная ошибка имеет две вариации – если используется стандартная процедура из методов какого-нибудь объекта, то фраза будет звучать “Обращение к процедуре объекта как к функции”. Если же использовать процедуру, объявленную в коде, то текст ошибки будет “Обращение к процедуре как к функции”.
При этом ошибка использования процедуры объекта является ошибкой времени выполнения – т.е. на этапе сохранения и проверки конфигурации платформа эту ошибку не обнаружит.

А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.

Рассмотрим два примера:

1. Воспроизведем ошибку “Обращение к процедуре как к функции”. При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.

2. Воспроизведем ошибку “Обращение к процедуре объекта как к функции”. Здесь мы неверно используем метод объекта массива “Добавить”, который является процедурой.

Как исправить? Ошибка тривиальная, и исправление тоже. Чаще всего, достаточно внимательно прочитать описание методов объекта во встроенной справке или синтакс-помощнике. Если метод является процедурой, то значений он возвращать не может. Следовательно, нужно модифицировать код так, чтобы такого ошибочного вызова не было.
Если же используется процедура, объявленная в коде, возможно, есть необходимость изменить ее на функцию, либо также скорректировать код, который эту процедуру использует.

Процедура не может возвращать значение

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

В процедуре можно написать ключевое слово “Возврат” без параметров. Это будет означать выход из процедуры.

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

Процедура ПроцедураНеМожетВозвращатьЗначение(Команда)
Возврат "Ошибка";
КонецПроцедуры

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

Переменная не определена

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

  • Опечатка в имени переменной
  • Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова “Перем”, или передана в качестве параметра)
  • Написание на клиенте серверного кода. Например, обращение к менеджеру справочников “Справочники”, и т.п. Клиентская часть приложения “не видит ” серверные объекты языка
  • Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.

Как исправить?

Внимательно следить за правильностью набранного кода, своевременно объявлять переменные или передавать их в качестве параметров. Писать серверный код только в серверных модулях, а также использовать соответствующие инструкции препроцессора, например “&НаСервере”.

Значение не является значением объектного типа

Ошибка “Значение не является значением объектного типа” может возникнуть при неверном обращении к объекту языка. Объектный тип – это такие объекты языка, которые содержат в себе другие объекты – свойства, реквизиты и т.п. Эти свойства доступны через точку, например “Объект.СвойствоЭтогоОбъекта”

Но если через точку попытаться использовать какое-то значение, которое внутри себя свойств не имеет – например, любое значение примитивного типа – это и приведет к ошибке.

Разберем более сложный пример:

&НаСервере
Процедура ЗначениеНеЯвляетсяЗначениемОбъектногоТипаНаСервере(Справочники = Ложь)
Сообщить(Справочники.Сотрудники.ПустаяСсылка());
КонецПроцедуры

Ошибка может быть “плавающей”. Если вместо параметра по умолчанию “Справочники = Ложь” будет передан менеджер справочников, то ошибки возникать не будет. А если вызвать процедуру без параметров, то будет использоваться параметр по умолчанию с типом Булево, что и приведет к ошибке.

Чаще всего чтобы исправить ошибку, нужно в отладчике посмотреть, какой тип значения используется. Можно внести изменения в код, чтобы обеспечить корректное поведение (например, в запросе вместо наименования товара выбрать ссылку, и в коде через точку уже обращаться к свойствам ссылки, а не текстового наименования). А можно добавить проверку на нужный тип значения. Т.е. – если значение того типа, который мы ожидаем – выполняем код. Иначе – не выполняем.

Ошибка при вызове метода контекста

Ошибка при вызове метода контекста

Обнаружены ошибки в 1С Синтаксическая ошибка

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

Если эти условия не соблюдать, платформа в зависимости от версии может выдавать сообщения вида “Ошибка при вызове метода контекста”, и далее будут следовать более подробные сведения об ошибке – стек вызовов, приведших к ошибке, номер строки и позиции в строке, где произошла ошибка.

Чаще всего ошибка при вызове метода контекста встречается в следующих методах:

  1. Записать
  2. Прочитать
  3. Выполнить
  4. Создать
  5. ПроверитьВывод

Разберем эту ошибку на примере метода Выполнить объекта Запрос:

Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 1 ГДЕ ИСТИНА И");
Запрос.Выполнить();

В тексте запроса допущена ошибка –  после первого условия “ГДЕ ИСТИНА” указан оператор И, но после него нет еще одного условия. В результате при попытке выполнения запроса, платформа вернет ошибку.

Для исправления ошибки зачастую достаточно внимательно использовать методы, при необходимости уточнять порядок, количество и тип параметров – это можно сделать в справке или синтакс-помощнике (встать курсором на имя метода в коде, и нажать сочетание клавиш Ctrl+F1). В случае запроса – нужно передавать синтаксически корректный текст запроса; в случае проверки вывода на печать – в системе должен быть установлен принтер; в случае подключения к почте – должны быть корректно указаны логин и пароль, и т.п.

Тип не может быть выбран в запросе в 1С 8.3 (8.2)

Ошибка Тип не может быть выбран в запросе

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

Так, если ресурс регистра сведений имеет тип ХранилищеЗначений, выбрать его запросом будет нельзя. Также, если в таблицу значений поместить значения не подходящих типов, а после передать эту таблицу в качестве параметра-источника данных, выполнение запроса также приведет к ошибке “Тип не может быть выбран в запросе”.

Еще одна ситуация, когда запрос будет выдавать ошибку – если таблица значений, которая передается в качестве параметра, имеет не типизированные колонки.

Неверно:

//ТЗОшибочныйТип.Колонки.Добавить("Контрагент");

Верно:

//ТЗОшибочныйТип.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));

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

Использование в 1С модальных окон в данном режиме запрещено

Ошибка Использование в 1С модальных окон в данном режиме запрещено​

Платформа будет выдавать такое сообщение, если в коде используются методы, приводящие к открытию модальных окон. Модальные окна – это окна, которые при открытии блокируют весь остальной интерфейс. В 1С есть несколько модальных методов – например – “Вопрос”, “ОткрытьЗначение”, “Предупреждение”. Кроме того, в коде может использоваться модальный синтаксис открытия форм: “ОткрытьМодально()”

Если в свойствах конфигурации выбран режим использования модальности “Не использовать”, то выполнение модальных методов будет приводить к этой ошибке “Использование в 1С модальных окон в данном режиме запрещено”.

Для устранения ошибки можно пойти несколькими путями. Как водится, один – быстрый, другой – правильный 🙂

Быстрый способ – переключить режим использования модальности в положение “Использовать”.

Более правильный способ – использовать в коде немодальные вызовы методов. Например, у метода “Вопрос” есть немодальный аналог  – “ПоказатьВопрос”, у метода “Предупреждение” – “ПоказатьПредупреждение”, и т.п. Чаще всего об этих методах дополнительно указано в синтакс-помощнике и справке.

Кроме того, в последних версиях платформы появились асинхронные методы – “ВопросАсинх”, “ПредупреждениеАсинх” и др. Появление этих методов позволяет писать более простой и понятный асинхронный код, и направлено в первую очередь, на более полноценную поддержку браузерами и работу в веб-клиенте.

1С 8.3 и 8.2: Запись с такими ключевыми полями существует!

Данная ошибка появляется при некорректной записи в регистр сведений. Чаще всего с этой ошибкой сталкиваются начинающие разработчики, не до конца понимающие механизмы работы с ключевыми полями (измерениями).

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

Однако если поместить две абсолютно одинаковые записи в набор записей, и попытаться его записать – платформа выдаст ошибку. Еще один распространенный случай, когда 1С сообщает “Запись с такими ключевыми полями существует” – это запись в периодический регистр сведений с периодичностью от “День” и выше, подчиненный регистратору.

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

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

Поле объекта недоступно для записи в 1С

Ошибка Поле объекта недоступно для записи в 1С​

Чаще всего начинающие программисты 1С сталкиваются с этой ошибкой в двух ситуациях.

Первый случай – это попытка редактирования системных полей, недоступных для записи. Например, в модуле формы сама форма будет содержаться в объекте ЭтаФорма. И попытка присвоить этому реквизиту любое значение приведет к ошибке “Поле объекта недоступно для записи”.

Второй случай – и с ним новички как раз допускают больше всего ошибок – это попытка редактирования полей ссылки, а не самого объекта. Чаще всего код выглядит примерно так:

Элемент = Справочники.Сотрудники.НайтиПоКоду("12345");
Элемент.Наименование = "Новое наименование";

 

Исполнение данного кода приведет к ошибке, т.к. поля ссылки доступны только для чтения, а метод НайтиПоКоду вернет именно ссылку. Чтобы можно было внести изменения, следует из ссылки получить сам объект – используя соответствующий метод ПолучитьОбъект().

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

Ссылка на обработку

По ссылке вы можете скачать внешнюю обработку, в которой воспроизводится большая часть ошибок, описанных в статье. Для воспроизведения части ошибок нужно будет убрать комментарии в коде.

Заключение

Как видите, зачастую ошибки тривиальны, и достаточно просто исправляются. Общие рекомендации – внимательно читать документацию и справку, корректно использовать методы, активно пользоваться отладчиком. Если вы новичок, и хотите освоить программирование в 1С с нуля – могу предложить приобрести мой базовый курс для начинающих. Более подробная информация – по ссылке.

Понравилась статья? Поделить с друзьями:
  • Обледенение печной трубы ошибка при установке дымника
  • Областной учительский форум закончился ошибка
  • Облако трассир ошибка подключения к облаку
  • Облако работает с ошибкой трассир
  • Облако ошибка взаимодействия с сервером на айфоне