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

Быстрая обработка файла эксель средствами 1С

С недавних пор (относительно) 1С умеет загружать файлы эксель в табличный документ. Причём листы раскидывает на области.  Обработка идет на удивление быстро, по сравнению со «старым» способом, через COM соединение с Excel.

Вот пример обработки файла:

1.Выбираем файл на «клиенте» и передаем его на «сервер»:

&НаКлиенте
Процедура ЗагрузкаПрайса(Команда)
		Режим = РежимДиалогаВыбораФайла.Открытие;
	    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
	    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")+ "(*.xlsx)|*.xlsx";
	    ДиалогОткрытияФайла.Фильтр = Фильтр;
	    ДиалогОткрытияФайла.МножественныйВыбор = Истина;
	    ДиалогОткрытияФайла.Заголовок = "Выберите файл(ы)";
	    Если ДиалогОткрытияФайла.Выбрать() Тогда
	        МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
	        Для Каждого ИмяФайла Из МассивФайлов Цикл
	            ВыбФайл = Новый Файл(ИмяФайла);
	            Сообщить(ИмяФайла+ НСтр("ru = '; Размер = '; en = '; Size = '")+ ВыбФайл.Размер());			
				АдресВременногоХранилища = "";
     			ПоместитьФайл(АдресВременногоХранилища, ИмяФайла, , Ложь, ЭтаФорма.УникальныйИдентификатор);   
				ЗагрузкаПрайсаНаСервере(АдресВременногоХранилища);
			 конеццикла;
		конецесли;	   					
	
КонецПроцедуры

2. Обрабатываем файл на «Сервере»:

&НаСервере
Процедура ЗагрузкаПрайсаНаСервере(АдресВременногоХранилища)
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	ДвоичныеДанные.Записать(ИмяВременногоФайла);

	сообщить(ИмяВременногоФайла);
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.Прочитать(ИмяВременногоФайла,СпособЧтенияЗначенийТабличногоДокумента.Значение);

	//листаем все листы
	Для Каждого ОбластьТД ИЗ ТабличныйДокумент.Области Цикл			
			ОбластьФайла = ТабличныйДокумент.ПолучитьОбласть(ОбластьТД.Имя);
			КолВоСтрокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоВертикали();
			КолВоКолонокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоГоризонтали();
			Сообщить("Строк:"+КолВоСтрокФайла);
			Сообщить("Колонок:"+КолВоКолонокФайла);			
			имялиста=ОбластьТД.Имя;
			Сообщить("Лист:"+имялиста);			
					МассивИменКолонок=Новый Массив();
					// читаем шапку листа
					Для ит=1 ПО КолВоКолонокФайла Цикл
						нКолонка = СтрЗаменить(ит, Символы.НПП, "");
						ИмяКолонки=ОбластьФайла.ПолучитьОбласть("R1" + "C"+нКолонка).ТекущаяОбласть.Текст;
						сообщить("- колонка: "+ИмяКолонки);
						МассивИменКолонок.Добавить(ИмяКолонки);
					конеццикла;	
					НачСтрока=0;КонСтрока=0;
					НачСтрока = ?(НачСтрока = 0, 2, НачСтрока);
					КонСтрока = ?(КонСтрока = 0, КолвоСтрокФайла, КонСтрока);
					//перебираем все строки без первой строки			
					Для нСтрокаТФ = НачСтрока ПО КонСтрока Цикл
						нСтрока = СтрЗаменить(нСтрокаТФ, Символы.НПП, "");
						СодержимоеСтроки=Новый Массив();
						Для нКолонкаТФ = 1 ПО КолВоКолонокФайла Цикл
							нКолонка = СтрЗаменить(нКолонкаТФ, Символы.НПП, "");
							Область = ОбластьФайла.ПолучитьОбласть("R"+нСтрока+"C"+нКолонка);
							ТекущаяОбласть = Область.ТекущаяОбласть;
							ЗначениеЯчейки = СокрЛП(ТекущаяОбласть.Текст);
							СодержимоеСтроки.Добавить(ЗначениеЯчейки);					
						конеццикла;			
						// ОбработатьСписокЗначений в "СодержимоеСтроки"
					конеццикла;							
	конеццикла;			
КонецПроцедуры

УТ 11.3 не формируется файл offers.xml

Для того чтобы он начал формироваться, в УТ нужно пройти следующий квест:

1) Поставить галочки в константах «Использовать типовые тоглашения с клиентами» и «Использовать типовые и индивидуальные тоглашения с клиентами»

2) НСИ и Администрирование -> ПРодажи -> Оптовые продажи поставить «Использовать соглашения с клиентами» -> Типовые

2) Создать типовое соглашение через «Продажи» -> Индивидуальные соглашения с клиентами. Не забыть поставить галочку «Доступно для обмена с сайтом»

 

БСП 3.1.13 Добавление контактной информации в свой справочник

Задача: Внедрить в свой справочник контактную информацию (Например Телефон и Адрес)

Решение: используем стандартный функционал БСП

  1. В переопределяемые типы ВладелецКонтактнойИнформации добавляем справочник, куда нужно добавить контактную информацию. Если Не казан составной тип — указываем.
  2. В справочник  ВидыКонтактнойИнформации добавляем предопределенные значения: группа с указанием имени справочника и реквизиты. Например:

3. В справочник где хотим разместить контактную информацию, на форму добавляем группу «КонтактнаяИнформация»

4. В модуль формы справочника добавляем:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

//Стандартная подсистема Управление контактной информацией
 УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "ГруппаКонтактнаяИнформация", ПоложениеЗаголовкаЭлементаФормы.Лево);
//Конец Стандартная подсистема Управление контактной информацией

	// инициализация !! выполняем 1 раз, далее коментируем!
	
		//КМ_Организации = Справочники.ВидыКонтактнойИнформации.СправочникЭЗС.ПолучитьОбъект();
		//КМ_Организации.Используется = Истина;
		//ОбновлениеИнформационнойБазы.ЗаписатьДанные(КМ_Организации);

		//ПараметрыВида = УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Телефон);
		//ПараметрыВида.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонЭЗС;
		//ПараметрыВида.МожноИзменятьСпособРедактирования = Истина;
		//ПараметрыВида.Порядок = 1;
		//УправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ПараметрыВида);
		//
		//ПараметрыВида = УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Адрес);
		//ПараметрыВида.Вид = Справочники.ВидыКонтактнойИнформации.АдресЭЗС;
		//ПараметрыВида.МожноИзменятьСпособРедактирования = Истина;
		//ПараметрыВида.Порядок = 2;
		//УправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ПараметрыВида);
	
	// конец инициализации!	
	
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	

КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		МодульУправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтотОбъект, Объект, Отказ);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		МодульУправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;

КонецПроцедуры


// СтандартныеПодсистемы.КонтактнаяИнформация

&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент)
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформациейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
		МодульУправлениеКонтактнойИнформациейКлиент.НачатьИзменение(ЭтотОбъект, Элемент);
	КонецЕсли;
КонецПроцедуры

// Параметры:
// 	Элемент - ПолеФормы
//


&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		
		ПараметрыОткрытия = Новый Структура;
		
		Отбор = Новый Структура("ИмяРеквизита", Элемент.Имя);
		Строки = ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
		ДанныеСтроки = ?(Строки.Количество() = 0, Неопределено, Строки[0]);
		Если ДанныеСтроки <> Неопределено Тогда
			//ДобавитьСтрануВПараметрыОткрытия(ПараметрыОткрытия, ДанныеСтроки.Вид, Объект.СтранаРегистрации);
		КонецЕсли;
		
		МодульУправлениеКонтактнойИнформациейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
		МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент,, СтандартнаяОбработка, ПараметрыОткрытия);
	КонецЕсли;
	
КонецПроцедуры

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

// Параметры:
// 	Элемент - ПолеФормы
// 	СтандартнаяОбработка - Булево
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияОчистка(Элемент, СтандартнаяОбработка)
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформациейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
		МодульУправлениеКонтактнойИнформациейКлиент.НачатьОчистку(ЭтотОбъект, Элемент.Имя);
	КонецЕсли;
КонецПроцедуры


// Параметры:
// 	Команда - КомандаФормы
//
&НаКлиенте
Процедура Подключаемый_КонтактнаяИнформацияВыполнитьКоманду(Команда)
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформациейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент");
		МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда.Имя);
	КонецЕсли;
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура Подключаемый_ПродолжитьОбновлениеКонтактнойИнформации(Результат, ДополнительныеПараметры) Экспорт
	ОбновитьКонтактнуюИнформацию(Результат);
КонецПроцедуры

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

Внимание! Обращаю внимание что нужно на форме прописать событие «ПриСозданииНаСервере», а в самом событии закомментировать код, в котором написано, что выполнять 1 раз

1С: Преобразование данных в JSON. Вся боль и печаль.

К сожалению 1С не умеет преобразовывать абсолютно любые данные в формат JSON. Есть некоторые ограничения. Из тех которые мне попались: не умеет преобразовывать NULL, не умеет преобразовывать таблицы значений.

Как обхожу проблему NULL в запросах:

		|	ВЫБОР
		|		КОГДА ПользователиПриложения.КлиентЮрлицо.Наименование ЕСТЬ NULL
		|			ТОГДА """"
		|		ИНАЧЕ ПользователиПриложения.КлиентЮрлицо.Наименование
		|	КОНЕЦ КАК КлиентЮрлицоНаименование

Как преобразовываю Таблицу Значений:

Вариант 1:

    Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда
        Значение1 = ОбщегоНазначения.ТаблицаЗначенийВМассив(Значение);
    КонецЕсли;

Вариант 2 (по сути «ручной» вариант первого варианта):

	МассивАвто=Новый Массив();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ТаблицаАвтомобилейПользователя=Новый структура("AutoName,AutoCode","","");		
		ТаблицаАвтомобилейПользователя.AutoName=ВыборкаДетальныеЗаписи.Наименование;
		ТаблицаАвтомобилейПользователя.AutoCode=ВыборкаДетальныеЗаписи.Код;
	КонецЦикла;
	
	Информация.ТаблицаАвтомобили=МассивАвто;

1С: проверка вилидности email и пароля

Ну например можно организовать вот так:

Функция ПарольСоответствуетТребованиям (Пароль) экспорт
	УстановитьПроверкуСложностиПаролейПользователей(Истина);
	ВременныйПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
	ВременныйПользовательИБ.АутентификацияСтандартная = Истина;
	ВременныйПользовательИБ.Имя = НСтр("ru = 'Временный пользователь'")+
	" (" + Строка(Новый УникальныйИдентификатор) + ")";
	ВременныйПользовательИБ.Пароль = Пароль;
	ХорошийПароль = Истина;
	Попытка
		ВременныйПользовательИБ.Записать();
	Исключение
		ХорошийПароль = Ложь;
	КонецПопытки;
	ВременныйПользовательИБ.Удалить();
Возврат ХорошийПароль;
КонецФункции
Функция ПроверкаВалидностиEmail(Адрес) Экспорт
    ЛатинскиеБуквы = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    Цифры = "0123456789";
    //ищем крайний справа символ @ для правильного выделения локальной и доменной части
    ИндексСобаки = Найти(Адрес,"@");
    //1. строка адреса вообще не содержит разделителя
    Если ИндексСобаки = 0 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    УрезаемаяСтрока = Сред(Адрес, ИндексСобаки+1);
    Пока Найти(УрезаемаяСтрока,"@") > 0 Цикл
        ИндексСобаки = ИндексСобаки + Найти(УрезаемаяСтрока,"@");
        УрезаемаяСтрока = Сред(УрезаемаяСтрока, ИндексСобаки+1);
    КонецЦикла;
    ДоменнаяЧасть = Сред(Адрес, ИндексСобаки+1);
    ЛокальнаяЧасть = Лев(Адрес, ИндексСобаки-1);
    //2. Проверяем длину локальной части
    Если СтрДлина(ЛокальнаяЧасть) < 1 ИЛИ СтрДлина(ЛокальнаяЧасть) > 64 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //3. Проверяем длину доменной части
    Если СтрДлина(ДоменнаяЧасть) < 1 ИЛИ СтрДлина(ДоменнаяЧасть) > 255 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //4. Проверяем что локальная части не начинается и не заканчивается на "."
    Если Лев(ЛокальнаяЧасть, 1) = "." ИЛИ Прав(ЛокальнаяЧасть, 1) = "." Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //5. Локальная части не содержит 2 или более "." подряд
    Если Найти(ЛокальнаяЧасть, "..") > 0 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //Проверка доменной части
    //6. Доменная часть не начинается с точки
    Если Лев(ДоменнаяЧасть, 1) = "." Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //7. Доменная часть не содержит 2 или более "." подряд
    Если Найти(ДоменнаяЧасть, "..") > 0 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //8. Проверка частей доменной части
    //каждая часть начинается с буквы и заканчивается буквой или цифрой
    //каждая часть длиной не более 63 символов
    ИдентификаторыДоменнойЧасти = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ДоменнаяЧасть, ".");
    Для Каждого ИдентификаторДомена ИЗ ИдентификаторыДоменнойЧасти Цикл
        Если СтрДлина(ИдентификаторДомена) > 63 Тогда
            Возврат ЛОЖЬ;
        КонецЕсли;
        Если Найти(ЛатинскиеБуквы, Лев(ИдентификаторДомена,1)) = 0
            //для доменов, нарушающих RFC 1035 п.2.3.1, например @1c.ru :)
            И Найти(Цифры, Лев(ИдентификаторДомена,1)) = 0
            Тогда
            Возврат ЛОЖЬ;
        КонецЕсли;
        Если Найти(ЛатинскиеБуквы, Прав(ИдентификаторДомена,1)) = 0 И Найти(Цифры, Прав(ИдентификаторДомена,1)) = 0 Тогда
            Возврат ЛОЖЬ;
        КонецЕсли;
    КонецЦикла;
    //Все проверки пройдены - радуемся
    Возврат ИСТИНА;
КонецФункции