Имя: Пароль:
1C
1С v8
Передать управление с сервера на клиент для вывода пользовательского диалога
,
0 Irinka Vitaminka
 
12.05.19
19:12
Помогите, пожалуйста. Логика кода:
ищем номенклатуру по артикулу, затем по наименованию. если номенклатура не найдена, то требуется показать диалог "Номенклатура не найдена.Выберите действие:" и 2 кнопки: "Создать новую номенклатуру", "Изменить артикул".
Функция поиска номенклатуры происходит на сервере. Функцию диалога нужно реализовывать на клиенте.
Выдает ошибку: Процедура или функция с указанным именем не определена (ВыбратьДействиеСНоменклатурой) Ответ = <<?>>ВыбратьДействиеСНоменклатурой(); (Проверка: Сервер)

&НаСервере
Функция ОпределитьНоменклатуру(АртикулИзXML, НаимИзXML)
    НомерАртикула = АртикулИзXML + "           ";
    НомерАртикула = Лев(НомерАртикула, 11);
    НайденнаяНоменклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",НомерАртикула);
    Если НайденнаяНоменклатура.Пустая() Тогда
        Пока Найти(НаимИзXML, "  ") > 0 Цикл
              НаимИзXML = СтрЗаменить(НаимИзXML, "  ", " ");
        КонецЦикла;
        НайденнаяНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(НаимИзXML);    
    КонецЕсли;
    Если НайденнаяНоменклатура.Пустая() Тогда
        Ответ = ВыбратьДействиеСНоменклатурой();
    КонецЕсли;

    Возврат НайденнаяНоменклатура;
КонецФункции

&НаКлиенте
Функция ВыбратьДействиеСНоменклатурой()
    Кнопки = Новый СписокЗначений;
  
    Кнопки.Добавить("СоздатьНовЭлНоменклатуры", "Создать новую номенклатуру");
    Кнопки.Добавить("ИзменитьАртикул", "Изменить артикул");
    
    Ответ = Вопрос("Номенклатура не найдена. Выберите действие: ", Кнопки);
    Если Ответ = "СоздатьНовЭлНоменклатуры" Тогда
        Сообщить("СоздатьНовЭлНоменклатуры");
    ИначеЕсли Ответ = "ИзменитьАртикул" Тогда
        Сообщить("ИзменитьАртикул");
    КонецЕсли;
        
    Возврат Ответ;     
КонецФункции

Как мне с сервера перейти на клиент, получить от пользователя ответ и действовать дальше на сервере в зависимости от ответа?
1 ДенисЧ
 
12.05.19
19:18
Бить процедуры на куски.
2 Лефмихалыч
 
12.05.19
19:19
Никак. Раздели на три функции отдельные функции - одна ищет, вторая изменяет артикул, третья - создает. А на клиенте вызывай их и показывай диалоги.


Которые в одной и той же функции и ищут, и создают, у них шерсть на ладошках отрастает и слепоглазие. Особенно, если называется это всё Найти
3 Irinka Vitaminka
 
12.05.19
19:34
(2) у меня получается почти вся логика на сервере
1. на клиенте выбирается файл XML
2. на сервере читаю его в СписокЗначений и вызываю процедуру СоздатьРасходнуюНакладную
3. на сервере в процедуре СоздатьРасходнуюНакладную заполняю реквизиты и табличную часть, и мне надо подставить номенклатуру. Для этого вызываю процедуру ОпределитьНоменклатуру, которая как раз ищет и подставляет. А если не находит, то нужен диалог с пользователем
4. на клиенте пользователь должен выбрать, что делать
5. на сервере создать номенклатуру или поменять артикул

То есть мне нужно какое-то логически завершенное действие на сервере, чтобы потом выполнение кода перешло на клиент?
И получается на форме внешней обработки будут еще кнопки типа "заполнить номенклатуру"?
Но у меня файл XML из многих накладных состоит..
я не понимаю, как еще разделить, с 1С работаю 5 дней, во вторник дали задачу
4 Irinka Vitaminka
 
12.05.19
19:39
я правильно понимаю, что из процедуры &НаСервере нельзя вызвать процедуру &НаКлиенте?
если управление перешло на сервер, то на клиент оно вернется после выполнения всего блока &НаСервере?
5 ПолПалыч
 
12.05.19
19:40
(4) да.
6 Irinka Vitaminka
 
12.05.19
19:41
как же тогда поступают в ситуациях, если при программном создании документа нет, допустим, контрагента с таким ИНН и нужно, чтобы пользователь внес данные в справочник контрагентов, чтобы в этот создаваемый документ потом этого же контрагента записать?
7 shuhard
 
12.05.19
19:42
(5) нет конечно
https://wonderland.v8.1c.ru/blog/peredacha-informatsii-s-servera/

(6) верни код ошибки
8 ПолПалыч
 
12.05.19
19:58
(7) не понимаю о чем ты. Из серверной процедуры нельзя вызывать клиентскую.
9 Лефмихалыч
 
12.05.19
20:00
(6) написано же прямым текстом в (2), что делать и как
10 Garykom
 
гуру
12.05.19
20:03
(6) >как же тогда поступают
Очень просто поступают: "нанимают программиста"
;)
11 palsergeich
 
12.05.19
20:06
Господин с ОФ на УФ переходит?
Да и в ОФ диалог в транзакции - моветон.
12 Лефмихалыч
 
12.05.19
20:06
(3) тебе надо вытрусить вот этот мусор из головы.
Сервер всё умеет, но ничего не хочет. Клиент ничего не умеет, но всё хочет.
Сервер - делает. Но только тогда, когда его вызывает клиент и только то, что требует клиент. Вопросы пользователю задает клиент и на основании ответов принимает решение, что у сервера запросить.
13 Garykom
 
гуру
12.05.19
20:06
(0) Изучите интерфейс типовых загрузок данных в конфах УФ.

Там везде данные грузятся таблицами а не по одной строчке и сразу для всего списка/таблицы указывается для каждой колонки в каждой строке что делать, создать автоматом или юзер сам лезет, правит номенклатуру и снова обновляет чтобы обо подцепило имеющуюся
14 Garykom
 
гуру
12.05.19
20:08
(12) Та не есть обходные пути с периодическими запросами (что делать?) клиента к серверу, а тот ответит что делать сча клиенту каким то местом и где то сохраняя данные клиента среди многих
15 Лефмихалыч
 
12.05.19
20:10
(14) так делают только мудаки.
16 Лефмихалыч
 
12.05.19
20:10
+(15) ну, или высоко*бучие профессионалы, когда все остальные варианты исчерпаны. Студентам та нельзя. И расскзывать об этом им нельзя. Мозг выкипит и без того неокрепший
17 vde69
 
12.05.19
20:15
(6) подход такой

1. с клиента вызывем функцию ЗачитатьНаСервере()
2. в этой функции читаем и анализируем файл на сервере, результат помещаем во временное хранилище а адрес хранилища возвращаем на клиент вместе таблицей косяков
3. на клиенте разбираем таблицу косяков и задаем все вопросы
4. вызываем процедуру СделатьВсеНаСервере в нее передаем адрес хранища из п. 1 и таблицу исправлений
5. на сервере все записываем и делаем, при необходимости в транзакции
18 Irinka Vitaminka
 
12.05.19
20:59
спасибо вам всем огромное!!! вы такие отзывчивые! сейчас буду все читать и изучать, что вы сказали
19 Irinka Vitaminka
 
14.05.19
22:23
я сделаль)
перенесла чтение XML на клиента

подскажите, пожалуйста, как называется окно в БП "Реализация (акты, накладные)", где отображается список всех документов? попадаю туда так: Продажи->Реализация (акты, накладные) Журнал? но в конфигураторе я журнала с таким именем не нахожу, да и вообще ничего не нахожу. я хотела, чтобы после выполнения кода пользователь со вкладки обработки попадал сразу на эту страницу
20 palsergeich
 
14.05.19
23:03
Найти очень просто:
открываешь в 1с нужную форму. в конфигураторе Отладка -> остановить и жмешь на любую кнопку в интересующей форме.
Только делать надо быстро, обрабочиков ожидания левых много.
21 palsergeich
 
14.05.19
23:11
Не факт что с первой или второй попытки выйдет попасть куда надо, а не в какую нибудь БСП функцию, но приноровишься.
22 areaho0ray
 
15.05.19
02:02
(19) Это ФормаСписка
23 Irinka Vitaminka
 
15.05.19
16:20
спасибо! все сделала)