Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 окт 2025, 07:04

Как при запуске работы системы запустить внешнюю обработку

Автор sali, 11 сен 2025, 08:50

0 Пользователей и 1 гость просматривают эту тему.

sali

antoneus, вот и про тоже думал , когда домой ехал, что по-другому не получиться только отдельно создавать для регламента этот массив и отдавать его

sali

antoneus, а не знаете можно программно проверить включен регламент или нет?
не такой строкой РегламентныеЗадания.ПолучитьРегламентныеЗадания(Метаданные.РегламентныеЗадания.Найти("Выгрузить цены номенклатуры"))[9].Использованиеа способом поэффективней?

antoneus


sali

antoneus, нет.
ну то которое получилось программно создать
спрашиваю для того , потому что не нашел другого варианта как,  проверить РЗ на признак "Включено" в функции которая прописана в модуле формы эдо
Получается , это функции которые выполняются руками для выгрузки цен
&НаКлиенте
Асинх Процедура Выгрузить(Команда)
Если Режим = "Номенклатура" Тогда
ТекстВопроса = НСтр("ru = 'Будет выгружена номенклатура в соответствии с установленными отборами. Продолжить выполнение операции?'");
ИначеЕсли Режим = "Цены" Тогда
ТекстВопроса = НСтр("ru = 'Будут выгружены цены номенклатуры в соответствии с установленными отборами. Продолжить выполнение операции?'");
...
Если НЕ ПроверитьЗаполнение() Тогда
Отказ = Истина;
КонецЕсли;

Если Отказ Тогда
Возврат;
КонецЕсли;

Если Режим = "Номенклатура" Тогда
Результат = ВыгрузитьНоменклатуруНаСервере();
ИначеЕсли Режим = "Цены" Тогда
Результат = ВыгрузитьЦеныНаСервере();
....КонецПроцедуры

&НаСервере
Функция ВыгрузитьЦеныНаСервере()
//проверить если включен регламент то запустить процесс. массивстрок взять из экспортной функции в модуле менеджера
КлючТорговогоОборудования = ?(ЭДОН_ТорговоеОборудование.Пустая(), "", ЭДОН_ТорговоеОборудование.ГУИДИсточника);
МассивСтрокВыгрузки = Товары.НайтиСтроки(Новый Структура("Выбран", Истина));
Возврат ЭДОН_РаботаССервисом.ВыгрузитьЦены(АдресПубликации, КлючКлиента, КлючТорговогоОборудования, МассивСтрокВыгрузки, ДатаНачала);
КонецФункции// ВыгрузитьЦеныНаСервере()

sali

НО СЛУЧИЛСЯ казус , чтобы функция выгрузки заработала ее надо дать программного пинка

sali

antoneus, я снова со своей проблемой
делаю выгрузку номенклатуры все отрабатывает без ошибок , но позиции не загружаются
такой код для выгрузки позиций и соединения базы с сервером ЭДО
Процедура ВыгрузитьНоменклатуру() Экспорт 

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|СправочникНоменклатура.Ссылка КАК Номенклатура,
|ИСТИНА КАК Выбран
|{ВЫБРАТЬ
| Номенклатура.*,
| Выбран}
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура
|ГДЕ
| НЕ СправочникНоменклатура.ЭтоГруппа
| И НЕ СправочникНоменклатура.ПометкаУдаления
|{ГДЕ
| СправочникНоменклатура.Ссылка.* КАК Номенклатура}"; 

РезультатЗапроса = Запрос.Выполнить();
ВыборкаНоменклатуры = РезультатЗапроса.Выгрузить();

СтруктураСтрокВыгрузки = Новый ТаблицаЗначений;
СтруктураСтрокВыгрузки.Колонки.Добавить("Выбран");
СтруктураСтрокВыгрузки.Колонки.Добавить("Артикул");
СтруктураСтрокВыгрузки.Колонки.Добавить("Штрихкод");
СтруктураСтрокВыгрузки.Колонки.Добавить("Номенклатура");
СтруктураСтрокВыгрузки.Колонки.Добавить("ЕдиницаИзмерения");

Для каждого Элемент Из ВыборкаНоменклатуры Цикл   
Стр = СтруктураСтрокВыгрузки.Добавить();
Стр.Выбран = Элемент.Выбран;
Стр.Номенклатура = Элемент.Номенклатура
КонецЦикла;                               

МассивСтрокВыгрузки = СтруктураСтрокВыгрузки.НайтиСтроки(Новый Структура("Выбран", истина));
пКлюч = ПройтиАвторизациюРегламент();
Результат = ЭДОН_РаботаССервисом.ВыгрузитьНоменклатуру(пКлюч.АдресПубликации, пКлюч.КлючКлиента, пКлюч.КлючТорговогоОборудования, МассивСтрокВыгрузки, пКлюч.ЭтоБП);
КонецПроцедуры                                                     

таблица заполняется, в номенклатуре справочник ссылка - не строка! булево поставлено , но не выгружает. в чем может быть проблема?

antoneus

В чем угодно. На входе ЭДОН_РаботаССервисом.ВыгрузитьНоменклатуру параметры при удачной выгрузке и неудачной совпадают?

sali

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

sali

там же порядок какой , если программно

определяет какой регламент

ИначеЕсли ИдентификаторКоманды = Перечисления.ЭДОН_РегламентныеЗаданиеРасширение.ВыгрузитьЦеныНоменклатуры тогда

Если Метаданные.Обработки.Найти("ЭДОН_РабочееМесто") <> Неопределено Тогда
Обработки["ЭДОН_РабочееМесто"].ВыгрузитьЦеныНоменклатуры(); 
КонецЕсли;

КонецЕсли;   

идет в модуль менеджера к этой функции
Процедура ВыгрузитьЦеныНоменклатуры() Экспорт       

// идет по запросу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЦеныНоменклатурыСрезПоследних.ВидЦен КАК ТипЦены,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка КАК Номенклатура
|{ВЫБРАТЬ
| Номенклатура.*,
| ТипЦены.*,
| Цена}
|ИЗ
| Справочник.Номенклатура КАК спрНоменклатура
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО (спрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура)
|{ГДЕ
| ЦеныНоменклатурыСрезПоследних.Номенклатура.*,
| ЦеныНоменклатурыСрезПоследних.ВидЦен.* КАК ТипЦены}";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаЦенЗапрос = РезультатЗапроса.Выгрузить();

// создает таблицу куда это все сложить
СтруктураСтрокВыгрузки = Новый ТаблицаЗначений;
СтруктураСтрокВыгрузки.Колонки.Добавить("Выбран");
СтруктураСтрокВыгрузки.Колонки.Добавить("Артикул");
СтруктураСтрокВыгрузки.Колонки.Добавить("Номенклатура");
СтруктураСтрокВыгрузки.Колонки.Добавить("ТипЦены");
СтруктураСтрокВыгрузки.Колонки.Добавить("Цена"); 

//Пока ВыборкаЦенЗапрос.Следующий() Цикл
// СтрокаТЗ = СтруктураСтрокВыгрузки.Добавить();
// СтрокаТЗ.Выбран       = Истина;
// СтрокаТЗ.Артикул      = ВыборкаЦенЗапрос.Номенклатура.Артикул;
// СтрокаТЗ.Номенклатура = ВыборкаЦенЗапрос.Номенклатура;
// СтрокаТЗ.ТипЦены      = ВыборкаЦенЗапрос.ТипЦены;
// СтрокаТЗ.Цена         = ВыборкаЦенЗапрос.Цена;
//КонецЦикла; 

Для каждого Элемент Из ВыборкаЦенЗапрос Цикл   
Стр = СтруктураСтрокВыгрузки.Добавить();
Стр.Выбран = Истина;
Стр.Номенклатура = Элемент.Номенклатура;
Стр.Артикул = Элемент.Номенклатура.Артикул;
Стр.ТипЦены = Элемент.ТипЦены;
Стр.Цена = Элемент.Цена;
КонецЦикла;                               

// после выгружает ее в массив
МассивСтрокВыгрузки = Новый Массив; 
Для каждого Строка из СтруктураСтрокВыгрузки цикл
  МассивСтрокВыгрузки.Добавить(Новый Структура(
         "Выбран,Артикул,Номенклатура,ТипЦены,Цена",
         Строка.Выбран,
         Строка.Артикул,
         Строка.Номенклатура,
         Строка.ТипЦены,
Строка.Цена
     ));
КонецЦикла;     

// МассивСтрокВыгрузки = СтруктураСтрокВыгрузки.НайтиСтроки(Новый Структура("Выбран", истина)); 

// определяет ключи для правильного соединения с сервером
пКлюч = ПройтиАвторизациюРегламент();

// собирает необходимые данные для функции в общем модуле
Результат = ЭДОН_РаботаССервисом.ВыгрузитьЦены(пКлюч.АдресПубликации, пКлюч.КлючКлиента, пКлюч.КлючТорговогоОборудования, МассивСтрокВыгрузки, НачалоДня(ТекущаяДатаСеанса()));

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

sali

теперь если идти по ручному варианту

определяет режим и добавляет колонки
Если Режим = "Цены" Тогда

Если Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.ТипЦены) Тогда
ТекстСообщения = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("КОЛОНКА",, НСтр("ru = 'Тип цены'"),, "Товары");
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", 1, "ТипЦены");
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, Поле, "Объект", Отказ);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.Цена) Тогда
ТекстСообщения = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("КОЛОНКА",, НСтр("ru = 'Цена'"),, "Товары");
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", 1, "Цена");
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,, Поле, "Объект", Отказ);
КонецЕсли;

..... после идет снова на определение
ИначеЕсли Режим = "Цены" Тогда
Результат = ВыгрузитьЦеныНаСервере();

идет к процедуре. всё там берет что нужно&НаСервере
Функция ВыгрузитьЦеныНаСервере()
КлючТорговогоОборудования = ?(ЭДОН_ТорговоеОборудование.Пустая(), "", ЭДОН_ТорговоеОборудование.ГУИДИсточника);
МассивСтрокВыгрузки = Товары.НайтиСтроки(Новый Структура("Выбран", Истина));
Возврат ЭДОН_РаботаССервисом.ВыгрузитьЦены(АдресПубликации, КлючКлиента, КлючТорговогоОборудования, МассивСтрокВыгрузки, ДатаНачала);
КонецФункции// ВыгрузитьЦеныНаСервере()


а в Результат закладывается только Сообщение об успешной или не успешной передачи данных

Если ЗначениеЗаполнено(Результат.СообщениеОбОшибке) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(СтрШаблон(НСтр("ru='Сервис вернул ошибку: %1'"), Результат.СообщениеОбОшибке));

ТекстОповещения = НСтр("ru='Ошибка'");
ТекстПояснения = НСтр("ru='Сервис вернул ошибку'");
ПоказатьОповещениеПользователя(ТекстОповещения,, ТекстПояснения, БиблиотекаКартинок.ДиалогВосклицание);
Иначе

ТекстОповещения = НСтр("ru='Успех'");
ТекстПояснения = НСтр("ru='Данные загружены на сервис'");
ПоказатьОповещениеПользователя(ТекстОповещения,, ТекстПояснения, БиблиотекаКартинок.ДиалогИнформация);
КонецЕсли;

у меня сервис возвращает пустую строку - это значит, Всё ок


Функция ВыгрузитьЦены(АдресПубликации, КлючКлиента, КлючТорговогоОборудования, МассивСтрокВыгрузки, ДатаНачалаПримененияЦены) Экспорт

Результат = Новый Структура;
Результат.Вставить("СообщениеОбОшибке", "");

...
    РезультатОперации = ИнтернетПоддержкаПользователей.ЗагрузитьСодержимоеИзИнтернет(
URLСервиса(АдресПубликации),
Логин(),
Пароль(),
ДопПараметрыЗапроса);

Если РезультатОперации.КодСостояния = 200 Тогда

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатОперации.Содержимое);
ОтветОбъект = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Если ОтветОбъект.general.error Тогда

// Сообщение для пользователя.
Результат.СообщениеОбОшибке = ОтветОбъект.general.message;

// Запист в журнал регистарции.
ИнформацияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Сервис вернул ошибку (%1).
|Код состояния: %2;
|Сообщение: %3'"),
ИдентификаторСервиса,
ОтветОбъект.general.response,
ОтветОбъект.general.message);

ЗаписатьОшибкуВЖурналРегистрации(ИнформацияОбОшибке, ИдентификаторСервиса);
Прервать;
КонецЕсли;

Иначе
ЗаписатьОшибкуВЖурналРегистрации(РезультатОперации.ИнформацияОбОшибке, ИдентификаторСервиса);

Результат.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
?(РезультатОперации.КодСостояния = 500,
НСтр("ru = 'Ошибка сервиса (%1).'"),
НСтр("ru = 'Ошибка подключения (%1).'")),
РезультатОперации.КодСостояния);
Прервать;
КонецЕсли;
КонецЦикла;

Возврат Результат;


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск