Функция получение содержимого адреса 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/");
СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(" Категория: Нет
Как декодировать (преобразовать) Unicode в 1С При разработке очередного обмена с интернет магазином через API столкнулисть что сайт возвращает ответ в виде:
Код VBS {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
из кода ясно что это JSON и используя код ПрочитатьJSON
Код 1C v 8.3 Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
В переменной ДанныеЛога будет структура в виде
В результате получилась функция с 2-мя вариантами возрата, в зависимости от того как нужно
Код 1C v 8.3 //Функция читает полученный JSON декадируя текст юникод
Функция ДекодироватьUniCodeВJSON(стрВходящая)
// стрВходящая содержит {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Вариант 1 используя перебор структуры и вывод в текстовую переменную
Текст = "";
Для каждого Элемент Из ДанныеЛога Цикл
//добавим разделитель после предыдущего значения
Текст = Текст + ?(НЕ ПустаяСтрока(Текст), Символы.ПС, "");
//добавим представление ключа и значения:
Текст = Текст + Элемент.Ключ + " = " + Элемент.Значение;
КонецЦикла;
Возврат Текст; //Вернет ok = true description = Статус заказа изменен
// Вариант 2 мспользуя ЗаписьJSON
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
ЗаписатьJSON(Запись, ДанныеЛога,);
Возврат Запись.Закрыть(); // Вернет JSON {"ok":"true","description":"Статус заказа изменен"}
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3 //Параметры: Строка в Юникод (обязательный) Тип: Строка. Исходная строка.
//Возвращаемое значение: Тип: Строка. Строка обработанных символов.
//Описание: Возвращает преобразованную строку из формата Unicod.
//Автор: Александр Кияница (treedo)
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив(66) ;
МасУкр[0]="А"; МасУкр[1]="Б"; МасУкр[2]="В"; МасУкр[3]="Г"; МасУкр[4]="Ґ"; МасУкр[5]="Д";
МасУкр[6]="Е"; МасУкр[7]="Є"; МасУкр[8]="Ж"; МасУкр[9]="З"; МасУкр[10]="И"; МасУкр[11]="І";
МасУкр[12]="Ї"; МасУкр[13]="Й"; МасУкр[14]="К"; МасУкр[15]="Л"; МасУкр[16]="М"; МасУкр[17]="Н";
МасУкр[18]="О"; МасУкр[19]="П"; МасУкр[20]="Р"; МасУкр[21]="С"; МасУкр[22]="Т"; МасУкр[23]="У";
МасУкр[24]="Ф"; МасУкр[25]="Х"; МасУкр[26]="Ц"; МасУкр[27]="Ч"; МасУкр[28]="Ш"; МасУкр[29]="Щ";
МасУкр[30]="Ь"; МасУкр[31]="Ю"; МасУкр[32]="Я";
МасУкр[33]="а"; МасУкр[34]="б"; МасУкр[35]="в"; МасУкр[36]="г"; МасУкр[37]="ґ"; МасУкр[38]="д";
МасУкр[39]="е"; МасУкр[40]="є"; МасУкр[41]="ж"; МасУкр[42]="з"; МасУкр[43]="и"; МасУкр[44]="і";
МасУкр[45]="ї"; МасУкр[46]="й"; МасУкр[47]="к"; МасУкр[48]="л"; МасУкр[49]="м"; МасУкр[50]="н";
МасУкр[51]="о"; МасУкр[52]="п"; МасУкр[53]="р"; МасУкр[54]="с"; МасУкр[55]="т"; МасУкр[56]="у";
МасУкр[57]="ф"; МасУкр[58]="х"; МасУкр[59]="ц"; МасУкр[60]="ч"; МасУкр[61]="ш"; МасУкр[62]="щ";
МасУкр[63]="ь"; МасУкр[31]="ю"; МасУкр[65]="я";
МасКод = Новый Массив(66) ;
МасКод[0]="0410"; МасКод[1]="0411"; МасКод[2]="0412"; МасКод[3]="0413"; МасКод[4]="0490"; МасКод[5]="0414";
МасКод[6]="0415"; МасКод[7]="0404"; МасКод[8]="0416"; МасКод[9]="0417"; МасКод[10]="0418"; МасКод[11]="0406";
МасКод[12]="0407"; МасКод[13]="0419"; МасКод[14]="041A"; МасКод[15]="041B"; МасКод[16]="041C"; МасКод[17]="041D";
МасКод[18]="041E"; МасКод[19]="041F"; МасКод[20]="0420"; МасКод[21]="0421"; МасКод[22]="0422"; МасКод[23]="0423";
МасКод[24]="0424"; МасКод[25]="0425"; МасКод[26]="0426"; МасКод[27]="0427"; МасКод[28]="0428"; МасКод[29]="0429";
МасКод[30]="042C"; МасКод[31]="042E"; МасКод[32]="042F";
МасКод[33]="0430"; МасКод[34]="0431"; МасКод[35]="0432"; МасКод[36]="0413"; МасКод[37]="0491"; МасКод[38]="0434";
МасКод[39]="0435"; МасКод[40]="0454"; МасКод[41]="0436"; МасКод[42]="0437"; МасКод[43]="0438"; МасКод[44]="0456";
МасКод[45]="0457"; МасКод[46]="0439"; МасКод[47]="043A"; МасКод[48]="043B"; МасКод[49]="043C"; МасКод[50]="043D";
МасКод[51]="043E"; МасКод[52]="043F"; МасКод[53]="0440"; МасКод[54]="0441"; МасКод[55]="0442"; МасКод[56]="0443";
МасКод[57]="0444"; МасКод[58]="0445"; МасКод[59]="0446"; МасКод[60]="0447"; МасКод[61]="0448"; МасКод[62]="0449";
МасКод[63]="044C"; МасКод[31]="044E"; МасКод[65]="044F";
тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина(Строка) Цикл
Если Лев(Строка, 1) = "\" Тогда
Если Лев(Строка, 2) = "\u" Тогда
тмпСтрока = Прав(Лев(Строка, 6),4) ;
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав(тмпСтрока, 1) ;
тмпСтрока = СтрЗаменить(тмпСтрока,СтрокаЗамены,ТРег(СтрокаЗамены));
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
Сообщить("Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Строка = Прав(Строка, (СтрДлина(Строка)-6)) ;
Иначе
Строка = Прав(Строка, (СтрДлина(Строка)-2)) ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев(Строка, 1) ;
Строка = Прав(Строка, (СтрДлина(Строка)-1)) ;
КонецЕсли;
КонецЦикла;
Возврат ГотововаяСтрока ;
КонецФункции
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Как строку вида 2023-07-24T15:35:34+03:00 (формат ISO 8601) преобразовать в дату? Стандарт ISO 8601, составлен таким образом, что:
Строка даты-времени сплошная без пробельных разделителей Латинские символы используются в качестве разделителей/идентификаторов: D - дни, Y - годы, Z - идентификатор UTC и т.д., например можно задать промежуток времени: P4Y3M2D1H - 4 года, 3 месяца, 2 дня и 1 час. Буква T выбрана в качестве уникального разделителя времени, остальные буквы латинского алфавита (почти все) задействованы под разные цели и они не пересекаются. Соответственно упрощается парсинг ISO-8601 строки: имеется заранее известный набор флагов/символов/маркеров, опираясь на которые, можно достаточно быстро разбить строку на нужные составляющие и при этом сохраняется требование к human readability самой строки. Конвертация даты из формата ISO8601 в дату 1С:
Код 1C v 8.3 //Простой пример
Дата1С = XMLЗначение(Тип("Дата"), "2023-07-24T15:35:34+03:00");
// еще Функция Возвращает структуру с полями "Дата" и "Миллисекунды", стандартный способ преобразования даты округляет время, а в некоторых случаях важна особая точность
Функция КонвертироватьДатуISO8601ВДату(Дата) Экспорт
КонвертированнаяДата = Новый Структура("Дата, Миллисекунды");
АвтоконвертированнаяДата = XMLЗначение(Тип("Дата"), Дата);
Миллисекунды = Сред(Дата, 21);
Миллисекунды = СокрЛП(СтрЗаменить(Миллисекунды, "Z", ""));
Если НЕ ПустаяСтрока(Миллисекунды) Тогда
ЧислоМиллисекунд = Число(Миллисекунды);
Если ЧислоМиллисекунд >= 500 Тогда
АвтоконвертированнаяДата = АвтоконвертированнаяДата - 1;
КонецЕсли;
КонецЕсли;
КонвертированнаяДата.Дата = АвтоконвертированнаяДата;
КонвертированнаяДата.Миллисекунды = Миллисекунды;
Возврат КонвертированнаяДата;
КонецФункци
Категория:
Работа с Датами (Временем) COM-подключение к базе 7.7 из .NET, .NET Core Инсталяция:> dotnet add package sabatex.V1C77
или добавить через NUGET пакет sabatex.V1C77.
Добавить пространство имен: using sabatex.V1C77;
пример использованя: ---C#
static void Main(string[] args) { // создаём строку соединения var connection = new sabatex.V1C77.Models.Connection { DataBasePath = @"C:\demo\1SBUKRD", // путь к базе PlatformType = sabatex.V1C77.Models.EPlatform1C.V77M, // платформа 1С77 UserName = "Админов", // имя пользователя UserPass = "" // пароль или пустая строка }; // соединяемся с 1С77 // using (var _1c77 = sabatex.V1C77.COMObject1C77.CreateConnection(connection)) { // перебор всего справочника Контрагенты var contr = _1c77.GlobalContext.CreateObject("Справочник.Контрагенты"); if (contr.Method<double>("ВыбратьЭлементы") == 1) { while (contr.Method<double>("ПолучитьЭлемент")==1) { if (contr.Method<double>("ЭтоГруппа") == 1) continue; var name = contr.GetProperty<string>("Наименование"); Console.WriteLine(name); } } } } [/pre] соответствие тип ов данных 1С7.7 и C#
строка - string число - doubl дата - DataTime остальное - V1C77COMObject возможно использовать bool для замены double(0- false;1 - true) тогда выражение сократится к if (contr.Method("ВыбратьЭлементы"))
Категория:
OLE, ActiveX Запрос тип ового счета с пробелом в маске Подскажите пожалуйста, формирую отчет по остаткам сумм на бух счетах.
В запросе необходимо выбрать конкретные счета для вывода остатков.Но план счетов нетип овой, имеются счета, с маской ******** в которых присутствуют пробелы, т.е формат 1110 21, 1030 25 итд.Пробел чем то заменить нельзя. По законодательству только так.
Как в запросе этот пробел проставить? Пробовала и @ и нижнее подчеркивание, но при выводе отчета вылезает ошибка что такого счета нет (с нижним пробелом) или что задано неверное имя атрибута структуры.
Если пишешь слитно счет, тоже не находит
Категория:
1С Бухгалтерия 3.0 Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же утрачен.
На сегодня облачные хранилища часто заменяют физические носители информации. Как правило, облачные хранилища предоставляют бесплатно от 2 до 15 ГБ дискового пространства, кому-то этого будет вполне достаточно.
ПО Effector Saver позволяет настроить периодичное резервное копирование информационной базы 1С в облако. И задать количество хранения файлов резервной копии, отдельно для каждого хранилища.
Таким образом, вы можете установить удобное время для бэкапа и управлять количеством копий базы данных.
Далее в статье рассмотрим как с помощью Effector Saver настроить бэкап информационной базы 1С:Предприятия в облако Яндекс.Диск.
На компьютере где производится настройка, должна быть установлена программа 1С:Предприятие и подключена необходимая база данных.
Скачиваем программу с оф. сайта Скачать Effector Saver
Запускаем файл инсталляции Мастера установки. На последнем этапе Мастера установки, соглашаемся с запуском программы и нажимаем «Завершить » .
На панели инструментов нажимаем «Задачи» «Добавить задачу» .
Выбираем тип новой задачи «Резервное копирование 1С:Предприятие 8» , нажмите «Создать» .
Во вкладке «Подключение к 1С» нажимаем «Выбрать базу 1С:Предприятия из списка и заполнить основные параметры» .
В открывшемся окне «Выбор базы 1С:Предприятия» указываем необходимую базу и нажимаем «Выбрать» .
Поля «Наименование:» , «Исполняемый файл:» , «Вариант базы:» и «Каталог базы:» автоматически заполнятся в соответствии с выбранной базой.
Необходимо только заполнить имя и пароль пользователя указанной базы, под которым будет запускаться резервное копирование средствами Конфигуратора 1С:Предприятия.
Если используете программную лицензию 1С, то установите флаг «Использовать программную лицензию 1С» .
На вкладке «Отключение пользователей» , устанавливаем флаг «Завершить работу пользователей 1С:Предприятия» .
В Effector Saver доступно два варианта завершения работы пользователей:
- если у вас файловой база выберите «Вызвать штатное завершение работы пользователей» ;
- если у вас клиент-серверная база выберите «Завершить сеансы на сервер 1С:Предприятие» . Если в кластере 1С:Предприятия создан пользователь «администратор кластера», установите флажок «Кластер требует авторизации» . Заполните поля: «Имя администратора кластера:» и «Пароль администратора кластера:» . Если порт подключения к Агенту сервера отличный от стандартного, установите флажок «Используется нестандартный порт агента сервера» . Заполните поле «Порт агента сервера:» (по умолчанию 1540).
На следующей вкладке «Хранилище архивов» указываем, где следует хранить создаваемые архивы.
Для добавления нового хранилища архива, нажимаем на кнопку «+» . В открывшемся окне, нажимаем «Создать новое хранилище» .
Из выпадающего списка, выберите, «Яндекс.Диск » . Доступны и другие варианты: Локальная/сетевая папка, FTP/FTPS, WebDAV, Google Диск, Dropbox, OneDrive, Облако Mail.Ru.
Поле «Название:» , оставим как есть. Нажимаем «Авторизация» .
Откроется окно браузера, в котором необходимо ввести логин и пароль для доступа к Яндекс.Диску. Затем нажмите «Разрешить» , после этого окно браузера автоматически закроется.
Далее укажем папку для хранения бэкапа базы 1С, нажимаем на кнопку с тремя точками и выбираем папку, (если папки нет, создайте ее).
Для управления количеством копий базы данных, устанавливаем флаг «Автоматически удалять устаревшие резервные копии» , и заполняем параметр «Хранить количество копий» , например 3. Нажимаем «ОК» .
На следующей вкладке назначим расписание. В поле «Назначить задание:» , выберите нужный интервал времении заполните параметр «Время начала:» .
В верхней части окна настройки устанавливаем флажок «Выполнять задачу по расписанию» и нажимаем кнопку «Сохранить» .
Резервное копирование информационной базы 1С на Яндекс.Диск будет осуществляться автоматически в соответствии с установленным расписанием.
Категория:
Администрирование Автоматическое резервное копирование 1С:Предприятия в облако с помощью ПО Effector Saver Всем известно, для большей гарантии восстановления важных данных, необходимо копировать архивы в несколько мест хранения. Отдельный диск может помочь в случае порчи основного, но в случае если устройство будет потеряно или украдено, он будет так же утрачен.
На сегодня облачные хранилища часто заменяют физические носители информации. Как правило, облачные хранилища предоставляют бесплатно от 2 до 15 ГБ дискового пространства, кому-то этого будет вполне достаточно.
ПО Effector Saver позволяет настроить периодичное резервное копирование информационной базы 1С в облако. И задать количество хранения файлов резервной копии, отдельно для каждого хранилища.
Таким образом, вы можете установить удобное время для бэкапа и управлять количеством копий базы данных.
Далее в статье рассмотрим как с помощью Effector Saver настроить бэкап информационной базы 1С:Предприятия в облако Яндекс.Диск.
На компьютере где производится настройка, должна быть установлена программа 1С:Предприятие и подключена необходимая база данных.
Скачиваем программу с оф. сайта Скачать Effector Saver
Запускаем файл инсталляции Мастера установки. На последнем этапе Мастера установки, соглашаемся с запуском программы и нажимаем «Завершить » .
На панели инструментов нажимаем «Задачи» & «Добавить задачу» .
Выбираем тип новой задачи «Резервное копирование 1С:Предприятие 8» , нажмите «Создать» .
Во вкладке «Подключение к 1С» нажимаем «Выбрать базу 1С:Предприятия из списка и заполнить основные параметры» .
В открывшемся окне «Выбор базы 1С:Предприятия» указываем необходимую базу и нажимаем «Выбрать» .
Поля «Наименование:» , «Исполняемый файл:» , «Вариант базы:» и «Каталог базы:» автоматически заполнятся в соответствии с выбранной базой.
Необходимо только заполнить имя и пароль пользователя указанной базы, под которым будет запускаться резервное копирование средствами Конфигуратора 1С:Предприятия.
Если используете программную лицензию 1С, то установите флаг «Использовать программную лицензию 1С» .
На вкладке «Отключение пользователей» , устанавливаем флаг «Завершить работу пользователей 1С:Предприятия» .
В Effector Saver доступно два варианта завершения работы пользователей:
- если у вас файловой база выберите «Вызвать штатное завершение работы пользователей» ;
- если у вас клиент-серверная база выберите «Завершить сеансы на сервер 1С:Предприятие» . Если в кластере 1С:Предприятия создан пользователь «администратор кластера», установите флажок «Кластер требует авторизации» . Заполните поля: «Имя администратора кластера:» и «Пароль администратора кластера:» . Если порт подключения к Агенту сервера отличный от стандартного, установите флажок «Используется нестандартный порт агента сервера» . Заполните поле «Порт агента сервера:» (по умолчанию 1540).
На следующей вкладке «Хранилище архивов» указываем, где следует хранить создаваемые архивы.
Для добавления нового хранилища архива, нажимаем на кнопку «+» . В открывшемся окне, нажимаем «Создать новое хранилище» .
Из выпадающего списка, выберите, «Яндекс.Диск » . Доступны и другие варианты: Локальная/сетевая папка, FTP/FTPS, WebDAV, Google Диск, Dropbox, OneDrive, Облако Mail.Ru.
Поле «Название:» , оставим как есть. Нажимаем «Авторизация» .
Откроется окно браузера, в котором необходимо ввести логин и пароль для доступа к Яндекс.Диску. Затем нажмите «Разрешить» , после этого окно браузера автоматически закроется.
Далее укажем папку для хранения бэкапа базы 1С, нажимаем на кнопку с тремя точками и выбираем папку, (если папки нет, создайте ее).
Для управления количеством копий базы данных, устанавливаем флаг «Автоматически удалять устаревшие резервные копии» , и заполняем параметр «Хранить количество копий» , например 3. Нажимаем «ОК» .
На следующей вкладке назначим расписание. В поле «Назначить задание:» , выберите нужный интервал времени и заполните параметр «Время начала:» .
В верхней части окна настройки устанавливаем флажок «Выполнять задачу по расписанию» и нажимаем кнопку «Сохранить» .
Резервное копирование информационной базы 1С на Яндекс.Диск будет осуществляться автоматически в соответствии с установленным расписанием.
Категория:
1С ERP Управление предприятием 2.0 Вывести результат формирования СКД в таблицу значений Код 1C v 8.3 Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);
Категория:
Схема Компоновки Данных Отправка почты через Mail.ru с использованием технологии шифрования SSL Часто клиенты просят сделать автоматическую отправку счетов или отчетов на электронную почту, ниже приведены примеры кода для разных версий 1С:
Код 1C v 8.3
//Код для обычного приложения, для управляемого приложения отправка почты так же, только с файлами и предупреждение нужно изменить код
Функция ПолучитьПрофильПочты()
//Создаем профиль либо считываем из справочника
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";//Отправитель.АдресСервераSMTP; //"smtp.mail.ru";
Профиль.АдресСервераPOP3 = "pop.mail.ru"; //Отправитель.АдресСервераPOP3; //"pop.mail.ru";
Профиль.ПортPOP3 = 995;//Отправитель.ПортPOP3; //110;
Профиль.ПортSMTP = 465;//Отправитель.ПортSMTP; //587;
Профиль.Пользователь = "s_v@inbox.ru";// Отправитель.Email; //"test@mail.ru";
Профиль.Пароль = "8mFTnDjC4KftTzh"; //Отправитель.Пароль; //"123456789";
Профиль.ПользовательSMTP = "s_v@inbox.ru";//Отправитель.Email; //"test@mail.ru";
Профиль.ПарольSMTP = "8mFTnDjC4KftTzh";//Отправитель.Пароль; //"123456789";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.ИспользоватьSSLSMTP = Истина;
//Создаем письмо
Возврат Профиль;
КонецФункции
Процедура ОсновныеДействияФормыСчетОтправитьНаПочту(Кнопка)
Если ЗначениеЗаполнено(Ответственный.ПочтаДляОтправкиСчета) Тогда
Почта = Новый ИнтернетПочта;
Письмо = Новый ИнтернетПочтовоеСообщение;
Текст = Письмо.Тексты.Добавить("В приложении счет");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Письмо.Тема = Строка(Ссылка);
Письмо.Отправитель = "s_vmeste@inbox.ru";
Письмо.ИмяОтправителя = "1С";
Письмо.Получатели.Добавить(Ответственный.ПочтаДляОтправкиСчета);
врфайл=ПолучитьИмяВременногоФайла("pdf");
текТабдок=СчетФаксимилеТовары(); //Функция возвращает табличный документ печать счета
текТабдок.Записать(врфайл,ТипФайлаТабличногоДокумента.PDF);
Письмо.Вложения.Добавить(врфайл);
//добавляем вложение если нужно, например "C:\Приложение.doc"
//Вложений можно добавлять сколько требуется.
//Отправляем письмо
Попытка
Почта.Подключиться(ПолучитьПрофильПочты()); Почта.Послать(Письмо); Предупреждение("Письмо отправлено",3);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Закрываем письмо
Почта.Отключиться();
//Закрываем файл вложения
Письмо.Вложения.Очистить();
Иначе
Предупреждение("В настройках ответственного не указана почта для отправки счета");
КонецЕсли;
КонецПроцедуры
С версиями 8.2 сложнее, так как все почтовые сервисы перешли на SSL, а медоты:
Код 1C v 8.3 Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.ИспользоватьSSLSMTP = Истина;
появились только в 8.3.1 , остается использовать stunnel или CDO :
Код 1C v 8.2 УП //Отправка через CDO, Адрессаты через ";"
Функция ПослатьПоПочте(Знач Адрессаты, ТемаСообщения = "",ТекстСообщения = "" ,СписокВложений = "")Экспорт
Оправитель = "s_v@inbox.ru";
Пароль = "8mFTnDjC4KftTzh";
loConfig = Новый COMОбъект("CDO.Configuration");
loCdoMessage = Новый COMОбъект("CDO.Message");
loCdoMessage.Configuration = loConfig;
loCdoMessage.From = Строка("1С <"+Оправитель+">"); //loCdoMessage.From = "Тест 1C"""" <xxxxxxx@yandex.ru>";
loCdoMessage.To = Адрессаты; //loCdoMessage.To = "xxxxxxx@gmail.ru>";
loCdoMessage.Subject = ?(ТемаСообщения="","1С",ТемаСообщения);
loCdoMessage.TextBody = "1C";
HTMLBody = "<html>
|<head>
|<meta content=""text/html; charset=Windows-1251"" http-equiv=""content-type"">
|<title> Тестовое сообщение </title>
|</head>
|<body>
|<h4>" + ТекстСообщения + "</h4>
|<p></p>
|</body>
|</html>";
//loCdoMessage.BodyPart.Charset = "windows-1251";
loCdoMessage.HTMLBody = HTMLBody;
Если ТипЗнч(СписокВложений) = Тип("Строка") И Не СписокВложений = "" Тогда
Попытка
loCdoMessage.AddAttachment(СписокВложений);
Исключение
КонецПопытки;
ИначеЕсли ТипЗнч(СписокВложений) = Тип("СписокЗначений") Тогда
Для каждого ПутьКВложению Из СписокВложений Цикл
Попытка
loCdoMessage.AddAttachment(ПутьКВложению.Значение);
Исключение
КонецПопытки;
КонецЦикла;
КонецЕсли;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing"). Value = 2;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver"). Value = "smtp.mail.ru";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport"). Value = "465";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"). Value = 1;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername"). Value = Оправитель;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword"). Value = Пароль;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl"). Value = 1;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
loConfig.Fields.Update();
Попытка
loCdoMessage.Send();
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Процедура ОсновныеДействияФормыСчетТовары(Кнопка)
Если ЗначениеЗаполнено(Менеджер.ПочтаДляОтправкиСчета) Тогда
врфайл=ПолучитьИмяВременногоФайла("xls");
текТабдок=СчетФаксимилеТовары();
текТабдок.Записать(врфайл,ТипФайлаТабличногоДокумента.XLS);
ПослатьПоПочте(Менеджер.ПочтаДляОтправкиСчета,Строка(Ссылка),"Счет в приложении",врфайл);
Предупреждение("Письмо отправлено",3);
Иначе
Предупреждение("В настройках ответственного не указана почта для отправки счета");
КонецЕсли;
КонецПроцедуры
Через stunnel в 1С код, менять не нужно, только установить программу и изменить настройки подключения к почтовому ящику
Скачиваем stunnel c официального сайта (stunnel.org) и запускаем инсталятор, жмем yes при установке спросит страну и ваши данные, это нужно для создания сертификата на вашем компьютере.
После запуска в трее появится его иконка, правой клавишей и редактировать edit configuration
В блокноте откроется файл настроек, там будет пример для gmail дополняем или заменяем его следующим:
Код Batch File (DOS, CMD, BAT) [gmail-pop3]
client = yes
accept = 127.0.0.1:10110
connect = pop.gmail.com:995
[gmail-imap]
client = yes
accept = 127.0.0.1:10143
connect = imap.gmail.com:993
[gmail-smtp]
client = yes
accept = 127.0.0.1:10025
connect = smtp.gmail.com:465
[yandex-pop3]
client = yes
accept = 127.0.0.1:20110
connect = pop.yandex.ru:995
[yandex-imap]
client = yes
accept = 127.0.0.1:20143
connect = imap.yandex.ru:993
[yandex-smtp]
client = yes
accept = 127.0.0.1:20025
connect = smtp.yandex.ru:465
[mail-pop3]
client = yes
accept = 127.0.0.1:30110
connect = pop.mail.ru:995
[mail-imap]
client = yes
accept = 127.0.0.1:30143
connect = imap.mail.ru:993
[mail-smtp]
client = yes
accept = 127.0.0.1:30025
connect = smtp.mail.ru:465
Сохраняем файл и делаем Reload configuration
В настройка 1С меняем порты для работы
gmail
pop3 10110
imap 10143
smtp 10025
yandex
pop3 20110
imap 20143
smtp 20025
mail
pop3 30110
imap 30143
smtp 30025
Если в коде прописано, то:
Код 1C v 8.х Функция ПолучитьПрофильПочты()
//Создаем профиль либо считываем из справочника
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "localhost";//"smtp.mail.ru";//Отправитель.АдресСервераSMTP; //"smtp.mail.ru";
Профиль.АдресСервераPOP3 = "localhost";//"pop.mail.ru"; //Отправитель.АдресСервераPOP3; //"pop.mail.ru";
Профиль.ПортPOP3 = 30110;//Отправитель.ПортPOP3; //110; 995
Профиль.ПортSMTP = 30025;//Отправитель.ПортSMTP; //587; 465
Профиль.Пользователь = "s_v@inbox.ru";// Отправитель.Email; //"test@mail.ru";
Профиль.Пароль = "8mFTnDjC4KftTzh"; //Отправитель.Пароль; //"123456789";
Профиль.ПользовательSMTP = "s_v@inbox.ru";//Отправитель.Email; //"test@mail.ru";
Профиль.ПарольSMTP = "8mFTnDjC4KftTzh";//Отправитель.Пароль; //"123456789";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
//Профиль.ИспользоватьSSLPOP3 = Истина;
//Профиль.ИспользоватьSSLSMTP = Истина;
//Создаем письмо
Возврат Профиль;
КонецФункции
Все, можно отправлять и проверять работу через консоль Show log window в меню
P.S. Почтовый ящик в примерах не рабочий, как пример
Категория:
Работа с Интернет, Почтой (Mail), FTP Как удалить движения документа программно? Потребовалось в УТ быстро удалить все движения по банку, дело вроде легкое - отменить проведение всех поступлений и списаний безналичных денежных средств, но не тут то было...
При попытке отмены проведения выполнялись проверки на условия оплаты по заказу и документ ни как не отменял проведения
Ну не может тип овым способом, заставим не тип овым: Через запрос делаем выбору необходимых нам документов и в обработке результата пишем:
Код 1C v 8.3 Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
//алгоритм обработки строки результата - начало
ДокОбъект = СтрокаРезультата.Ссылка.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ДокОбъект.Проведен = Ложь;
//ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(режимзаписидокумента.запись);
//алгоритм обработки строки результата - конец
КонецЦикла;
Готовая функция для использования в своих обработках или общем модуле:
Код 1C v 8.3 Процедура УдалитьДвиженияДокумента(Документ)
ДокОбъект = Документ.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Категория:
Документы Библиотека кода: Сравнить две таблицы значений Код 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 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции// СравнитьТаблицыЗначений()
Категория:
Полезные, Универсальные Функции Отправка и получение почты с использованием технологии шифрования SSL Почти все почтовые сервисы перешли на использование SSL и для получения почты нужно использовать IMAP, можно конечно и POP, но это уже прошлый век )
Пример получения почты с mail.ru по IMAP используя SSL:
Код 1C v 8.3 Функция ПолучитьНовыеПисьма() Экспорт
Почта = Новый ИнтернетПочта;
ИспользоватьIMAP=Истина; ПочтовыйЯщик = "";
Профиль = ПолучитьПрофиль();
Попытка
Если ИспользоватьIMAP Тогда
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
Если ПочтовыйЯщик = "" Тогда
ПочтовыйЯщик = "INBOX";
КонецЕсли;
Почта.ТекущийПочтовыйЯщик = ПочтовыйЯщик;
Иначе;
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.POP3);
КонецЕсли;
Исключение
Сообщить(НСтр("ru = 'Ошибка при подключении к почтовому серверу. Проверьте настройки.'"));
Сообщить(ОписаниеОшибки());
Возврат 0;
КонецПопытки;
ЗагруженныеПисьма = ПолучитьИдентификаторыЗагруженныхПисем();
ИдентификаторыНовыхПисем = Почта.ПолучитьИдентификаторы(ЗагруженныеПисьма);
Если ИдентификаторыНовыхПисем.Количество() = 0 Тогда
//Новых нет
Иначе
//Получаем новые письма
Письма = Почта.Выбрать(Ложь, ИдентификаторыНовыхПисем,Истина);
Для каждого Письмо Из Письма Цикл
Если Найти(Письмо.Тема,"siteabc.ru")>0 Тогда //Если это наше письмо то грузим его
ПисьмоОбъект = Справочники.ВходящиеПисьма.СоздатьЭлемент();
ПисьмоОбъект.Идентификатор = Письмо.Идентификатор[0];
ПисьмоОбъект.Наименование = Письмо.Тема;
ПисьмоОбъект.Дата = Письмо.ДатаОтправления;
ПисьмоОбъект.Отправитель = Письмо.Отправитель;
Если ИспользоватьIMAP Тогда
ПисьмоОбъект.ПочтовыйЯщик = "IMAP/" + ПочтовыйЯщик;
Иначе
ПисьмоОбъект.ПочтовыйЯщик = "POP3";
КонецЕсли;
Для каждого Элемент Из Письмо.Тексты Цикл
Если Элемент.ТипТекста = ТипТекстаПочтовогоСообщения.HTML Тогда
ПисьмоОбъект.ВидСодержимого = "HTML";
Текст = Элемент.Текст;
Если Найти(Текст, "<HTML>") = 0 Тогда
Текст = "<HTML><BODY>" + Текст + "</BODY></HTML>";
КонецЕсли;
//Вложения = Новый Массив;
//// обрабатываем вложения, что бы правильно сформировать HTML
//Для каждого Вложение Из Письмо.Вложения Цикл
// Ид = "cid:" + Вложение.Идентификатор;
// Если Найти(Текст, Ид) <> 0 Тогда
// Вложения.Добавить(Вложение);
// КонецЕсли;
//КонецЦикла;
Прервать;
ИначеЕсли Элемент.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст Тогда
ПисьмоОбъект.ВидСодержимого ="Текст";
Текст = Элемент.Текст;
КонецЕсли;
КонецЦикла;
ПисьмоОбъект.Текст = Текст;
ПисьмоОбъект.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
Почта.Отключиться();
Функция ПолучитьПрофиль(ИмяОтправителя = "", ИспользоватьIMAP = Ложь) Экспорт
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.POP3ПередSMTP=Ложь;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP ="siteabcz@mail.ru";
Профиль.ПарольIMAP = "9Ljkuf";
Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
Возврат Профиль;
КонецФункции
Функция ПолучитьИдентификаторыЗагруженныхПисем() Экспорт
Идентификаторы = Новый Массив();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Идентификатор ИЗ Справочник.ВходящиеПисьма";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Идентификаторы.Добавить(Выборка.Идентификатор);
КонецЦикла;
Возврат Идентификаторы;
КонецФункции
/// ЕЩЕ примеры настройки профиля
Функция ПолучитьПрофиль(ИмяОтправителя = "", ИспользоватьIMAP = Ложь) Экспорт
//Профиль = Новый ИнтернетПочтовыйПрофиль;
//Профиль.АдресСервераSMTP = Выборка.АдресSMTPСервера;
//Профиль.ПортSMTP = Выборка.ПортSMTP;
//Профиль.ИспользоватьSSLSMTP = Выборка.SSLSMTP;
//Профиль.ПарольSMTP = Выборка.ПарольSMTP;
//Профиль.ПользовательSMTP = Выборка.ПользовательSMTP;
//Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
//
//Профиль.АдресСервераIMAP = Выборка.АдресIMAPСервера;
//Профиль.ПортIMAP = Выборка.ПортIMAP;
//Профиль.ИспользоватьSSLIMAP = Выборка.SSLIMAP;
//Профиль.ПользовательIMAP = Выборка.ПользовательIMAP;
//Профиль.ПарольIMAP = Выборка.ПарольIMAP;
//Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
//
//Профиль.АдресСервераPOP3 = Выборка.АдресPOP3Сервера;
//Профиль.ПортPOP3 = Выборка.ПортPOP3;
//Профиль.ИспользоватьSSLPOP3 = Выборка.SSLPOP3;
//Профиль.Пароль = Выборка.ПарольPOP3;
//Профиль.Пользователь = Выборка.ПользовательPOP3;
//Профиль.ТолькоЗащищеннаяАутентификацияPOP3 = Ложь;
//
//Профиль.ВремяОжидания = Выборка.ТаймаутИнтернетПочты;
//
//ИмяОтправителя = Выборка.ИмяОтправителяПочтовогоСообщения;
//ИспользоватьIMAP = Выборка.ИспользоватьIMAP;
//
Профиль = Новый ИнтернетПочтовыйПрофиль;
//Профиль.АдресСервераSMTP = "smtp.mail.ru";
//Профиль.ПортSMTP = 465;
//Профиль.ИспользоватьSSLSMTP = Истина;
//Профиль.ПарольSMTP ="9LEY";
//Профиль.ПользовательSMTP = "siteabcz@mail.ru";
//Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Истина;
//Профиль.Пользователь = "siteabcz@mail.ru";
//Профиль.Пароль = "siteabcz";
//Профиль.АдресСервераPOP3 = "pop.mail.ru";
//Профиль.ПортPOP3 = 995;
//Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.POP3ПередSMTP=Ложь;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP ="siteabcz@mail.ru";
Профиль.ПарольIMAP = "siteabcz";
Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
Возврат Профиль;
КонецФункции
//ОБЩИЙ ПРИМЕР ОТПРАВКИ и ПОЛУЧЕНИЯ
Функция ОтправитьПисьмо(EmailОтправителя, ПарольОтправителя,
Порт, АдресСервера, EmailПолучателя,
ИмяПолучателя, ТекстСообщения,
ЗаголовокСообщения, МассивФайловыхПутей)
//ПОЧТОВЫЙ ПРОФИЛЬ
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.АдресСервераSMTP = АдресСервера;
Профиль.ПортSMTP = Порт;
Профиль.Пользователь = EmailОтправителя;
Профиль.Пароль = ПарольОтправителя;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ПарольSMTP = ПарольОтправителя;
Профиль.ПользовательSMTP = EmailОтправителя;
//ПОЧТОВОЕ СООБЩЕНИЕ
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = EmailОтправителя;
Сообщение.Тема = ЗаголовокСообщения;
Сообщение.Тексты.Добавить(ТекстСообщения, ТипТекстаПочтовогоСообщения.HTML);
Сообщение.Организация = "The company";
Адрес = Сообщение.Получатели.Добавить(EmailПолучателя);
Адрес.ОтображаемоеИмя = ИмяПолучателя;
Для каждого ПутьКФайлу Из МассивФайловыхПутей Цикл
Сообщение.Вложения.Добавить(ПутьКФайлу);
КонецЦикла;
// ПОЧТОВЫЙ СЕРВЕР
Почта = Новый ИнтернетПочта();
//Подключение к серверу
Попытка
Почта.Подключиться(Профиль);
Исключение
Сообщить("Ошибка при подключении к серверу: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
//Отправка письма
Попытка
Почта.Послать(Сообщение);
Исключение
Почта.Отключиться();
Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Почта.Отключиться();
Возврат Истина;
КонецФункции
Функция ПолучитьПисьма()
//ПОЧТОВЫЙ ПРОФИЛЬ
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.Пользователь = "xxx@xxxx.xx";
Профиль.Пароль = "xxxxxx";
Профиль.АдресСервераPOP3 = "pop3.mail.ru";
ПРофиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
МассивПисем = Новый массив();
//ПОЛУЧЕНИЕ ПИСЕМ
Попытка
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
МассивПисем = Почта.Выбрать(Ложь);
Исключение
Сообщить("Ошибка получения почты " + ОписаниеОшибки());
КонецПопытки;
Возврат МассивПисем;
КонецФункции
Категория:
Работа с Интернет, Почтой (Mail), FTP Программное создание, заполнение документа и открытие формы (УП, тонкий клиент) Чтобы программно заполнить документ по кнопке, делаем примерно следующее:
1. на форму, в нашем случае документа, добавляем кнопку (Команда и у нее процедура СоздатьПеремещение(Команда))
2. в ее обработчике пишем код создания документа перемещение товаров и заполняем его
Код 1C v 8.3 &НаСервере
Функция СоздатьПеремещениеНаСервере(ДанныеФормы)
ДанныеФормы.Дата=ТекущаяДата();
// ДанныеФормы.Номер="1";
ДанныеФормы.СкладОтправитель = Справочники.Склады.НайтиПоНаименованию("Склад гарантийного обслуживания");
ДанныеФормы.СкладПолучатель = Справочники.Склады.НайтиПоНаименованию("Склад гарантийных");
новСП=Новый СписокЗначений; н=0;
Для Каждого стр из Объект.ДанныеПоГН Цикл
Если стр.ДанныеПроверки=Перечисления.СтатусПроверкиГарантии.зн0 тогда //!В документ перемещение только записи статус=зн0
новСП.Добавить(Строка(стр.НомерЗаводской)); н=н+1;
КонецЕсли;
КонецЦикла;
Если н>0 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугСерии.Серия КАК Серия,
| РеализацияТоваровУслугСерии.Ссылка.Дата КАК ДатаОтгрузки,
| РеализацияТоваровУслугСерии.Ссылка.Контрагент КАК Контрагент,
| РеализацияТоваровУслугСерии.Ссылка КАК Возврат,
| РеализацияТоваровУслугСерии.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(РеализацияТоваровУслугСерии.Серия) КАК СерияСТР
|ИЗ
| Документ.ВозвратТоваровОтКлиента.Серии КАК РеализацияТоваровУслугСерии
|ГДЕ
| РеализацияТоваровУслугСерии.Серия В
| (ВЫБРАТЬ
| СерииНоменклатуры.Ссылка КАК Ссылка
| ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
| ГДЕ
| СерииНоменклатуры.Наименование В (&Наименование))
|
|УПОРЯДОЧИТЬ ПО
| Серия
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Наименование", новСП);
ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
Для каждого стр из новСП Цикл
НайденнаяСтрока=ТаблицаЗапроса.Найти(стр.Значение,"СерияСТР");
Если НайденнаяСтрока = Неопределено Тогда
//нет такого
Иначе
нстр=ДанныеФормы.Товары.Добавить();
нстр.Номенклатура = НайденнаяСтрока.Номенклатура;
нстр.Серия=НайденнаяСтрока.Серия;
нстр.КоличествоУпаковок=1;
нстр.Количество=1;
нстр.СтатусУказанияСерий=2;
нстр.СтатусУказанияСерийОтправитель=2;
нстр.СтатусУказанияСерийПолучатель=2;
нстр=ДанныеФормы.Серии.Добавить();
нстр.Номенклатура = НайденнаяСтрока.Номенклатура;
нстр.Серия=НайденнаяСтрока.Серия;
нстр.Количество=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;
//определяем максимальную сторону по которой будем проводить пропорциональное изменениеДелитель= ?(Ширина>Высота, Делитель=Ширина/500, Делитель=Высота/500);
НоваяШирина = Ширина/Делитель;
НоваяВысота = Высота/Делитель;
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 Пример работы с общим макетом тип а ActiveDocument в клиент-серверном варианте Код 1C v 8.х //**********************************************************************************
//получаем макет на сервере, сохраняем в файл и передаем на клиента
&НаСервере
Функция ПолучитьДанныеМакета()
АдресХранилища = Новый УникальныйИдентификатор();
Макет = ПолучитьОбщийМакет("Договор");
ВременныйФайл = ПолучитьИмяВременногоФайла("doc");
Макет.Записать(ВременныйФайл);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), АдресХранилища);
УдалитьФайлы(ВременныйФайл);
Возврат Адрес;
КонецФункции
//**********************************************************************************
//код сотрудника, нужно для создания уникального имени файла для каждого пользователя
&НаСервере
Функция КодПользователя(Пользователь)
Возврат СокрЛП(Пользователь.Сотрудник.Код);
КонецФункции
//**********************************************************************************
//Ссылка - ссылка на договор(ссылка справочника, нужно для подстановки реквизитов)
//РеквизитыДляПечати - структура с нужными реквизитами
&НаКлиенте
Процедура ПечатьДоговора(Ссылка,РеквизитыДляПечати)
Пользователь = ОбщегоНазначения.ТекущийПользователь();
Каталог = КаталогВременныхФайлов();
Каталог = ?(Прав(Каталог,1) = "\", Каталог, Каталог+"\");
ПолноеИмяФайла = Каталог+"Договор_"+КодПользователя(Пользователь)+".doc";
Попытка
Индификатор = ПолучитьДанныеМакета();
МакетДоговора = ПолучитьИзВременногоХранилища(Индификатор);
МакетДоговора.Записать(ПолноеИмяФайла);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
MSWord = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Ошибка при попытке создать объект ""MS Word""!" + Символы.ПС +
"Возможно приложение ""MS Word"" не установлено или установлено неправильно.", СтатусСообщения.Внимание);
КонецПопытки;
MSWord.Documents.Open(ПолноеИмяФайла);
Попытка
Документ = MSWord.Application.Documents(1);
Документ.Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке, и объект закрывается.
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
MSWord.Application.Quit();
Возврат;
КонецПопытки;
//*******************************************
//тут выполняем замену
Попытка
Замена = Документ.Content.Find;
Замена.Execute("{ЧтоМеняем}", Ложь, Истина, Ложь, , , Истина, , Ложь, "На что меняем");
Исключение
КонецПопытки;
// Делаем видимым приложение и активизируем его.
MSWord.Application.Visible = Истина;
MSWord.Activate();
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice