Функция получение содержимого адреса url (веб-страницы) методом GET // Возвращает содержимое ответа HTTP-сервера, полученного методом GET, в виде строки или двоичных данных
// ** Coded by Sergey (aka Porutchik) * 2014 http://forum.aeroion.ru/cat1.html //
// Параметры
// СерверПриемник - - доменное имя сервера или полный адрес (url) запрашиваемой ссылки.
// Может включать протокол (http://, https://) и порт.
// АдресСтраницы - - опционально. Адрес страницы на сервере без протокола (http://, https://),
// доменного имени сервера (хоста) и порта.
// Если не указано, адрес страницы будет извлечён из параметра СерверПриемник
// ПараметрыСоединения - - опционально. Структура, содержащая дополнительные параметры для HTTPСоединение.
// Назначение ключей:
// Логин или Пользователь - Тип Строка - Имя пользователя на указанном сервере.
// Пароль - Тип Строка - Пароль пользователя на указанном сервере.
// Прокси - Тип ИнтернетПрокси - Прокси, используемый для соединения с сервером.
// Таймаут - Тип Число - Таймаут осуществляемого соединения и операций, в секундах. 0 - не устанавливать таймаут..
// ЗаголовкиHTTP - - опционально.
// Заголовки, которые будут отправлены на сервер в виде соответствия: "Заголовок" - "Значение".
// Если указано, функция возвратит в программу заголовки HTTP-ответа с кодом состояния в ключе StatusCode,
// имя файла в ключе FileName, url-кодированное имя в ключе EncodeFileName
// ПолучитьКакДвоичныеДанные - - опционально. Определяет, в каком виде получить содержимое ответа сервера
// По умолчанию Ложь.
// ЗащищенноеСоединение - - опционально. По умолчанию Ложь.
// Если Истина, соединение будет происходить по протоколу https://
//
// Возвращаемое значение:
// , - содержимое ответа сервера, если ресурс найден по указанному адресу.
//
Функция ПолучитьСодержимоеВебАдреса(Знач СерверПриемник, Знач АдресСтраницы = "",
Знач ПараметрыСоединения = Неопределено, ЗаголовкиHTTP = Неопределено,
Знач ПолучитьКакДвоичныеДанные = Ложь, Знач ЗащищенноеСоединение = Ложь) Экспорт
Перем ИмяФайлаОтветаКодированное, ИмяФайлаОтвета, Порт, Логин, Пользователь, Пароль, Прокси, Таймаут;
Если Не ЗначениеЗаполнено(СерверПриемник) Тогда Возврат Неопределено; КонецЕсли;
Если ТипЗнч(ЗаголовкиHTTP) Тип("Соответствие") Тогда ЗаголовкиHTTP = Новый Соответствие; КонецЕсли;
Если Найти(Нрег(СерверПриемник), "https://") = 1 Тогда ЗащищенноеСоединение = Истина; КонецЕсли;
Протокол = ?(Найти(Нрег(СерверПриемник), "https://") = 1 ИЛИ ЗащищенноеСоединение, "https://", "http://");
Если Лев(НРег(СерверПриемник), СтрДлина(Протокол)) = Протокол Тогда
СерверПриемник = Сред(СерверПриемник, СтрДлина(Протокол) + 1);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(АдресСтраницы) Тогда
Позиция = Найти(СерверПриемник, "/");
Если Позиция > 0 Тогда
АдресСтраницы = Сред(СерверПриемник, Позиция, СтрДлина(СерверПриемник));
СерверПриемник = Лев(СерверПриемник, Позиция - 1);
Иначе
АдресСтраницы = "/";
КонецЕсли;
КонецЕсли;
СерверПриемник = СтрЗаменить(СерверПриемник, "/", "");
//Выделяем порт из доменного имени
ПозицияДвоеточия = Найти(СерверПриемник, ":");
Если ПозицияДвоеточия > 0 Тогда
Порт = Число(Сред(СерверПриемник, ПозицияДвоеточия + 1));
СерверПриемник = Лев(СерверПриемник, ПозицияДвоеточия - 1);
КонецЕсли;
Если ТипЗнч(ПараметрыСоединения) = Тип("Структура") Тогда
Для каждого КлючЗначение из ПараметрыСоединения Цикл
Значение = КлючЗначение.Значение; Выполнить(КлючЗначение.Ключ + " = Значение;");
КонецЦикла;
Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Логин);
КонецЕсли;
НТТР = Новый HTTPСоединение(СерверПриемник, Порт, Пользователь, Пароль, Прокси, Таймаут,
?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено));
//Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
ОтветHTTP = НТТР.Получить(Новый HTTPЗапрос(АдресСтраницы, ЗаголовкиHTTP)); //
ОшибкаЗапроса = (ОтветHTTP.КодСостояния >= 400);
//После получения ответа сервера необходимо проверить статус или код состояния.
//http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.... //Если сервер вернул один из статусов переадресации
//301 Moved Permanently («перемещено навсегда») или 302 Moved Temporarily («перемещено временно»),
//то в этом случае можно попытаться перейти на ресурс, на который переадресовал сервер
Если ОтветHTTP.КодСостояния = 301 или ОтветHTTP.КодСостояния = 302 Тогда
Если ОтветHTTP.Заголовки.Количество() > 0 Тогда
//Адрес страницы переадресации содержится в поле Location заголовка ответа
АдресСтраницы = ОтветHTTP.Заголовки["Location"]; //
Если ЗначениеЗаполнено(АдресСтраницы) Тогда
Если Найти(НРег(АдресСтраницы), "http://") = 0 И Найти(НРег(АдресСтраницы), "https://") = 0 Тогда
АдресСтраницы = ?(Лев(АдресСтраницы, 1) = "/", Сред(АдресСтраницы, 2), АдресСтраницы);
Если Найти(АдресСтраницы, СерверПриемник + "/") = 0 Тогда
АдресСтраницы = Протокол + СерверПриемник + ?(ЗначениеЗаполнено(Порт), ":" + Порт, "") + "/" + АдресСтраницы;
КонецЕсли;
КонецЕсли;
//Если сервер вернул cookies (http://ru.wikipedia.org/wiki/HTTP_cookie, http://www.faqs.org/rfcs/rfc6265.html?#41;, //вставим их в заголовки для передачи на страницу перехода
Куки = ОтветHTTP.Заголовки["Set-Cookie"];//
Если ЗначениеЗаполнено(Куки) Тогда ЗаголовкиHTTP.Вставить("Cookie", Куки); КонецЕсли;
//Рекурсивный вызов
Возврат ПолучитьСодержимоеВебАдреса(АдресСтраницы, , , ЗаголовкиHTTP, ПолучитьКакДвоичныеДанные, ЗащищенноеСоединение);//
КонецЕсли;
КонецЕсли;
ИначеЕсли ОтветHTTP.КодСостояния >= 100 И ОтветHTTP.КодСостояния 0 Тогда
ТипСодержимого = ОтветHTTP.Заголовки["Content-Type"];
//http://ru.wikipedia.org/wiki/Список_MIME-типов Если Найти(ТипСодержимого, "text/") = 1 ИЛИ Найти(ТипСодержимого, "/javascript")
ИЛИ Найти(ТипСодержимого, "+xml") ИЛИ Найти(ТипСодержимого, "/xml") 0 ИЛИ Найти(ТипСодержимого, "/json") 0 Тогда
ПолучитьКакДвоичныеДанные = Ложь;
ИначеЕсли Найти(ТипСодержимого, "image/") = 1 ИЛИ Найти(ТипСодержимого, "video/") = 1
ИЛИ Найти(ТипСодержимого, "application/") = 1 ИЛИ Найти(ТипСодержимого, "audio/") = 1 Тогда
//Если содержимое полученного ответа представляет собой изображение, видео, приложение,
//возвращаем двоичные данные, так как возвращать в виде строки не имеет смысла.
ПолучитьКакДвоичныеДанные = Истина;
КонецЕсли;
//Некоторые сервера возвращают в типе содержимого имя отданного файла, например image/png; name="Имя файла.png"
//или отдают в заголовке Content-Disposition: attachment; filename=Имя файла.png (http://www.http11.ru/post.php?post=2) Если ОтветHTTP.Заголовки["Content-Disposition"] Неопределено Тогда
ТипСодержимого = ОтветHTTP.Заголовки["Content-Disposition"];
КонецЕсли;
ТипСодержимого = СтрЗаменить(СтрЗаменить(ТипСодержимого, """", ""), "'", "");
//в ключе filename*=UTF-8'' содержится url-кодированное имя файла
ПозицияИмениФайла = Найти(ТипСодержимого, "filename*=UTF-8");
Если ПозицияИмениФайла 0 Тогда
ИмяФайлаОтветаКодированное = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("filename*=UTF-8"));
ПозицияДвоеточия = Найти(ИмяФайлаОтветаКодированное, ";");
Если ПозицияДвоеточия 0 Тогда
ИмяФайлаОтветаКодированное = Лев(ИмяФайлаОтветаКодированное, ПозицияДвоеточия - 1);
КонецЕсли;
КонецЕсли;
//в ключе filename= содержится обычное имя файла
ПозицияИмениФайла = Найти(ТипСодержимого, "name=");
Если ПозицияИмениФайла 0 Тогда
ИмяФайлаОтвета = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("name="));
ПозицияДвоеточия = Найти(ИмяФайлаОтвета, ";");
Если ПозицияДвоеточия 0 Тогда
ИмяФайлаОтвета = Лев(ИмяФайлаОтвета, ПозицияДвоеточия - 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЗаголовкиHTTP = ОтветHTTP.Заголовки;
//Добавляем в заголовки ответа код состояния (ответа) HTTP-сервера и имя файла содержимого, если есть.
ЗаголовкиHTTP.Вставить("StatusCode", ОтветHTTP.КодСостояния);
Если ЗначениеЗаполнено(ИмяФайлаОтвета) Тогда ЗаголовкиHTTP.Вставить("FileName", ИмяФайлаОтвета); КонецЕсли;
Если ЗначениеЗаполнено(ИмяФайлаОтветаКодированное) Тогда
ЗаголовкиHTTP.Вставить("EncodeFileName", ИмяФайлаОтветаКодированное);
КонецЕсли;
Если ОшибкаЗапроса ИЛИ НЕ ПолучитьКакДвоичныеДанные Тогда Возврат ОтветHTTP.ПолучитьТелоКакСтроку(); КонецЕсли;
Возврат ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();
КонецФункции // ПолучитьСодержимоеВебАдреса()
//Источник: http://forum.aeroion.ru/topic749.html [/pre]Примеры использования:
// Получение содержимого в виде строки//
СодержимоеАдреса = ПолучитьСодержимоеВебАдреса("
//
ЗаголовкиHTTP = Новый Соответствие;
ЗаголовкиHTTP.Вставить("Referer", "a href="http://some_site.com/" )"="">http://some_site.com/") ;
СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(" Категория: Нет
Получить основной договор контрагента &НаСервере
Процедура НайтиДоговорКонтрАгента(ФормаОрганизация,ФормаКонтрагент)
Сообщить(ФормаКонтрагент);
КАгент = Новый Структура;
КАгент.Вставить("Организация",ФормаОрганизация);
КАгент.Вставить("Контрагент",ФормаКонтрагент);
КАгент.Вставить("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
Сообщить(РегистрыСведений.ОсновныеДоговорыКонтрагента.Получить(ТекущаяДата(),КАгент)[0]);
КонецПроцедуры
Категория:
Регистры Библиотека кода: Сравнить две таблицы значений Код 1C v 8.х
Функция ТаблицыЗначенийРавны(ТаблицаЗначений1, ТаблицаЗначений2) Экспорт
Если ТипЗнч( ТаблицаЗначений1 ) < > Тип( "ТаблицаЗначений" ) ИЛИ ТипЗнч( ТаблицаЗначений2 ) < > Тип( "ТаблицаЗначений" ) Тогда
Возврат Ложь ;
КонецЕсли ;
Если ТаблицаЗначений1 . Количество( ) < > ТаблицаЗначений2 . Количество( ) Тогда
Возврат Ложь ;
КонецЕсли ;
Если ТаблицаЗначений1 . Колонки. Количество( ) < > ТаблицаЗначений2 . Колонки. Количество( ) Тогда
Возврат Ложь ;
КонецЕсли ;
Для каждого Колонка Из ТаблицаЗначений1 . Колонки Цикл
Если ТаблицаЗначений2 . Колонки. Найти( Колонка. Имя) = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Для каждого Колонка Из ТаблицаЗначений2 . Колонки Цикл
Если ТаблицаЗначений1 . Колонки. Найти( Колонка. Имя) = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
СтрокаИндекса = "" ;
Для каждого Колонка Из ТаблицаЗначений1 . Колонки Цикл
Если СтрокаИндекса = "" Тогда
СтрокаИндекса = Колонка. Имя;
Иначе
СтрокаИндекса = СтрокаИндекса+ "," + Колонка. Имя;
КонецЕсли ;
КонецЦикла ;
ТаблицаЗначений2 . Индексы. Добавить( СтрокаИндекса) ;
Для каждого СтрокаТаблицы Из ТаблицаЗначений1 Цикл
СтруктураПоиска = Новый Структура;
Для каждого Колонка Из ТаблицаЗначений1 . Колонки Цикл
СтруктураПоиска. Вставить( Колонка. Имя, СтрокаТаблицы[Колонка. Имя]) ;
КонецЦикла ;
СтрокиТаблицы2 = ТаблицаЗначений2 . НайтиСтроки( СтруктураПоиска) ;
Если СтрокиТаблицы2 . Количество( ) < > 1 Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
СтрокаИндекса = "" ;
Для каждого Колонка Из ТаблицаЗначений2 . Колонки Цикл
Если СтрокаИндекса = "" Тогда
СтрокаИндекса = Колонка. Имя;
Иначе
СтрокаИндекса = СтрокаИндекса+ "," + Колонка. Имя;
КонецЕсли ;
КонецЦикла ;
ТаблицаЗначений1 . Индексы. Добавить( СтрокаИндекса) ;
Для каждого СтрокаТаблицы Из ТаблицаЗначений2 Цикл
СтруктураПоиска = Новый Структура;
Для каждого Колонка Из ТаблицаЗначений2 . Колонки Цикл
СтруктураПоиска. Вставить( Колонка. Имя, СтрокаТаблицы[Колонка. Имя]) ;
КонецЦикла ;
СтрокиТаблицы1 = ТаблицаЗначений1 . НайтиСтроки( СтруктураПоиска) ;
Если СтрокиТаблицы1 . Количество( ) < > 1 Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Категория:
Полезные, Универсальные Функции Как уменьшить вес картинок в базе данных или изменить размер, ширину или высоту картинок? Иногда возникает необходимость обработать фотографии в 1С автоматически, уменьшить вес картинок в килобайтах, за счет удаления из файла не нужной технической информации и сглаживания цветов, или изменить размер, уменьшить картинку пропорционально задав максимальный размер по ширине или высоте.В этом случае можно:1) установить специальные библиотеки в операционной системе для работы с графикой, н-р GFLAx и подключать их как com-объекты2) использовать api сервисов, таких как optipic.io .
Рассмотрим оба варианта:1) Использование GFLAxСкачиваем и устанавливаем библиотеку GFLAx, скачать можно здесь https://www.xnview.com/en/#downloads
Далее её надо зарегистрировать в Windows. Для этого запускаем CMD.exe с правами администратора и набираем: regsrv32 "путь_к_DLL\GFLAx.dll"Далее уже в программе, для пропорционального изменения размера файла до максимального размера в 500 пикселей можно вставить такой код:
Код 1C v 8.х GFLAx = Новый COMОбъект( "GFLAx.GFLAx" ) ;
GFLAx. LoadBitmap( ИмяИсходногоФайла) ;
Ширина = GFLAx. Width;
Высота = GFLAx. Height;
НоваяШирина = Ширина/ Делитель;
НоваяВысота = Высота/ Делитель;
GFLAx. Resize( Цел( НоваяШирина) , Цел( НоваяВысота) ) ;
GFLAx. SaveBitmapИмяВыходногоФайла) ;
Данный способ требует специальных настроек операционной системы, навыков системного администрирования и данный способ не проводит полноценную оптимизацию картинки.Кроме того, на компьютере или сервере, где производиться оптимизация эта библиотека должна быть установлена.2) Использование сервиса optipic.io Подобные сервисы обычно платные, но стоимость использования не высокая, а качество и гибкость существенно выше.
Преимущества использования сервиса optipic.io в проектах 1С:
Легко подключить Не нужно устанавливать дополнительные библиотеки в операционной системе Можно использовать как для оптимизации изображений, так и для изменения размера изображения в пикселях (ресайз) Не зависит от операционной системы и типа используемого клиента Конфигурация будет работать после переезда на другой компьютер или сервер Качество и эффективность сжатия производятся в самом оптимальном виде Использование сервиса можно легко встроить в любой свой проект на 1С. Для этого можно добавить себе функцию, в которую передавать имя файла с исходной картинкой и параметры оптимизации. А в качестве ответа получить имя файла уже оптимизированного сервисом.
Пример такой функции для 1C8:
Код 1C v 8.х Функция ОптимизироватьКартинку(ФайлКартинкиИсходный, Качество=70, НужноИзменятьРазмер=Ложь, МаксимальнаяШирина=1000, МаксимальнаяВысота=1000) Экспорт
ssl = Новый ЗащищенноеСоединениеOpenSSL( Неопределено , Неопределено ) ;
email = "ВашEmail" ;
Пароль = "ВашПароль" ;
Соедиенение = Новый HTTPСоединение( "optipic.io" , , email, Пароль, , , ssl) ;
СкриптНаСайте = "api/compress?quality=" + Качество+ "&from=1c" ;
Если НужноИзменятьРазмер Тогда
СкриптНаСайте = СкриптНаСайте + "&maxwidth=" + Формат( МаксимальнаяШирина, "ЧГ=" ) + "&maxheight=" + Формат( МаксимальнаяВысота, "ЧГ=" ) ;
КонецЕсли ;
НовыйФайлКартинки = ПолучитьИмяВременногоФайла( ) ;
Попытка
Результат = Соедиенение. ОтправитьДляОбработки( ФайлКартинкиИсходный, СкриптНаСайте, НовыйФайлКартинки) ;
Возврат НовыйФайлКартинки;
Исключение
Возврат ФайлКартинкиИсходный;
КонецПопытки ;
КонецФункции
И далее в коде обращаться к данной функции, н-р так
Код 1C v 8.х НовыйФайл = ОптимизироватьКартинку( ФайлКартинкиИсходный, 70 , Истина , 500 , 500 ) ;
Категория:
1С ERP Управление предприятием 2.0 Добавление дополнительных отчетов и обработок в тонком клиенте БП 3.0, ЗУП 3.0, УТ 11 Любой отчет и обработку можно подключить пользователям как дополнительные отчеты или обработки, вот например пункт в БП - Банк:
Добавление происходит через
далее Дополнительные отчеты и обработки , в списке нажмите Создать и Выберите Файл отчета/обработки:
Перед добавлением файл нужно подготовить, дописать в модуль объекта код подключения:
Для обработок код:
Код 1C v 8.3 Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации. Вставить( "Вид" , "ДополнительнаяОбработка" ) ;
ПараметрыРегистрации. Вставить( "Назначение" , Новый СписокЗначений) ;
ПараметрыРегистрации. Вставить( "Наименование" , "Сравнение документов БУХ и УТ" ) ;
ПараметрыРегистрации. Вставить( "Версия" , "1.0" ) ;
ПараметрыРегистрации. Вставить( "БезопасныйРежим" , Истина ) ;
ПараметрыРегистрации. Вставить( "Информация" , "" ) ;
ПараметрыРегистрации. Вставить( "Команды" , Новый СписокЗначений) ;
ТаблицаКоманд = ПолучитьТаблицу_Команд( ) ;
ДобавитьКоманду( ТаблицаКоманд,
"Сравнение документов БУХ и УТ" ,
"Сравнение документов БУХ и УТ" ,
"ОткрытиеФормы" ,
Ложь ,
"" ) ;
ПараметрыРегистрации. Вставить( "Команды" , ТаблицаКоманд) ;
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицу_Команд()
Команды = Новый ТаблицаЗначений;
Команды. Колонки. Добавить( "Представление" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Идентификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Использование" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "ПоказыватьОповещение" , Новый ОписаниеТипов( "Булево" ) ) ;
Команды. Колонки. Добавить( "Модификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "" )
НоваяКоманда = ТаблицаКоманд. Добавить( ) ;
НоваяКоманда. Представление = Представление;
НоваяКоманда. Идентификатор = Идентификатор;
НоваяКоманда. Использование = Использование;
НоваяКоманда. ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда. Модификатор = Модификатор;
КонецПроцедуры
Для отчетов и печатных форм меняйте параметр Вид :
Код 1C v 8.3
ПараметрыРегистрации. Вставить( "Вид" , "ДополнительнаяОбработка" ) ;
Возможные значения этого поля приведу в виде таблицы
Значение поля "Вид" Расположение команды
Расширение
файла
ПечатнаяФорма В меню "Печать" на форме объекта или списка epf ЗаполнениеОбъекта В меню "Заполнить" на форме объекта или списка epf СозданиеСвязанныхОбъектов В меню "Создать на основании" - "Создание связанных объектов.." на форме объекта или списка epf Отчет В меню "Отчеты" на форме объекта или списка erf ДополнительнаяОбработка В списке соответствующих подсистем в меню "Сервис" - "Дополнительные обработки" epf ДополнительныйОтчет В списке соответствующих подсистем в меню "Сервис" - "Дополнительные отчеты" erf
Это поле может принимать одно из значений, возвращаемых функциями в типовых конфигурациях:
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки<Вид>(). Например, для вида "ПечатнаяФорма" есть функция ВидОбработкиПечатнаяФорма().
Категория:
Внешние печатные формы, отчеты и обработк�… Как в excel сохраненный из 1С вставить новый лист? Я думаю, все сталкивались с однолистовым excel файлом из 1С, у которого на первый взгляд, нет возможности добавить листы. Все не так страшно - их просто скрыли или, что чаще всего - даже не отображали (обусловлено созданием файла из стороннего приложения, например 1С)
Решение:
Excel 2003 : Сервис - Параметры - вкладка Вид - Показывать ярлычки листов Excel 2007 : Кнопка Офис - Параметры Excel (Excel Options) - Дополнительно (Advanced) - Показывать ярлычки листов (Show sheet tabs) Excel 2010 : Файл (File) - Параметры (Options) - Дополнительно (Advanced) - Показывать ярлычки листов (Show sheet tabs) Вот и все. Но бывает так, что вы и не увидите их сразу. Если после отображения ярлычков, ярлычки так и не отобразились, следует проверить длину полосы прокрутки и если она является максимальной, то навести указатель мыши на левую границу полосы прокрутки(рис.1) ,
нажать левую кнопку мыши и не отпуская её потянуть вправо(рис.2) .
Ярлычки появятся!
Категория:
Работа с Microsoft Office и OpenOffice Добавление дополнительных отчетов и обработок в управляемом приложении Для добавления отчета или обработки нужно в модуле добавить Функцию СведенияОВнешнейОбработке()
Код 1C v 8.2 УП Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
ПараметрыРегистрации. Вставить( "Вид" , "ДополнительнаяОбработка" ) ;
ПараметрыРегистрации. Вставить( "Назначение" , МассивНазначений) ;
ПараметрыРегистрации. Вставить( "Наименование" , "Выгрузка проводок в БП 2.0" ) ;
ПараметрыРегистрации. Вставить( "БезопасныйРежим" , Истина ) ;
ПараметрыРегистрации. Вставить( "Версия" , "1.0" ) ;
ПараметрыРегистрации. Вставить( "Информация" , "Обработка 'Выгрузка проводок в БП 2.0'" ) ;
ТаблицаКоманд = ПолучитьТаблицуКоманд( ) ;
ДобавитьКоманду( ТаблицаКоманд,
"Выгрузка проводок в БП 2.0" ,
"ВыгрузкапроводоквБП20" ,
"ОткрытиеФормы" ,
Ложь ,
"" ) ;
ПараметрыРегистрации. Вставить( "Команды" , ТаблицаКоманд) ;
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды. Колонки. Добавить( "Представление" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Идентификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "Использование" , Новый ОписаниеТипов( "Строка" ) ) ;
Команды. Колонки. Добавить( "ПоказыватьОповещение" , Новый ОписаниеТипов( "Булево" ) ) ;
Команды. Колонки. Добавить( "Модификатор" , Новый ОписаниеТипов( "Строка" ) ) ;
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "" )
НоваяКоманда = ТаблицаКоманд. Добавить( ) ;
НоваяКоманда. Представление = Представление;
НоваяКоманда. Идентификатор = Идентификатор;
НоваяКоманда. Использование = Использование;
НоваяКоманда. ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда. Модификатор = Модификатор;
КонецПроцедуры
После сохранения приступим к добавлению в программу:
Ставим галку Дополнительные отчеты и обработки
Открываем дополнительные отчеты и обработки и жмем создать, появляется окно выбора файла, после выбора:
Укажите Размещение (в каком разделе отображать данный отчет/обработку) и в списке в колонке Быстрый доступ выберите пользователей, которым будет доступен данный отчет/обработка.
Если при добавлении вы получаете ошибку:
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(2621)}: Поле объекта не обнаружено (ХранилищеВариантов)
Если ВнешнийОбъектМетаданные.ХранилищеВариантов <> Неопределено Тогда
То нужно заменить в модуле объекта, в ф ункции СведенияОВнешнейОбработке() :
Код 1C v 8.2 УП РегистрационныеДанные. Вставить( "Вид" , "ДополнительнаяОтчет" ) ;
на:
РегистрационныеДанные. Вставить( "Вид" , "ДополнительнаяОбработка" ) ;
Категория:
Внешние печатные формы, отчеты и обработк�… Функции сохранения таблицы значений в файл и чтения из файла В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:
П орядок программных действий при выгрузке в файл выглядит так:
Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки); Конвертируем таблицу значений в табличный документ; Сохраняем табличный документ в MXL.
При загрузке таблицы порядок действий такой:
Читаем из файла табличный документ; Конвертируем табличный документ в таблицу значений; Используем эту таблицу значений в своих целях (загружаем в табличную часть).
Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Основные функции для реализации поставленной задачи следующие:
ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Код 1C v 8.3
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1 ;
НачалоСтолбец = 1 ;
КонецЕсли ;
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтрока < ТабДок. ВысотаТаблицы
Цикл
НачалоСтрока = НачалоСтрока + 1 ;
КонецЦикла ;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтолбец < ТабДок. ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1 ;
КонецЦикла ;
КонецЕсли ;
КонецСтрока = ? ( КонецСтрока = Неопределено , ТабДок. ВысотаТаблицы, КонецСтрока) ;
КонецСтолбец = ? ( КонецСтолбец = Неопределено , ТабДок. ШиринаТаблицы, КонецСтолбец) ;
ЭтоТаблица = ( ТипЗнч( СтруктураКолонок) = Тип( "ТаблицаЗначений" ) ) ;
ТабЗначений = ПолучитьТаблицуВывода( СтруктураКолонок) ;
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений. Добавить( ) ;
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ? ( ЭтоТаблица, Колонка. Наименование, Колонка. Ключ) ;
пИндексКолонки = ? ( ЭтоТаблица, Колонка. СтолбецОтчёт, ИндексКолонки) ;
Если ТабДок. Область( ИндексСтроки, пИндексКолонки) . СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Текст;
КонецЕсли ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
КонецЦикла ;
Возврат ТабЗначений;
КонецФункции ;
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли ;
НачалоСтрока = ? ( НачалоСтрока = Неопределено , 1 , НачалоСтрока) ;
НачалоСтолбец = ? ( НачалоСтолбец = Неопределено , 1 , НачалоСтолбец) ;
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Текст = ? ( ПустаяСтрока( Колонка. Заголовок) , Колонка. Имя, Колонка. Заголовок) ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЕсли ;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . СодержитЗначение = Истина ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . ТипЗначения = Новый ОписаниеТипов( Колонка. ТипЗначения) ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Значение = Элемент[Колонка. Имя];
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЦикла ;
Возврат ТабДок;
КонецФункции ;
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок. Прочитать( ИмяФайла) ;
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл1 = ТабДок. Область( 1 , ИндексКолонки) ;
Обл2 = ТабДок. Область( 2 , ИндексКолонки) ;
ИмяКолонки = СокрЛП( Обл1 . Текст) ;
ИмяКолонки = ? ( Найти( ИмяКолонки, " " ) > 0 , СтрЗаменить( ТРег( ИмяКолонки) , " " , "" ) , ИмяКолонки) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл2 = ТабДок. Область( 1 , ИндексКолонки) ;
ИмяКолонки = "К" + Формат( ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0" ) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
КонецЕсли ;
Таблица = ПреобразоватьТДвТЗ( ТабДок, СтруктураКолонок, ? ( ЕстьЗаголовок, 2 , 1 ) , 1 ) ;
Возврат Таблица;
КонецФункции ;
Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт
ТабДок = ПреобразоватьТЗвТД( ТабЗначений, Неопределено , 1 , 1 , ЕстьЗаголовок) ;
ТабДок. Записать( ИмяФайла, ТипФайлаТабличногоДокумента. MXL) ;
КонецПроцедуры ;
Еще небольшой набор функций для вывода таблицы значений в табличный документ. После формирования табличного документа, - сохраняем его в файл mxl.
Табличный документ можно сохранить a файлы следующих типов:
ANSITXT - Текстовый документ DOCX - документ MS Word HTML HTML3 HTML4 HTML5 MXL MXL7 ODS - Файл Open Office PDF - файл Acrobat Readr TXT - Текстовый документ XLS - файл Excel XLS95 - файл Excel95 XLS97 - файл Excel97 XLSX - файл Excel2010
Код 1C v 8.3
Функция ЗагрузитьТЗизФайла(ИмяФайла)
Путь = КаталогВременныхФайлов( ) + ИмяФайла;
Текст = Новый ЧтениеТекста( Путь, КодировкаТекста. UTF8) ;
стрТЗ = Текст. Прочитать( ) ;
Текст. Закрыть( ) ;
ТЗ = ЗначениеИзСтрокиВнутр( стрТЗ) ;
Возврат ТЗ;
КонецФункции
Функция ЗаписьТЗ2ТабДок(записьТЗ,НомерСтроки,ТабличныйДокумент)
НомерКолонки = 1 ;
Символ160 = Символ( 160 ) ;
Для каждого полеТЗ из ЗаписьТЗ цикл
типПоляТЗ = ТипЗнч( полеТЗ) ;
если типПоляТЗ = Тип( "Число" ) тогда
полеТЗ= Строка( полеТЗ) ;
полеТЗ= СтрЗаменить( полеТЗ, Символ160 , "" ) ;
полеТЗ= СтрЗаменить( полеТЗ, "," , "." ) ;
иначеесли типПоляТЗ = Тип( "Строка" ) тогда
иначе
полеТЗ = строка( полеТЗ) ;
КонецЕсли ;
имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = полеТЗ;
НомерКолонки = НомерКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
номерСтроки= 1 ;
номКолонки= 1 ;
ТабличныйДокумент = новый ТабличныйДокумент;
Для НомКол= 0 по ТаблицаЗначений. Колонки. Количество( ) - 1 Цикл
имяКолонки= ТаблицаЗначений. Колонки[НомКол]. Имя;
имяОбласти = "R" + номерСтроки + "C" + номКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = имяКолонки;
ЖирныйШрифт = ? ( ЖирныйШрифт = Неопределено , Новый Шрифт( Ячейка. Шрифт, , , Истина ) , ЖирныйШрифт) ;
Ячейка. Шрифт = ЖирныйШрифт;
номКолонки = номКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
НомСтр= 1 ;
Для каждого записьТЗ из ТаблицаЗначений Цикл
НомСтр = НомСтр + 1 ;
ЗаписьТЗ2 ТабДок( записьТЗ, НомСтр, ТабличныйДокумент) ;
КонецЦикла ;
КонецФункции
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
ТабличныйДокумент = новый ТабличныйДокумент;
НаимКолонок2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
Таблица2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
ТабличныйДокумент. Записать( ФайлMxl, ТипФайлаТабличногоДокумента. MXL) ;
ТабличныйДокумент. Показать( ФайлMxl, ФайлMxl) ;
Возврат 0 ;
КонецФункции
Функция Тест_ВыгрузитьТЗвMxl() ;
файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat" ;
ТЗ = ЗагрузитьТЗизФайла( файл_мТЗИсходныеДанные) ;
ФайлMxl = КаталогВременныхФайлов( ) + СтрЗаменить( файл_мТЗИсходныеДанные, ".dat" , ".mxl" ) ;
ТаблицаЗначений2 Mxl( ТЗ, ФайлMxl) ;
КонецФункции
Тест_ВыгрузитьТЗвMxl( ) ;
Пример выгруженной таблицы значений в файл:
Категория:
Работа с Таблицей Значений Как выгрузить все дополнительные обработки и отчеты в каталог? Выгрузить все дополнительные обработки и отчеты в каталог всего за пару кликов. Простейшая обработка в один реквизит и команду.
Набросайте элементы на форму и вставьте код в модуль формы обработки. И без всякого скачивания.
Работоспособность проверена на БП 3.0, Документооборот 1.4-2.0, платформы 1С 8.3.7, 8.3.8
Код 1C v 8.3 #Область ВыборКаталогаДляВыгрузки
&НаКлиенте
Процедура КаталогВыгрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ДопПараметры = новый Структура;
ДопПараметры. Вставить( "ИмяЭлемента" , "КаталогВыгрузки" ) ;
ОписаниеОповещения = Новый ОписаниеОповещения( "ОбработатьВыборКаталога" , ЭтаФорма, ДопПараметры) ;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. ВыборКаталога) ;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
Если ЗначениеЗаполнено( Объект. КаталогВыгрузки) Тогда
ДиалогОткрытияФайла. Каталог = Объект. КаталогВыгрузки;
КонецЕсли ;
ДиалогОткрытияФайла. Показать( ОписаниеОповещения) ;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборКаталога(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат ;
КонецЕсли ;
Объект[ДополнительныеПараметры. ИмяЭлемента] = ВыбранныеФайлы[0 ];
КонецПроцедуры
#КонецОбласти
#Область НажатиеНаКнопку
&НаКлиенте
Процедура Выгрузить(Команда)
ОчиститьСообщения( ) ;
Если НЕ ЗначениеЗаполнено( Объект. КаталогВыгрузки) Тогда
Сообщить( "Укажите каталог для выгрузки" ) ;
Возврат ;
КонецЕсли ;
Каталог = Новый Файл( Объект. КаталогВыгрузки) ;
Если НЕ Каталог. Существует( ) Тогда
Сообщить( "Указанный каталог не существует" ) ;
Возврат ;
КонецЕсли ;
МассивФайлов = НайтиФайлы( Объект. КаталогВыгрузки, "*.*" ) ;
Если МассивФайлов. Количество( ) > 0 Тогда
ОписаниеОповещения = новый ОписаниеОповещения( "ПодвержденияЗамещения" , ЭтаФорма) ;
ПоказатьВопрос( ОписаниеОповещения, "В каталоге есть файлы. При выгрузке будет выполнение замещение существующих." + Символы. ПС+ "Начать выгрузку?" , РежимДиалогаВопрос. ДаНет) ;
Возврат ;
КонецЕсли ;
ВыгрузкаНачнись( ) ;
КонецПроцедуры
&НаКлиенте
Процедура ПодвержденияЗамещения(ЧтоОтветилПользователь, Параметры) Экспорт
Если ЧтоОтветилПользователь = КодВозвратаДиалога. Да Тогда
ВыгрузкаНачнись( ) ;
Иначе
Возврат ;
КонецЕсли ;
КонецПроцедуры
#КонецОбласти
#Область СамаВыгрузка
&НаКлиенте
Процедура ВыгрузкаНачнись()
ПолучаемыеФайлы = ПодготовимФайлыНаСервере( ЭтаФорма. УникальныйИдентификатор) ;
Обработчик = Новый ОписаниеОповещения( "ОбработкаРезультатаВыгрузки" , ЭтотОбъект) ;
НачатьПолучениеФайлов( Обработчик, ПолучаемыеФайлы, Объект. КаталогВыгрузки, Ложь ) ;
КонецПроцедуры
&НаСервере
Функция ПодготовимФайлыНаСервере(ИдентификаторФормы)
Массив = Новый Массив;
Выборка = Справочники. ДополнительныеОтчетыИОбработки. Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
Если ТипЗнч( Выборка. ХранилищеОбработки) = Тип( "ХранилищеЗначения" ) Тогда
Адрес = ПоместитьВоВременноеХранилище( Выборка. ХранилищеОбработки. Получить( ) , ИдентификаторФормы) ;
Массив. Добавить( Новый ОписаниеПередаваемогоФайла( Выборка. ИмяФайла, Адрес) ) ;
КонецЕсли ;
КонецЦикла ;
Возврат Массив;
КонецФункции
&НаКлиенте
Процедура ОбработкаРезультатаВыгрузки(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
ПоказатьПредупреждение( , "Выгрузка в каталог завершена" , 10 ) ;
КонецПроцедуры
#КонецОбласти
Автор: Михали Задорнов (MZadornov)
Категория:
Внешние печатные формы, отчеты и обработк�… Фоновые задания 1С, примеры работы и параллельного запуска В рамках выполнения проекта столкнулся с интересной задачей ускорения загрузки данных из других информационных баз. Задача загрузки данных предполагала выполнение к внешней базе несвязанных между собой запросов, результаты которых помещаются в одну таблицу значений. Когда на оптимизацию запроса рука уже не поднималась, приступил к ускорению загрузки с помощью распараллеливания процессов. Отмечу, что элементы кода в данном посте приведены для клиент-серверного варианта и укрупнено для общего понимания подхода.
Что у нас в 1с Предприятии 8.2 имеется для распараллеливания & это фоновые задачи . Метод, который будет вызываться в фоновой задаче, должен быть прописан в серверном общем модуле и быть экспортным. Естественно нам понадобиться в фоновую задачу передавать и забирать значения.
В моем случае передача значений в фоновую задачу происходила через параметры. Метод ЗагрузитьИзВИБ имеет два параметра это ВходнойПараметр и АдресВХранилище. ВходнойПараметр это структура, в которую сгружаются все данные, необходимые для проведения загрузки. АдресВХранилище это адрес во временном хранилище, по которому будет передан результат загрузки. Сам код метода фонового задания выглядит так:
Код 1C v 8.х Процедура ЗагрузитьИзВИБ(ВходнойПараметр,АдресВХранилище) Экспорт
ТаблицаДляЗаполнения = ВходнойПараметр. ТаблицаДляЗаполнения;
ДанныеОбъекта = ВходнойПараметр. ДанныеОбъекта;
ВыполнитьЗагрузку( ТаблицаДляЗаполнения, ДанныеОбъекта) ;
ПоместитьВоВременноеХранилище( ТаблицаДляЗаполнения, АдресВХранилище) ;
КонецПроцедуры
Зачем нам в фоновую задачу передавать адрес во временном хранилище. Наша фоновая задача должна куда-то положить результат, причем так чтобы мы знали где его потом взять.
Для того чтобы запустить фоновые задачи выполняется следующий код:
Код 1C v 8.х МассивАдресовВХранилище = Новый Массив;
МассивЗапущенныхЗаданий = Новый Массив;
Сч = 1 ;
Пока Сч < = КоличествоПотоков Цикл
Ключ = Новый УникальныйИдентификатор;
ВходнойПараметр = Новый Структура;
ВходнойПараметр. Вставить( "ТаблицаДляЗаполнения" , ТаблицаДляЗаполнения) ;
ВходнойПараметр. Вставить( "ДанныеОбъекта" , ДанныеОбъекта) ;
АдресВХранилище = ПоместитьВоВременноеХранилище( Неопределено ) ;
МассивПараметров = Новый Массив;
МассивПараметров. Добавить( ВходнойПараметр) ;
МассивПараметров. Добавить( АдресВХранилище) ;
МассивАдресовВХранилище. Добавить( АдресВХранилище) ;
МассивЗапущенныхЗаданий. Добавить( ФоновыеЗадания. Выполнить( "ОбщийМодульСервер.ЗагрузитьИзВИБ" , МассивПараметров, Ключ, "Загрузка" ) ) ;
Сч = Сч + 1 ;
КонецЦикла ;
Перед запуском фоновой задачи через ФоновыеЗадания.Выполнить() мы формируем массив параметров. Значения из массива параметров переходят в метод фонового задания в качестве параметров. В МассивЗапущенныхЗаданий хранятся все фоновые задачи, которые мы запустили. Теперь надо подождать их ожидания.
ФоновыеЗадания.ОжидатьЗавершения(МассивЗапущенныхЗаданий);
После того как все задачи были завершены, можем приступить к получению из них данных. Для этого мы проходим по всем адресам в хранилище, которые хранятся в массиве МассивАдресовВХранилище . После получения результата фонового задания перегоняем его в общую таблицу.
Код 1C v 8.х Для Каждого ТекАдресВХранилище Из МассивАдресовВХранилище Цикл
ТекТаблица = ПолучитьИзВременногоХранилища( ТекАдресВХранилище) ;
Для Каждого ТекСтрокаДанные Из ТекТаблица Цикл
НоваяСтрока = НашаОбщаяТаблица. Добавить( ) ;
ЗаполнитьЗначенияСвойств( НоваяСтрока, ТекСтрокаДанные) ;
КонецЦикла ;
КонецЦикла ;
Вопрос определения оптимального количества потоков выходит за рамки данного поста. А после получения некоторых результатов на рабочих данных пока что выходит и за рамки моего сознания . Но если у вас есть идеи как посчитать нужное количество потоков, пишите в комментариях, с радостью почитаю.
Источник
Категория:
Регламентные задания, Фоновые задания Добавить штрихкод Здравствуйте! Такой вопрос: Как в Отчет с помощью построительОтчета засунуть штрихкод?!
ПолучитьМакетПостротеляОтчета() вот из за него начинаются проблемы. Выдаёт только КоличествоНачальныйОстаток и КоличествоКонечныйОстаток. Я так понял в отчет выводится первая картинка тогда как мне надо третью.
ШТРИХКОД ДОБАВЛЯЮ ТАК
Код 1C v 8.3 ТЗ = ПостроительОтчета. Результат. Выгрузить( ) ;
ТЗ. Колонки. Добавить( "Штрихкод" , , "Штрихкод" ) ;
ПакетДляОтчета = ТЗ;
ОбработкаШК = ВыбираемШК( ТЗ) ;
ПомещаемШКВПакет( ОбработкаШК) ;
ПостроительОтчета. ИсточникДанных = Новый ОписаниеИсточникаДанных( ПакетДляОтчета) ;
ОтборПериодичность = ДобавитьОтборПериодичность( ) ;
ПостроительОтчета. Макет = ПолучитьМакетПостротеляОтчета( ) ;
ПостроительОтчета. МакетОформления = _ПолучитьМакетОформления( ) ;
ПостроительОтчета. ОформитьМакет( ) ;
ПостроительОтчета. Параметры. Вставить( "ДатаНач" , ? ( ДатаНач = Дата( '00010101000000 ') , ДатаНач, Новый Граница( НачалоДня( ДатаНач) , ВидГраницы. Включая) ) ) ;
ПостроительОтчета. Параметры. Вставить( "ДатаКон" , ? ( ДатаКон = Дата( '00010101000000 ') , ДатаКон, Новый Граница( КонецДня( ДатаКон) , ВидГраницы. Включая) ) ) ;
ПостроительОтчета. Параметры. Вставить( "ДатаНачала" , ? ( ДатаНач = Дата( '00010101000000 ') , ДатаНач, НачалоДня( ДатаНач) ) ) ;
ПостроительОтчета. Параметры. Вставить( "ДатаКонца" , ? ( ДатаКон = Дата( '00010101000000 ') , Дата( "39991231" ) , КонецДня( ДатаКон) ) ) ;
ПостроительОтчета. Выполнить( ) ;
ПостроительОтчета. Вывести( ТабличныйДокумент) ;
< br>
Категория:
1С Управление производственным предприят�… ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст= Неопределено Тогда
Если ТипЗнч( рВетка) < > Тип( "ДеревоЗначений" ) Тогда Возврат КонецЕсли ;
Если ТипЗнч( рПараметры) < > Тип( "Структура" ) Тогда рПараметры= Новый Структура КонецЕсли ;
стрКолонок= ? ( рПараметры. Свойство( "Колонки" ) , рПараметры. Колонки, Неопределено ) ;
Если ТипЗнч( стрКолонок) < > Тип( "Структура" ) Тогда стрКолонок= Новый Структура КонецЕсли ;
рПоказыватьУровни= ? ( рПараметры. Свойство( "ПоказыватьУровни" ) , рПараметры. ПоказыватьУровни, Ложь ) ;
рШагОтступа= ? ( рПараметры. Свойство( "ШагОтступа" ) , рПараметры. ШагОтступа, 2 ) ;
рДеревоДляТеста= рВетка;
рЗапись= Новый ЗаписьXML;
рЗапись. УстановитьСтроку( ) ;
СериализаторXDTO. ЗаписатьXML( рЗапись, рДеревоДляТеста) ;
стро= рЗапись. Закрыть( ) ;
стро= СтрЗаменить( стро, "xmlns=" , "xmlns:myns1C=" ) ;
рЧтение= Новый ЧтениеXML;
рЧтение. УстановитьСтроку( стро) ;
постр= Новый ПостроительDOM;
рДокументДОМ= постр. Прочитать( рЧтение) ;
рВыражение= "/ValueTree/row" ; максКолвоУровней= 1 ;
рРазыменователь= Новый РазыменовательПространствИменDOM( рДокументДОМ) ;
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
рРезультат= рДокументДОМ. ВычислитьВыражениеXPath( рВыражение, рДокументДОМ, рРазыменователь, ТипРезультатаDOMXPath. Любой) ;
Если рРезультат. ПолучитьСледующий( ) = Неопределено Тогда Прервать КонецЕсли ;
рВыражение= рВыражение+ "/row" ;
максКолвоУровней= максКолвоУровней+ 1 ;
КонецЦикла ;
максКолвоУровней= максКолвоУровней- 1 ;
строПробелы= " " ;
строРазделители= "===============================================================================================" ;
строОтступы= "___________________________________________________________________________________________" ;
секШапка1 = "|[_HCS" + Лев( строПробелы, максКолвоУровней* рШагОтступа) + "]|" ;
секГорРазделитель1 = "|" + Лев( строОтступы, максКолвоУровней* рШагОтступа+ 6 ) + "|" ;
рШиринаКолонкиИерархии= СтрДлина( секШапка1 ) - 2 ;
строПолейШапки= "#Поле _HCS
| #Выравнивание Центр" ;
строПолейЗаписи= "" ;
Если рПоказыватьУровни Тогда
секШапка1 = секШапка1 + "[_Level]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, 8 ) + "|" ;
строПолейШапки= строПолейШапки+ "
|#Поле _Level
| #Выравнивание Центр" ;
строПолейЗаписи= "#Поле _Level
| #Выравнивание Центр
| #Забивать Истина" ;
КонецЕсли ;
мИменКолонок= Новый Массив;
Для каждого кол Из рВетка. Колонки Цикл
Если стрКолонок. Количество( ) < > 0 и не стрКолонок. Свойство( кол. Имя) Тогда Продолжить КонецЕсли ;
рДлинаИмениКолонки= СтрДлина( кол. Имя) ;
рНужнаяШирина= Макс( ? ( кол. Ширина< 3 , 10 , кол. Ширина) , рДлинаИмениКолонки) ;
секШапка1 = секШапка1 + "[" + кол. Имя+ Лев( строПробелы, рНужнаяШирина- рДлинаИмениКолонки) + "]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, рНужнаяШирина+ 1 ) + "=|" ;
строПолейШапки= строПолейШапки+ "
|#Поле " + кол. Имя+ "
| #Выравнивание Центр" ;
рОписТипов= кол. ТипЗначения;
Если рОписТипов. Типы( ) . Количество( ) = 1 и рОписТипов. СодержитТип( Тип( "Булево" ) ) Тогда
рВыравнивание= "Центр" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Число" ) ) Тогда
рВыравнивание= "Право" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Строка" ) ) и рОписТипов. КвалификаторыСтроки. Длина= 0 Тогда
рВыравнивание= "ПоШирине" ;
Иначе
рВыравнивание= "Лево" ;
КонецЕсли ;
строПолейЗаписи= строПолейЗаписи+ ? ( ПустаяСтрока( строПолейЗаписи) , "" , Символы. ПС) + "#Поле " + кол. Имя+ "
| #Выравнивание " + рВыравнивание;
Попытка
Если ЗначениеЗаполнено( стрКолонок[кол. Имя]) Тогда
строПолейЗаписи= строПолейЗаписи+ "
| #Формат "" " + СокрЛП( стрКолонок[кол. Имя]) + """ " ;
КонецЕсли ;
Исключение
КонецПопытки ;
мИменКолонок. Добавить( кол. Имя) ;
КонецЦикла ;
секШапка2 = СтрЗаменить( СтрЗаменить( секШапка1 , "[" , "<" ) , "]" , ">" ) ;
секЗапись1 = секШапка1 ; секЗапись2 = секШапка2 ;
секГорРазделитель2 = СтрЗаменить( СтрЗаменить( секГорРазделитель1 , "=" , "-" ) , "|" , "+" ) ;
секГорРазделитель1 = СтрЗаменить( секГорРазделитель1 , "_" , "=" ) ;
секГорРазделитель2 = СтрЗаменить( секГорРазделитель2 , "_" , " " ) ;
тМакет= Новый ТекстовыйДокумент;
тМакет. ДобавитьСтроку( "#Область Шапка" ) ;
тМакет. ДобавитьСтроку( строПолейШапки) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( секШапка1 ) ;
тМакет. ДобавитьСтроку( секШапка2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
тМакет. ДобавитьСтроку( "" ) ;
тМакет. ДобавитьСтроку( "#Область Запись" ) ;
тМакет. ДобавитьСтроку( строПолейЗаписи) ;
тМакет. ДобавитьСтроку( секЗапись1 ) ;
тМакет. ДобавитьСтроку( секЗапись2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель2 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
рПараметры. Вставить( "ИсходныйМакет" , тМакет) ;
рТекст= Новый ТекстовыйДокумент;
сек= тМакет. ПолучитьОбласть( "Шапка" ) ;
сек. Параметры. _HCS= "Иерархия" ;
Для каждого имякол Из мИменКолонок Цикл
кол= рВетка. Колонки[имякол];
сек. Параметры[кол. Имя]= ? ( ПустаяСтрока( кол. Заголовок) , кол. Имя, кол. Заголовок) ;
КонецЦикла ;
рТекст. Вывести( сек) ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , тМакет. ПолучитьОбласть( "Запись" ) ) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "Отступ" , 0 ) ;
пар. Вставить( "ШагОтступа" , рШагОтступа) ;
ВывестиДеревоЗначенийВТекст( рВетка, рТекст, пар) ;
Иначе
мИменКолонок= рПараметры. МассивИмёнКолонок;
рСекция= рПараметры. ТекущаяСекция;
рОтступ= рПараметры. Отступ;
рШиринаКолонкиИерархии= рПараметры. ШиринаКолонкиИерархии;
рПоказыватьУровни= рПараметры. ПоказыватьУровни;
строОтступы= "_________________________________________________________________________________________________________" ;
строПробелы= " " ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , рПараметры. ТекущаяСекция) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "ШагОтступа" , рПараметры. ШагОтступа) ;
пар. Вставить( "Отступ" , рОтступ+ рПараметры. ШагОтступа) ;
Для каждого рПодветка Из рВетка. Строки Цикл
рСекция. Параметры. _HCS= Лев( строПробелы, рОтступ) + "\" + Лев( строОтступы, рШиринаКолонкиИерархии- рОтступ- 1 ) ;
Если рПоказыватьУровни Тогда
рСекция. Параметры. _Level= рПодветка. Уровень( ) ;
КонецЕсли ;
Для каждого имякол Из мИменКолонок Цикл
рСекция. Параметры[имякол]= рПодветка[имякол];
КонецЦикла ;
рТекст. Вывести( рСекция) ;
ВывестиДеревоЗначенийВТекст( рПодветка, рТекст, пар)
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( "ВывестиДеревоЗначенийВТекст, ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
КонецПопытки ;
КонецПроцедуры
Источник
Категория:
Работа с Деревом Значений Полезные возможности редактора кода 1С Мне частенько приходится взаимодействовать с 1С-разработчиками, и во время совместной работы над проектами замечаю, что далеко не все из них хорошо знают свой главный инструмент – «Конфигуратор». Причем это не относится к степени крутости девелопера. Как оказалось, даже синьоры пользуются далеко не всеми возможностями «Конфигуратора», а ведь они могут сэкономить кучу времени, а тем самым повысить продуктивность разработчика.
Под катом я решил собрать несколько полезных фишек стандартного конфигуратора, которыми пользуюсь регулярно. Многие из них появились в платформе «1С:Предприятие 8.3.х», поэтому перед тестированием обязательно проверьте номер версии установленной у вас платформы.
Закладки Функция установки в коде закладок появилось еще с первых релизов 8-й версии платформы «1С:Предприятие». Штука чрезвычайно полезная и помогает разработчику быстрей передвигаться по коду. Например, у нас есть большой модуль, в который мы решили добавить ряд функций. Естественно, потом нам предстоит их отлаживать, а соответственно постоянно между ними переключаться.
Хорошо, если новые функции добавлены в самый конец модуля, а если потребовалось расположить в разных частях? Вот тут начинается самое интересное. Одни программисты начинают скролить текст (как правило, этим страдают новички). Более продвинутые применяют поиск по тексту (Ctrl + F ).
Оба способа рабочие, но пользоваться ими долго. Куда правильней использовать функцию «закладки». Например, переходим к какой-нибудь строке. Нажимаем ALT + F2 и получаем закладку (слева от строки отобразиться квадратик).
Убирается закладка тем же сочетанием клавиш. Так вот, закладок может быть в модуле расставлено много. По ним легко передвигаться нажатием клавиши F2. Фича крутая, но она была изначально не доделана и не позволяла, например, передвигаться по закладкам в разных модулях. Это досадное ограничение создавало лишние тормоза для программистов, привыкших к хорошим IDE (например, Visual Studio, PHP Storm).
В версии 8.3 недочет исправили и сделали классную вещь – «Список закладок ». Нажимаем клавиши «Ctrl + Shift + F2 », и перед нами откроется окно с полным списком установленных закладок:
В нем перечислены все закладки в разрезе модулей. Для каждой закладки указан номер строк и доступен перечень действий: перейти к коду, удалить закладку, удалить все закладки.
Таким образом, работать с закладками стало на порядок проще. Еще бы добавили возможность установки горячих клавиш на закладки, и стало бы совсем хорошо. Помню еще со времен «Delphi 6» привык к установке закладок по горячим клавишам Alt + <Цифра> . Наставил закладок и быстро перемещайся по ним.
Группировка строк В «1С:Предприятие» с самого начала была одна большая проблема – отсутствие возможности создавать дополнительные модули для определенных объектов. Например, есть у меня справочник «Контрагенты» и мне хочется разделить его функционал на модули. Допустим, функционала очеееень много. Так вот, в моем распоряжении все равно стандартный набор: Модуль объекта, Модуль менеджера и модуль формы. Понятное дело, что у каждого модуля своя роль, но что делать мне с моими 100500 функциями, которые относятся непосредственно к справочнику «Контрагенты»?
По мнению 1С я должен оформить их в виде общего модуля. С одной стороны, идея классная. Делаем модуль, его сразу видно и т.д., и т.п. Правда всегда есть один нюанс. Если следователь этой методике, то при наличии кучу объектов в конфигурации число общих модулей будет зашкаливать.
Вот взять хотя бы библиотеку БСП. Стоит ее внедрить и в количестве модулей начинает теряться. Я уже молчу про конфигурации, которые построены на базе БСП. Там и сто пятьсот модулей от БСП, и еще столько же специально для конфигурации.
В общем, неудобство налицо (особенно после опыта разработки в языках, где нет подобных ограничений). Увы, спастись от этой проблемы в настоящее время не получится. Зато, мы можем использовать возможности группировки функций/процедур в модулях.+
Например, есть у нас общий модуль «РаботаСКонтрагентами». В нем часть функций отвечают за поиск контрагента, другая часть за загрузку контрагентов из внешних источников и т.д. Чтобы не потеряться во всем этом многообразии возможностей, можно логически сгруппировать все функции/процедуру. Для этого в платформе 8.3 появилась функция под названием «Области». Рассмотрим пример:
Код 1C v 8.3 #Область ПОИСК_КОНТРАГЕНТОВ
Функция ПоискКонтрагентаПоПаспортнымДанным()
КонецФункции
Функция ПоискКонтрагентаПоНаименованию()
КонецФункции
#КонецОбласти
#Область ИМПОРТ_КОНТРАГЕНТОВ
Функция ИмпортКонтрагентаИзExcel()
КонецФункции
Функция ИмпортКонтрагентаИзJSON()
КонецФункции
#КонецОбласти
После добавление областей (язык препроцессора) наш код будет сгруппирован. Если их свернуть (области), то в итоге мы увидим симпатичный комментарий (см. рисунок ниже):
Клик мышкой по плюсику развернет область, и мы увидим свернутые функции. Если хочется сразу развернуть все имеющиеся функции (в пределах области), то кликаем по плюсику удерживая Ctrl.
Вот такая мега удобная вещь и в модулях с большим количеством функций спасает очень даже. В предыдущих версиях платформы было модно использовать для подобных целей блоки комментариев, но управлять/добавлять областями явно удобней.
Форматирование кода Собственно говоря, тут и рассказывать особо нечего – выделяем код, нажимаем «Alt + Shift + F » и редактор попытается привести его в божеский вид в соответствии с вшитым code-style. Функция работает вполне сносно и ей обязательно надо пользоваться. Пишу это потому, что неоднократно видел, как разработчики пытаются отбивать отступы самостоятельно. Это конечно круто, но зачем тратить время, если большую часть работы можно выполнить одной горячей клавишей?
Комментирование Опять же, никаких секретных действий – выделили код, нажали “Ctrl + num /” (слеш на дополнительной области клавиатуры) и получили закомментированный участок. Захотели вернуть обратно? Не беда! Выделяем закомментированный участок кода, нажимаем «Ctrl + Shift + num /» и мгновенно приводим его в боевой режим. Фишка попсовая, но опять же, новички про нее не знают, и тратят кучу времени на расстановку слешей. Да еще и матерят компанию «1С», за отсутствие возможности многострочного комментирования, как в продвинутых язык программирования.
Быстрая вставка специальных символов
Иногда возникает необходимость быстро вставить в редактор специальный символ (которого нет на клавиатуре). В большинстве случаев разработчики используют для этого функции встроенного языка (например, символ). А ведь есть способ проще. Если удерживать клавишу Alt и набрать на доп. клавиатуре код нужного символа (из таблицы ASKII), то он тут же будет вставлен. Например, держим ALT и набираем 65. На выходе получаем букву «А». Или вводим 4 и получаем бубновую масть.
Вставка специальных символов Хорошо, с этим понятно, но какой от этого еще можно получить профит? Лично я, таким образом вставляю символ амперсанда (&). Все знают, что этот символ используется для определения параметров в языке запросов. Неудобство состоит в том, что текст запроса мы пишем на русском языке, а для добавления этого символа перед параметром приходится переключить на английский, затем нажать Shift + 7, а потом вернуться обратно на русский.
Чтобы избавить себя от этой рутиной последовательности действий, я использую выше озвученную функцию. С ее помощью для установки амперсанда требуется лишь набрать с удержанной клавишей «alt» последовательность цифр 38. При этом надобность в двойном переключении языка отпадает.
Многие могут подумать, что я искусственно раздул проблему из ничего, но тут просто дело привычки. Кода приходится писать много и вот такие мелочи немного повышают производительность и избавляют от лишних нажатий клавиши backspace (для удаления случайно набранных символов). Не убедил? Тогда просто выделите время и попробуйте себя переучить
Автор: Игорь Антонов
Категория:
Полезные, Универсальные Функции Скрипт автообновления типовых конфигураций Батник на "языке 1С" для клиент серверных баз, скачивает с сайта ИТС нужное обновление, бекапит базу и обновляет. Подойдет как рабочая заготовка для собственных "обновляторов". В текущем виде все работает. Надо только занести свои переменные.
Код 1C v 8.3
Перем мРасположениеОбновлений;
Перем мИтсЛогин;
Перем мИтсПароль;
Перем home;
Перем DumpIB;
Перем ФайлСписокОбновленийZIP;
Перем ФайлСписокОбновленийXML;
Перем КодВозврата;
Функция ФайлСуществует(Знач ПутьКФайлу) Экспорт
Файл = Новый Файл( ПутьКФайлу) ;
Возврат Файл. Существует( ) ;
КонецФункции
Процедура УстановитьКонстанты()
каталог_tmplts = "D:\tmplts" ;
мИтсЛогин = "---" ;
мИтсПароль = "---" ;
мРасположениеОбновлений = каталог_tmplts + "\1c" ;
home = каталог_tmplts + "\1Cupdate" ;
DumpIB = home + "\DumpIB\" ;
ФайлСписокОбновленийXML = home + "\v8cscdsc.xml" ;
ФайлСписокОбновленийZIP = home + "\v8upd11.zip" ;
Если НЕ ФайлСуществует( home) Тогда
СоздатьКаталог( home) ;
КонецЕсли ;
Если НЕ ФайлСуществует( DumpIB) Тогда
СоздатьКаталог( DumpIB) ;
КонецЕсли ;
Если НЕ ФайлСуществует( мРасположениеОбновлений) Тогда
СоздатьКаталог( мРасположениеОбновлений) ;
КонецЕсли ;
КонецПроцедуры
Функция ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
ПараметрыБазы = Неопределено ;
Попытка
COMОбъект = Новый COMОбъект( "V" + мВерсияПлатформы+ ".COMConnector" ) ;
Исключение
Сообщить( "Не удалось создать COM-объект!" ) ;
Возврат ПараметрыБазы;
КонецПопытки ;
ПутьКБазе = "srvr="" " + СокрЛП( мИмяСервера) + """ ;" + "ref="" " + СокрЛП( мИмяБазы) + """ ;" ;
СтрокаСоединения = ПутьКБазе + "Usr="" " + СокрЛП( мБазаЛогин) + """ ;" + "Pwd="" " + СокрЛП( мБазаПароль) + """ ;" ;
Попытка
V82 = COMОбъект. Connect( СтрокаСоединения) ;
Исключение
Сообщить( СтрокаСоединения) ;
Сообщить( "Внешнее соединение не установлено!" ) ;
Возврат ПараметрыБазы;
КонецПопытки ;
ПараметрыБазы = Новый Структура;
ПараметрыБазы. Вставить( "ТекущаяВерсия" , v82. Метаданные. Версия) ;
ПараметрыБазы. Вставить( "ПутьКПлатформе" , v82. КаталогПрограммы( ) + "1cv8.exe" ) ;
Возврат ПараметрыБазы;
КонецФункции
Процедура УстановитьCOMСоединение(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Попытка
COMОбъект = Новый COMОбъект( "V" + мВерсияПлатформы+ ".COMConnector" ) ;
Исключение
Сообщить( "Не удалось создать COM-объект!" ) ;
Возврат ;
КонецПопытки ;
ПутьКБазе = "srvr="" " + СокрЛП( мИмяСервера) + """ ;" +
"ref="" " + СокрЛП( мИмяБазы) + """ ;" ;
СтрокаСоединения = ПутьКБазе +
"Usr="" " + СокрЛП( мБазаЛогин) + """ ;" +
"Pwd="" " + СокрЛП( мБазаПароль) + """ ;" ;
Сообщить( СтрокаСоединения) ;
Попытка
V82 = COMОбъект. Connect( СтрокаСоединения) ;
Исключение
Сообщить( СтрокаСоединения) ;
Сообщить( "Внешнее соединение не установлено!" ) ;
Возврат ;
КонецПопытки ;
КонецПроцедуры
Функция ВыполнитьЗагрузкуСпискаОбновлений(ИмяФайлаЗагрузки,ТекущаяВерсияКонфигурации)
СообщениеОбОшибке = "Ошибка при чтении файла списка обновлений." ;
Если НЕ ФайлСуществует( ИмяФайлаЗагрузки) Тогда
Сообщить( "Нету XML файла (списка обновлений)" ) ;
Возврат Неопределено ;
КонецЕсли ;
ВерсияДляОбновления = Неопределено ;
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML. ОткрытьФайл( ИмяФайлаЗагрузки) ;
ЧтениеXML. Прочитать( ) ;
ЧтениеXML. Прочитать( ) ;
ЧтениеXML. Прочитать( ) ;
ДатаФормирования = ЧтениеXML. Значение;
ЧтениеXML. Прочитать( ) ;
Пока ЧтениеXML. Прочитать( ) Цикл
Если ЧтениеXML. Имя = "v8u:updateList" Тогда
Прервать ;
Иначе
Конфигурация = ЧтениеXML. ПолучитьАтрибут( "configuration" ) ;
Пока ЧтениеXML. Прочитать( ) Цикл
Если ЧтениеXML. Имя = "v8u:update" Тогда
Прервать ;
Иначе
Если ЧтениеXML. Имя = "v8u:vendor" Тогда
ЧтениеXML. Прочитать( ) ;
Поставщик = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:version" Тогда
ЧтениеXML. Прочитать( ) ;
Версия = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:file" Тогда
ЧтениеXML. Прочитать( ) ;
ПутьКФайлуОбновления = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:size" Тогда
ЧтениеXML. Прочитать( ) ;
РазмерФайлаОбновления = ЧтениеXML. Значение;
ИначеЕсли ЧтениеXML. Имя = "v8u:target" Тогда
ЧтениеXML. Прочитать( ) ;
Если ЧтениеXML. Значение = ТекущаяВерсияКонфигурации Тогда
ВерсияДляОбновления = Версия;
КонецЕсли ;
КонецЕсли ;
ЧтениеXML. Прочитать( ) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Исключение
Сообщить( СообщениеОбОшибке) ;
ЧтениеXML. Закрыть( ) ;
Возврат Неопределено ;
КонецПопытки ;
ЧтениеXML. Закрыть( ) ;
Возврат ВерсияДляОбновления;
КонецФункции
Процедура ПроверитьОбновлениеКонфигурации(мИмяСервера,мИмяБазы,мТипКонфигурации,мВерсияРелиза,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Сообщить( "----------------------------------------------------------------------" ) ;
УдалитьФайлы( ФайлСписокОбновленийXML) ;
УдалитьФайлы( ФайлСписокОбновленийZIP) ;
СерверОбновлений = Новый HTTPСоединение( "downloads.1c.ru" , , мИтсЛогин, мИтсПароль, ) ;
ЗапросКСерверуОбновлений = Новый HTTPЗапрос( "/ipp/ITSREPV/V8Update/Configs/" + мТипКонфигурации+ "/" + мВерсияРелиза+ "/" + мВерсияПлатформы+ "/v8upd11.zip" ) ;
СерверОбновлений. Получить( ЗапросКСерверуОбновлений, ФайлСписокОбновленийZIP) ;
ФайлZip = Новый ЧтениеZipФайла( ФайлСписокОбновленийZIP) ;
ФайлZip. ИзвлечьВсе( home) ;
ФайлZip. Закрыть( ) ;
УдалитьФайлы( ФайлСписокОбновленийZIP) ;
ПараметрыComБазы = ВернутьРелизИПлатформу( мИмяСервера, мИмяБазы, мВерсияПлатформы, мБазаЛогин, мБазаПароль) ;
Если ПараметрыComБазы = Неопределено Тогда
Возврат ;
КонецЕсли ;
ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений( ФайлСписокОбновленийXML, ПараметрыComБазы. ТекущаяВерсия) ;
ТребуетсяОбновление = Ложь ;
Если ВерсияДляОбновления = Неопределено Тогда
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ" ) ;
Возврат ;
КонецЕсли ;
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " update: " + ВерсияДляОбновления) ;
КомандаПакетногоАрхивирования = """ " + ПараметрыComБазы. ПутьКПлатформе + """ " + " CONFIG /S" + мИмяСервера+ "\" + мИмяБазы+ " /N"" " + мБазаЛогин+ """ /P"" " + мБазаПароль+ """ /DumpIB " + DumpIB + мИмяБазы + ".dt /OUT "" " + home+ "\" + мИмяБазы+ ".log"" -NoTruncate" ;
ЗапуститьПриложение( КомандаПакетногоАрхивирования, , Истина , КодВозврата) ;
Если КодВозврата = 0 Тогда
Сообщить( "Резервная копия успешно создана." ) ;
Иначе
Сообщить( "Ошибка при создании резервной копии" ) ;
Возврат ;
КонецЕсли ;
Версия_Для_Обновления = СтрЗаменить( ВерсияДляОбновления, "." , "_" ) ;
Если НЕ ФайлСуществует( мРасположениеОбновлений + "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления+ "\" ) Тогда
Заголовки = Новый Соответствие( ) ;
Заголовки. Вставить( "User-Agent" , "1C+Enterprise/8.2" ) ;
СерверОбновлений = Новый HTTPСоединение( "downloads.v8.1c.ru" , , мИтсЛогин, мИтсПароль, ) ;
СтрокаЗапросHTTP = "/tmplts/1c/" + мТипКонфигурации+ "/" + Версия_Для_Обновления + "/1cv8.zip" ;
Сообщить( СтрокаЗапросHTTP) ;
ЗапросКСерверуОбновлений = Новый HTTPЗапрос( СтрокаЗапросHTTP, Заголовки) ;
СерверОбновлений. Получить( ЗапросКСерверуОбновлений, мРасположениеОбновлений+ "\1cv8.zip" ) ;
ФайлZip = Новый ЧтениеZipФайла( мРасположениеОбновлений+ "\1cv8.zip" ) ;
ФайлZip. ИзвлечьВсе( мРасположениеОбновлений+ "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления) ;
ФайлZip. Закрыть( ) ;
УдалитьФайлы( мРасположениеОбновлений+ "\1cv8.zip" ) ;
КонецЕсли ;
КомандаПакетногоОбновления = """ " + ПараметрыComБазы. ПутьКПлатформе + """ " + " CONFIG /S" + мИмяСервера+ "\" + мИмяБазы+ " /N"" " + мБазаЛогин+ """ /P"" " + мБазаПароль+ """ /UpdateCfg " + мРасположениеОбновлений+ "\" + мТипКонфигурации+ "\" + Версия_Для_Обновления + "\1cv8.cfu /UpdateDBCfg /OUT "" " + home+ "\" + мИмяБазы+ ".log"" -NoTruncate" ;
ЗапуститьПриложение( КомандаПакетногоОбновления, , Истина , КодВозврата) ;
Если КодВозврата = 0 Тогда
Сообщить( "База Успешно обновлена" ) ;
Иначе
Сообщить( "ОШИБКА ПРИ ОБНОВЛЕНИИ" ) ;
Возврат ;
КонецЕсли ;
ПараметрыComБазы = ВернутьРелизИПлатформу( мИмяСервера, мИмяБазы, мВерсияПлатформы, мБазаЛогин, мБазаПароль) ;
Если ПараметрыComБазы = Неопределено Тогда
Возврат ;
КонецЕсли ;
ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений( ФайлСписокОбновленийXML, ПараметрыComБазы. ТекущаяВерсия) ;
ТребуетсяОбновление = Ложь ;
Если ВерсияДляОбновления = Неопределено Тогда
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ" ) ;
Возврат ;
КонецЕсли ;
Сообщить( мИмяБазы + " ver: " + ПараметрыComБазы. ТекущаяВерсия+ " update: " + ВерсияДляОбновления) ;
КонецПроцедуры
УстановитьКонстанты( ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_el" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_spb" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_domx" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_el" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_ip" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_guild" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_lebedeva" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1741" , "bp_porsche" , "Accounting" , "30" , "83" , "Администратор" , "Администратор" ) ;
ПроверитьОбновлениеКонфигурации( "ka1sql1:1641" , "up_service" , "HRM" , "25" , "82" , "Администратор" , "Администратор" ) ;
Источник
Категория:
Администрирование Как установить HTTP соединение через прокси (proxy) сервер В этом посте я покажу несколько примеров HTTP соединения используя прокси сервера:
Общий пример установки параметров прокси:
Код 1C v 8.х
Соединение = Новый HTTPСоединение( "www.mysite.ru" ) ;
Соединение = Новый HTTPСоединение( "www.mysite.ru" , 8080 ) ;
ПроксиСервер = Новый интернетПрокси;
ПроксиСервер. Пользователь = имяПользователя;
ПроксиСервер. Пароль = парольПользователя;
Соединение = Новый HTTPСоединение( "www.mysite.ru" , , , , ПроксиСервер, Истина ) ;
Пример загрузки файла
Код 1C v 8.х
ПроксиСервер = Новый ИнтернетПрокси;
ПроксиСервер. Пользователь = "userfile" ;
ПроксиСервер. Пароль = "12345" ;
ПроксиСервер. Установить( "http" , "10.1.1.23" , "3185" ) ;
СерверИсточник = "shop.com" ;
Адрес = "/price.asp" ;
ИмяВходящегоФайла = "c:\temp\input.html" ;
НТТР = Новый HTTPСоединение( СерверИсточник, , , , ПроксиСервер) ;
НТТР. Получить( Адрес, ИмяВходящегоФайла) ;
ВходящийФайл = Новый Файл( ИмяВходящегоФайла) ;
Вот пример загрузки файла
Код 1C v 8.х //Создаем Файл для отправки
ИмяФайлаHTML = КаталогВременныхФайлов() + “My1cV8bNdr”;
ФайлHTML = Новый ЗаписьТекста(ИмяФайлаHTML, КодировкаТекста.ANSI);
ФайлHTML.ЗаписатьСтроку(”–My1cV8bNdr”);
ФайлHTML.ЗаписатьСтроку(”content-disposition: form-data; name=”"userfile”"; filename=”"test.htm”"”);
ФайлHTML.ЗаписатьСтроку(”Content-Type: text/html”);
ФайлHTML.ЗаписатьСтроку(”");
ФайлHTML.ЗаписатьСтроку(”Дальше вставляем html код.”);
ФайлHTML.ЗаписатьСтроку(”–My1cV8bNdr–”);
ФайлHTML.Закрыть();
// Если необходимо использовать прокси
ПроксиСервер = Новый ИнтернетПрокси();
ПроксиСервер.Сервер(”адрес прокси”);
ПроксиСервер.Порт(”порт прокси”);
ПроксиСервер.Пользователь = “пользователь прокси”;
ПроксиСервер.Пароль = “пароль прокси”;
// Формируем заголовок для запроса
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить(”Content-Type”, “multipart/form-data; boundary=My1cV8bNdr”);
// Устанавливаем соединение и отпровляем запрос
HTTP = Новый HTTPСоединение(”сервер куда соединяемся”, , , , ПроксиСервер);
HTTP.ОтправитьДляОбработки(ИмяФайлаHTML, “/upload.php”, КаталогВременныхФайлов() + “result.htm”, ЗаголовокHTTP);
HTTP = Неопределено;
Категория:
Работа с Интернет, Почтой (Mail), FTP