Имя: Пароль:
1C
1С v8
Внешняя дополнительная обработка - команды
,
0 Масянька
 
03.10.19
08:37
Доброе утро!
Есть обработка.
Нужно добавить механизм заполнения табличных частей документа.
Как?
Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("");
    
    ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
    //ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", ".... (Обмен)");
    ПараметрыРегистрации.Вставить("Версия", "1.0.2.2");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Информация", "Обработка для обмена с системой .....");
    
    ТаблицаКоманд = ПолучитьТаблицуКоманд();    
    ДобавитьКоманду(ТаблицаКоманд, "Нативи Маркет", "ОткрытьОбработку", "ОткрытиеФормы", Истина);
    ДобавитьКоманду(ТаблицаКоманд, "Выполнить синхронизацию", "ВыполнитьСинхронизацию", "ВызовСерверногоМетода");
// Я
    ДобавитьКоманду(ТаблицаКоманд, "Загрузка в табличную часть", "ЗагрузкаВТЧ", "ВызовКлиентскогоМетода", Ложь);
    
    //ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    Возврат ПараметрыРегистрации;
КонецФункции
Спасибо.
1 Mankubus
 
03.10.19
08:53
2 Vadim_37
 
03.10.19
08:57
Что-то типа

&НаСервере
Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
    
    Если ИдентификаторКоманды = "ЗагрузкаВТЧ" Тогда
        ЗагрузитьВТЧПолюбому();
    КонецЕсли;
    
КонецПроцедуры
3 Масянька
 
03.10.19
08:58
(1) А почитать за тебя нужно?
Меня не устраивает "    ПараметрыРегистрации.Вставить("Вид","ЗаполнениеОбъекта");".
У меня дополнительная внешняя обработка (ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); "
Мне нужно сделать команду с видом "заполнение объекта" (нечто в этом роде).
Я не нашла в гугле. Поэтому и спрашиваю у гуру.
4 Масянька
 
03.10.19
08:59
(2) Команда - заполнение ТЧ. В док-те должна появиться кнопка "Заполнить" и в ней моя команда.
5 Cyberhawk
 
03.10.19
09:04
Какие проблемы?
6 Масянька
 
03.10.19
09:06
(5)  ДобавитьКоманду(ТаблицаКоманд, "Загрузка в табличную часть", "ЗагрузкаВТЧ", "ВызовКлиентскогоМетода", Ложь);  - правильно?
Почему нет кнопки?
7 Sergz66
 
03.10.19
09:08
(3) Сделай еще одну обработку и у нее сделай вид Заполнение объекта
8 Cyberhawk
 
03.10.19
09:08
Где нет?
9 Масянька
 
03.10.19
09:09
(8) В док-те.
Если делать "ПараметрыРегистрации.Вставить("Вид","ЗаполнениеОбъекта")" - кнопка появляется.
10 Масянька
 
03.10.19
09:10
(7) Тут обработка по обмену. В ней получается инфа для обмена. Потом это нужно загрузить в док-т.
11 Cyberhawk
 
03.10.19
09:11
Не каждый вид подключаемой обработки совместим с каждым типом использования команды
12 RomanYS
 
03.10.19
09:11
(6) где нет кнопки? У тебя массив назначений пустой
13 Масянька
 
03.10.19
09:11
(11) Откуда инфа? Где прочесть?
14 Sergz66
 
03.10.19
09:12
(10)Ну не предусмотрели разработчики БСП возможности использовать несколько видов у одной обработки...
15 Sergz66
 
03.10.19
09:12
(13)ИТС, не?
16 Масянька
 
03.10.19
09:14
(15) Ткни. Я не нашла.
17 Cyberhawk
 
03.10.19
09:14
18 Cyberhawk
 
03.10.19
09:15
(обратить внимание на описание возвращаемого значения)
19 Cyberhawk
 
03.10.19
09:16
Ну а потом, после лицезрения слова "глобальная", обратиться в раздел 5: https://its.1c.ru/db/bsp301doc#content:1865:1:issogl1_глобальные_отчеты_и_обработки
20 Масянька
 
03.10.19
09:17
(19) То бишь, как таковая команда (для конфы), определяется именно видом обработки?
21 Cyberhawk
 
03.10.19
09:18
Вид обработки на самом верхнем уровне определяет, будет команда глобальной (в подсистеме) или привязанной к объекту (в форме объекта и/или списка).
На следующем уровне (для неглобальных) уже определяет, в каком подменю будет команда - печать, заполнение, отчеты
22 Масянька
 
03.10.19
09:19
(21) Я не поняла :(
23 Масянька
 
03.10.19
09:32
(21) А как на следующем уровне определить команду для заполнения? Пусть хотя бы для одного док-та.
24 Cyberhawk
 
03.10.19
09:39
(23) Если без записи объекта (чисто манипуляции с данными формы), то
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
Иначе подойдет и любой другой тип команды.
25 Масянька
 
03.10.19
09:44
(24) В Сведениях:
    ДобавитьКоманду(ТаблицаКоманд, "Загрузка в табличную часть", "ЗагрузкаВТЧ", ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы(), Ложь);
Нету кнопки.
А настройку команды как сделать?
26 Cyberhawk
 
03.10.19
09:47
Не по чертежу значит
27 Cyberhawk
 
03.10.19
09:51
Пишешь же что в (9) все работает. Какие проблемы-то?
28 Масянька
 
03.10.19
09:52
(27) Это если менять вид обработки.
А не меняя вид обработки вариант сделать кнопку?
29 Cyberhawk
 
03.10.19
10:03
Могу только порекомендовать перечитать (21)
30 hhhh
 
03.10.19
10:05
(28) а конфа новая? дело в том, что  ТаблицаКоманд = ПолучитьТаблицуКоманд();     давным давно отменили. теперь по другому там в свежих БСП.
31 Масянька
 
03.10.19
10:08
(30) Получить прописана ниже
Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции
32 Масянька
 
03.10.19
14:02
Чтобы новые темы не плодить...
Как в одной обработке вызвать процедуру из другой?

    Если Обработка <> Неопределено Тогда
        Обработка.ОбработкаИнициализация();


Это в первой

&НаСервере
Процедура ОбработкаИнициализация() Экспорт

Это во второй.
Пишет - Метод объекта не обнаружен (ОбработкаИнициализация)
33 Масянька
 
03.10.19
14:02
Процедура (во второй) лежит в модуле объекта
34 RomanYS
 
03.10.19
14:03
(32) >>Это во второй.
В модуле обработки?
Тип Обработка какой?
35 Масянька
 
03.10.19
14:05
Отбой. Уже нашла.
PS Вот что значит "поговорить с умными людьми" :)
36 Масянька
 
04.10.19
10:08
Все таки придется продолжать...
Описываю:
- есть обработка, которая выполняет некий обмен. В этой обработке сделали форму со списком нужной фигни.
- нужно в таб. часть док-тов сделать загрузку фигни (см. выше).
Пришли к такому решению:
- новая обработка (вид "Заполнение").
- в новой обработке открыть форму списка нужной фигни из обработки обмена.

&НаСервере
Функция ПолучитьОбработку()
    
    Обработка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Нативи Маркет (Обмен)").Ссылка;

    Возврат Обработка;

КонецФункции
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    Если (ИдентификаторКоманды = "ЗагрузкаВТЧ") Тогда
    Обработка = ПолучитьОбработку();
    ОткрытьФорму("Справочники.ДополнительныеОтчетыИОбработки." + Строка(обработка) + ".ФормаСпискаПересчет");
        
    КонецЕсли;

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

Выдает - Неизвестное имя формы ...
Прошу помощи.
37 Масянька
 
04.10.19
11:32
Я понимаю, конечно, интереснее деликатесами делиться, но может кто ткнет в правильном направлении?
38 hhhh
 
04.10.19
11:57
(37) ну вот это "Строка(обработка)" - какая-то запредельная фигня.
39 Масянька
 
04.10.19
12:00
(38) Так важно?
40 Масянька
 
04.10.19
12:00
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    ОткрытьФорму("Справочники.ДополнительныеОтчетыИОбработки.НативиМаркет.ФормаОбмена");
КонецПроцедуры
Вот этот код должен работать?
Обработка в справочнике есть.
41 Mankubus
 
04.10.19
12:33
(40) нет это не будет работать
я тут еще раз погуглил..

&НаКлиенте
Процедура Команда1(Команда)
    ИмяОбр = ПолучитьИмяВнешней("C:\мояОбработка.epf");
    
    ПараметрыОткрытия = Новый Структура("КлючВарианта", "");
    Уникальность = "ВнешняяОбработка." + ИмяОбр + "/КлючВарианта.";
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбр + ".Форма", , Неопределено, Уникальность);
КонецПроцедуры

Функция ПолучитьИмяВнешней(ИмяФайла)
    дд = Новый ДвоичныеДанные(ИмяФайла);
    АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(дд);
    ИмяОбр = ВнешниеОбработки.Подключить(АдресВоВременномХранилище,,);
    
    Возврат ИмяОбр;
КонецФункции

только тебе нужно сначала получить обработку из справочника и записать ее например во временный файл
42 Масянька
 
04.10.19
13:03
(41) Я это раньше тебя нагуглила. Только не работало.
Оказывается, толстый клиент нужен.
43 Масянька
 
04.10.19
14:40
Еще вопрос: открытие с параметром.
Обработка по команде открывает обработку обмена.

    ПараметрыОбработки = Новый Структура();
    ПараметрыОбработки.Вставить("ДокументОбработки" , Док);

    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма.ФормаСпискаПересчет", ПараметрыОбработки);

Но в обработке обмена ругань - недопустимое значение параметра (параметр номер 2) - на вот это
&НаСервере
Процедура СохранитьОбработку()
    
    ЗначениеВРеквизитФормы(Обработка, "Объект");
    
КонецПроцедуры

Почему?
44 Кац
 
04.10.19
14:50
Все не читал. Задача какая?
Открыть чтоль внешнюю обработку из справочника внешних обработок?
45 Масянька
 
04.10.19
15:01
(44) Прочитай (43).
Стоит убрать параметры - все норм.
Как обойти?
46 Кац
 
04.10.19
15:10
(45) т.е. ты открываешь не основную форму обработки? попробуй основную


ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", ПараметрыОбработки);
47 Масянька
 
04.10.19
15:12
(46) Да нет же!
В открываемую (!!!!) форму передаются параметры. При этом ругается здесь:

&НаСервере
Процедура СохранитьОбработку()
    
    ЗначениеВРеквизитФормы(Обработка, "Объект");
    
КонецПроцедуры

Если параметры убрать - ругани нет.
48 Кац
 
04.10.19
15:14
Расскажи сколько форм у ивоей обработки? ФормаСпискаПересчет это ведь не основная ее форма?
49 Масянька
 
04.10.19
15:14
(48)
1. 6 (шесть).
2. Не основная.
50 Масянька
 
04.10.19
15:15
+ (49) Забыла: обработка не моя. Я только ломаю... Ну, ломальщик...
51 Масянька
 
04.10.19
15:16
(48) Если ты думаешь, что она (не основная форма) не открывается - забудь.
Без передачи параметров открывается норм.
52 Кац
 
04.10.19
15:18
Я к тому, что  с основной формой + параметры не будет проблем, откроется.
А с не основной формой есть какой-то нюанс и в параметр надо передавать ключ. Но это не точно, надо гуглить.

Но можно схитрить - открывать основную, а из нее слету открывать ФормаСпискаПересчет
53 Масянька
 
04.10.19
15:19
Слушайте, в ветке 75% постов - мои.
Со мной будет кто-нибудь говорить?
54 Масянька
 
04.10.19
15:20
(52) Так-с...
А погуглить не знаешь где? А не могу нагуглить.
55 Масянька
 
04.10.19
15:21
Мне параметр нужен именно в этой форме.
По-любому, в нее нужно передать параметр.
56 Кац
 
04.10.19
15:33
v8: Как открыть вторую форму обработки, открытой через меню файл? (УФ) глянь пост 26, посмотри как маньяк открывает не основную форму
57 Масянька
 
04.10.19
15:35
(56) Спасибо
58 Масянька
 
07.10.19
16:06
Следующий вопрос:
(кратко напомню вводную: внешняя обработка по заполнению док-та - кнопка "Заполнить" в док-те)
если ТЧ док-та не пуста - вопрос об очистке.
Кол-во в ТЧ можно получить на клиенте (по-крайней мере, у меня на сервере - ругается), а вот вопрос  - на клиенте.
Как обойти?
59 Масянька
 
07.10.19
16:25
Неужели реквизит лепить?
Но, ведь, простая же операция...
60 hhhh
 
07.10.19
16:43
(59) ну в типовых посмотреть как сделано. Там вроде никаких реквизитов. Чистят без проблем.
61 3achem
 
07.10.19
16:45
(58) А что сложного? Диалог с пользователем - потом вызов серверной процедуры
62 Масянька
 
07.10.19
16:49
(60) В типовых все на клиенте. Поскольку в документе делается (или в справочнике).
А у меня - док-т это ссылка (из него вызвали обработку).
63 Масянька
 
07.10.19
16:49
(61) А можно пример кода?
64 hhhh
 
07.10.19
16:52
(63) Ну типа

Если ОпределитьКоличествоНаСервере(СсылкаНаДОкумент) > 0 Тогда

   ПоказатьВопрос(, "Чистить ТЧ?");
65 Масянька
 
07.10.19
16:56
(64) А в типовых где? Уже так и сделала.
66 Масянька
 
07.10.19
16:58
Дальше:
&НаСервере
Процедура ОчиститьТабЧастьДокта()
    
    ДокОбъект = Объект.РабочийДокумент.ПолучитьОбъект();
Сообщить("1 - " + ДокОбъект + " - " + ТипЗнч(ДокОбъект));    
    ТабЧасть = ДокОбъект.Запасы;
Сообщить("2 - " + ТабЧасть.Количество());
    ТабЧасть.Очистить();
Сообщить("3 - " + ТабЧасть.Количество());
    
    
КонецПроцедуры

в 3-ем сообщении - 0, а закрываешь обработку (возвращаешься в док-т) - перечитать ничего не удалено.
Почему?
67 pechkin
 
07.10.19
16:59
открыть форму можно для любого вида обработки.
так что сделать привязанную и одновременно непривязанную можно
68 hhhh
 
07.10.19
16:59
(65) Я не смотрел. Просто из опыта знаю, что она постоянно спрашивает, ТЧ непустая, очистить?
69 pechkin
 
07.10.19
16:59
(66) так не записыаешь же
70 Масянька
 
07.10.19
17:00
(69) А не записывая никак?
71 pechkin
 
07.10.19
17:01
(70) только как заполнение объекта
72 Масянька
 
07.10.19
17:02
(71) Переведи...
73 hhhh
 
07.10.19
17:02
(66) такая фишка в восьмерке

ДокОбъект1 = Объект.РабочийДокумент.ПолучитьОбъект();

и

ДокОбъект2 = Объект.РабочийДокумент.ПолучитьОбъект();

ДокОбъект1 и ДокОбъект2 - это два разных объекта. Они ничего не знают друг о друге.
74 pechkin
 
07.10.19
17:02
(72) у тебя вроде в (0) все переведено
75 Масянька
 
07.10.19
17:04
(73) Я бы это не фишкой назвала...
76 Масянька
 
07.10.19
17:04
Спасибо!
77 Масянька
 
08.10.19
08:29
(73) (74) То есть - чтобы увидеть в док-те (из которого вызвана форма заполнения) изменения, до-к нужно записать? Я правильно понимаю?
78 Масянька
 
09.10.19
13:14
Очень надеюсь, что последний вопрос...

&НаКлиенте
Процедура Загрузить(Команда)
    
    ДокументОбъект = ВладелецФормы.Объект;
    КолВоСтр = КолВоСтрокВТабЧастиДокта(ДокументОбъект);

    Если (КолВоСтр > 0) Тогда
        Ответ = Неопределено;
        ПоказатьВопрос(Новый ОписаниеОповещения("ЗагрузитьОтветНаВопрос", ЭтотОбъект, ДокументОбъект), НСтр("ru = 'Табличная часть документа заполнена. Очистить?'"), РежимДиалогаВопрос.ДаНет, 0);
    Иначе
        ЗагрузитьВДокумент(ДокументОбъект);
        КопироватьДанныеФормы(ДокументОбъект, ВладелецФормы.Объект);
    КонецЕсли;

    КопироватьДанныеФормы(ДокументОбъект, ВладелецФормы.Объект);
    
    ЭтаФорма.Закрыть();
    
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьОтветНаВопрос(Результат, ДокументОбъект) Экспорт
    
    Ответ = Результат;
    Если (Ответ = КодВозвратаДиалога.Да) Тогда
        ОчиститьТабЧастьДокта(ДокументОбъект);
    КонецЕсли;
    
    ЗагрузитьВДокумент(ДокументОбъект);
    
    КопироватьДанныеФормы(ДокументОбъект.Запасы, ВладелецФормы.Объект.Запасы);
    
    ВладелецФормы.Модифицированность = Истина;

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

&НаСервере
Процедура ОчиститьТабЧастьДокта(ДокументОбъект)
    
    ТабЧасть = ДокументОбъект.Запасы;
    ТабЧасть.Очистить();
    
КонецПроцедуры

Этот кусок работает шикарно - для очистки ТЧ.
А вот для заполнения ТЧ - фигня.
&НаСервере
Процедура ЗагрузитьВДокумент(ДокументОбъект)
    
    Фильтр = Новый Соответствие;
    Фильтр.Вставить("filter", "{""include"":""productItems""}");
    
    ПересчетСписок = ПолучитьТоварыНаСервере(Фильтр);
    
        тчЗапасы = Пересчет.Запасы;
        Для Каждого ТекСтр Из тчЗапасы Цикл
            ТекТовар           = ТекСтр.Номенклатура;
            ТекХарактеристика     = ТекСтр.Характеристика;
            ТекПартия          = ТекСтр.Партия;
            ТекКоличество       = ТекСтр.Количество;
            ТекЕдиница           = ТекСтр.ЕдиницаИзмерения;
            ТекЦена           = ТекСтр.Цена;
            
            ТекСтрДокта = ДокументОбъект.Запасы.Добавить();
            ТекСтрДокта.Номенклатура      = УстановитьЭлементСправочника(ТекТовар, Справочники.Номенклатура, "Не найдена номенклатура: ");
            ТекСтрДокта.ЕдиницаИзмерения = УстановитьЕдИзм(ТекЕдиница);
            ТекСтрДокта.Характеристика     = УстановитьХарактеристику(ТекХарактеристика);
            ТекСтрДокта.Партия             = УстановитьЭлементСправочника(ТекПартия, Справочники.ПартииНоменклатуры, "Не найдена партия: ");
            ТекСтрДокта.Количество          = ТекКоличество;
            ТекСтрДокта.Цена             = ТекЦена;
КонецПроцедуры

То есть - не вижу в ТЧ документа.
Ну, почему?!
79 Масянька
 
09.10.19
13:17
Сообщить("тек. стр. док - " + ТекСтрДокта.Номенклатура);            

нормально пишет номенклатуру.
А в док-те не отображается.
80 pechkin
 
09.10.19
13:18
копировать данные формы не обязательно
ДокументОбъект = Форма.Объект
можно на сервер передавать спокойно
81 Масянька
 
09.10.19
13:32
(80) А почему в док-те не отображается?