Функция получение содержимого адреса 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-пакеты Как установить отбор в табличной части программно? Часто требуется в табличной части установить отбор по нужному значению.
Ниже приведены 2 примера:
Код 1C v 8.3 // В ТЧ "Товары" отображать только те строки, у которых в колонке "КолВо" содержится значение 10
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("КолВо", 10);
// При позиционировании на строке ТЧ "Контрагенты" в событии ПриАктивизацииСтроки()
// накладывать отбор на ТЧ "Договоры": отображать только договоры по текущему контрагенту
&НаКлиенте
Процедура КонтрагентыПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Контрагенты.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
// ТЧ Контрагенты пустая
Элементы.Договоры.ОтборСтрок = Неопределено;
Иначе
// Для ТЧ Договоры устанавливаем отбор по текущему контрагенту
ТекущийКонтрагент = ТекущиеДанные.Контрагент;
Элементы.Договоры.ОтборСтрок = Новый ФиксированнаяСтруктура("Контрагент", ТекущийКонтрагент);
КонецЕсли;
КонецПроцедуры
Посмотрите более подробную статью Табличная часть ~ Как настроить отбор строк?
Категория:
Работа с Формой (Диалог) и её элементами Вывод в поле Наименование справочника Штатное список значений из справочника Подразделения? Есть два справочника Штатное и Подразделения. В справочнике Штатное есть автоматически генерируемое поле Наименование. Как программно сделать так чтобы в поле Наименование справочника Штатное выводились списком значений из поля Наименование справочника Подразделения? Я только начал изучать программирование в 1С. Вариант с добавлением в код модуля списка выбора я уже реализовал. Но сами понимаете что это не то. Посмотрите код. Может у кого то решение есть лучше.
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Наименование.РежимВыбораИзСписка = Истина;
Элементы.Наименование.СписокВыбора.Добавить("Администрация");
Элементы.Наименование.СписокВыбора.Добавить("Бухгалтерия");
Элементы.Наименование.СписокВыбора.Добавить("Отдел ИТ");
КонецПроцедуры
&НаКлиенте
Процедура ТЧШтатноеЕдиницыПриИзменении(Элемент)
РассчитатьСуммуТЧШтатное();
КонецПроцедуры
&НаКлиенте
Процедура ТЧШтатноеОкладПриИзменении(Элемент)
РассчитатьСуммуТЧШтатное();
КонецПроцедуры
&НаКлиенте
Процедура ТЧШтатноеСуммаПриИзменении(Элемент)
Стр = Элементы.ТЧШтатное.ТекущиеДанные;
Если Стр.Единицы=0 И Стр.Оклад=0 Тогда
ИначеЕсли Стр.Единицы=0 Тогда
Стр.Единицы=Стр.Сумма / Стр.Оклад;
ИначеЕсли Стр.Оклад=0 Тогда
Стр.Оклад=Стр.Сумма / Стр.Единицы;
Иначе
Стр.Оклад=Стр.Сумма / Стр.Единицы;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьСуммуТЧШтатное()
Стр = Элементы.ТЧШтатное.ТекущиеДанные;
Стр.Сумма = Стр.Единицы * Стр.Оклад;
КонецПроцедуры
&НаКлиенте
Процедура ЕдиницыИтогПриИзменении(Элемент)
Стр = Элементы.Штатное.ТекущиеДанные;
Стр.ЕдиницыИтог = Стр.Единицы + 1;
КонецПроцедуры
&НаКлиенте
Процедура СуммаИтогПриИзменении(Элемент)
Стр = Элементы.Штатное.ТекущиеДанные;
Стр.СуммаИтог = Стр.Сумма + 1;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Объект.ЕдиницыИтог = Объект.ТЧШтатное.Итог("Единицы");
Объект.СуммаИтог = Объект.ТЧШтатное.Итог("Сумма");
КонецПроцедуры
Категория:
Справочники Отправка почты через 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.3
// Часто при создании дополнительных расчетов необходимо в расчете это получить
&НаСервере
Функция СреднемесячноеКоличествоЧасов(Год)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Год",Год);
Запрос.УстановитьПараметр("РабочийДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий);
Запрос.УстановитьПараметр("ПредпраздничныйДень", Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ВЫБОР
| КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня =РабочийДень
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ) КАК ЧислоРабочихДней,
| СУММА(ВЫБОР
| КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня =ПредпраздничныйДень
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ) КАК ЧислоПредпраздничныхДней
|ИЗ
| РегистрСведений.ДанныеПроизводственногоКалендаря КАК РегламентированныйПроизводственныйКалендарь
|ГДЕ
| РегламентированныйПроизводственныйКалендарь.Год =Год";
ВыборкаКалендаря = Запрос.Выполнить().Выбрать();
Если ВыборкаКалендаря.Следующий() тогда
ЧислоРабочихДнейВГоду = ?(ВыборкаКалендаря.ЧислоРабочихДней = NULL, 0, ВыборкаКалендаря.ЧислоРабочихДней);
ЧислоПредпраздничныхДнейВГоду = ?(ВыборкаКалендаря.ЧислоПредпраздничныхДней= NULL, 0, ВыборкаКалендаря.ЧислоПредпраздничныхДней);
Иначе
ЧислоРабочихДнейВГоду = 0;
ЧислоПредпраздничныхДнейВГоду = 0;
КонецЕсли;
СреднеМесячное = Окр((ЧислоРабочихДнейВГоду*8+ЧислоПредпраздничныхДнейВГоду*7)/12,2);
Возврат СреднеМесячное;
КонецФункции
Категория:
1С Зарплата и Управление Персоналом 3.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 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции// СравнитьТаблицыЗначений()
Категория:
Полезные, Универсальные Функции Отправка и получение почты с использованием технологии шифрования 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;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ДанныеФормы;
КонецФункции
&НаКлиенте
Процедура СоздатьПеремещение(Команда)
Форма=ПолучитьФорму("Документ.ПеремещениеТоваров.ФормаОбъекта");
ДанныеФормы=Форма.Объект;
ДанныеФормы=СоздатьПеремещениеНаСервере(ДанныеФормы);
КопироватьДанныеФормы(ДанныеФормы,Форма.Объект);
Форма.Открыть();
КонецПроцедуры
Категория:
Документы Как в УТ 11.3, в справочник номенклатуры добавить остатки на складах и актуальные цены Попросил клиент добавить в справочник номенклатуры остатки и цены на текущий момент. Нужно!? Делаем:
1. Открываем форму списка номенклатуры и в свойства СписокНоменклатуры - Настройка списка
Корректируем запрос добавляя выборку по остаткам склада, новый вариант:
Код 1C v 8.3 ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Ссылка,
СпрНоменклатура.Код КАК Код,
СпрНоменклатура.Наименование КАК Наименование,
СпрНоменклатура.Артикул КАК Артикул,
СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
СпрНоменклатура.Родитель,
ВЫБОР
КОГДА СпрНоменклатура.ЕстьТоварыДругогоКачества
ТОГДА 4 + ВЫБОР
КОГДА СпрНоменклатура.ПометкаУдаления
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ + ВЫБОР
КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
ТОГДА 0
ИНАЧЕ 2
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА СпрНоменклатура.ПометкаУдаления
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ + ВЫБОР
КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
ТОГДА 0
ИНАЧЕ 2
КОНЕЦ
КОНЕЦ КАК ИндексКартинки,
ТоварыНаСкладахОстатки1.ВНаличииОстаток КАК Остаток_Про,
ТоварыНаСкладахОстатки2.ВНаличииОстаток КАК Остаток_Лемм
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(,
Склад =Склад1
) КАК ТоварыНаСкладахОстатки1
ПО (ТоварыНаСкладахОстатки1.Номенклатура = СпрНоменклатура.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(,
Склад =Склад2
) КАК ТоварыНаСкладахОстатки2
ПО (ТоварыНаСкладахОстатки2.Номенклатура = СпрНоменклатура.Ссылка)
ГДЕ
НЕ СпрНоменклатура.ЭтоГруппа
{ГДЕ
(СпрНоменклатура.Ссылка В
(ВЫБРАТЬ
Сегменты.Номенклатура
ИЗ
РегистрСведений.НоменклатураСегмента КАК Сегменты
ГДЕ
Сегменты.Сегмент =СегментНоменклатуры))}
2. Устанавливаем параметры в Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Код 1C v 8.3 СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("Склад1", Справочники.Склады.НайтиПоНаименованию("PRO"));
СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("Склад2", Справочники.Склады.НайтиПоНаименованию("ЛЕММ"));
Цены.Параметры.УстановитьЗначениеПараметра("КонПериода", ТекущаяДата());
Добавляем Динамический список Цены:
В свойствах произвольный запрос:
Код 1C v 8.3 ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЦеныНоменклатурыСрезПоследних.Номенклатура,
ЦеныНоменклатурыСрезПоследних.ВидЦены,
ЦеныНоменклатурыСрезПоследних.Характеристика,
ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&КонПериода, ) КАК ЦеныНоменклатурыСрезПоследних
И для списка номенклатуры пропишем обновление цен при активизации строки
Код 1C v 8.3
Цены.Отбор.Элементы.Очистить();
НовыйЭлементОтбора = Цены.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеОтбора = Новый ПолеКомпоновкиДанных("Номенклатура");
НовыйЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
НовыйЭлементОтбора.Использование = Истина;
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлементОтбора.ПравоеЗначение = ?(Элемент.ТекущиеДанные <> Неопределено, Элемент.ТекущиеДанные.Ссылка,ВернутьЗначениеНоменклатура());
В результате:
Клиент доволен, а это самое главное
Если Вам нужна аналогичная настройка, обращайтесь, контакты тут
Категория:
1С Управление торговлей 11 Как получить координаты выделенной области на Яндекс Карте? На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее:
Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таблица координат
Код инициализации карты и обработчик кнопки получения координат:
Код 1C v 8.х Процедура ИнициализироватьКарту()
ПутьКФайлу = КаталогВременныхФайлов()+"yamaps.html";
Ф = новый Файл(ПутьКФайлу);
Если Ф.Существует() Тогда
УдалитьФайлы(ПутьКФайлу);
КонецЕсли;
Т = новый ТекстовыйДокумент;
ТД = ЭтотОбъект.ПолучитьМакет("МакетЯндекс");
Т.УстановитьТекст(ТД.ПолучитьТекст());
Т.Записать(ПутьКФайлу);
ЭлементыФормы.Эксплорер.Перейти(ПутьКФайлу);
КонецПроцедуры
Процедура ВыполнитьСкрипт(Команда) Экспорт
ЭлементыФормы.Эксплорер.document.getElementById("WebClientOperation").value = Команда;
ЭлементыФормы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
Процедура ПриОткрытии()
ИнициализироватьКарту();
КонецПроцедуры
Процедура ПолучитьКоординатыНажатие(Элемент)
ВыполнитьСкрипт("GetGEO();");
ТекКоординаты=ЭлементыФормы.Эксплорер.document.getElementById("geometry").innerText;
ТекКоординаты=СтрЗаменить(ТекКоординаты,"Координаты: [","");
МассивСтроки = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ТекКоординаты, "], [ ");
Точки.Очистить();
Для Каждого стр из МассивСтроки Цикл
Текстр=СтрЗаменить(стр,"[","");
Текстр=СтрЗаменить(Текстр,"]","");
Текстр=СокрЛП(Текстр);
нСтрок=Точки.Добавить();
симвЗапятой=Найти(Текстр,",");
нСтрок.Широта=Лев(Текстр,симвЗапятой-1);
нСтрок.Долгота=Сред(Текстр,симвЗапятой+2,СтрДлина(Текстр));
КонецЦикла;
//Сообщить(ТекКоординаты);
КонецПроцедуры
Макет
Код VBS <!DOCTYPE html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var index = 1;
var MyMap, route;
var clusterer;
var PointArray = [];
var noclick = false;
ymaps.ready(init);
function init(){
myMap = new ymaps.Map ("map", {
center: [55.75, 37.62],
zoom: 10
}),
polygon = new ymaps.GeoObject({
geometry: {
type: "Polygon",
coordinates: []
}
});
myMap.behaviors.enable('scrollZoom');
myMap.behaviors.disable('dblClickZoom');
myMap.events.add('click', function (e) {
if (!noclick) {
// addMarker(e.get('coords'));
}else{
noclick = false;
}
});
myMap.events.add('drag end', function (e) {
noclick = true;
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
});
// создадим кластеризатор и запретим приближать карту при клике на кластеры
//clusterer = new ymaps.Clusterer({clusterDisableClickZoom: true, synchAdd: true});
//myMap.geoObjects.add(clusterer);
myMap.geoObjects.add(polygon);
polygon.editor.startDrawing();
$('input').attr('disabled', false);
// Обработка нажатия на любую кнопку.
$('input').click(
function () {
// Отключаем кнопки, чтобы на карту нельзя было
// добавить более одного редактируемого объекта (чтобы в них не запутаться).
$('input').attr('disabled', true);
GetGEO();
});
}
function addMarker(coordPosition){
myPlacemark = new ymaps.Placemark(coordPosition, {
// Свойства
// Текст метки
iconContent: 'Точка'+index
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
document.getElementById('CoordX').value = coordPosition[0].toPrecision(15);
document.getElementById('CoordY').value = coordPosition[1].toPrecision(15);
index++;
}
function calcRoute(options){
ymaps.route(options, {
// Опции маршрутизатора
mapStateAutoApply: true, // автоматически позиционировать карту
avoidTrafficJams: false // Учитывать пробки
}).then(
function (router) {
route = router;
myMap.geoObjects.add(route);
//заполняем и сохраняем инфо про маршрут
document.getElementById('RouteInfo').value = "Длина маршрута - " + route.getHumanLength() + ". Время - " + route.getHumanJamsTime();
//генерация события для перехвата в 1С
var evt = document.createEventObject();
document.body.fireEvent('ondatasetcomplete', evt);
},
function (error) {
alert("Возникла ошибка: " + error.message);
});
}
function calcLine(options){
var poly = new ymaps.Polyline(options, {
hintContent: "Маршрут",
balloonContent: "Маршрут экспедитора",
balloonContentHeader: "",
balloonContentBody: "",
balloonContentFooter: ""
}, {
cursor: "pointer",
draggable: false,
hasBalloon: true,
hasHint: true,
interactiveZIndex: false,
opacity: 1,
openBalloonOnClick: true,
openEmptyBalloon: false,
openEmptyHint: false,
openHintOnHover: true,
strokeColor: '#E33926',
strokeOpacity: 0.8,
strokeStyle: '',
strokeWidth: 5,
syncOverlayInit: false,
visible: true
});
myMap.geoObjects.add(poly);
myMap.setBounds(poly.geometry.getBounds());
}
function Reset(){
// Удаляем все геообъекты на карте
myMap.geoObjects.removeAll();
PointArray = [];
index = 1;
}
function ChangeCityMSK(){
myMap.panTo([55.75, 37.62], {
flying: 1
});
}
function ChangeCitySPB(){
myMap.panTo([59.938531, 30.313497], {
flying: 1
});
}
function ChangeCityKRAS(){
myMap.panTo([45.04, 38.97], {
flying: 1
});
}
function ChangePlace(k,d){
myMap.panTo([k, d], {
flying: 1
});
}
function FindAdres(Adres){
Reset();
var myGeocoder = ymaps.geocode(Adres);
myGeocoder.then(
function (res){
var firstGeoObject = res.geoObjects.get(0);
if(firstGeoObject != null){
myMap.panTo(
// Координаты нового центра карты
firstGeoObject.geometry.getCoordinates(), {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(firstGeoObject.geometry.getCoordinates(), {
// Свойства
// Текст метки
iconContent: Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}else{
alert("Ничего не найдено");}
}
);
}
function ReverseSearchAdres(CoordX, CoordY, Adres){
Reset();
var CoordPosition = [CoordX, CoordY];
myMap.panTo(
// Координаты нового центра карты
CoordPosition, {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent: Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}
function addToPointArrayM(CoordX, CoordY, TextC, Text){
var CoordPosition = [CoordX, CoordY];
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent: Text
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: TextC
});
myMap.geoObjects.add(myPlacemark);
}
function addToPointArrayPointOne(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
geometry: {type: "Point", coordinates: [CoordX, CoordY>,
properties: {
clusterCaption: ID,
iconContent: ID,
hintContent: ID,
balloonContent: Text,
balloonContentBody: Text
}
});
myMap.geoObjects.add(point);
}
function addToPointArray(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
geometry: {type: "Point", coordinates: [CoordX, CoordY>,
properties: {
clusterCaption: ID,
iconContent: ID,
hintContent: ID,
balloonContent: Text,
balloonContentBody: Text
}
});
PointArray.push(point);
}
function drawCluster(){
clusterer.add(PointArray);
myMap.geoObjects.add(clusterer);
}
function createPolygon(ArrayPoint, Name, color) {
// Создаем многоугольник
myPolygon = new ymaps.Polygon([
// Координаты вершин внешней границы многоугольника.
ArrayPoint
], {
//Свойства
hintContent: Name
}, {
// Опции.
// Цвет заливки (зеленый)
fillColor: color,
// Цвет границ (синий)
strokeColor: '#0000FF',
// Прозрачность (полупрозрачная заливка)
opacity: 0.6,
// Ширина линии
strokeWidth: 5,
// Стиль линии
strokeStyle: 'shortdash'
});
myMap.geoObjects.add(myPolygon);
}
function WebClientClick() {
//очистка перед кликом координат, иначе после клика в упр. формах идет считывание координат
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
var WebClientOperation = document.getElementById("WebClientOperation").value;
//alert(WebClientOperation);
switch (WebClientOperation) {
case "0": // ничего не делаем
var a = 1;
default: // запускаем функцию
eval(WebClientOperation);
}
document.getElementById('WebClientOperation').value = "0";
}
function GetGEO(){
polygon.editor.stopEditing();
printGeometry(polygon.geometry.getCoordinates());
}
// Выводит массив координат геообъекта в <div id="geometry">
function printGeometry (coords) {
$('#geometry').html('Координаты: ' + stringify(coords));
function stringify (coords) {
var res = '';
if ($.isArray(coords)) {
res = '[ ';
for (var i = 0, l = coords.length; i < l; i++) {
if (i > 0) {
res += ', ';
}
res += stringify(coords[i]);
}
res += ' ]';
} else if (typeof coords == 'number') {
res = coords.toPrecision(6);
} else if (coords.toString) {
res = coords.toString();
}
return res;
}
}
</script>
</head>
<body>
<div id="geometry"/></div>
<div id="map" style="width:100%; height:100%"></div>
<input type="hidden" id="CoordX" name="CoordX" value="0"></input>
<input type="hidden" id="CoordY" name="CoordY" value="0"></input>
<input type="hidden" id="RouteInfo" name="RouteInfo" value=""></input>
<input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0"></input>
<input type="hidden" id="WebClient" name="WebClient" onclick="WebClientClick();"></input>
<!-- <input type="button" value="Завершить редактирование" id="stopEditPolyline"/> -->
</body>
</html>
Категория:
Географическая схема Как найти документ по уникальному идентификатору через com соединение? Потребовалось написать небольшую синхронизацию данных в дополнении к стандартной УТ-БП, нужно по уникальному идентификатору искать документы:
Стандартное Соединение.Справочники.Номенклатура.ПолучитьСсылку(УИ);
Выдает ошибку {Форма.Форма.Форма(301)}: Ошибка при вызове метода контекста (ПолучитьСсылку): Произошла исключительная ситуация: Несоответствие типов (параметр номер '1')
Нужно уникальный идентификатор создавать в com: Соединение.Справочники.Номенклатура.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИ)));
Рабочий пример:
Код 1C v 8.3 &НаСервере
Функция ПодключитьБазуНаСервере(Соединение = "")
Объект.ФайловаяБазаДанных=Ложь;
Объект.Сервер="srv1с";
Объект.База="buh";
Объект.ИмяПользователя="Obmen";
Объект.Пароль="1qaz";
// Подключение к 1С
Если Объект.ФайловаяБазаДанных Тогда
СтрокаПодключения = "file='" + Объект.ПутьКБазе + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
Иначе
СтрокаПодключения = "srvr='" + Объект.Сервер + "'; ref='" + Объект.База + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
КонецЕсли;
Попытка
V8 = Новый COMObject("V83.COMConnector");
Соединение = V8.Connect(СтрокаПодключения);
ЕстьСоединение = Истина;
Исключение
ЕстьСоединение = Ложь;
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат Соединение;
КонецФункции
&НаСервере
Процедура ОбновитьДанныеПлатежейНаСервере()
Соединение = ПодключитьБазуНаСервере();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка КАК Ссылка,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа КАК ОснованиеПлатежа,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Сумма КАК Сумма
|ИЗ
|Документ.ПоступлениеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа
|ГДЕ
|НЕ ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа ССЫЛКА Документ.ЗаказКлиента";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
УИД = ВыборкаДетальныеЗаписи.Ссылка.УникальныйИдентификатор();
СсылкаНаДок = Соединение.Документы.ПоступлениеНаРасчетныйСчет.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИД)));
//Сообщить(СсылкаНаДок.Номер);
Для каждого СтрокаИсточник Из СсылкаНаДок.РасшифровкаПлатежа Цикл
//Сообщить("Счет: "+Строка(СтрокаИсточник.СчетНаОплату.Номер));
УИД = Соединение.String(СтрокаИсточник.СчетНаОплату.УникальныйИдентификатор());
текДок= Документы.ЗаказКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));
Если ЗначениеЗаполнено(текДок) Тогда
Сообщить(текДок);
текОбъект=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
текОбъект.РасшифровкаПлатежа[0].ОснованиеПлатежа= текДок;
текОбъект.РасшифровкаПлатежа[0].Заказ= текДок;
текОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеПлатежей(Команда)
ОбновитьДанныеПлатежейНаСервере();
КонецПроцедуры
Категория:
COM-объекты, WMI, WSH Как в СКД вывести дату и время формирования отчета? Есть несколько вариантов вывода информации перед основным отчетом,какой лучше?! - зависит от задачи:
Допустим нам нужно вывести дату и время формирования отчета и свою шапку отчета, например так:
Варианты решения:
1. Использование группировки и макета заголовка: 1. Создаем в схеме новую группировку (без поля) и установим имя группировке Шапка отчета.
2. Удалим у данной группировки из выбранных полей автополе
В других настройках выберем макет оформления "Без оформления" (иначе на наш макет будет накладываться стандартный макет и вокруг всех ячеек будет рамка)
На вкладке макеты добавляем макет заголовка группировки (при добавлении указываем наше имя группировки (Шапка отчета) и указываем область с нашими данными), справа в табличном документе пишем необходимый текст и параметр
Сохраняем, формируем и видим результат как выше
2. Программное изменение текста заголовка Код нужно установить в процедуре модуля отчета ПриКомпоновкеРезультата()
Код 1C v 8.2 УП ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыВывода.
НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Title"));
ЗначениеПараметра.Значение="Отчет сформирован "+Формат(ТекущаяДата(),"ДЛФ=DDT");
ЗначениеПараметра.Использование = Истина;
еще пример:
Код 1C v 8.3 Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок").Использование = Истина;
КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок").Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить;
КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("Заголовок").Использование = Истина;
КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("Заголовок").Значение = "Пример вывода своего заголовка," + Символы.ПС
+ "Отчет сформирован "+Формат(ТекущаяДата(),"ДЛФ=DDT");
КонецПроцедуры
3. Вывод табличного макета с параметром перед формированием отчета Создаем макет ВыводСформирован , в нем создаем параметр Сформирован и назначаем имя области Заголовок
В модуле перед
Код 1C v 8.х МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
Пишем:
Код 1C v 8.х // получим макет заголовка отчета
МакетЗаголовка = ПолучитьМакет("ВыводСформирован");
ОбластьЗаголовка = МакетЗаголовка.ПолучитьОбласть("Заголовок");
ОбластьЗаголовка.Параметры.Сформирован = "Сформирован: " + Формат(ТекущаяДата(),"ДЛФ=DDT");
//ОбластьЗаголовка.Параметры.Заголовок = ТекстЗаголовка;
ТабличныйДокумент.Вывести(ОбластьЗаголовка);
в результате:
Категория:
Схема Компоновки Данных 17 правил для составления оптимального ЗАПРОСа к данным базы 1С Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получить сложную выборку данных, сгруппированную и отсортированную необходимым образом. Классический пример применения запроса - получение сводки по состоянию регистра накопления на определенный момент времени. Так же, механизм запросов позволяет легко получать информацию в различных временных разрезах.
Текст запроса – это инструкция, в соответствии с которой должен быть выполнен запрос. В тексте запроса описывается:
таблицы информационной базы, используемые в качестве источников данных запроса; поля таблиц, которые требуется обрабатывать в запросе; правила группировки; сортировки результатов; и т. д. Инструкция составляется на специальном языке – языке запросов и состоит из отдельных частей – секций, предложений, ключевых слов, функций, арифметических и логических операторов, комментариев, констант и параметров.
Язык запросов платформы 1С очень похож на синтаксис других SQL-языков, но имеются отличия. Основными преимуществами встроенного языка запросов являются: разыменование полей, наличие виртуальных таблиц, удобная работа с итогами, нетипизированные поля в запросах.
Рекомендации по написанию запросов к базе данных на языке запросов платформы 1С: 1) Текст запроса может содержать предопределенные данные конфигурации, такие как:
значения перечислений; предопределенные данные: справочников; планов видов характеристик; планов счетов; планов видов расчетов; пустые ссылки; значения точек маршрута бизнес-процессов. Также текст запроса может содержать значения системных перечислений, которые могут быть присвоены полям в таблицах базы данных: ВидДвиженияНакопления, ВидСчета и ВидДвиженияБухгалтерии. Обращение в запросах к предопределенным данным конфигурации и значениям системных перечислений осуществляется с помощью литерала функционального типа ЗНАЧЕНИЕ. Данный литерал позволяет повысить удобочитаемость запроса и уменьшить количество параметров запроса.
Пример использования литерала ЗНАЧЕНИЕ :
ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.Москва) ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.ПустаяСсылка) ГДЕ ТипТовара = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга) ГДЕ ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) ГДЕ ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.БизнесПроцесс1.ТочкаМаршрута.Действие1 2) Использование инструкции АВТОУПОРЯДОЧИВАНИЕ в запросе может сильно время выполнения запроса, поэтому, если сортировка не требуется, то лучше вообще ее не использовать. Во большинстве случаях лучше всего применять сортировку с помощью инструкции УПОРЯДОЧИТЬ ПО .
Автоупорядочивание работает по следующим принципам:
Если в запросе было указано предложение УПОРЯДОЧИТЬ ПО, то каждая ссылка на таблицу, находящаяся в этом предложении, будет заменена полями, по которым по умолчанию сортируется таблица (для справочников это код или наименование, для документов – дата документа). Если поле для упорядочивания ссылается на иерархический справочник, то будет применена иерархическая сортировка по этому справочнику. Если в запросе отсутствует предложение УПОРЯДОЧИТЬ ПО, но есть предложение ИТОГИ, тогда результат запроса будет упорядочен по полям, присутствующим в предложении ИТОГИ после ключевого слова ПО, в той же последовательности и, в случае если итоги рассчитывались по полям – ссылкам, то по полям сортировки по умолчанию таблиц, на которые были ссылки. Если в запросе отсутствуют предложения УПОРЯДОЧИТЬ ПО и ИТОГИ, но есть предложение СГРУППИРОВАТЬ ПО, тогда результат запроса будет упорядочен по полям, присутствующим в предложении, в той же последовательности и, в случае если группировка велась по полям – ссылкам, то по полям сортировки по умолчанию таблиц, на которые были ссылки. В случае же, если в запросе отсутствуют предложения и УПОРЯДОЧИТЬ ПО, ИТОГИ и СГРУППИРОВАТЬ ПО, результат будет упорядочен по полям сортировки по умолчанию для таблиц, из которых выбираются данные, в порядке их появления в запросе. В случае, если запрос содержит предложение ИТОГИ, каждый уровень итогов упорядочивается отдельно. 3) Что бы избежать повторного запроса к базе данных при выводе результата запроса пользователю (например, построение запроса или отображение результата запроса с помощью табличного документа) полезно использовать инструкцию ПРЕДСТАВЛЕНИЕССЫЛКИ , которая позволяет получать представление ссылочного значения. Пример:
Код 1C v 8.х ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕССЫЛКИ(РасходнаяНакладнаяСостав.Номенклатура) КАК НоменклатураПредставление<br>
Так же возможно использование инструкции ПРЕДСТАВЛЕНИЕ - предназначена для получения строкового представления значения произвольного типа. Отличие этих инструкций в том, что в первом случае, если инструкции передать ссылку, результатом будет строка, В остальных случаях результатом будет значение переданного параметра. Во втором случае, результатом инструкции всегда будет строка!
4) Если в запросе имеется поле с составным типом, то для таких полей возникает необходимость привести значения поля к какому-либо определенному типу с помощью инструкции ВЫРАЗИТЬ , что позволит убрать лишние таблицы из левого соединения с полем составного типа данных и ускорить выполнение запроса. Пример:
Имеется регистра накопления ОстаткиТоваров, у которого поле Регистратор имеет составной тип. В запросе выбираются Дата и Номер документов ПоступлениеТоваров, при этом при обращении к реквизитам документа через поле Регистратор не происходит множество левых соединений таблицы регистра накопления с таблицами документов-регистраторов.
Код 1C v 8.х ВЫБРАТЬ
ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров).Номер КАК НомерПоступления,
ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров).Дата КАК ДатаПоступления
ИЗ
РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров<br>
Если приведение типа считается не осуществимым, то результатом приведения типа будет значение NULL .
5) Не стоит забывать про инструкцию РАЗРЕШЕННЫЕ , которая означает, что запрос выберет только те записи, на которые у текущего пользователя есть права. Если данное слово не указать, то в случае, когда запрос выберет записи, на которые у пользователя нет прав, запрос отработает с ошибкой.
6) В случае, если в запросе используется объединение, и в некоторых частях объединения присутствуют вложенные таблицы (документ с табличной частью), а в некоторых нет, возникает необходимость дополнения списка выборки полями – пустыми вложенными таблицами. Делается это при помощи ключевого слова ПУСТАЯТАБЛИЦА , после которого в скобках указываются псевдонимы полей, из которых будет состоять вложенная таблица. Пример:
Код 1C v 8.х // Выбрать поля Номер и Состав
// из виртуальной таблицы Документ.РасхНакл
ВЫБРАТЬ Ссылка.Номер, ПУСТАЯТАБЛИЦА.(Ном, Тов, Кол) КАК Состав
ИЗ Документ.РасхНакл
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка.Номер, Состав.(НомерСтроки, Товар, Количество)
ИЗ Документ.РасхНакл Документ.РасходнаяНакладная.Состав.*<br>
7) Что бы в результат запроса не попали повторяющиеся строки, следует использовать инструкцию РАЗЛИЧНЫЕ , потому что так нагляднее и понятнее, а инструкция СГРУППИРОВАТЬ ПО применяется для группировки с помощью агрегатных функций. Ксати, при использовании агрегатных функций предложение СГРУППИРОВАТЬ ПО может быть и не указано совсем, при этом все результаты запроса будут сгруппированы в одну единственную строку. Пример:
Код 1C v 8.х // Необходимо узнать, каким вообще контрагентам
// отгружался товар за период.
Выбрать Различные
Документ.РасходнаяНакладная.Контрагент<br>
8) Инструкция СГРУППИРОВАТЬ ПО позволяет обращаться к полям верхнего уровня, без группировки результатов по этим полям, если агрегатные функции применены к полям вложенной таблицы. Хотя в справке 1С написано, при группировке результатов запроса в списке полей выборки обязательно должны быть указаны агрегатные функции, а помимо агрегатных функций в списке полей выборки допускается указывать только поля, по которым осуществляется группировка. Пример:
Код 1C v 8.х ВЫБРАТЬ
ПоступлениеТоваровИУслуг.Товары.(СУММА(Количество),Номенклатура),
ПоступлениеТоваровИУслуг.Ссылка,
ПоступлениеТоваровИУслуг.Контрагент
ИЗ
Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
СГРУППИРОВАТЬ ПО
ПоступлениеТоваровИУслуг.Товары.(Номенклатура)<br>
9) Инструкция ЕСТЬNULL предназначена для замены значения NULL на другое значение, но не забываем, что второй параметр будет преобразован к типу первого в случае, если тип первого параметра является строкой или числом.
10) При обращении к главной таблице можно в условии обратиться к данным подчиненной таблицы. Такая возможность называется разыменование полей подчиненной таблицы.
Пример (поиск документов, содержащих в табличной части определенный товар):
Код 1C v 8.х ВЫБРАТЬ
Приходная.Ссылка
ИЗ
Документ.Приходная Где Приходная.Товары.Номенклатура =Номенклатура.<br>
Преимущество этого запроса перед запросом к подчиненной таблице Приходная.Товары в том, что если есть дубли в документах, результат запроса вернет только уникальные документы без использования ключевого слова РАЗЛИЧНЫЕ.
11) Интересный вариант оператора В - это проверка вхождения упорядоченного набора в множество таких наборов (Поле1, Поле2, ... , ПолеN) В (Поле1, Поле2, ... , ПолеN).
Пример:
Код 1C v 8.х ВЫБРАТЬ
Контрагенты.Ссылка
ГДЕ
(Контрагенты.Ссылка, Товары.Ссылка) В
(ВЫБРАТЬ Продажи.Покупатель, Продажи.Товар
ИЗ РегистрНакопления.Продажи КАК Продажи)
ИЗ
Справочник.Контрагенты,
Справочник.Товары<br>
12) При любой возможности используйте виртуальные таблицы запросов. При создании запроса система предоставляет в качестве источников данных некоторое количество виртуальных таблиц - это таблицы, которые так же являются результатом запроса, который система формирует в момент выполнения соответствующего участка кода.
Разработчик может самостоятельно получить те же самые данные, которые система предоставляет ему в качестве виртуальных таблиц, однако алгоритм получения этих данных не будет оптимизирован, так как:
Все виртуальные таблицы параметризованы, т. е. разработчику предоставляется возможность задать некоторые параметры, которые система будет использовать при формировании запроса создания виртуальной таблицы. В зависимости от того, какие параметры виртуальной таблицы указаны разработчиком, система может формировать РАЗЛИЧНЫЕ запросы для получения одной и той же виртуальной таблицы, причем они будут оптимизированы с точки зрения переданных параметров.
Не всегда разработчик имеет возможность получить доступ к тем данным, к которым имеет доступ система.
13) В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется. В большинстве случаев эти правила не оказывают влияния на выполнение запроса, но бывают случаи, когда для выполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса:
Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618
Чтобы избежать такой ошибки, не рекомендуют использовать функцию ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ().
14) С осторожностью используйте ИЛИ в конструкции ГДЕ , так как использование условия с ИЛИ может значительно "утяжелить" запрос. Решить проблему можно конструкцией ОБЪЕДИНИТЬ ВСЕ . Пример:
Код 1C v 8.х ВЫБРАТЬ
_ДемоКонтрагенты.НаименованиеПолное
ИЗ
Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
ГДЕ
_ДемоКонтрагенты.Ссылка =Ссылка1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
_ДемоКонтрагенты.НаименованиеПолное
ИЗ
Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
ГДЕ
_ДемоКонтрагенты.Ссылка =Ссылка2<br>
15) Условие НЕ В в конструкции ГДЕ увеличивает время исполнения запроса, так как это своего рода НЕ (ИЛИ1 ИЛИ2 ... ИЛИn) , поэтому для больших таблиц старайтесь использовать ЛЕВОЕ СОЕДИНЕНИЕ с условием ЕСТЬ NULL . Пример:
Код 1C v 8.х ВЫБРАТЬ
_ДемоКонтрагенты.Ссылка
ИЗ
Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Документ._ДемоЗаказПокупателя КАК _ДемоЗаказПокупателя
ПО _ДемоКонтрагенты.Ссылка = _ДемоЗаказПокупателя.Контрагент
ГДЕ
_ДемоЗаказПокупателя.Контрагент ЕСТЬ NULL<br>
16) При использовании Временных таблиц нужно индексировать поля условий и соединений в этих таблицах, НО, при использовании индексов запрос может выполняться еще медленнее. Поэтому необходимо анализировать каждый запрос с применением индекса и без, замерять скорость выполнения запроса и принимать окончательное решение.
Если вы помещаете во временную таблицу данные, которые изначально индексированы по некоторым полям, то во временной таблице индекса по этим полям уже не будет.
17) Если вы не используете Менеджер временных таблиц , то явно удалять временную таблицу не требуется, она будет удалена после завершения выполнения пакетного запроса, иначе следует удалить временную таблицу одним из способов: командой УНИЧТОЖИТЬ в запросе, вызвать метод МенеджерВременныхТаблиц.Закрыть() .
Источник
И в дополнении видео от Евгения Гилева : Типовые ошибки при написании запросов на 1С:
VIDEO Категория:
Запросы