1С: проверка почты по протоколу IMAP

Задача: прочитать почту из почтового ящика и обработать её посредством 1С.

Решение: за основу можно взять код что-то вроде:

Профиль = Новый ИнтернетПочтовыйПрофиль;
		Профиль.АутентификацияPOP3 = Ложь;
		Профиль.АутентификацияSMTP = Ложь;		
		// IMAP         		
	 УстановитьПривилегированныйРежим(Истина);
	  уз=справочники.УчетныеЗаписиЭлектроннойПочты.НайтиПоНаименованию("Поверка приборов учета");
      Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(уз, "Пароль, ПарольSMTP");
	УстановитьПривилегированныйРежим(Ложь);	  			
		Профиль.ИспользоватьSSLIMAP = Истина;
		Профиль.АдресСервераIMAP = уз.СерверВходящейПочты;
		Профиль.ПортIMAP = уз.ПортСервераВходящейПочты; 	
		Профиль.ПользовательIMAP = уз.ПользовательSMTP;
		Профиль.ПарольIMAP = Пароли.ПарольSMTP;
		Профиль.ТолькоЗащищеннаяАутентификацияIMAP=Ложь;
		IПочта = Новый ИнтернетПочта;
		Сообщ = Новый СообщениеПользователю();
			IПочта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP); //ПротоколИнтернетПочты.POP3		
			заголовки=IПочта.ПолучитьЗаголовки();
			если заголовки.Количество()>0 тогда		
				ПоследнийЗаголовок=Новый Массив();
				ПоследнийЗаголовок.Добавить(заголовки[заголовки.Количество()-1]);					
				МассивСообщений = Новый Массив;
				МассивСообщений = IПочта.Выбрать(Ложь,ПоследнийЗаголовок);					
				ТекстСообщения=МассивСообщений[0].тексты[0].Текст;			
					уд=Новый Массив();
					уд.Добавить(МассивСообщений[0]);
					IПочта.УдалитьСообщения(уд);	
					IПочта.ОчиститьУдаленныеСообщения();
			иначе	
				answer.result="писем нет";
			конецесли;		
		IПочта.Отключиться(); 	

1С: таблица значений на форме

Задача: скрыть отдельную колонку или показать все колонки в таблице значений расположенной на форме.

Решение: напишем две процедуры, одна из которых скрывает текущую выбранную мышкой колонку, а другая показывает все колонки в выбранной таблице.

&НаКлиенте
Процедура СкрытьКолонку(Команда)
      ТЭ_имя_объект=ТекущийЭлемент.Имя;
      ТЭ_поле=ТекущийЭлемент.ТекущийЭлемент.имя;
      имяКолонки=СтрЗаменить( ТЭ_поле,ТЭ_имя_объект,"");	  
	  элементы[ТЭ_поле].Видимость=Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьВсеКолонки(Команда)
      ТЭ_имя_объект=ТекущийЭлемент.Имя;
      ТЭ_поле=ТекущийЭлемент.ТекущийЭлемент.имя;
      имяКолонки=СтрЗаменить( ТЭ_поле,ТЭ_имя_объект,"");
	  для каждого стр из элементы[ТЭ_имя_объект].ПодчиненныеЭлементы цикл
		  стр.Видимость=Истина;
	  конеццикла;	  
КонецПроцедуры

Функционал можно например навесить на контекстное меню

1С: Сжимаем прикрепленные файлы

Задача: есть некий справочник, к которому прикрепляются файлы. Физически они конечно хранятся в томах, но всё равно занимают места очень порядочно. Необходимо собственно каждый файлик положить в архив, заново «перекрепить» его к элементам справочника. Оригинал соответственно удалить.

Решение:

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1000
		|	Файлы.ВладелецФайла КАК ВладелецФайла,
		|	Файлы.Ссылка КАК Ссылка,
		|	Файлы.ПолноеНаименование КАК ПолноеНаименование,
		|	Файлы.ТекущаяВерсияПутьКФайлу КАК ПутьКФайлу,
		|	Файлы.ТекущаяВерсияТом.ПолныйПутьWindows КАК ПолныйПуть,
		|	Файлы.ДатаСоздания КАК ДатаСоздания
		|ИЗ
		|	Справочник.Файлы КАК Файлы
		|ГДЕ
		|	Файлы.ВладелецФайла ССЫЛКА Справочник.СК_ГосуслугиЛК_ВходящиеСообщения
		|	И Файлы.ПометкаУдаления = ЛОЖЬ
		|	И НЕ Файлы.ТекущаяВерсияПутьКФайлу ПОДОБНО ""%zip%""
		|	И Файлы.ДатаСоздания МЕЖДУ &ДатаС И &ДатаПо
		|
		|УПОРЯДОЧИТЬ ПО
		|	ДатаСоздания";	
	Запрос.УстановитьПараметр("ДатаС", объект.ДатаС);	
	Запрос.УстановитьПараметр("ДатаПо", объект.ДатаПо);	
	РезультатЗапроса = Запрос.Выполнить();	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		если СтрНайти(ВыборкаДетальныеЗаписи.ПутьКФайлу,".zip")=0 тогда
			НовыйАрхив = Новый ЗаписьZipФайла(
			        ВыборкаДетальныеЗаписи.ПолныйПуть+"tmp.zip",
			        "","",МетодСжатияZIP.Сжатие,УровеньСжатияZIP.Максимальный,МетодШифрованияZIP.Zip20					
			);			
			НовыйАрхив.Добавить(ВыборкаДетальныеЗаписи.ПолныйПуть+ВыборкаДетальныеЗаписи.ПутьКФайлу);
			НовыйАрхив.Записать();            
			//возврат 0;
			ДвоичныеДанные = Новый ДвоичныеДанные(ВыборкаДетальныеЗаписи.ПолныйПуть+"tmp.zip"); 
			АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
			РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(
				ВыборкаДетальныеЗаписи.ВладелецФайла,
				ВыборкаДетальныеЗаписи.ПолноеНаименование+".zip",
				"zip",
				ТекущаяДата(),
				ТекущаяДата(),
				,
				АдресФайлаВХранилище,АдресФайлаВХранилище,
				Ложь,
				,
				,
				Истина
			);						
			об=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
			об.ПометкаУдаления=Истина;
			об.Записать();
			об.Удалить();					
			УдалитьФайлы(ВыборкаДетальныеЗаписи.ПолныйПуть+ВыборкаДетальныеЗаписи.ПутьКФайлу);						
		конецесли;		
	КонецЦикла;

Т.е. что тут делаем: выбираем элемент справочника с прикрепленным файлом, сжимаем его в архив zip, прикрепляем его и удаляем оригинал.

1С: Сортировка таблицы значений на управляемой форме

По умолчанию, не понятно почему на платформе не завезено средство сортировки таблицы значений отображаемой на форме. Поэтому выходом может быть например такое решение:

  • добавляем команды СортироватьПоКолонкеВозр и СортироватьПоКолонкеУбыв
  • добавляем их в контекстное меню
  • Код команды может быть такой:
&НаКлиенте
Процедура СортироватьПоКолонке(Команда)
      ТЭ_имя_объект=ТекущийЭлемент.Имя;
      ТЭ_поле=ТекущийЭлемент.ТекущийЭлемент.имя;
      имяКолонки=СтрЗаменить( ТЭ_поле,ТЭ_имя_объект,"");
      если команда.имя="СортироватьПоКолонкеУбыв" тогда
           СортироватьНасервере(ТЭ_имя_объект,имяКолонки,"Убыв");
	  конецесли;		   
      если команда.имя="СортироватьПоКолонкеВозр" тогда
          СортироватьНасервере(ТЭ_имя_объект,имяКолонки,"Возр");
	конецесли;
КонецПроцедуры

&НаСервере
Процедура сортироватьНасервере(имяОбъекта,имяКолонки,ВидСортировки)
    тз= РеквизитФормыВЗначение("БуферТЗ");
    тз.Сортировать(имяКолонки+" "+ВидСортировки);
    ЗначениеВРеквизитФормы(ТЗ,"БуферТЗ");
конецпроцедуры

В результате получаем что-то подобное:

1С: Открыть форму и получить результат работы

Задача: из формы документа открыть форму подбора чего-либо, и по результату получить результат в исходную форму.

Ну собственно задача штатная и обыденная, никаких изобретений тут нет. Оставляю, т.к. не часто этим пользуюсь и забывается

Решение:

В исходной форме вызываем новую форму:

&НаКлиенте
Процедура ПодборФИАС(Команда)
	Оповещение = Новый ОписаниеОповещения("ПолучитьФИАСДомаИзФормыПодбора", ЭтотОбъект);
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Ключ", объект.Ссылка);	
	ОткрытьФорму("Справочник.УКАУКАУК.Форма.ФормаПодбораФИАС", ПараметрыФормы,ЭтаФорма,,,,Оповещение,РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры

&НаКлиенте
Функция ПолучитьФИАСДомаИзФормыПодбора(Результат, ДополнительныеПараметры) экспорт
	нс=объект.Дома.Добавить();
	нс.ИдДома="-";
	нс.КодФиас=Результат.ВыбранныйФиас;
КонецФункции	

В открываемой форме, пропишем обработку закрытия формы:

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	Фиас="";
	для каждого стр из Элементы.Дом.СписокВыбора цикл
		если стр.Представление=Элементы.Дом.ВыделенныйТекст тогда
			Фиас=стр.Значение;
		конецЕсли;	
	конеццикла;	
	ПараметрыЗакрытия = Новый Структура;
	ПараметрыЗакрытия.Вставить("ВыбранныйФиас", Фиас);	    
	Закрыть(ПараметрыЗакрытия);	
КонецПроцедуры

1 2 3 51