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

Уже ранее была статья на эту тему, но в этом случае все советы не помогли. Помогли другие:

  1. Найти не битую cf этой версии конфигурации
  2. Зайти битую конфигурацию, снять её с поддержки
  3. Объединить битую конфигурацию с не битой cf. В время объединения 1С предложит снова поставить её на поддержку
  4. После этой манипуляции, битая становится не битой и позволяет далее нормально штатно обновлятся

1c 7.7 Выборка всех элементов справочника без группировки

1С 7.7 не умеет выбирать все элементы справочника в запросе без группировки по какому то реквизиту. Обычно группируют по Коду. А что делать, если какой-то талантливый программист, решил что поле Код в справочнике например может быть не уникальным? Тогда будем группировать по текущему элементу справочника. Например:

	ТекстЗапроса=
	"//{{ЗАПРОС(СформироватьСЧТ)
	|ОбрабатыватьДокументы все;
	|Обрабатывать НеПомеченныеНаУдаление;
	|Владелец = Справочник.Счетчики.Владелец;
	|Наименование = Справочник.Счетчики.Наименование;
	|ТекущийЭлемент = Справочник.Счетчики.ТекущийЭлемент;
	|Группировка ТекущийЭлемент  Без Групп;
	|"//}}ЗАПРОС
	;             
            
		Запрос = СоздатьОбъект("Запрос");		
		Запрос.Выполнить(ТекстЗапроса);		 
		Пока Запрос.Группировка() = 1 Цикл
...
...

1c 7.7 Получения последней даты занесения периодического реквизита

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

Решение: используем следующую функцию:

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

1С: Получить таблицы из Html

Задача: в неком html файле содержится несколько таблиц. Необходимо их распарсить и обработать силами 1С

Решение: воспользуемся построителем DOM. Результатом работы функции будет массив таблиц html документа.

&НаСервере
Функция УбратьНеОбрабатываемыеСимволы(стр)
	стр=стрзаменить(стр," ","_");
	стр=стрзаменить(стр,"№","N");
	стр=стрзаменить(стр,"-","_");
	стр=стрзаменить(стр,".","_");
	стр=стрзаменить(стр,",","_");
	стр=стрзаменить(стр,"/","_");
	возврат стр;
конецфункции	
&НаСервере
Функция ПреобразоватьФайлHtmlВМассивТаблиц(АдресХранилищаФайла)	
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаФайла);
	ИмяВременногоФайлаСпр = ПолучитьИмяВременногоФайла("html");
	ДвоичныеДанные.Записать(ИмяВременногоФайлаСпр);     
	
	ЧтениеHTML = Новый ЧтениеHTML;
	ЧтениеHTML.ОткрытьФайл(ИмяВременногоФайлаСпр, "UTF-8");

	ПостроительDOM = Новый ПостроительDOM;
	ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
	ЭлементыТаблицы = ДокументHTML.ПолучитьЭлементыПоИмени("table");
	
	МассивТаблиц=Новый Массив();	
	для каждого таблица из	ЭлементыТаблицы цикл
	  ТЗ=Новый ТаблицаЗначений();	
	  строкиТаблицы=таблица.ПолучитьЭлементыПоИмени("tr");	
	      ПрочитаноСтрок=0;
		  для каждого строкаТаблицы из	строкиТаблицы цикл
		  	колонки=строкаТаблицы.ПолучитьЭлементыПоИмени("td");			
			ПрочитаноКолонок=0;
			для каждого колонка из колонки цикл
				если ПрочитаноСтрок=0 тогда
					ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(колонка.ТекстовоеСодержимое));
				иначе
					если ПрочитаноКолонок=0 тогда
					 нс=ТЗ.Добавить()
				    конецесли;		 
				    нс[ПрочитаноКолонок]=колонка.ТекстовоеСодержимое;
				конецесли;	
				ПрочитаноКолонок=ПрочитаноКолонок+1;
			конеццикла;		
			ПрочитаноСтрок=ПрочитаноСтрок+1;
		  конеццикла;
	  МассивТаблиц.Добавить(ТЗ);
	конеццикла;	
	ЧтениеHTML.Закрыть();											
	
конецфункции

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

1C: Выбор из нескольких вариантов макета отчета СКД

Задача: в зависимости от внешних условий, выводить тот или иной вариант отчёта СКД.

Решение:

Добавим в отчёт два макета СКД:

Далее, в зависимости от нажатой кнопки, формируем разные данные:

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

	// задаем сами
     НастройкиСхемыОСКД = СхемаСКД.НастройкиПоУмолчанию;
	 ПараметрыДанныхОСКД = НастройкиСхемыОСКД.ПараметрыДанных.Элементы;
	 
	 ЭлементНачалоПериода = ПараметрыДанныхОСКД.Найти("Период");
	 ЭлементНачалоПериода.Использование = Истина;	 
	 
	 ДатаНачала = ФильтрПериод.ДатаНачала;
	 ДатаОкончания = ФильтрПериод.ДатаОкончания;
	 
     ЭлементНачалоПериода.Значение.ДатаНачала        = НачалоМесяца(ДатаНачала);
     ЭлементНачалоПериода.Значение.ДатаОкончания    = КонецМесяца(ДатаОкончания);	 
	 
	 ЭлементНачалоПериода = ПараметрыДанныхОСКД.Найти("СетеваяОрганизация");
	 ЭлементНачалоПериода.Использование = Истина;	 
	 ЭлементНачалоПериода.Значение=отчет.Сетевая;

	 ЭлементНачалоПериода = ПараметрыДанныхОСКД.Найти("Фильтр");
	 ЭлементНачалоПериода.Использование = Истина;	 
	 ЭлементНачалоПериода.Значение=отчет.Фильтр;
	 	 
	 
	 КомпоновщикМакетаОСКД = Новый КомпоновщикМакетаКомпоновкиДанных;
	 Макет = КомпоновщикМакетаОСКД.Выполнить(СхемаСКД, НастройкиСхемыОСКД);
	 Фильтр=отчет.Фильтр;
	 

	ПроцессорКомпоновкиОСКД = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиОСКД.Инициализировать(Макет);
	ТаблДок.Очистить();
	ПроцессорВыводаОСКД = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВыводаОСКД.УстановитьДокумент(ТаблДок);
	ПроцессорВыводаОСКД.Вывести(ПроцессорКомпоновкиОСКД);	
	ПроцессорВыводаОСКД.ЗакончитьВывод();
КонецПроцедуры

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

&НаКлиенте
Процедура ОтчетПоЛС(Команда)
	РукамиНаСервере(Результат,"ОсновнаяСхемаКомпоновкиДанных1");
	Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
	Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;		
	
КонецПроцедуры
1 13 14 15 16 17 51