В статье будут рассмотрены основные причины отказа от модальности в платформе «1С:Предприятие» и основные методы преобразования участков кода на новую асинхронную модель.
Применимость
В статье рассматриваются асинхронная модель построения бизнес-логики, добавленная платформу «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.
Отказ от использования модальных окон в платформе 1С:Предприятие 8.3
- При разработке конфигурации на платформе 1С:Предприятие 8 периодически возникает потребность приостановить работу программы до того момента, когда пользователь примет какое-либо решение или выполнит какие-либо действия.
- Например, при нажатии на кнопку заполнения табличной части у пользователя следует спросить, нужно ли очистить табличную часть, чтобы не произошло потери ранее введенных данных.
- Такое поведение может обеспечить, например, следующий код:
&НаКлиентеПроцедура
ЗаполнитьТовары
(Команда
)
Ответ
=
Вопрос
(“Табличная
часть
будет
очищена.
Продолжить?”
,
РежимДиалогаВопрос.ДаНет
);
Если
Ответ
=
КодВозвратаДиалога.Да
Тогда
//алгоритм заполненияКонецЕсли
;
КонецПроцедуры
- В результате работы этого фрагмента кода произойдет приостановка выполнения программного кода, на экране отображается вопрос, интерфейс приложения кроме диалога с вопросом становится недоступным, система ожидает принятия решения пользователем, выполнение кода продолжится только после ответа на вопрос.
- Также к приостановке выполнения кода и блокировке интерфейса приводит открытие модальных окон при помощи вызова метода ОткрытьМодально().
- При работе с конфигурацией в режиме веб-клиента через браузер в этом случае будет открыто новое окно – всплывающее окно, которое заблокирует не только текущую вкладку, но и весь интерфейс браузера, включая остальные открытые окна и вкладки.
- Всплывающие окна в Интернете зачастую используются для злоумышленного распространения нежелательной рекламы, поэтому браузеры содержат функции блокировки всплывающих окон.
- В таком случае для работы с конфигурациями 1С:Предприятие 8 через браузер необходимо запретить блокирование всплывающих окон.
Проблемы также возникают при работе на мобильных устройствах. Так, например, модальные окна не поддерживаются на iPad.
Для решения указанных проблем следует использовать блокирующие окна вместо модальных. Для пользователя визуально все выглядит так же: окно блокирует интерфейс веб-клиента.
Однако блокирующее окно как бы “рисуется” поверх главного окна, и блокируется только текущая вкладка браузера, в которой открыта конфигурация, позволяя переключаться на другие вкладки, поскольку модальные окна браузера при этом не используются.
Таким образом, всплывающие окна в браузере не открываются и обеспечивается работа через веб-клиент на мобильных устройствах.
У корневого элемента конфигурации существует свойство “Режим использования модальности”, которое определяет, можно ли в конфигурации открывать модальные окна.
Если выбран вариант “Использовать”, то модальные окна можно открывать. Если выбран вариант “Не использовать”, то модальные окна недопустимы. При попытке вызвать метод, открывающий модальное окно, система выводит сообщение об ошибке:
- При таком значении свойства “Режим использования модальности” допустимы только блокирующие окна.
- Если выбран вариант “Использовать с предупреждениями”, то при открытии модальных окон в окно сообщений выводится текст:
- Такой вариант работы может использоваться как промежуточный при переработке конфигурации с целью отказа от использования модальных окон.
- Основное отличие блокирующих окон от модальных заключается в том, что открытие блокирующего окна не производит приостановки выполнения кода.
- Поэтому разработчикам придется переписать программный код, использующий модальные окна, с учетом этой особенности.
- Код нужно разделить на две части:
- открытие блокирующего окна;
- обработка выбора пользователя.
- Фрагмент кода, приведенный в начале статьи, нужно переписать следующим образом:
- &НаКлиентеПроцедура
ЗаполнитьТовары
(Команда
)
Оповещение
=
Новый
ОписаниеОповещения
(,
ЭтотОбъект
); - РежимДиалогаВопрос.ДаНет
); - Процедура
(Результат
,
ДополнительныеПараметры
)
Экспорт
КонецПроцедуры
&НаКлиентеЕсли
Результат
=
КодВозвратаДиалога.Да
Тогда
//алгоритм заполненияКонецЕсли
;
КонецПроцедуры
После выполнения процедуры ПоказатьВопрос() система не останавливается, ожидая ответ пользователя, исполнение кода продолжается.
Пользователь сможет сделать выбор только после завершения работы всей процедуры. При этом будет вызвана экспортная процедура ЗаполнитьТоварыВопросЗавершение(). Ее название мы передали в конструктор объекта ОписаниеОповещения.
Процедура, которая будет вызвана после осуществления выбора, может быть расположена в модуле формы, модуле команды, общем не глобальном модуле.
В рассмотренном примере вызываемая процедура расположена в модуле управляемой формы, поэтому мы передали в параметр ЭтотОбъект.
Рассмотрим вызов процедуры, расположенной в общем модуле. Для этого добавим новый общий модуль ОбработкаОповещений, установим для него флаг “Клиент (управляемое приложение)”, а признак “Глобальный” не устанавливаем. Расположим в этом модуле процедуру ЗаполнитьТоварыВопросЗавершение().
Тогда обработчик команды заполнения будет выглядеть так:
&НаКлиентеПроцедура
ЗаполнитьТовары
(Команда
)
Оповещение
=
Новый
ОписаниеОповещения
(“ЗаполнитьТоварыВопросЗавершение”
,ОбработкаОповещений
);
ТекстВопроса
=
“Табличная
часть
будет
очищена.
Продолжить?”
;
- ПоказатьВопрос
(Оповещение
,
ТекстВопроса
,
РежимДиалогаВопрос.ДаНет
); - После вызова любого метода, открывающего блокирующее окно, процедура должна завершаться, а выполняемый далее код следует располагать в процедуре, которая будет вызвана после закрытия окна.
- Для передачи контекста (вспомогательных данных, неких параметров, значений переменных) из процедуры, открывающей модальное окно, в процедуру, вызывающуюся при его закрытии, предусмотрен третий необязательный параметр конструктора объекта ОписаниеОповещения – ДополнительныеПараметры.
- Этот объект (любого типа) будет передан в процедуру, описанную в ОписаниеОповещения, последним параметром.
- На примере рассмотренного выше участка кода это можно сделать так:
- &НаКлиентеПроцедура
ЗаполнитьТовары
(Команда
)
Параметр1
=
;
Параметр2
=
; - СписокПараметров
=
Новый
Структура
(“Параметр1
,
Параметр2″
,
Параметр1
,
Параметр2
);
КонецПроцедуры
Оповещение
=
Новый
ОписаниеОповещения
(“ЗаполнитьТоварыВопросЗавершение”
,
ЭтотОбъект
,СписокПараметров
);
ПоказатьВопрос
(Оповещение
,
“Табличная
часть
будет
очищена.
Продолжить?”
,
РежимДиалогаВопрос.ДаНет
);
КонецПроцедуры
&НаКлиенте
Процедура
ЗаполнитьТоварыВопросЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт
Если
Результат
=
КодВозвратаДиалога.
Да
Тогда
//анализируем ДополнительныеПараметры.Параметр1 //анализируем ДополнительныеПараметры.
Параметр2КонецЕсли
;
КонецПроцедуры
- Если нужно передать только одно значение, то структуру можно не использовать, а присвоить это значение параметру ДополнительныеПараметры конструктора объекта ОписаниеОповещения.
- Рассмотрим несколько примеров работы с блокирующими окнами.
Задача 1. Открытие другой формы
Из формы документа по нажатию на кнопку “Открыть параметры” нужно открыть форму, на которой расположены два флажка Параметр1 и Параметр2, которые должен установить пользователь. После закрытия формы вывести в строку сообщений значения параметров.
Создаем общую форму “ФормаПараметров”, на которой размещаем реквизиты Параметр1 и Параметр2, а также команду ЗакрытьФорму:
- Обработчик команды выглядит следующим образом:
- Обработчик
команды
выглядит
следующим
образом:
&НаКлиентеПроцедура
ЗакрытьФорму
(Команда
) - СписокПараметров
=
Новый
Структура
(“Параметр1, Параметр2”
,
Параметр1
,
Параметр2
);
Закрыть
(СписокПараметров
);
КонецПроцедуры
Для формы свойство РежимОткрытияОкна устанавливаем в “Блокировать весь интерфейс”:
- На форме документа располагаем команду ОткрытьПараметры, обработчик которой описываем следующим образом:
- &НаКлиентеПроцедура
ОткрытьПараметры
(Команда
)
Оповещение
=
Новый
ОписаниеОповещения
(“ОткрытьПараметрыЗавершение”
,
ЭтотОбъект
);
ОткрытьФорму
(“ОбщаяФорма.ФормаПараметров”
,
,
,
,
,
,
Оповещение
);
КонецПроцедуры
&НаКлиенте - Процедура
ОткрытьПараметрыЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт - Сообщение
=
Новый
СообщениеПользователю
;
Если
ТипЗнч
(Результат
)
=
Тип
(“Структура”
)
Тогда
Для
каждого
КлючЗначение
Из
Результат
Цикл
Сообщение.Текст
=
“Ключ:
“”
” + КлючЗначение.Ключ + “””
,
значение
=
”
+
КлючЗначение.Значение
;
Сообщение.Сообщить
();
КонецЦикла
;
КонецЕсли
;
- КонецПроцедуры
- В пользовательском режиме, запуская конфигурацию под веб-клиентом, получаем такие результаты работы:
Для увеличения нажмите на изображение.
Режим открытия окна можно также указывать в последнем параметре процедуры ОткрытьФорму.
&НаКлиентеПроцедура
ОткрытьПараметры
(Команда
)
Оповещение
=
Новый
ОписаниеОповещения
(“ОткрытьПараметрыЗавершение”
,
ЭтотОбъект
);
ОткрытьФорму
(“ОбщаяФорма.ФормаПараметров”
,
,
,
,
,
,
Оповещение
,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
);
КонецПроцедуры
Задача 2. Вопрос при закрытии формы
- При закрытии окна обработки задавать пользователю вопрос, действительно ли он хочет закрыть окно.
- Эту задачу можно решить при помощи следующего кода, расположенного в модуле формы обработки:
- &НаКлиентеПерем
НужноЗакрыватьФорму
;
&НаКлиенте - Процедура
ПередЗакрытием
(Отказ
,
СтандартнаяОбработка
)
Если
НЕ
НужноЗакрыватьФорму
=
Истина
Тогда
Отказ
=
Истина
;
Оповещение
=
Новый
ОписаниеОповещения
(“ПередЗакрытиемЗавершение”
,
ЭтотОбъект
);
ПоказатьВопрос
(Оповещение
,
“Вы
действительно
хотите
закрыть
окно?”
,
РежимДиалогаВопрос.ДаНет
);
КонецЕсли
;
КонецПроцедуры
&НаКлиенте
Процедура
ПередЗакрытиемЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт
Если
Результат
=
КодВозвратаДиалога.
Да
Тогда
НужноЗакрыватьФорму
=
Истина
;
Закрыть
();
Иначе
- НужноЗакрыватьФорму
=
Неопределено
; - КонецПроцедуры
- В процедуре ПередЗакрытием формы пользователю задается вопрос, флаг Отказ выставляется в Истина, закрытие формы отменяется.
- После утвердительного ответа на вопрос переменная НужноЗакрыватьФорму устанавливается в Истина, форма закрывается повторно.
КонецЕсли
;
Задача 3. Ввод числового значения
- При нажатии на кнопку на форме обработки открывать стандартный диалог ввода числа.
- Для этого необходимо воспользоваться методом ПоказатьВводЧисла() вместо ВвестиЧисло(), который открывает блокирующее окно вместо модального.
- &НаКлиентеПроцедура
ВводЧисла
(Команда
) - Оповещение
=
Новый
ОписаниеОповещения
(“ВводЧислаЗавершение”
,
ЭтотОбъект
);
ПоказатьВводЧисла
(Оповещение
,
,
“Введите
количество”
,
15
,
3
);
КонецПроцедуры
&НаКлиенте
- Процедура
ВводЧислаЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт - Сообщение
=
Новый
СообщениеПользователю
; - Сообщение.Сообщить
(); - КонецПроцедуры
- После закрытия окна ввода числа будет вызвана процедура, в первый параметр которой будет передано введенное число или значение Неопределено, если пользователь отказался от ввода.
Сообщение.Текст
=
“Вы
ввели
количество
”
+
Результат
;
КонецЕсли
;
Задача 4. Выбор цвета
При нажатии на кнопку на форме обработки при помощи стандартного диалога выбора цвета пользователь указывает необходимый цвет. Этот цвет установить для фона нажимаемой кнопки.
- Добавим на форму команду ВыборЦвета со следующим обработчиком:
- &НаКлиентеПроцедура
ВыборЦвета
(Команда
) - ДиалогВыбораЦвета
=
Новый
ДиалогВыбораЦвета
;
Оповещение
=
Новый
ОписаниеОповещения
(“ВыборЦветаЗавершение”
,
ЭтотОбъект
);
ДиалогВыбораЦвета.
Пока
зать
(Оповещение
);
КонецПроцедуры
&НаКлиенте
Процедура
ВыборЦветаЗавершение
(Результат
,
ДополнительныеПараметры
)
Экспорт
Если
НЕ
Результат
=
Неопределено
Тогда
Элементы.ВыборЦвета.ЦветФона
=
Результат
;
КонецЕсли
;
КонецПроцедуры
Для объектов ДиалогВыбораЦвета (а также ДиалогРедактированияСтандартногоПериода, КонструкторФорматнойСтроки, ДиалогРасписанияРегламентногоЗадания, ДиалогВыбораШрифта) метод Показать() открывает блокирующее окно.
После закрытия окна будет вызвана процедура, в первый параметр которой будет передано выбранное значение (цвет, шрифт и т.д.) или значение Неопределено, если пользователь отказался от выбора.
- Следует обратить внимание, что объект ДиалогВыбораФайла не имеет метода Показать() в отличие от диалогов выбора цвета или шрифта, поскольку реализация этих диалогов существенно разная.
- Для использования диалога выбора файла на веб-клиенте необходимо предварительно подключить расширение работы с файлами.
- Диалоги, реализуемые через расширение работы с файлами, не создают таких проблем в работе, как модальные окна браузеров, поэтому не было реализовано открытие блокирующих окон для объекта ДиалогВыбораФайла.
В заключение отметим, что начиная с релиза 8.3.10 в веб-клиенте прекращена поддержка модальных окон. В этом случае, если в конфигурации происходит вызов модального метода, то происходит генерация исключения.
Также в в веб-клиенте прекращена поддержка режима интерфейса В отдельных окнах
. Кроме того, и в тонком, и в веб-клиенте теперь нельзя открывать форму в отдельном окне (при работе в режиме интерфейса В Закладках).
Такие кардинальные шаги позволили отказаться от режима интерфейса, который уже не поддерживается всеми современными браузерами.
Какой практический вывод можно сделать из этой информации? А вывод довольно простой – если по какой-то причине в вашей конфигурации до сих пор существуют модальные вызовы, то в этих местах в в веб-клиенте будет выдаваться окно с сообщением об ошибке.
Хочется предостеречь от попыток “нагуглить” какое-то быстрое решение данной проблемы, т.к. основная масса советов сводится к такому рецепту: в конфигураторе на уровне конфигурации в свойстве «Режим использования модальности» поставить значение «Использовать».
Естественно, в данный момент, это работать не будет только из-за того, что сами современные браузеры уже не поддерживают модальные вызовы.
И у вас есть всего два пути, каким образом решить описанную выше проблему:
- Обновить платформу до релиза 8.3.10+ (8.3.11), установить свойство конфигурации «Режим совместимости» в «Не использовать» и переписать фрагменты кода, использующие модальные методы на асинхронную модель построения бизнес-логики
- Рекомендовать вашим клиентам пользоваться устаревшими браузерами, где модальные вызовы еще поддерживались (Mozilla Firefox версии 37 и ниже, Chrоme ниже 37 версии и т.д.).
Кстати, начиная с релиза 8.3.11, больше не поддерживаются веб-браузеры Microsoft Internet Explorer версий 8 и 9.
С веб-браузерами в свете модальности мы разобрались, теперь настала пора прояснить ситуацию и с остальными клиентами.
Начиная с версии 8.3.5 свойство «Режим использования модальности» в тонком и толстом клиентах учитывается, только если указан параметр командной строки /EnableCheckModal. Этот параметр автоматически подставляется в командную строку только при запуске приложения из конфигуратора.
Если же этот параметр не указан, то генерация исключений не происходит и соответствующие предупреждения не показываются. Т.е.
на практике в случае использования толстого и тонкого клиента никакого кардинального изменения в работе при использовании режима модальности не наблюдается – модальные вызовы будут работать так же, как и работали ранее, при этом не выдавая никаких предупреждений, как в веб-клиенте.
Источник: https://vkontaktebot.ru/sovety/asinhronnye-metody-1s-pochemu-voznikaet-oshibka-ispolzovanie.html
Онлайн-школа программирования в 1С
- Если в процессе выполнения уроков у вас появилась такая ошибка — исправить её очень легко.
- Вернитесь в конфигуратор и выберите пункт меню «Конфигурация» -> «Открыть конфигурацию»:
- В открывшемся окне нажмите правой кнопкой на пункте «Конфигурация» и выберите из раскрывшегося меню пункт «Свойства»:
- Откроется окно со свойствами конфигурации (справа):
- Пролистайте его в самый низ и найдите там пункт «Режим использования модальности»:
- Установите его значение в «Использовать»:
Внимание! Обратите внимание, что если вы используете платформу 1С, отличную от той, что мы скачивали в первом уроке (более поздней версии), то у вас также будет присутствовать поле «Режим использования синхронных вызовов…». Его также нужно установить в «Использовать».
Наконец, выберите пункт меню «Конфигурация» -> «Сохранить конфигурацию»:
Готово! Теперь ошибки больше не возникнет.
Пояснения ниже — для тех кому интересно, что мы сделали.
Мы включили режим использования модальности в нашей конфигурации. По умолчанию этот режим выключен и это не позволяет нам использовать такие команды как ВвестиЧисло, ВвестиСтроку, ВвестиДату, ОткрытьЗначение.
Дело в том, что эти команды относятся к модальным. Их вызов приводит к тому, что перед пользователем появляется окно (например, для ввода информации), которое блокирует возможность работы с программой, пока окно не закроется.
- А так как наличие таких окон крайне нежелательно при работе с 1С через веб-браузер, то при разработке новых конфигураций режим модальности по умолчанию выключен.
- Мы же можем смело включать его, так как пишем учебные примеры, не рассчитанные на работу в интернете.
- С уважением, Владимир Милькин
Источник: https://helpme1c.ru/oshibka-ispolzovanie-sinxronnyx-metodov-na-kliente-zapreshheno
1с сделать серверный вызов при завершении работы
При написании программ нередко возникает необходимость выполнить какие-либо действия при запуске или завершении работы программы. С «обычными» программами в этом случае всё просто. Необходимо обработать соответствующие события или поместить необходимый код перед загрузкой главного окна или отображением консольного «интерфейса».
Но, что делать в случае с 1С? Если в 1С Предприятие подобный функционал?
В 1С есть возможность выполнения кода при запуске и остановке приложения. Она реализована в виде специальных событий обработка которых доступна в модуле управляемого приложения.
- ПередНачаломРаботыСистемы
1С Предприятие запускается, но рабочее окно конфигурации, ещё не появилось на экране; - ПриНачалеРаботыСистемыПриложение уже запущено;
- ПередЗавершениемРаботыСистемыСобытие возникает перед началом процесса завершения работы приложения. Рабочее окно ещё отображается на экране;
- ПриЗавершенииРаботыСистемыРабочее окно уже закрылось и выполняются заключительные действия перед полным завершением работы.
- Если в режиме конфигуратора щёлкнуть правой кнопкой мыши на корне конфигурации и выбрать в открывшемся меню пункт «Открыть модуль управляемого приложения», откроется стандартное окно для редактирования кода, в котором содержится код вышеназванного модуля.
- Для обработки требуемых событий в модуле управляемого приложения нужно описать соответствующие процедуры, как это показано в примере ниже:
- 1С (Код)
- Процедура ПередНачаломРаботыСистемы(Отказ) // Делаем что-то
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы() // Делаем что-то
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ) // Делаем что-то
КонецПроцедуры
Процедура ПриЗавершенииРаботыСистемы() // Делаем что-то
КонецПроцедуры - Обратите внимание!
- Имена процедур должны строго соответствовать названиям тех событий, которые они обрабатывают.
Процедура ПередЗавершениемРаботыСистемы принимает единственный параметр – «Отказ» (булево, значение по умолчанию «ложь»). Этот параметр определяет отмену завершения работы конфигурации. То есть, если перед завершением работы выполняются некоторые проверки и их результаты неудовлетворительны, можно отменить завершение работы просто присвоив параметру «Отказ» значение «истина».
Параметр «Отказ» в процедуре ПередНачаломРаботыСистемы, имеет аналогичное назначение. Если ему присвоить значение «истина», приложение просто не запустится.
Таким образом можно не только выполнять нужные действия, но и управлять самим процессом запуска и завершения работы.
Ограничения
- Весь код размещённый в модуле управляемого приложения работает только на стороне клиента. Поэтому, если при обработке вышеперечисленных событий необходимо обратиться к серверу, то для этих целей следует создать отдельный общий модуль и установить в его настройках работу на стороне сервера и доступность для вызова сервера на стороне клиента (то есть в свойствах установить флажки «Сервер» и «Вызов сервера»).
- Также не рекомендуется при запуске и завершении приложения выполнять громоздкие операции. И дело здесь не только в увеличении времени обработки событий вследствие больших объёмов данных или сложности алгоритмов. Модуль управляемого приложения компилируется при запуске программы. Поэтому, чем больше он загружен функционалом, тем дольше приложение будет запускаться.
Подобные операции лучше выполнять по запросу во время работы или в регламентных заданиях.
Для успешного выполнения резервного копирования в информационной базе не должно быть активных сеансов пользователей. Чтобы автоматически завершить работу пользователей перед выполнением бэкапа в программе предусмотрен соответствующий механизм.
Для настройки завершения работы пользователей 1С:Предприятия перейдите на закладку «
.
Важно: в бесплатной редакции программы не реализован данный функционал. В момент запуска резервного копирования пользователям необходимо покинуть базу 1С:Предприятия, иначе выгрузка базы не произойдет.
Установите флаг . Из выпадающего меню выберете один из вариантов: «Завершить сеансы на сервере 1С:Предприятия»
или .
В случае выбора «
Завершить сеансы на сервере 1С:Предприятие»
— отключение пользователей происходит путем принудительного завершения сеансов на сервере 1С:Предприятия. Этот вариант подходит только для клиент-серверных баз 1С:Предприятия.
Если Вы изменяли стандартные настройки сервера 1С, возможно потребуется изменить параметры, которые идут ниже.
Установите флаг , если в кластере 1С:Предприятия создан пользователь «Администратор кластера». Заполните поля: «Имя администратора кластера:»
и «Пароль администратора кластера:»
.
Важно:
не путайте данного пользователя с пользователем базы 1С:Предприятия и пользователем «
Администратор центрального сервера»
.
В консоли сервера 1С:Предприятия администраторы кластера расположены по следующему пути: «Console Root»
— «1C:Enterprise 8.3 Central Servers»
— «(*)имя компьютера» — «Кластеры»
— «Локальный кластер»
— «Администраторы»
Установите флаг «Используется не стандартный порт агента сервера»
, если порт подключения к Агенту сервера отличный от стандартного.
Заполните поле «Порт агента сервера»
. Порт подключения к агенту сервера 1С:Предприятия по умолчанию — 1540.
Для определения порта агента сервера зайдите в Сервер 1С и при клике правой кнопкой мыши на имя компьютера из выпадающего меню выберете «Свойства»
— — «IP порт»
.
В случае выбора
— отключение пользователей происходит путем вызова встроенного в типовые конфигурации механизма завершения работы пользователей. Данный механизм основан на использовании процедуры «Блокировка установки соединений с информационной базой».
Алгоритм выполнения следующий:
- Запуск завершения работы пользователей;
- Запуск выполнения задачи (архивирование, тестирование и исправление и т.д.);
- Запуск разрешения работы пользователей.
Возможно Вас заинтересует:
Вопрос: Серверные методы при завершении работы запрещены
Есть типовая БП 3.0.44.94. Запускается внешняя обработка по меню «ФайлОткрыть». При завершении работы БП, если не закрыть ее, выдается «Серверные методы…запрещены», что, как минимум некомфортно)))) Или это чем-то чревато и для базы данных? Изменения могу внести в обработку, но какие?
Ответ:
nomad_irk сказал(а):
Так косяк из-за обработки, по вашим словам…….
Нажмите, чтобы раскрыть…
Вы правы. Обработка не адаптирована к новому релизуметодам. Исправлять надо ее, согласен. Обработка закрывается успешно, а программа с предупреждением. Ссылку, посмотрю попозже, спасибо.
Проблема снимается, если просто вспомнить перед закрытием БП об открытой обработке (вопрос привычки)), но это не всегда получается,особенно если открыто множество вкладококон… Я предполагал найти простое решение, или оценку риска….
Обработка в базу ничего не записывает, это только ярлыки на внешние обработки на жестком диске. Но для опыта, можно, конечно, и раскрутитьисправить сабж….))))
- Вопрос: Серверный вызов при завершении работы 1с.
- мой модуль1- клиент(управляемое)
- мой модуль 2 ХХХ_НВХ (сервер, вызов сервера)
добрего.
модуль управляемого приложения
ххх_нвх — серверный модуль.
нужно его вызвать при завершении работы управляемого приложения.
как обойти ограничение 1с на невозможность серверных вызовов при и перед завершением работы системы?
Режим совместимости не используется.
версия платформы 8.3.8 и выше
Ответ:
Сообщение от fsdfsgwergwrwh
Ребят все привет!
Это нововведение с какого года?
- Просто где-то в видосе видел, что у человека получалось сделать серверный вызовы при завершении работы.
- Не по теме:
- всегда и работало, просто у ТС руки не из того места растут
- Вопрос: не загружается 1с 8.3 после некорректного завершения работы
- Вопрос: Вариант запуска «Вызов серверного метода»
Добрый день! После некорректного завершения работы 1с предприятие 8.3 не загружается. После нажатия кнопки «1с предприятие» в окне запуска вроде бы начинается загрузка программы, но появляется окно «Ожидание запуска» с сообщением: «Начало сеанса с информационной базой запрещено». Подскажите, пожалуйста, что делать в этом случае? Приветствую.
Возникла проблема при Вызов серверного метода внешней обработки. Нужно к УТ11(типовая) подключить внешнюю обработку, которая должна вызываться кнопкой из док. Реализация и после обработка выполняет свои процедуры. Вн. обработка формы не имеет, все процедуры исполняются внутри модуля. На итс нашел пример но не могу осуществить. Может кто сталкивался, помогите плиз.
То что есть на итс:
Для глобальных отчетов и глобальных обработок реализовать экспортную процедуру ВыполнитьКоманду с параметрами ИдентификаторКоманды и ПараметрыВыполненияКоманды, где ПараметрыВыполненияКоманды – структура со свойством ДополнительнаяОбработкаСсылка (ссылка на элемент справочника ДополнительныеОтчетыИОбработки, который связан с данной дополнительной обработкой):
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт // Реализация логики команды
Если ИдентификаторКоманды = … Тогда … ИначеЕсли …
КонецПроцедуры
Для назначаемых обработок типа «Создание связанных объектов» реализовать экспортную процедуру ВыполнитьКоманду с параметрами ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты и ПараметрыВыполненияКоманды:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполненияКоманды) Экспорт // Реализация логики команды по созданию связанных объектов
Если ИдентификаторКоманды = … Тогда … ИначеЕсли … КонецПроцедуры
- Ответ:
смотри выше по документации, про функцию СведенияОВнешнейОбработке - Вопрос: метод ПриАктивизацииСтроки
- Ответ:
- Сообщение от Александр321321
- Я просто не понял как мне это поможет
Здравствуйте. В данном методе есть такая особенность, что в нём нельзя использовать серверные методы формы с директивой компиляции &НаСервере. Тогда вопрос, вот к примеру нужно выводить на форму текст из реквизита подчинённого справочника, данные, естественно, берутся из сервера, но если я их буду брать в данном методе, то идёт зацикливание и в дальнейшем вылет из программы. Как решать это? Пробовал и запросом и напрямую, всё равно зацикливается и никак не получается получить нужный объект
Вы можете вывести состояние паспорта в отдельную колонку списка. Либо я изначально неправильно вас понял.
- Всегда есть некрасивый вариант превратить вашу серверную контекстную процедуру во внеконтекстную серверную функцию, которая на входе получает ссылку на основной справочник, а возвращает состояние паспорта.
- Вопрос: v7: +FormEx — крах при завершении работы
- Ответ:
Понял, спсб
Win7(x64) а также терминальный клиент / вирт в WinServ2008r2(x64).
на выходе из 1с вываливается окно «Прекращена работа программы…»: — Имя события проблемы: APPCRASH
— Имя приложения: 1
cv7.exe
— Версия приложения: 7
.70
.
.27 — Имя модуля с ошибкой: ntdll.dll в принципе бы оно и ничего — но если это во встроенной вирт.машине (или в терм.сессии) — 1с остается висеть, а пользователь спокойно уходит.. в результате приходится руками чистить (и монопольный запуск блокируется).
кто-нибудь сталкивался? если да — решил ли и если да — то как?
заранееблагодаренивсётакоэ.
Вопрос: В тонком клиенте КаталогВременныхФайлов() выдаёт ошибку. Это синхронный метод?
Самописная простенькая конфигурация на управляемых формах. База серверная. Пользователи подключаются под тонким клиентом.
Делаю обработку по загрузке данных из Ексель файла, который находится в инете.
Пытаюсь сохранить этот файл в каталог временных файлов на клиенте.
В процедуре &НаКлиенте пишу КаталогВременныхФайлов(). Дает ошибку «Использование синхронных методов на клиенте запрещено»
Под толстым клиентом работает, под тонким не работает.
Хотя в синтакс помошнике написано что метод доступен и в тонком клиенте тоже.
Что не так делаю?
Можно ли как-нибудь выяснить была ли программа закрыта аварийно?
К примеру, ИБ запущена файлово по сети вторым пользователем. Выключили главный компьютер, на котором расположена ИБ. Программа завершена аварийно. Можно ли это увидеть?
Ответ:
cfl заменятся при следующем запуске и удалятся, если след. завершение пройдет удачно.
Остается ЖР.
Но там программно не отследить. Смотрим только где есть начало сеанса и нет окончания…
- Вопрос: Ошибка при работе с регулярными выражениями
- Ошибка при работе с регулярными выражениями. Код ошибки — 10301 (U_REGEX_RULE_SYNTAX)*
- «В режиме 1С:Предприятия при выполнении любого опасного действия происходит ошибка
- Ошибка при работе с регулярными выражениями. Код ошибки -10301 (U_REGEX_RULE_SYNTAX)
Добрый день.
После перевода БП на платформу 8.3.10.2580 стала появляться ошибка при открытии внешней обработки. Обработка простая — 6 полей ввода, 4 кнопки, никаких дендрограмм и прочих излишеств.
и аварийное завершение работы, если в файле conf.cfg указано некорректное значение, например *, параметра DisableUnsafeActionProtection.»
Источник: http://maylohack.ru/smarttv/1s-sdelat-servernyi-vyzov-pri-zavershenii-raboty.html
Почему возникает ошибка "Использование синхронных методов на клиенте запрещено"? Использование синхронных методов на клиенте запрещено 1с
«Использование модальных окон в данном режиме запрещено» — такая ошибка сейчас начинает беспокоить пользователей и программистов 1С с приходом нового интерфейса платформы 1С 8.3 — « «.
Разработчики технологической платформы 1С идут в ногу со временем, стандартизируя своё решение под мировые стандарты разработки программного обеспечения. Все стандарты так или иначе сводятся к единому интерфейсу, близкому к веб-страницам.
Модальные и всплывающие (pop-up) окна считаются плохим тоном и уже давно перестали быть нормальным при разработке софта. Пользователи привыкли к работе «в одном окне».
Особенно часто мы видим ошибку модальности у следующих методов 1С:
- Вопрос;
- Предупреждение;
- ОткрытьЗначение.
Разработчики платформы 1С 8 с выходом нового интерфейса «такси» приняли верное решение — попытаться переучить разработчиков прикладных решений на новый лад. Они включили в новую платформу возможность — «режим использования модальности».
Быстрое исправление проблемы
Если нет времени разбираться и нужно быстро решить задачу, предлагаем простое, но не совсем правильное решение. Для быстрого исправления ошибки достаточно сменить режим модальности в свойствах конфигурации.
Для этого зайдите в систему в режиме , откройте конфигурацию:
В открытой конфигурации вызовите контекстное меню, нажав на корень конфигурации правой кнопкой, выбрав «Свойства»:
Получите 267 видеоуроков по 1С бесплатно:
Откроются свойства конфигурации, где в подвале есть интересующее нас свойство — «Режим использования модальности», выберите режим «Использовать»:
После этого сохраните и примените изменения, нажав клавишу «F7».
Правильное решение задачи
- Правильный способ решения этой проблемы — доработать конфигурацию или внешнюю обработку под новые требования.
- Предупреждение, вопрос, диалоговые окна и другие модальные окна — всё это необходимо переписывать на новый лад.
- Встроенные операторы, которые вызывали модальные окна, необходимо заменить на дублирующие функции.
- Например:
- Предупреждение — ПоказатьПредупреждение;
- Вопрос — ПоказатьВопрос (подробно — );
- — ПоказатьВводЧисла.
- При этом появился специализированный объект — ОписаниеОпевещения.
- Пример замены:
- Строка = «»
; ВвестиСтроку(Строка, «Введите строковое значение»
) Сообщить(«Вы ввели » + Строка)
; - Необходимо заменить на:
- Строка = «»
; ОписаниеОповещения = Новый ОписаниеОповещения(«ТестовыйВводСтроки»
, ЭтаФорма)
; ПоказатьВводСтроки(ОписаниеОповещения, Строка, «Введите строковое значение»
)
; - При этом добавить подобную процедуру на клиенте, которая отработает, когда значение будет введено пользователем:
&НаКлиенте Процедура ТестовыйВводСтроки(ПолученноеЗначение, ПереданныеПараметры) Экспорт Сообщить(«Вы ввели » + Строка)
; КонецПроцедуры
Формы, которые разрабатываются внутри конфигурации, открываются точно так же. Достаточно заменить метод «ОткрытьФормуМодально» на «ОткрытьФорму», прописав описание оповещения и нужную для него новую процедуру.
Чтобы открывающейся формой закрыть доступ к вызываемой форме, достаточно в свойстве формы указать в свойстве «РежимОткрытияОкна» значение «Блокировать окно владельца»:
Печать (Ctrl+P)
Работа с файлами в асинхронном режиме присутствует только на стороне клиентского приложения.
В общем случае рекомендуется использовать синхронные методы для работы на стороне сервера и асинхронные – для работы на стороне клиентского приложения.
Рассмотрим пример работы с файлами в асинхронной технике: удаление всех файлов в каталоге временных файлов. Для синхронной техники такое действие будет выглядеть следующим образом:
- &НаКлиенте
Процедура Удалить(Команда)
УдалитьФайлы(КаталогВременныхФайлов(), ПолучитьМаскуВсеФайлыКлиента());
КонецПроцедуры - Асинхронная техника будет выглядеть по-другому:
- &НаКлиенте
Процедура Удалить(Команда)
ОбратныйВызов = Новый ОписаниеОповещения(“ПолучитьКаталогВременныхФайловЗавершение”, ЭтотОбъект, “УдалитьОшибка”, ЭтотОбъект);
НачатьПолучениеКаталогаВременныхФайлов(ОбратныйВызов);
КонецПроцедуры
&НаКлиенте - Процедура ПолучитьКаталогВременныхФайловЗавершение(ИмяКаталогаВременныхФайлов, ДополнительныеПараметры)
Экспорт
ОбратныйВызов = Новый ОписаниеОповещения(“УдалитьЗавершение”, ЭтотОбъект, “ФайловаяОшибка”, ЭтотОбъект);
НачатьУдалениеФайлов(ОбратныйВызов, ИмяКаталогаВременныхФайлов, ПолучитьМаскуВсеФайлыКлиента());
КонецПроцедуры
&НаКлиенте
Процедура УдалитьЗавершение(ДополнительныеПараметры) Экспорт
Сообщить(“Удаление успешно завершено”);
КонецПроцедуры
&НаКлиенте
Процедура ФайловаяОшибка (ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры)
Экспорт
Сообщить(“При выполнении файловой операции обнаружена ошибка: ” + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
КонецПроцедуры
Во-первых
, следует обратить внимание, что практически все файловые операции стали асинхронными.
Даже такие простые действия, как получение каталога временных файлов. И необходимость получения такого каталога приводит к первому асинхронному вызову. Затем происходит вызов собственно удаления всех файлов.
И обработка завершения удаления требует второй обработчик, в котором должны располагаться действия, которые должны происходить после удаления всех файлов в каталоге временных файлов. В данном примере это выдача сообщения о завершении операции.
Если при выполнении файловых операций произойдет ошибка – управление будет передано обработчику ФайловыеОшибка()
. В нем можно корректно обработать сложившуюся ситуацию.
Работа с файлами в веб-клиенте
Источник: https://bumotors.ru/pochemu-voznikaet-oshibka-ispolzovanie-sinhronnyh-metodov-na-kliente-zapreshcheno.html
Загрузка из Excel в 1С 8.3 или 8.2 для программиста
Нужно загрузить большой объем данных из Экселя в 1С? Настроить постоянную загрузку накладных и товаров? Обратитесь к нам! Оставьте заявку в форме выше или позвоните нам по телефону +7 499 350 29 00.
Несомненно, одним из самых распространенных способов массового занесения информации в информационную систему является загрузка информации в 1С 8.3 из Excel. Ниже я рассмотрю пошаговое создание обработки загрузки данных и дам ссылку на скачивание её.
Данная инструкция написана для программистов, для пользователей 1С скорее подойдут следующие статьи:
Самые популярные данные, которые требуются для загрузки в 1С из Excel:
- номенклатура и её штрих-коды, в том числе с картинками;
- накладные от поставщика;
- прайс-листы от контрагентов;
- начальные остатки по складам или бухгалтерскому учету.
MS Excel — программа для работы с электронными таблицами, созданная компанией Microsoft. Она предоставляет возможности экономико-статистических расчетов, графические инструменты и язык макропрограммирования VBA. Excel является одним из наиболее популярных приложений в мире.
Обработку мы будем делать универсальную, подобно той, что мы делали для загрузки файлов csv в 1С.
1. Создание обработки загрузки и её формы
Тут мы особо ничего не будем придумывать, сделаем поле ввода для выбора файла на диске, кнопку «Прочитать» для чтения файла и заполнения табличной части.
2 Обработчик выбора файла
Тут всё сделаем как в загрузке из CSV:
При нажатии на выбор файла необходимо отображать диалог выбора файла в ОС. Сделать это очень просто. Необходимо на обработчик “НачалоВыбора” в поле ввода файла указать следующий код:
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбора.Заголовок = “Выберите файл”; Если ДиалогВыбора.Выбрать() Тогда ИмяФайла = ДиалогВыбора.ПолноеИмяФайла; КонецЕсли;
3 Обработка данных из Excel и загрузка в 1С 8.3
Для начала мы очищаем информацию в таблице, находим файл на диске, подключаемся к Excel через COM-объект и проводим все технические настройки:
//очищаем таблицу и удаляем колонки Таблица.Очистить(); Таблица.Колонки.Очистить(); ЭлементыФормы.Таблица.Колонки.Очистить();
Получите 267 видеоуроков по 1С бесплатно:
//подключаемся к эксель Попытка Excel = Новый COMОбъект(«Excel.Application»); Excel.WorkBooks.Open(ИмяФайла); Состояние(«Обработка файла Microsoft Excel…»); Исключение Сообщить(«Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!»); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Попытка //Открываем необходимый лист Excel.Sheets(1).Select(); // лист 1, по умолчанию Исключение //Закрываем Excel Excel.ActiveWorkbook.Close(); Excel = 0; Сообщить(«Файл «+Строка(ИмяФайла)+» не соответствует необходимому формату! Первый лист не найден!»); ОтменитьТранзакцию(); Возврат; КонецПопытки; //Получим количество строк и колонок. //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel Версия = Лев(Excel.Version,Найти(Excel.Version,».»)-1); Если Версия = «8» тогда ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count; ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13); Иначе ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row; ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column; Конецесли;
После того как мы получили все данные из файла, мы считываем 1 строку файла и генерируем колонки на форме с наименованиями из файла:
//считываем первую строку и генерируем колонки Сч = 1; Пока ЗначениеЗаполнено(Excel.Cells(1, Сч).Text) Цикл ИмяКолонки = Excel.Cells(1, Сч).Text; ИмяБезПробелов = СтрЗаменить(ИмяКолонки,» «,»»); // убираем из имени колонок пробелы Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки); НоваяКолонка = ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов, ИмяКолонки); НоваяКолонка.Данные = ИмяБезПробелов; Сч = Сч + 1; КонецЦикла;
После формирования колонок считываем тело файла эксель и построчно заносим данные в табличное поле:
Для НС = 2 по ФайлСтрок Цикл // НС указываем с какой строки начинать обработку Состояние(«Файл «+Строка(ИмяФайла)+»: Обрабатывается первый лист «+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),»ЧЦ=3; ЧДЦ=0″))+» %»); ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break НоваяСтрока = Таблица.Добавить(); Для НомерКолонки = 1 по Таблица.Колонки.Количество() Цикл //заполняем строку значениями ТекущееЗначение = Excel.Cells(НС, НомерКолонки).Text; ИмяКолонки = Таблица.Колонки[НомерКолонки-1].Имя; НоваяСтрока[ИмяКолонки] = ТекущееЗначение; КонецЦикла; КонецЦикла;
- В результате мы получаем загруженные данные из excel c такими же колонками:
- Не забудьте закрыть Эксель в 1С после выполнения процедур с помощью кода:
Excel.DisplayAlerts = 0; Excel.Quit(); Excel.DisplayAlerts = 1;
Универсальную загрузку из excel в 1C можно бесплатно скачать тут.
Обратите внимание, эта обработка написана в режиме «обычного приложения 1С».
- Если у Вас всё же возникли проблемы с загрузкой, Вы можете обратиться за помощью к опытному программисту 1C.
- Видеоурок по загрузке товаров в 1С из файлов Excel:
- Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Источник: https://programmist1s.ru/zagruzka-iz-excel-v-1s/