Архив рубрики: 1C

Разработки на платформе 1С

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

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

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

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

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

 

1с УТ несоответствие фасету maxlength 1000

Такая ошибка случилась при штатном обмене с сайтом в УТ 11.3 Почему? А один из реквизитов для выгрузки у меня более чем 1000 символов. 1С видимо думает что такие длинные реквизиты зло. Может оно и право, но заказчику нужны нормальные тексты, а не обрезанные до 1000 символов.

Решение: правим схему XDTO CML208, а именно у типа значений ЗначениеТип, ставим нужную длинну.

БСП 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 Тогда
            Возврат ЛОЖЬ;
        КонецЕсли;
    КонецЦикла;
    //Все проверки пройдены - радуемся
    Возврат ИСТИНА;
КонецФункции