Чтение XML в таблицу значений

XML ТаблицаЗначений
5 Добавил: ArturR
Режим = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);        
	ДиалогОткрытияФайла.ПолноеИмяФайла = "";
	Фильтр = "Текст(*.XML)|*.XML";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;             
	ДиалогОткрытияФайла.Заголовок = "Выберите файл для загрузки";
	
	Если ДиалогОткрытияФайла.Выбрать() Тогда 
		ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
		Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
		ТЗ = Сериализатор.ПрочитатьXML(ЧтениеXML,Тип("ТаблицаЗначений"));
		ЧтениеXML.Закрыть();
	КонецЕсли;
	
		ЭтотОбъект.Контрагент 		  	= Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ТЗ[0].КонтрагентИНН);
		ЭтотОбъект.КРВ_IDМенеджер	  	= ТЗ[0].IDМенеджер;
		ЭтотОбъект.КРВ_НомерЗаказаУНФ 	= ТЗ[0].Номер;
		ЭтотОбъект.Склад 				= Справочники.Склады.НайтиПоНаименованию(ТЗ[0].Склад);
	
Для каждого СтрокаТЗ Из ТЗ Цикл
КонецЦикла; 

Сохранение таблицы значений в XML

XML Таблица значений
5 Добавил: ArturR
ДанныеНакладной = Новый ТаблицаЗначений();
	ДанныеНакладной.Колонки.Добавить("НоменклатураАртикул");
	ДанныеНакладной.Колонки.Добавить("Количество");
	ДанныеНакладной.Колонки.Добавить("Цена");
	
	Для Каждого Стр Из Товары Цикл
		Если Стр.Номенклатура.Артикул = "" Тогда
			Сообщить ("Внимание! В номенклатуре " + Стр.Номенклатура + " не определен артикул.");
		Иначе		
			СтрокаТЗ = ДанныеНакладной.Добавить();
			СтрокаТЗ.НоменклатураАртикул = Стр.Номенклатура.Артикул;
			СтрокаТЗ.Количество = Стр.Количество;
			СтрокаТЗ.Цена = Стр.Цена;		
		КонецЕсли;
	КонецЦикла;
	Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
	XML = Новый ЗаписьXML;
	ИмяФайла = "" + КРВ_ВспомогательныеФункции.УбратьНули(Номер)
	+ " - " + КРВ_ВспомогательныеФункции.УбратьНедопустимыеСимволы(Контрагент);
	
	XML.ОткрытьФайл("d:\1C_DATA\ОБМЕН\" + ИмяФайла + ".xml");
	Сериализатор.ЗаписатьXML(XML, ДанныеНакладной);

Как по GUID определить время и дату создания ссылки?

Как по GUID определить время и дату создания ссылки?
GUID дата Ссылка
6 Добавил: Yashar
Функция UUID_Timestamp(Ссылка)
	
	ГУИД = Ссылка.УникальныйИдентификатор();
    // Например ГУИД равен: bdb62d89-cede-11e4-b12b-d4ae52b5e909
    // Дата содержится в первых символах, bdb62d89-cede-11e4 которые нужно переставить задом наперед: 11e4-cede-bdb62d89
    Строка16 = Сред(ГУИД, 15, 4) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
    
    // Убираем "лишние" знаки "-"(тире).
    Строка16 = СтрЗаменить(Строка16, "-", "");
    
    // Убираем первый символ, так как в нем содержится версия стандарта (зашит в седьмой октет)
    Строка15 = Сред(Строка16, 2);
    
    // Получаем timestamp в 60 бит : 1E4 CEDE BDB6 2D89
    ЧислоСек = 0;
    Для Позиция = 1 По СтрДлина(Строка15) Цикл
        ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка15,Позиция,1))*Pow(16,СтрДлина(Строка15) - Позиция);
    КонецЦикла;
    ЧислоСек = ЧислоСек / 10000000;
    
    // Прибавляем к дате начала Григореанского календаря
    Возврат Дата(1582, 10, 15, 00, 00, 00) + ЧислоСек + СмещениеСтандартногоВремени() + СмещениеЛетнегоВремени();;
    
КонецФункции

Веб сервис БУХ обращение

Добавил: Евгений uer
&НаСервереБезКонтекста
Функция ПолучитьПроксиУниверсальныйВебСервисЕРП(ТестовыйСервер)
	
	ПараметрыПрокси = ПолучитьПараметрыПрокси(ТестовыйСервер);
	
	АдресWS			= ПараметрыПрокси.АдресWS;
	Пользователь	= ПараметрыПрокси.Пользователь;
	Пароль			= ПараметрыПрокси.Пароль;
	
	Попытка
		Определение = Новый WSОпределения(АдресWS, Пользователь, Пароль);
		
		Прокси = Новый WSПрокси(Определение, "gm_BuhExchangeURL", "gm_BuhExchange", "gm_BuhExchangeSoap");
		Прокси.Пользователь	= Пользователь;
		Прокси.Пароль		= Пароль;	
	Исключение	
		ЗаписьЖурналаРегистрации("ВебСервис",УровеньЖурналаРегистрации.Ошибка,,, "ПолучитьПроксиУниверсальныйВебСервисБух()"+ Символы.ПС + ОписаниеОшибки());
		Возврат Неопределено;	
	КонецПопытки;	
	
	Возврат Прокси;
	
КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьПараметрыПрокси(ТестовыйСервер)
	
	СтруктураПараметров = Новый Структура();	
	
	СтруктураПараметров.Вставить("АдресWS","http://192.168.12.11/buh_centr/ws/gm_BuhExchange.1cws?wsdl"); //"http://192.168.12.11/buh_centr/ws/gm_BuhExchange.1cws?wsdl"
	
	СтруктураПараметров.Вставить("Пользователь","WS_Обмен");
	СтруктураПараметров.Вставить("Пароль","123456");
	
	Возврат СтруктураПараметров;
	
КонецФункции

Кеширование текущей строки для сравнения при окончании редактирования

Сохранить кеш строки до её изменения пользователем. Сравнить после окончания редактирования, если надо выполнить нужные действия.
ИзмененияВСтрокеТЧ
Добавил: AlexMir
//1. На форме необходимо создать реквизит: КешТекущейСтроки - ПроизвольныйТип.

//2. В нужной табличной части создаём процедуру ПередНачаломИзменения, например такую:

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

// 3. Добавить  Процедуру  ПреобразоватьСтрокуТаблицыВСтруктуру. В этой процедуре необходимо пропускать обработку колонок, которые взяты по ссылке из какого-то ссылочного реквизита (Ссылка.Реквизит), они не главные и их не обязательно помещать в структуру

// Возвращает структуру с ключами, соответствующими колонкам таблицы значений.
// Значения в структуре заполняются значениями полей из переданной строки таблицы.
//
// Параметры:
//	ТекущаяСтрока - СтрокаТаблицыЗначений
//      ПодчиненныеЭлементы - полный путь к подчиненным элементам табличной части (колонкам) на управляемых формах
//      ИмяТаблица - имя таблицы на управляемой форме
// Возвращаемое значение:
//	Структура
//      лучше вынести  функцию в общий модуль НаКлиенте
&НаКлиенте
Функция ПреобразоватьСтрокуТаблицыВСтруктуру(ТекущаяСтрока,ПодчиненныеЭлементы, ИмяТаблицы) Экспорт 
	
	РезультатСтруктура = Новый Структура;
	
    Для Каждого Колонка Из ПодчиненныеЭлементы Цикл
        Если Колонка.Имя = ИмяТаблицы+"Артикул" ИЛИ Колонка.Имя = ИмяТаблицы+"НомерСтроки" Тогда // вложенные в ссылку реквизиты исключаем, их пользователь не меняет
            Продолжить;
        КонецЕсли; 
        ИмяКолонки = СтрЗаменить(Колонка.Имя,ИмяТаблицы,"");
		РезультатСтруктура.Вставить(ИмяКолонки, ТекущаяСтрока[ИмяКолонки]);
	КонецЦикла;
	
	Возврат РезультатСтруктура;
	
КонецФункции

// 4. Создаём процедуру ПриОкончанииРедактирования и в ней уже смотрим что изменилось в строке, после её редактирования, сопоставляем с кешированными данными в строке, например так:

&НаКлиенте
Процедура ПрикреплённыеФайлыНаСервереПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
    
    Если  НоваяСтрока = Ложь И КешТекущейСтроки <> Неопределено Тогда
        
        // проверяем сравниваем с кешированной строкой перед изменениями
        Если КешТекущейСтроки.Имя <> "" И КешТекущейСтроки.Имя <> Элемент.ТекущиеДанные.Имя Тогда
            // пишете код что надо сделать

        КонецЕсли; 
     КонецЕсли;

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

Групповое изменение Измерения в НабореЗаписей регистра сведений

Изменить измерение в наборе записей регистра сведений
Регистры
1 Добавил: AlexMir
    НаборЗаписей = РегистрыСведений.РС1.СоздатьНаборЗаписей();    
   // тут устанавливаете нужный  отбор по измерениям 
    НаборЗаписей.Отбор.Измерение1.Установить(ЗначениеИзмерения);
    НаборЗаписей.Прочитать();

    МенеджерЗаписи = РегистрыСведений.РС1.СоздатьМенеджерЗаписи();
    
    Для Каждого ТекЗапись Из НаборЗаписей Цикл
        ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ТекЗапись);
        МенеджерЗаписи.Прочитать();
        МенеджерЗаписи.Измерение1 = НовоеЗначениеИзмерения;
        МенеджерЗаписи.Записать();
    КонецЦикла;

// набор используем только для цикла перебора записей
// а запись каждую редактируем отдельно
// если необходимо можно сделать в одной транзакции	

// иначе не даст сохранить, напишет набор не соотвествует  установленному отбору

Быстро получить всех родителей для текущей позиции

Вложенность всех родителей текущей позиции справочника
РодителиЭлементаСправочника
1 Добавил: AlexMir
ВсеКоды = СтрЗаменить(Справочники.Номенклатура.НайтиПоКоду(Код).ПолныйКод(),"/",Символы.ПС);
            
Для Индекс = 1 По СтрЧислоСтрок(ВсеКоды) Цикл
   Путь = Путь + Справочники.Номенклатура.НайтиПоКоду(СтрПолучитьСтроку(ВсеКоды, Индекс)) + "\";
КонецЦикла;

// Параметр .ПолныйКод() позволяет получить всех родителей через символ "/"
// дальше заменяем символ "/" на символ переноса строки Символы.ПС
// и получаем в каждой строке по родителю 
// далее через индекс строк собираем полный путь, при необходимости

глТекущийПользователь

глТекущийПользователь
глТекущийПользователь
1 Добавил: Александр
Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяОрганизация");
ПодразделениеОрганизации = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновноеПодразделениеОрганизации");
ЦФО = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновноеПодразделение");

Связанные документы

Поиск по критериям отбора связанных документов по ссылке ВыбДок - документ для которого ищем связные
Связанные документы критерии отбора
4 Добавил: ROXy
СвязанныеДокументы = КритерииОтбора.СвязанныеДокументы.Найти(ВыбДок);
Для Каждого ТекСвязанныйДокумент из СвязанныеДокументы Цикл
Сообщить(ТекСвязанныйДокумент);
КонецЦикла;

Разложить строку в массив

2 Добавил: Евгений
Функция 	РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
	МассивСтрок = Новый Массив();
	Если Разделитель = " " Тогда
		Стр = СокрЛП(Стр);
		Пока 1 = 1 Цикл
			Поз = Найти(Стр, Разделитель);
			Если Поз = 0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Стр, Поз - 1));
			Стр = СокрЛ(Сред(Стр, Поз));
		КонецЦикла;
	Иначе
		ДлинаРазделителя = СтрДлина(Разделитель);
		Пока 1 = 1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз = 0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Стр, Поз - 1));
			Стр = Сред(Стр, Поз + ДлинаРазделителя);
		КонецЦикла;
	КонецЕсли;	
КонецФункции