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

   Pro-tone

28.07.11 — 09:30

Пытаюсь мутировать на 8.2.14. Решил сделать задачу по УТ на упр. формах.

Ставлю отбор на форме при открытии.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

   //Вставить содержимое обработчика

  ВыбНоменклатураСсылка = Серверный.ПолучитьВсеДокументы(«РасходнаяНакладная»);

  Список.Параметры.УстановитьЗначениеПараметра(«ВыбНоменклатураСсылка»,ВыбНоменклатураСсылка);    

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

«Серверный» — общий модуль. Стоят галки «Сервер» и «Вызов сервера». При открытии заданной формы вываливает:

{Документ.РасходнаяНакладная.Форма.ФормаСписка.Форма(20)}: Ошибка при вызове метода контекста (ПолучитьВсеДокументы)

  ВыбНоменклатураСсылка = Серверный.ПолучитьВсеДокументы(«РасходнаяНакладная»);

по причине:

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

по причине:

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: ret    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

по причине:

Ошибка отображения типов:

Отсутствует отображение для типа ‘{http://v8.1c.ru/8.1/data/core}ValueTable’

Как лечить ?

   Stepa86

1 — 28.07.11 — 09:32

Перенеси этот код в ПриСозданииНаСервере(

Клиентские методы формы могут вызывать только методы этой формы

   Ненавижу 1С

2 — 28.07.11 — 09:33

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

почему так они решили? политика партии

ща куча набежит и скажет, что это правильно ))

   Stepa86

3 — 28.07.11 — 09:36

(2) еси чо, меня тоже выбешивает писать методы СделатьЧтоТо и СделатьЧтоТо_Сервер( только изза того, что напрямую сервер нельзя позвать из обработчика команды

   Pro-tone

4 — 28.07.11 — 09:37

(1) сделал так как ты сказал, убрал из ПриОткрытии():

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   
   //Вставить содержимое обработчика

  ВыбНоменклатураСсылка = Серверный.ПолучитьВсеДокументы(«РасходнаяНакладная»);

  Список.Параметры.УстановитьЗначениеПараметра(«ВыбНоменклатураСсылка»,ВыбНоменклатураСсылка);    

   

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

та же самая ошибка ((

   Ненавижу 1С

5 — 28.07.11 — 09:38

(3) ну значит есть братья по разуму ))

   Stepa86

6 — 28.07.11 — 09:39

(4) ВыбНоменклатураСсылка не список значений случаем?

   Pro-tone

7 — 28.07.11 — 09:41

(6) таблица значений

   Pro-tone

8 — 28.07.11 — 09:43

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: v    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: QueryParam    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data-composition-system/core}ParameterValue

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: value    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

по причине:

Ошибка отображения типов:

Отсутствует отображение для типа ‘{http://v8.1c.ru/8.1/data/core}ValueTable’

   Stepa86

9 — 28.07.11 — 09:45

ты в дин. список таблицу суешь??? я бы тоже огорчился

   Defender aka LINN

10 — 28.07.11 — 09:46

(1)(2) Чего курили?

(7) Молодец.

   Pro-tone

11 — 28.07.11 — 09:47

(9) ну да, отбор запросом дин списка

ВЫБРАТЬ

   ДокументРасходнаяНакладная.Ссылка,

   ДокументРасходнаяНакладная.ПометкаУдаления,

   ДокументРасходнаяНакладная.Номер,

   ДокументРасходнаяНакладная.Дата,

   ДокументРасходнаяНакладная.Проведен,

   ДокументРасходнаяНакладная.Контрагент,

   ДокументРасходнаяНакладная.Проект,

   ДокументРасходнаяНакладная.Товары.(

       Ссылка,

       НомерСтроки,

       Номенклатура

   ),

   ДокументРасходнаяНакладная.МоментВремени

ИЗ

   Документ.РасходнаяНакладная КАК ДокументРасходнаяНакладная

ГДЕ

   ДокументРасходнаяНакладная.Товары.Ссылка В(&ВыбНоменклатураСсылка)

   Pro-tone

12 — 28.07.11 — 09:47

(9)(10) а как правильно ?

   Stepa86

13 — 28.07.11 — 09:48

(10) свое надо иметь…

(11) массивом передавай, и есть подозрение, что в ТЗ лежит что то мутабельное

   Sarmen

14 — 28.07.11 — 09:48

Список значений туда передавай, а не таблицу значений.

   Sarmen

15 — 28.07.11 — 09:49

Да ещё табличную часть зачем выбираешь в запросе?

   Stepa86

16 — 28.07.11 — 09:49

(14) периодически вылезает гемор со списком, лично я его между методами не передаю

   Sarmen

17 — 28.07.11 — 09:50

Делай запрос по табличной части, а не по таблице расходной накладной.

   Defender aka LINN

18 — 28.07.11 — 09:51

(13) Не, у тебя лучше. Это, ять, ТаблицаЗначений! Ты знаешь такой тип в тонком клиенте? Я — нет.

   Pro-tone

19 — 28.07.11 — 09:51

(13) ппц, ок ща попробую. Что означает «мутабельное» ?

(15) это как бы сам 1 с софрмировал такой запрос, я только условие поставил в запрос

   Sarmen

20 — 28.07.11 — 09:54

ВЫБРАТЬ

   Товары.Ссылка.Ссылка,

   Товары.Ссылка.Номер,

   Товары.Ссылка.Дата,

   Товары.Ссылка.ПометкаУдаления,

   Товары.Ссылка.Проведен,

   Товары.Ссылка.СуммаПоДокументу,

   Товары.Ссылка.МоментВремени

ИЗ

   Документ.РасходнаяНакладная.Товары КАК Товары

ГДЕ

   Товары.Номенклатура В (&СписокЗначений)

примерно так …

   Stepa86

21 — 28.07.11 — 09:54

(19) мутабельное, грубо говоря это то, что нельзя с сервера на клиент передавать и обратно… подробнее в гугле

ТЧ порежь лучше, и для таких отборов лучше критерий отбора заюзать

   Pro-tone

22 — 28.07.11 — 09:55

(13) передал массивом стало работать ! спасибо ! Где об этом написано что таблица значений недоступна в запросе по динсписку формы клиента ?

   Pro-tone

23 — 28.07.11 — 09:57

(21) ща попробую через критерий отбора

   Ненавижу 1С

24 — 28.07.11 — 10:00

(10) почему?

   BigRoma

25 — 28.07.11 — 10:00

Между клиентом и сервером нельзя передавать таблицу значений.

Когда делаете Список.Параметры.УстановитьЗначениеПараметра(«ВыбНоменклатураСсылка»,ТаблицаЗначений);

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

   Mort

26 — 28.07.11 — 10:04

(24) Вот транслятор свой напишешь, сразу догадаешься.

   BigRoma

27 — 28.07.11 — 10:06

(26) вообще он прав, нельзя на тонком клиенте работать с северными объектами. Например, ДокументОбъект на клиенте не существует, таблица значений на тонком клиенте не существует.

   Ненавижу 1С

28 — 28.07.11 — 10:07

(27) так и не надо, достаточно в тонком клиенте хранить только ссылки на них, а пусть они живут на далеком сервере

   H A D G E H O G s

29 — 28.07.11 — 10:11

(28) Так так и сделано

   BigRoma

30 — 28.07.11 — 10:12

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

   Mort

31 — 28.07.11 — 10:12

(28) Ссылки и так есть. ТЗ на формах тоже нормально хранятся в коллециях. Чо не нравится-то? То что нельзя на клиенте Ссылка.реквизит написать? Дай такую возможность, сейчас бы 1Сники такого г0внокода написали, все бы от УФ крутили носом.

   Ненавижу 1С

32 — 28.07.11 — 10:14

ладно, пошел писать свою платформу

   Mort

33 — 28.07.11 — 10:15

(32) Блэк джек не забудь впилить. И шлюх.

   Ненавижу 1С

34 — 28.07.11 — 10:17

(33) главное Неопределено выпилить, оставить только NULL

   Pro-tone

35 — 28.07.11 — 10:17

Как я понимаю через критерий отбора (опять же в серверном модуле через вызов сервера с уф) будет примерно так:

Функция ОтборСерверная()

МассивСсылок = КритерииОтбора.ПоНоменклатуре.Найти(ВыбНоменклатура);

Для Каждого Ссылка Из МассивСсылок Цикл

   Сообщить(Ссылка);

КонецЦикла;

Возврат МассивСсылок;

КонецФункции

   H A D G E H O G s

36 — 28.07.11 — 10:17

(32) good speed

   Pro-tone

37 — 28.07.11 — 10:17

Функция ОтборСерверная(ВыбНоменклатура) конечно же

   Stepa86

38 — 28.07.11 — 10:19

(35) вообще то я предлагал прям в запросе обращение к критерию сделать и передавать туда номенклатуру… тока не уверен, что в дин. списке это нормально выглядеть будет

   Pro-tone

39 — 28.07.11 — 10:23

(38)

запрос к дин.списку

ВЫБРАТЬ

   ДокументРасходнаяНакладная.Ссылка,

   ДокументРасходнаяНакладная.ПометкаУдаления,

   ДокументРасходнаяНакладная.Номер,

   ДокументРасходнаяНакладная.Дата,

   ДокументРасходнаяНакладная.Проведен,

   ДокументРасходнаяНакладная.Контрагент,

   ДокументРасходнаяНакладная.Проект,

   ДокументРасходнаяНакладная.Товары.(

       Ссылка,

       НомерСтроки,

       Номенклатура

   ),

   ДокументРасходнаяНакладная.МоментВремени

ИЗ

   Документ.РасходнаяНакладная КАК ДокументРасходнаяНакладная

ГДЕ

   ДокументРасходнаяНакладная.Товары.Номенклатура В(&ВыбНоменклатураСсылка)

И после еще (по нажатию на кнопку ОтборПоНоменклатуре на форме списка)

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

   //Вставить содержимое обработчика

  Список.Параметры.УстановитьЗначениеПараметра(«ВыбНоменклатураСсылка»,КритерииОтбора.ПоНоменклатуре.Найти(ВыбНоменклатура));    

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

   Mort

40 — 28.07.11 — 10:23

Если подходить к коду грамотно, практически никогда не возникает конструкций СделатьЧтоТо и СделатьЧтоТо_Сервер

   Pro-tone

41 — 28.07.11 — 10:25

(38) фиг там, критерий отбора не живет на клиенте (

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

   Stepa86

42 — 28.07.11 — 10:31

(40) если у меня есть метод в серверном модуле, который делает то, что мне надо, как мне «Грамотно» написать команду, которая его вызывает?

   BigRoma

43 — 28.07.11 — 10:33

(42) ВызватьСерверныйМетод(Параметры)

а ещё лучше, по возможности

ВызватьСерверныйМетодБезКонтекста(Параметры)

   Stepa86

44 — 28.07.11 — 10:34

(43) а вот (40) говорит, что так не грамотно

   BigRoma

45 — 28.07.11 — 10:36

(44) честно говоря не понял о чем (4) говорил

   BigRoma

46 — 28.07.11 — 10:36

(44) честно говоря не понял о чем (40) говорил

   Mort

47 — 28.07.11 — 10:39

(44) Да, так не грамотно. Имя функции должно отражать ЧТО она делает, а не где.

   Mort

48 — 28.07.11 — 10:39

С «ГДЕ» прекрасно справляются директивы.

   Stepa86

49 — 28.07.11 — 10:41

есть серверный модуль Серверный и там процедура СоздатьПодчиненныйДокумент(пОсновнойДокумент)

Добавляя кнопку на форму хочу написать:

&НаКлиенте

Процедура СоздатьПодчиненныйДокумент()

Если Не Объект.Ссылка.Пустая() Тогда

Серверный.СоздатьПодчиненныйДокумент(Объект.Ссылка);

КонецЕсли;

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

а приходится писать так:

&НаКлиенте

Процедура СоздатьПодчиненныйДокумент()

СоздатьПодчиненныйДокумент_Сервер(Объект.Ссылка);

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

&НаСервере

Процедура СоздатьПодчиненныйДокумент_Сервер()

Если Не Объект.Ссылка.Пустая() Тогда

Серверный.СоздатьПодчиненныйДокумент(Объект.Ссылка);

КонецЕсли;

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

если я правильно понял (40), то он утверждает, что при грамотной разработке проксирующий метод не нужен… вот мне и интересно как тут грамотно?

   Mort

50 — 28.07.11 — 10:43

(49) Да, грамотно поставить галку «Вызов сервера» на модуль.

   Mort

51 — 28.07.11 — 10:44

А ссылку на пустое значение проверять, например, методом ЗначениеЗаполнено()

   Stepa86

52 — 28.07.11 — 10:44

+(49) Условия можно избежать, если сделать командой на объекте, а не на форме, тем более что в тонком клиенте она отвалится с ошибкой

   BigRoma

53 — 28.07.11 — 10:44

(49) а вот это уже странно, я всегда писал по первому варианту. Можете объяснить, почему он не работает? Казалось бы Объект.Ссылка имеет ссылочный тип и нормально сериализуется.

   Stepa86

54 — 28.07.11 — 10:45

(50) у кого? клиентские методы не видят экспортные серверные методы ни с галочкой ни без

   Stepa86

55 — 28.07.11 — 10:46

(53) Тонкий и веб не видят модуля Серверный

   Defender aka LINN

56 — 28.07.11 — 10:46

(49) а потому что не хочешь ты думать.

Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
    Серверный.СоздатьПодчиненныйДокумент(Объект.Ссылка);
КонецЕсли;
   Defender aka LINN

57 — 28.07.11 — 10:47

(55) А галку «вызов сервера»-то ты поставил?

   Pro-tone

58 — 28.07.11 — 10:49

(34) я вижу у тебя особая страсть к 2м типам «Неопределено» и «Null» =))

   Stepa86

59 — 28.07.11 — 10:49

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

(57) да

   BigRoma

60 — 28.07.11 — 10:51

(59) а процедуру экспортной сделал? )

   Ненавижу 1С

61 — 28.07.11 — 11:01

(58) и пустым ссылкам ))

   BigRoma

62 — 28.07.11 — 11:03

(61) кста вопрос порой задают на собеседованиях чем отличается NULL от Неопределено.

   Defender aka LINN

63 — 28.07.11 — 11:08

(59) У меня не падает. ЧЯДНТ?

   Stepa86

64 — 28.07.11 — 11:10

(63) тонкий клиент клиент-сервера? и какая версия платформы

  

Pro-tone

65 — 28.07.11 — 11:15

(61) и неизвестному объекту еще тогда ))

Студворк — интернет-сервис помощи студентам

Доброго дня всем
1с 8.3 Работаю с бизнес -процессами. Возникла сложность при завершении.
Есть ТЗ: При завершении задачи «Ознакомится с результатом» завершить комплексный бизнес процесс и все незавершенные задачи по нему.

В форме ЗадачиИсполнителя есть кнопка. Команда на кнопке выполняется наКлиенте. В конце выполнения я и решила подпихнуть свою обработку. Которая выполняется в общем модуле.
Вот как я это делаю. Вызов общего (клиент) из команды формы (Параметр: форма задачи)
Вызов

1C
1
2
3
    Если АМ_ОбщийКлиент.ЗавершитьБизнесПроцессПослеВыполненияЗадачиКлиент(ЭтаФорма) Тогда
    Возврат;
    КонецЕсли;

В общем модуле — клиенте переход на Общий (сервер, вызов сервера)

1C
1
2
3
4
5
6
Функция ЗавершитьБизнесПроцессПослеВыполненияЗадачиКлиент(Форма) Экспорт
    Отказ = Ложь;
    Задача = Форма.Объект.Ссылка; 
        АМ_Общий.ЗавершитьБизнесПроцессПослеВыполненияЗадачиОзнакомиться(Задача);
    Возврат Отказ;
      КонецФункции

Ну и в общем модуле я работаю уже непосредственно с задачей, ищу по ней бизнес-процесс, завершаю задачи.

Так вот теперь суть всего вопроса:
После завершения работы на сервере когда уже отладчик стоит на КонецФункции у меня неожиданно все сваливается в ошибку

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{ОбщийМодуль.АМ_ОбщийКлиент.Модуль(8)}: Ошибка при вызове метода контекста (ЗавершитьБизнесПроцессПослеВыполненияЗадачиОзнакомиться)
    АМ_Общий.ЗавершитьБизнесПроцессПослеВыполненияЗадачиОзнакомиться(Задача);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'СтрокаТаблицыЗначений'

Я не могу понять в чем она заключается. Я вроде бы никакие данные не передаю. Задача — ссылку которой я беру уже завершена и я ее не изменяю.
ЧТо не так то?? Почитала кучу форумов и справок, но не нашла ответа на вопрос. Может кто поможет и опишет корректность выполнения процедур Клиент-Сервер-Клиент. Буду очень признательна за любую информацию по этому вопросу

ИСТОЧНИК ОШИБОК:

Ситуации, когда возможно появление этой проблемы:
— Обмен в распределенной базе данных.
— Обновление конфигурации 1С.
— Импорт из внешних источников в 1С.

ПРОБЛЕМА:

{Форма.Управляемая.Форма(1000)}: Ошибка при вызове метода контекста (ПолучитьСписокНаСервере)
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘v’:
форма: Элемент
имя: {http://v8.1c.ru/8.2/uobjects}v
по причине:
Текст XML содержит недопустимый символ в позиции 5 :
?{?{?U

ВАРИАНТЫ РЕШЕНИЯ:

&НаСервере
Перем RegExp;

&НаКлиенте
Процедура Старт(Команда)

АнализируемыйТекст = «§ | §§ «» | a86;a87;♥♦♣♠•88;75;89;a92;b34;b35;a88;58;68;U97;R52;¶§44;V16;↑↓→←W35;↔50;60; !
| ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
| АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя
| ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω
| 0123456789
| ~!@#$%^&*(){}[]_-=+|/*:;.<>?,№ !
| ' | © | ® | µ | «» | ¤¢€£¥ | § | ½¼¾ | ¹²³ | °±×÷؃§ µ";

ТекстРезультат = СтартНаСервере(АнализируемыйТекст);

Сообщить(""+АнализируемыйТекст+"
|"+ТекстРезультат);

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

&НаСервере
Функция СтартНаСервере(Знач Текст)

RegEXP_Инициализация();

Если RegExp = Неопределено Тогда
Value = ИсключитьНеЧитаемыеСимволыИзСтроки(Текст);                 // Вариант "НЕТИПОВОЙ 1С".
Иначе
Value = ИсключитьНеЧитаемыеСимволыИзСтроки_REGEXP(Текст);    // Вариант "НЕТИПОВОЙ RegExp".
КонецЕсли;
//Value = ЗаменитьНедопустимыеСимволыXML(Value);                           // Вариант "ТИПОВОЙ 1С".

Возврат Value;

КонецФункции

ВАРИАНТ РЕШЕНИЯ "ТИПОВОЙ 1С":

// Функция (ТИПОВАЯ 1С), оставляющая в строке только допустимые для XML символы и цифры.
//
// Возвращаемое значение:
//    Строка.
//
&НаСервере
Функция ЗаменитьНедопустимыеСимволыXML(Знач Текст, СимволЗамены = " ")

Позиция = НайтиНедопустимыеСимволыXML(Текст);
Пока Позиция > 0 Цикл
ТекущийСимвол = Сред(Текст, Позиция, 1);
Если КодСимвола(ТекущийСимвол) = 21 Тогда    // Параграф.
Текст = СтрЗаменить(Текст, ТекущийСимвол, Символ(167));
Позиция = НайтиНедопустимыеСимволыXML(Текст);
Продолжить;
КонецЕсли;
Текст = СтрЗаменить(Текст, ТекущийСимвол, СимволЗамены);
Позиция = НайтиНедопустимыеСимволыXML(Текст);
КонецЦикла;

Возврат Текст;

КонецФункции

Достоинства:
- Максимально возможное сохранение содержимого исходной строки.
Исключаются только недопустимые для XML символы.
- Самая быстрая функция.
Недостатки:
- В итоговой строке могут присутствовать нечитаемье символы ("аброказаябры").

ВАРИАНТ РЕШЕНИЯ "НЕТИПОВОЙ RegExp":

// Функция (RegExp), инициализация.
//
// Возвращаемое значение:
//    Строка.
//
&НаСервере
Функция RegEXP_Инициализация()

// Читаемые символы.
// Латиница = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
// Кирилица = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
// Греческие = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω";
// Цифры = "0123456789";
// СпециальныеСимволы = "~
!@#$%^&*(){}[]_-=+|/*:;.<>?,№«» «;
ДвойнаяКавычка = «^»»»;
ОдинарнаяКавычка = «^’»;
АпострофОбратный = «^» + Символ(769);    // КодСимвола 769. Обратный для символа на букве «Ё».
АвторскоеПраво = «^©»;                             // КодСимвола 169. «Copyright» — латинская буква C в окружности — авторское право.
Зарезервировано = «^®»;                           // КодСимвола 174. «Registered» — латинская буква R в окружности — товарный знак.
ТоварныйЗнак = «^™»;                               // Верхний  индекс ТМ.
ШирокоеТире = «^—»;                                // КодСимвола 8212.
ДенежныеСимволы = «^¤^¢^€^£^¥»;         // Денежная единица, Цент, Евро, Фунт стерлингов, Иена или юань.
ДробныеСимволы = «^½^¼^¾»;                // Дроби: 1/2, 1/4, 3/4.
СимволыСтепени = «^¹^²^³»;                    // Степени: 1, 2, 3.
ПрочиеСимволы = «^°^±^×^÷^Ø^ƒ^µ^»+Символ(167);    // Градус, Плюс/Минус, Знак умножения, Знак деления, Диаметр, Знак функции, Микро, Параграф.

ЧитаемыеСимволы = «[«;
ЧитаемыеСимволы = ЧитаемыеСимволы + «^a-z^A-Z^а-я^А-Я^0-9^Ё^ё^Α-Ω^α-ω»;    // Латиница + Кирилица + Цифры + Греческие.
ЧитаемыеСимволы = ЧитаемыеСимволы + «^~^^!^@^#^$^%^^^&^*^(^)^{^}^[^]^_^-^=^+^^|^/^*^:^;^.^^?^,^№^«^»^ ";    // СпециальныеСимволы.
ЧитаемыеСимволы = ЧитаемыеСимволы + ДвойнаяКавычка + ОдинарнаяКавычка + АпострофОбратный + АвторскоеПраво + Зарезервировано +ТоварныйЗнак;
ЧитаемыеСимволы = ЧитаемыеСимволы + ШирокоеТире + ДенежныеСимволы + ДробныеСимволы + СимволыСтепени + ПрочиеСимволы;
ЧитаемыеСимволы = ЧитаемыеСимволы + "]";

ПолучитьCOMОбъектREGEXP(ЧитаемыеСимволы, Ложь, Истина, Ложь);

КонецФункции

// СПАСИБО Evg-Lylyk: http://infostart.ru/public/64222/
//
&НаСервере
Процедура ПолучитьCOMОбъектREGEXP(Шаблон, ИскатьДоПервогоСовпадения = Истина, МногоСтрок = Истина, ИгнорироватьРегистр = Истина)

Если RegExp = Неопределено Тогда   // Нужна инициализация.
Попытка
RegExp = Новый COMОбъект("VBScript.RegExp");    // Создаем объект для работы с регулярными выражениями.
Исключение
RegExp = Неопределено;
Возврат;
КонецПопытки;
КонецЕсли;

// Заполняем данные.
RegExp.MultiLine = МногоСтрок;                              // Истина — текст многострочный, Ложь — одна строка.
RegExp.Global = НЕ ИскатьДоПервогоСовпадения;   // Истина — поиск по всей строке, Ложь — до первого совпадения.
RegExp.IgnoreCase = ИгнорироватьРегистр;           // Истина — игнорировать регистр строки при поиске.
RegExp.Pattern = Шаблон;                                     // Шаблон (регулярное выражение).

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

// Функция (НЕТИПОВАЯ REGEXP), оставляющая в строке только читаемые(допустимые) для XML символы и цифры.
//
// Возвращаемое значение:
//    Строка.
//
&НаСервере
Функция ИсключитьНеЧитаемыеСимволыИзСтроки_REGEXP(Знач АнализируемыйТекст, ЗаменятьСимволы = Истина, СимволЗамены = " ")

Если НЕ RegExp.Test(АнализируемыйТекст) Тогда
Возврат АнализируемыйТекст;
КонецЕсли;

// Формирование результирующей строки.
ИтоговаяСтрока = АнализируемыйТекст;

РезультатАнализаСтроки = RegExp.Execute(АнализируемыйТекст);

Для Каждого Результат ИЗ РезультатАнализаСтроки Цикл
ТекущийСимвол = Результат.Value;
Если КодСимвола(ТекущийСимвол) = 21 Тогда    // Параграф.
ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, ТекущийСимвол, Символ(167));
Продолжить;
КонецЕсли;
Если ЗаменятьСимволы Тогда
// Замена символа в строке.
ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, ТекущийСимвол, СимволЗамены);
Иначе
// Сокращение строки на символ.
ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, ТекущийСимвол, "");
КонецЕсли;
КонецЦикла;

Возврат ИтоговаяСтрока;

КонецФункции

Достоинства:
- Остаются только визуализируемые, понятно читаемые допустимые для XML символы.
- Сопоставима по скорости с функцией ЗаменитьНедопустимыеСимволыXML (~ 0.5%).
Недостатки:
- Отдельные, возможно, необходимые символы могут исключаться.
(необходимо дополнить переменную ЧитаемыеСимволы).

ВАРИАНТ РЕШЕНИЯ "НЕТИПОВОЙ 1С":

// Функция (НЕТИПОВАЯ 1С), оставляющая в строке только читаемые(допустимые) для XML символы и цифры.
//
// Возвращаемое значение:
//    Строка.
//
&НаСервере
Функция ИсключитьНеЧитаемыеСимволыИзСтроки(Знач АнализируемыйТекст, ЗаменятьСимволы = Истина, СимволЗамены = " ")

// Читаемые символы.
Латиница = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Кирилица = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
Греческие = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω";
Цифры = "0123456789";
СпециальныеСимволы = "~
!@#$%^&*(){}[]_-=+|/*:;.<>?,№«» «;
ДвойнаяКавычка = «»»»;
ОдинарнаяКавычка = «‘»;
АпострофОбратный = «L9;»;           // КодСимвола 769. Обратный для символа на букве «Ё».
АвторскоеПраво = «©»;             // КодСимвола 169. «Copyright» — латинская буква C в окружности — авторское право.
Зарезервировано = «®»;           // КодСимвола 174. «Registered» — латинская буква R в окружности — товарный знак.
ТоварныйЗнак = «™»;               // Верхний  индекс ТМ.
ШирокоеТире = «—»;                // КодСимвола 8212.
ДенежныеСимволы = «¤¢€£¥»;  // Денежная единица, Цент, Евро, Фунт стерлингов, Иена или юань.
ДробныеСимволы = «½¼¾»;    // Дроби: 1/2, 1/4, 3/4.
СимволыСтепени = «¹²³»;         // Степени: 1, 2, 3
ПрочиеСимволы = «°±×÷؃µ»+Символ(167);    // Градус, Плюс/Минус, Знак умножения, Знак деления, Диаметр, Знак функции, Микро, Параграф.

ЧитаемыеСимволы = Латиница + Кирилица + Греческие + Цифры + СпециальныеСимволы + ШирокоеТире
+ ДвойнаяКавычка + ОдинарнаяКавычка + АпострофОбратный + АвторскоеПраво + Зарезервировано + ТоварныйЗнак
+ ДенежныеСимволы + ДробныеСимволы + СимволыСтепени + ПрочиеСимволы;

// Формирование результирующей строки.
ИтоговаяСтрока = «»;
Для НомерСимвола = 1 ПО СтрДлина(АнализируемыйТекст) Цикл
ТекущийСимвол = Сред(АнализируемыйТекст, НомерСимвола, 1);
// Заменяемые символы. Системный набор значений: «Символы»:
Если ТекущийСимвол = Символы.ВК ИЛИ ТекущийСимвол = Символы.ВТаб ИЛИ ТекущийСимвол = Символы.НПП
ИЛИ ТекущийСимвол = Символы.ПС ИЛИ ТекущийСимвол = Символы.ПФ ИЛИ ТекущийСимвол = Символы.Таб Тогда
ТекущийСимвол = СимволЗамены;
КонецЕсли;
Если КодСимвола(ТекущийСимвол) = 21 Тогда    // Параграф.
ТекущийСимвол = Символ(167);
КонецЕсли;
Если Найти(ЧитаемыеСимволы, ТекущийСимвол) > 0 Тогда
ИтоговаяСтрока = ИтоговаяСтрока + ТекущийСимвол;
Иначе
Если ЗаменятьСимволы Тогда
ИтоговаяСтрока = ИтоговаяСтрока + СимволЗамены;
Иначе
// Сокращение строки на символ.
КонецЕсли;
КонецЕсли;
КонецЦикла;

Возврат ИтоговаяСтрока;

КонецФункции

Достоинства:
— Остаются только визуализируемые, понятно читаемые допустимые для XML символы.
Недостатки:
— Отдельные, возможно, необходимые символы могут исключаться.
(необходимо дополнить переменную ЧитаемыеСимволы).
— Медленнее предыдущих на 30 %.

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

Вчера обновлял бухгалтерские базы, в частности 2 базы Бухгалтерия предприятия 3.0.
Базы стандартные, без изменений.
Обновление происходило на версию 3.0.34.13, платформа 8.3.4.437, базы серверные (Microsoft SQL Server 2008 R2).
После обновления все было нормально, сам запускал базу, пользователи не жаловались.
Но на следующий день, сегодня, у всех пользователей этих баз при попытке запуска в режиме 1С:Предприятие возникает ошибка:

Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.2/managed-application/modules}cli    Форма: Элемент    Тип:
{http://v8.1c.ru/8.1/data/core}FixedStructure

Детальное описание ошибки:
{ОбщийМодуль.СтандартныеПодсистемыКлиентПовтИсп.Модуль(56)}: Ошибка при вызове метода контекста
(ПараметрыРаботыКлиентаПриЗапуске)
    ПараметрыКлиента = СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗапуске(Параметры);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.2/managed-application/modules}cli    Форма: Элемент    Тип:
{http://v8.1c.ru/8.1/data/core}FixedStructure

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

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

Чистка кэша не помогает.

Способы решения:
1) Для быстрого временного решения проблемы можно в настройках базы в списке баз 1с установить основной режим запуска «Толстый клиент» вместо «Выбирать автоматически» (пользователю с включенный интерфейсом Такси это не помогло).
2) Включить возможность изменения конфигурации базы и добавить пустую строку в любой общий модуль (взято здесь: http://forum-mista.pro/topic.php?id=713977).

Второй способ решил проблему полностью.

Ошибка, похоже, связана с платформой, исходя из моей ситуации (платформа 8.3.4.437), из того, что пишут здесь: http://forum-mista.pro/topic.php?id=713977 (платформа 8.3.4.365) и из комментариев к данной публикации (платформа 8.3.4.496 и 8.3.5).

&НаСервере Функция ПодключитьВнешнююОбработку(Знач стрАдрес) Выдается ошибка: {ОбщийМодуль.УниверсальныеМеханизмы.Модуль(790,11)}: Процедура или функция с указанным именем не определена (ПодключитьВнешнююОбработку)

Попробуй ее выше клиентской процедуры воткнуть.

А кстати, в каком модуле у тебя этот код?

В общем модуле. Галочки в свойствах стоят 4 штуки.

Поменял местами, то же самое

Разноси по разным модулям.

и вновь продолжается бой..

разносил. Не работает. Метод не обнаружен пишет.

Галка «вызов сервера» стоит в свойствах модуля?

Поставил, никакой разницы Писал: &НаСервере Функция ПодключитьВнешнююОбработку(Знач стрАдрес) Экспорт &НаКлиенте Ошибка: Метод объекта не обнаружен (ПодключитьВнешнююОбработку)

&НаСервере Функция ПодключитьВнешнююОбработку(Знач стрАдрес) Экспорт КонецФункции В отдельный модуль с галками Сервер и Вызов с севрера

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

потому что архитекторы 1С такие

Не ври. А ты читай документацию внимательно и вдумчиво. Если у общего модуля стоят галки и «клиент» и «сервер», то будет скомпилировано 2(!) экземпляра этого модуля — один на стороне сервера, другой на стороне клиента. — В серверный экземпляр попадут все процедуры и функции объявленные с директивой &НаСервере, а так же без дериктив(что равнозначно &НаСервере) — В клиентский — те что объявлены &НаКлиенте. Если при этом у модуля стоит галка «вызов сервера», то вызов процедур серверного модуля доступен с клиента. При вызове процедуры, работает правило «ближнего вызова», т.е. если вызов идет с клиента то вызывается процедура из КЛИЕНТСКОГО экземпляра модуля, если с сервера — то СЕРВЕРНОГО. Улавливаешь в чем твоя ошибка ? &НаКлиенте Это вызов функции из КЛИЕНТСКОГО экземпляра модуля(!), а её там нет )) Потому что она объявлена с директивой &НаСервере и находится разумеется в СЕРВЕРНОМ экземпляре модуля.

И что? Есть возможность вызвать серверный экземпляр модуля из клиентского экземпляра того же модуля?

А? А то пришлось сделать копию общего модуля с другим именем.

(18, 19) Нет, нельзя. Но ты можешь вызвать метод серверного модуля из формы Пример: // В общем клиент-серверном модуле с галкой вызов сервера

+ точнее процедура объявленная без директив &наклиенте или &насервере будет скомпилирована и тат и там

А сервер то есть? Или ты пытаешься отладить на локальной?

чиать — думать. хватит переливать их пустого в порожнее, думал уже все поменяли психологию со времен корявой 7.7

Конечно есть. На локальном бы такой проблемы не возникало. это ты кому?

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

Проверка синтаксиса однако звисит от директив в общих модулях!

Вот блин… Ты это разработчикам типовых расскажи, и тем кто документацию пишет, а то они видимо не в курсе …

где ты в типовых это видел?

Тэги: 1С 8

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

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ошибка при вызове метода контекста получитьпоследнее
  • Ошибка при вызове операции сервиса
  • Ошибка при вызове метода контекста получитьобщуюформу
  • Ошибка при вызове метода контента

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии