Фоновые задания: Пример запуска выполнения процедуры / функции на сервере Как в 1С производится запуск фоновых заданий, каким образом можно получить список заданий при помощи метода "ПолучитьФоновыеЗадания()?
В одном проекте понадобилось запускать выполнение выгрузки на сайт с сервера.
Пользователь на своем клиенте открывает обработку, устанавливает параметры и нажимает выгрузить.
Выгрузка идет не с компьютера клиента, а создается фоновое задание на сервере!
На клиенте в модуле Кнопки Выгрузить:
Код 1C v 8.3 Процедура КоманднаяПанель1ВыгрузитьНаСайт(Кнопка)
ПараметрыФоновогоЗадания = Новый Массив;
ПараметрыФоновогоЗадания. Добавить( Группа) ;
ФоновыеЗадания. Выполнить( "МодульРегламентныхЗаданий.ВыгрузкаПрайсаНАФТП" ,
ПараметрыФоновогоЗадания, Новый УникальныйИдентификатор,
"Выгрузка прайса на сайт" ) ;
ПоказатьОповещениеПользователя( "Выгрузка прайса на сайт" , , "Запущено задание выгрузки прайса на сайт, проверьте данные на сайте через 2-3 минуты..." , БиблиотекаКартинок. Информация32 ) ;
ПараметрыФоновогоЗадания - это переменные функции, они задаются по порядку как определены в вызываемой функции.
На сервере в общем модуле МодульРегламентныхЗаданий:
Код 1C v 8.3 Процедура ВыгрузкаПрайсаНАФТП(Группа) Экспорт
Запрос = Новый Запрос( ) ;
Запрос. Текст =
"ВЫБРАТЬ
| ПрайсЛист1СрезПоследних.НоменклатураПрайса,
| ПрайсЛист1СрезПоследних.Цена
|ИЗ
| РегистрСведений.ПрайсЛист.СрезПоследних(, Поставщик = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) КАК ПрайсЛист1СрезПоследних
|ГДЕ
| &Условие
| И ПрайсЛист1СрезПоследних.НоменклатураПрайса.ИДдляСайта > 0" ;
Если ЗначениеЗаполнено( Группа) Тогда
Запрос. Текст = СтрЗаменить( Запрос. Текст, "&Условие" , "ПрайсЛист1СрезПоследних.НоменклатураПрайса В ИЕРАРХИИ(&НоменклатураПрайса)" )
Иначе
Запрос. Текст = СтрЗаменить( Запрос. Текст, "&Условие" , "ИСТИНА" )
КонецЕсли ;
Запрос. УстановитьПараметр( "НоменклатураПрайса" , Группа) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Текст = Новый ТекстовыйДокумент;
Пока Выборка. Следующий( ) Цикл
НомПрайса = Выборка. НоменклатураПрайса;
ЦенаА = Выборка. Цена;
Цена = Ценообразование. ОкруглитьЦену( ЦенаА * ( 1 + НомПрайса. Наценка20 / 100 ) + НомПрайса. Надбавка20 , НомПрайса. ПорядокОкругления, НомПрайса. ОкруглятьВБольшуюСторону) ;
Если Цена > 0 Тогда
Текст. ДобавитьСтроку( "" + Формат( НомПрайса. ИДдляСайта, "ЧГ=0" ) + ";" + Формат( Цена, "ЧГ=0" ) ) ;
КонецЕсли ;
КонецЦикла ;
ПутьКФайлВыгр = "\\FG-1\1c_data\naSite\vigruz.csv" ;
Текст. Записать( ПутьКФайлВыгр, "windows-1251" ) ;
КаталогНаSFTPСервере = "/sitetest.ru/public_html/p" ;
Попытка
ИмяПользователя = "serveruser" ;
ПарольПользователя = "password" ;
Сервер = "192.253.6.47" ;
Порт = "21" ;
Прокси = Новый ИнтернетПрокси( ) ;
Прокси. Пользователь = ИмяПользователя;
Прокси. Пароль = ПарольПользователя;
FTPСоединение = Новый FTPСоединение( Сервер, , ИмяПользователя, ПарольПользователя, , Ложь ) ;
FTPСоединение. УстановитьТекущийКаталог( КаталогНаSFTPСервере) ;
ТекущийКаталог = FTPСоединение. ТекущийКаталог( ) ;
Исключение
КонецПопытки ;
FTPСоединение. Записать( ПутьКФайлВыгр, "vigruz.csv" ) ;
НТТР = Новый HTTPСоединение( "sitetest.ru" ) ;
ФайлРезультата = ПолучитьИмяВременногоФайла( ) ;
НТТР. Получить( "/p/import_price.php" , ФайлРезультата) ;
КонецПроцедуры
Как Получить фоновые задания?
Напишем в процедуре обработки нажания следующий код:
Код 1C v 8.2 УП &НаКлиенте
Процедура ПолучитьФоновыеЗадания(Команда)
ПолучитьФоновыеЗаданияНаСервере( ) ;
КонецПроцедуры
Текст процедуры на сервере:
Код 1C v 8.2 УП &НаСервере
Процедура ПолучитьФоновыеЗаданияНаСервере()
ПараметрыОтбора = Новый Структура( "Наименование" , "Тестовое задание" ) ;
СписокФоновыхЗаданий = ФоновыеЗадания. ПолучитьФоновыеЗадания( ПараметрыОтбора) ;
Для каждого Задание Из СписокФоновыхЗаданий Цикл
Сообщить( Задание. Наименование) ;
КонецЦикла ;
КонецПроцедуры
В окно сообщений выведутся наименования выполняющихся и выполненных в 1С фоновых заданий с наименованием "Тестовое задание", так как мы сделали отбор именно по этому наименованию.
Категория:
Регламентные задания, Фоновые задания Табличная часть ~ Как получить массив строк по условию (отбору)? Для УП:
Код 1C v 8.3
&НаКлиенте
. . . .
ФМ= Новый ФиксированнаяСтруктура( "КлючСвязи" , Элементы. ДанныеБезКоррекции. ТекущиеДанные. КлючСвязи) ;
Элементы. СписокПодразделений. ОтборСтрок= ФМ;
Код 1C v 8.3
Функция ПолучитьЗаписиСогласноОтбору(ТабличноеПолеИсточник)
ОтборСтрок = ТабличноеПолеИсточник. ОтборСтрок;
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса. ИсточникДанных = Новый ОписаниеИсточникаДанных( ТабличноеПолеИсточник. Значение) ;
Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
Если ЭлементОтбора. Использование Тогда
НовыйОтбор = ПостроительЗапроса. Отбор. Добавить( ЭлементОтбора. Имя) ;
НовыйОтбор. Использование = Истина ;
НовыйОтбор. ВидСравнения = ЭлементОтбора. ВидСравнения;
НовыйОтбор. ЗначениеС = ЭлементОтбора. ЗначениеС;
НовыйОтбор. ЗначениеПо = ЭлементОтбора. ЗначениеПо;
НовыйОтбор. Значение = ЭлементОтбора. Значение;
КонецЕсли ;
КонецЦикла ;
Таблица = ПостроительЗапроса. Результат. Выгрузить( ) ;
МассивСтрок = Новый Массив;
Для Каждого Стр ИЗ Таблица Цикл
СтруктураПоиска = Новый Структура;
Для Каждого Колонка Из Таблица. Колонки Цикл
СтруктураПоиска. Вставить( Колонка. Имя, Стр[Колонка. Имя]) ;
КонецЦикла ;
НайденыеСтроки = ТабличноеПолеИсточник. Значение. НайтиСтроки( СтруктураПоиска) ;
Если НайденыеСтроки. Количество( ) > 0 Тогда
МассивСтрок. Добавить( НайденыеСтроки[0 ]) ;
КонецЕсли ;
КонецЦикла ;
Возврат МассивСтрок;
КонецФункции
Для Обычных форм:
Код 1C v 8.х ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ДокСсылка", ДанныеПоШК.Объект);
НайденныеСтроки = ПакетДокументов.НайтиСтроки(ПараметрыОтбора);
// Подробнее
СтруктураОтбора = Новый Структура("ВидДокумента, Контрагент", ПФ, ?(Контр = Неопределено, Справочники.Контрагенты.ПустаяСсылка(), Контр));
ПакетДокументов = ЗадачаОбъект.ПакетДокументов;
МассивСтрок = ПакетДокументов.НайтиСтроки(СтруктураОтбора);
Если МассивСтрок.Количество() Тогда
Для Каждого СтрокаМассива Из МассивСтрок Цикл
СтрокаМассива.ДобавленоПользователем = Истина;
СтрокаМассива.Пользователь = ПараметрыСеанса.ТекущийПользователь;
СтрокаМассива.ДатаВремя = ТекущаяДата();
КонецЦикла;
КонецЕсли;
//или
ТЧ = ПромежуточнаяНакладная.Выгрузить();
ТЧ.Свернуть("СхемаПродажи");
СтрокаСПустойСП = ТЧ.НайтиСтроки(Новый Структура("СхемаПродажи", Справочники.СхемыПродаж.ПустаяСсылка()));
Если ТЧ.Количество() - СтрокаСПустойСП.Количество() > 1 Тогда
Если Вопрос("Сбросить все схемы в строках?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
НесколькоСхем = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Для каждого СтрокаПН из ПромежуточнаяНакладная Цикл
Если СтрокаПН.Номенклатура.ВидНоменклатуры.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга Тогда
СтрокаПН.СхемаПродажи = СхемаПродажи;
КонецЕсли;
КонецЦикла;
Категория:
Работа с Формой (Диалог) и её элементами Поиск в таблице значений по двум и более полям Двумя способами: объектным и запросом
Код 1C v 8.х ТЗ = Новый ТаблицаЗначений;
ТЗ. Колонки. Добавить( "Наименование" , Новый ОписаниеТипов( "Число" ) ) ;
ТЗ. Колонки. Добавить( "Серия" , Новый ОписаниеТипов( "Число" ) ) ;
НоваяСтрока = ТЗ. Добавить( ) ;
НоваяСтрока. Наименование = 123 ;
НоваяСтрока. Серия = 456 ;
НоваяСтрока = ТЗ. Добавить( ) ;
НоваяСтрока. Наименование = 123 ;
НоваяСтрока. Серия = 789 ;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора. Вставить( "Наименование" , 123 ) ;
ПараметрыОтбора. Вставить( "Серия" , 789 ) ;
НайденныеСтроки = ТЗ. НайтиСтроки( ПараметрыОтбора) ;
Код 1C v 8.х
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ВТ_ТаблицаЗначений.Наименование,
| ВТ_ТаблицаЗначений.Серия
|ПОМЕСТИТЬ ВТ_ТаблицаЗначений
|ИЗ
| &ТЗ КАК ВТ_ТаблицаЗначений
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТаблицаЗначений.Наименование,
| ВТ_ТаблицаЗначений.Серия
|ИЗ
| ВТ_ТаблицаЗначений КАК ВТ_ТаблицаЗначений
|ГДЕ
| ВТ_ТаблицаЗначений.Наименование = &Наименование
| И ВТ_ТаблицаЗначений.Серия = &Серия" ;
Запрос. УстановитьПараметр( "ТЗ" , ТЗ) ;
Запрос. УстановитьПараметр( "Наименование" , 123 ) ;
Запрос. УстановитьПараметр( "Серия" , 456 ) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) ;
Категория:
Работа с Таблицей Значений Удаление строк из табличной части документа, все или по условию. Удалить все строки табличного поля документа.
Код 1C v 8.х ОтражениеВУчете. Очистить( ) ;
Как в табличной части документа удалить строки только с нулевым значением реквизита "Количество"?
Код 1C v 8.х
ОбъектДок = СсылкаДок. ПолучитьОбъект( ) ;
СтруктураДляПоиска = Новый Структура( "Количество" , 0 ) ;
ТабличнаяЧастьДок = ОбъектДок. Товары;
МассивПустыхСтрок = ТабличнаяЧастьДок. НайтиСтроки( СтруктураДляПоиска) ;
Для каждого Строка Из МассивПустыхСтрок Цикл
ТабличнаяЧастьДок. Удалить( Строка) ;
КонецЦикла ;
ОбъектДок. Записать( ) ;
Как удалить все строки, кроме тех которые соответсвуют заданному отбору?
Код 1C v 8.х
ПараметрыОтбора = Новый Структура( "СубконтоКт1" , Справочники. РасходыБудущихПериодов. РБПНаПФР) ;
ТЗисходн= ОтражениеВУчете. Выгрузить( ) ;
ТЗнов = ТЗисходн. Скопировать( ПараметрыОтбора) ;
ОтражениеВУчете. Очистить( ) ;
ОтражениеВУчете. Загрузить( ТЗнов) ;
В режиме управляемого приложения конструкция:
Код 1C v 8.2 УП Для каждого Запись из ТабличнойЧасти Цикл
Если Запись. НадоУдалить Тогда
ТабличнойЧасти. Удалить( Запись) ;
КонецЕсли ;
КонецЦикла ;
Работает некорректно, так как переписывает табличную часть и меняет индексы, сразу после удаления и Цикл полностью не обходит.
Решение пришло такое:
Код 1C v 8.2 УП КолВо = Объект. ТабличнойЧасти. Количество( ) - 1 ;
ИндексСтроки = КолВо;
Для счетчик = 0 по КолВо Цикл
Запись = Объект. ТабличнойЧасти. Получить( ИндексСтроки) ;
если Запись. НадоУдалить тогда
Объект. ТабличнойЧасти. Удалить( Запись) ;
КонецЕсли ;
ИндексСтроки = ИндексСтроки - 1 ;
КонецЦикла ;
Категория:
Документы Как скопировать, выгрузить данные из одной таблицы значений в другую? Как скопировать или выгрузить данные из одной таблицы значений в другую таблицу значений?
1. Добавление, копирование строк из одной таблицы значений в другую таблицу значений:
Код 1C v 8.х Для каждого СтрокаТЗ Из Таблица1 Цикл
ЗаполнитьЗначенияСвойств( Таблица2 . Добавить( ) , СтрокаТЗ)
КонецЦикла ;
2. Можно использовать метод
Скопировать() объекта ТаблицаЗначений:
Первым параметром в этот метод передается массив строк для копирования, если он не указан - копируются все строки таблицы значений. Этот параметр также может содержать отбор по значению колонок.
Вторым параметром передается список колонок для копирования в формате "Колонка1, Колонка2...". Если параметр не указан, копируются все колонки таблицы.
Допустим, есть таблица значений ТЗ с колонками Код, Номенклатура и Цена.
С помощью следующего кода мы выгрузим из этой таблицы в новую таблицу значений ТЗ1 все значения, содержащиеся в колонках Номенклатура и Цена:
Код 1C v 8.х ТЗ1 = Новый ТаблицаЗначений;
ТЗ1 = ТЗ. Скопировать( "Номенклатура,Цена" ) ;
В следующем примере мы выгрузим все строки исходной таблицы, в которых значение поля Цена = 15000.
Код 1C v 8.х ТЗ1 = Новый ТаблицаЗначений;
ПараметрыОтбора = Новый Структура( "Цена" , 15000 ) ;
ТЗ1 = ТЗ. Скопировать( ПараметрыОтбора) ;
Категория:
Работа с Таблицей Значений Удаление строк Таблицы Значений Код 1C v 8.х
НулевыеСтроки = ТаблицаПослеПодмен. НайтиСтроки( Новый Структура( "Сумма" , 0 ) ) ;
Для каждого СтрокаТаблицы Из НулевыеСтроки Цикл
ТаблицаПослеПодмен. Удалить( СтрокаТаблицы)
КонецЦикла ;
ПараметрыОтбора = Новый Структура( "Цена" , 15000 ) ;
ТЗНов = ТЗ. Скопировать( ПараметрыОтбора) ;
ТаблицаЗначений. Удалить( УдаляемаяСтрока) ;
ТаблицаЗначений. Удалить( 0 ) ;
ТаблицаЗначений. Колонки. Удалить( УдаляемаяКолонка) ;
ТаблицаЗначений. Колонки. Удалить( 0 ) ;
СтаршийИндексКолонок = ТаблицаЗначений. Колонки. Количество( ) - 1 ;
Индекс = ТаблицаЗначений. Количество( ) - 1 ;
Пока Индекс > = 0 Цикл
Для Сч = 0 По СтаршийИндексКолонок Цикл
Если ТипЗнч( ТаблицаЗначений[Индекс][Сч]) = Тип( "Число" ) Тогда
ТаблицаЗначений. Удалить( Индекс) ;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Индекс = Индекс - 1 ;
КонецЦикла ;
Категория:
Работа с Таблицей Значений