Архив метки: 1c

Программное сохранение отчета СКД в файл Excel

Задача: по расписанию формировать файл отчета СКД и отправлять его по электронной почте.

Решение:

1. Формируем файл

таб1=новый ТабличныйДокумент();
	
	СКД=Отчеты.ПрибыльЗаПериод.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	Настройки=СКД.НастройкиПоУмолчанию;
	Дата1=Настройки.ПараметрыДанных.Элементы.Найти("Дата1");
	Дата1.Значение=НачалоМесяца(ТекущаяДата());
	Дата2=Настройки.ПараметрыДанных.Элементы.Найти("Дата2");
	Дата2.Значение=КонецДня(ТекущаяДата());
	ВидЦены=Настройки.ПараметрыДанных.Элементы.Найти("ВидЦены");
	ВидЦены.Значение=Справочники.ВидыЦен.НайтиПоНаименованию("Основная цена закупки");
	Магазин=Настройки.ПараметрыДанных.Элементы.Найти("Магазин");
	Магазин.Значение=Справочники.Магазины.НайтиПоНаименованию("Вологда Торговля");

	 	Расшифровка = Новый ДанныеРасшифровкиКомпоновкиДанных;
		КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;    
		
        //Передаем в макет компоновки схему, настройки и данные расшифровки
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, Настройки, Расшифровка);    
        ВнешниеПараметры = Новый Структура;    
		
        //Выполним компоновку с помощью процессора компоновки
        ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеПараметры, Расшифровка);    
		
        //Выводим результат в табличный документ
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(таб1);    
        ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);    	 
		
		таб1.Записать("c:\temp\моржа.xls",ТипФайлаТабличногоДокумента.XLS);

2.Отправляем его по почте

	ПараметрыПочты = новый ИнтернетПочтовыйПрофиль;
		ПараметрыПочты.АдресСервераSMTP = пснмп;
		ПараметрыПочты.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
		ПараметрыПочты.ПользовательSMTP = плогин;
		ПараметрыПочты.ПарольSMTP=ппароль;
		
		Письмо=новый ИнтернетПочтовоеСообщение;
		Письмо.Тема="Комплексный отчет по продажам в магазине Вологда Торговля";
		Письмо.ИмяОтправителя="1С отправка отчетов";
		Письмо.Отправитель=побратный;
		Письмо.Получатели.Добавить(пполучатель);	
		Письмо.Получатели.Добавить("blabla@mail.ru");	

		Письмо.Тексты.Добавить("Комплексный отчет по продажам в магазине Вологда Торговля");		
		Письмо.Вложения.Добавить("c:\temp\моржа.xls");
		
		Подключение=новый ИнтернетПочта;
		Попытка
		Подключение.Подключиться(ПараметрыПочты);
		Подключение.Послать(Письмо);        

1001-й способ ограничить пользователей 1С

Задача: разрешить пользователям проводить документы только внутри разрешенных им складов.

Частично данная задача успешно решается при помощи RLE и соответствующих ролей. Но! не полностью. Во всяком случае в конфигурации 1С Розница 2.2 нет возможности ограничить пользователя (без изменения конфигураци)…ну например реализовывать  товар с «чужого» склада/Магазина, делать перемещение товаров на «чужие» склады (ограничения работают только для Ордеров???). 

Решение: используем относительно новую фичу от 1С — подписка на события. А именно на событие «Запись». Данные по которым будем проверять можно пользователю записывать данный документ или нет, будем брать из специально созданного справочника.

В котором перечисленна группа к которой принадлежит пользователь, вид документа по которому его ограничиваем и список складов, с которыми ему позволено это документ использовать.

Далее создадим подписку на событие:

И собственно саму обработку события

Функция ПолучитьГруппуПользователя()
 Запрос = Новый Запрос;
  	 Запрос.Текст = "ВЫБРАТЬ
  	                |	ГруппыПользователей.Наименование КАК Наименование
  	                |ИЗ
  	                |	Справочник.ГруппыПользователей КАК ГруппыПользователей
  	                |ГДЕ
  	                |	ГруппыПользователей.Состав.Пользователь.Ссылка = &Ссылка";
	 
	Запрос.УстановитьПараметр("Ссылка",  ПараметрыСеанса.ТекущийПользователь);
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	группа="";
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		//сообщить(ВыборкаДетальныеЗаписи.Наименование);
		группа=ВыборкаДетальныеЗаписи.Наименование;
	конеццикла;	           
	возврат группа;
	
КонецФункции	

Функция ПроверкаВсяческихПрав(Источник, Отказ) Экспорт
	отказываем=истина;
	естьправила=ложь;
 	гп=	ПолучитьГруппуПользователя();
	естьОтправитель=ложь;
	естьПолучатель=ложь;
    отказываемОтправитель=истина;
	отказываемПолучатель=истина;
	// проверяем соответствие складам "Откуда"
	 Запрос = Новый Запрос;
  	 Запрос.Текст = 
	 "ВЫБРАТЬ
	 |	ДополнительныеНастройкиПравГрибовСкладыОткуда.Склад.Ссылка КАК СкладСсылка
	 |ИЗ
	 |	Справочник.ДополнительныеНастройкиПравГрибов.РазрешенныеСклады КАК ДополнительныеНастройкиПравГрибовСкладыОткуда
	 |ГДЕ
	 |	ДополнительныеНастройкиПравГрибовСкладыОткуда.Ссылка.ГруппаПользователей.Наименование = &ИмяГруппы
	 |	И ДополнительныеНастройкиПравГрибовСкладыОткуда.Ссылка.ВидДокумента.Наименование = &ИмяДокумента";	 
	Запрос.УстановитьПараметр("ИмяГруппы", гп);
	Запрос.УстановитьПараметр("ИмяДокумента", Источник.Ссылка.Метаданные().Имя);
	РезультатЗапроса = Запрос.Выполнить();	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		естьправила=Истина;		
		если Источник.Ссылка.Метаданные().Реквизиты.Найти("Склад")<>Неопределено тогда			
			если источник.Склад.Ссылка=ВыборкаДетальныеЗаписи.СкладСсылка тогда отказываем=Ложь;
			конецесли;	
		конецесли;
		если Источник.Ссылка.Метаданные().Реквизиты.Найти("СкладОтправитель")<>Неопределено тогда		
			естьОтправитель=Истина;
			если источник.СкладОтправитель.Ссылка=ВыборкаДетальныеЗаписи.СкладСсылка тогда 
				отказываем=Ложь;				
				отказываемОтправитель=Ложь;
			конецесли;	
		конецесли;		
		если Источник.Метаданные().Реквизиты.Найти("СкладПолучатель")<>Неопределено тогда		
			естьПолучатель=Истина;
			если источник.Ссылка.СкладПолучатель.Ссылка=ВыборкаДетальныеЗаписи.СкладСсылка тогда 
				отказываем=Ложь;
				отказываемОтправитель=Ложь;
			конецесли;	
		конецесли;									
	конеццикла;	
 если естьправила=Ложь тогда
	 Отказ=ложь;
 иначе
	  //отрабатываем вариант что два склада отправитель и получатель!
	  если (естьОтправитель=Истина и естьПолучатель=Истина) тогда
		  если отказываемОтправитель=Ложь и отказываемПолучатель=Ложь тогда
		   отказ=ложь;	  
	   иначе
		   отказ=Истина;
		  конецесли;	  
		  иначе
			  отказ=отказываем;			  
	  конецесли
	  
  конецесли;
  
	 если отказ=Истина тогда сообщить("- вы не можете записать данный документ с данными складами - не хватает прав! Обратитесь к Кочанову Сергею.");
	 конецесли;	 	  
  
КонецФункции	

Програмное получение группы пользователя в 1С

Например можно так:

Функция ПолучитьГруппуПользователя()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ГруппыПользователей.Наименование КАК Наименование
|ИЗ
| Справочник.ГруппыПользователей КАК ГруппыПользователей
|ГДЕ
| ГруппыПользователей.Состав.Пользователь.Ссылка = &amp;Ссылка";

Запрос.УстановитьПараметр("Ссылка", ПараметрыСеанса.ТекущийПользователь);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
группа="";
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
сообщить(ВыборкаДетальныеЗаписи.Наименование);
группа=ВыборкаДетальныеЗаписи.Наименование;
конеццикла;
возврат группа;

КонецФункции

Функция ПроверкаВсяческихПрав(Источник, Отказ) Экспорт

сообщить("-- какойто негодяй из "+ПолучитьГруппуПользователя()+" хочет записать документ! Проверяем а нужно ли?");
КонецФункции

Нарушена целостность структуры конфигурации 1С

Сегодня при попытке обновить 1С появилась эта ошибка. Сначала чуть было не испугался, подумал что и в самом деле что-то порушилось. Однако все оказалось попроще, база не разрушилась, просто что-то сломалось в одном из файлов 1С локального пользователя. Гугл помог найти несколько способов лечения.

  1. Возможно поможет удаление проблемной базы из списка баз, и добавление вновь
  2. Некоторым помогала простая перезагрузка
  3. Мне помогло полностью удаление папки 1С из users/пользователь/AppData/Roaming/1C

Работа с базами и выполнение запросов MSSQL на прямую, посредством встроенного языка 1С

загруженное (1)Задача: выгрузить в удаленную базу MSSQL некие данные с произвольной структурой.

Решение: 1С умеет работать с COM соединениями. Их и используем.

Сначала напишем процедуру отвечающую за подключение к MSSQL, и выдающее на выходе  ссылку на полученное соединение: Читать далее Работа с базами и выполнение запросов MSSQL на прямую, посредством встроенного языка 1С