Это старая версия документа.


Элементарные алгоритмы

Сч = 0;
Пока Сч < ТЗ.Количество() Цикл
	СтрокаТаблицы = ТЗ.Получить(Сч);
	Если "Условие для удаления" Тогда
		ТЗ.Удалить(СтрокаТаблицы);
	Иначе
		Сч = Сч + 1;
	КонецЕсли;
КонецЦикла;
СтрокиКУдалению = Новый Массив();
Для каждого Строка Из ТаблицаЗначений Цикл
	Если "Условие для удаления" тогда
		СтрокиКУдалению.Добавить(Строка);
	КонецЕсли;
КонецЦикла; 

Для каждого Строка Из СтрокиКУдалению Цикл
	ТаблицаЗначений.Удалить(Строка);
КонецЦикла;

Постараемся не нарушать иерархию…

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

Для каждого ЭлементМассива Из Массив Цикл
	Соответствие.Вставить(ЭлементМассива);
КонецЦикла;

Для каждого КлючИЗначение Из Соответствие Цикл
	НовыйМассив.Добавить(КлючИЗначение.Значение);
КонецЦикла;
&НаСервере
Процедура ПрочитатьИерархическийНаСервере()
	
	УровеньДерева = 0;
	ПрочитатьДерево(Справочники.Иерархичный.ПустаяСсылка(), УровеньДерева);
	
КонецПроцедуры

&НаСервере
Процедура ПрочитатьДерево(Знач Родитель, Знач УровеньДерева)

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

	Строка = "";
	Для й = 1 По Уровень Цикл
		Строка = Строка + "   ";
	КонецЦикла; 
	Строка = Строка + "- ";
	Возврат Строка;

КонецФункции
РеквизитПрисутствует = ЕстьРеквизитДокумента("ИмяРеквизита", ДокументСсылка);

Функция ЕстьРеквизитДокумента(ИмяРеквизита, Документ)
	
	МетаданныеДокумента = Документ.Метаданные();
	Возврат НЕ МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено;
	
КонецФункции

Сначала выгрузим движения в таблицу значений, а потом пробежим ее строки, меняя то, что нам нужно (например склад на 41-ом счете):

Если Строка.СчетДт.ПринадлежитЭлементу(ПланыСчетов.Хозрасчетный.НайтиПоКоду("41")) Тогда
	Для й = 1 По 3 Цикл // найдем субконто Склад
		НаименованиеКолонки = "СубконтоДт" + й;
		Если Строка["Вид" + НаименованиеКолонки] = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады Тогда
			Строка[НаименованиеКолонки] = Источник._СкладПолучатель;
		КонецЕсли;
	КонецЦикла;
КонецЕсли;
// Устанавливает субконто для счета
//
// Параметры:
//  Счет  				- Счет
//
//  Субконто  			- <Тип.Вид> - <описание параметра>
//
//  ИмяСубконто		- его номер или наименование
//
//  ЗначениеСубконто	- Значение субконто
//
//
Процедура УстановитьСубконто(Счет, Субконто, ИмяСубконто, ЗначениеСубконто) Экспорт
	
	Если Счет = Неопределено ИЛИ Счет.Пустая() Тогда
		Возврат;
	КонецЕсли;
	
	Если ТипЗнч(ИмяСубконто) = Тип("Число") Тогда // если ИмяСубконто - его номер
		Если ИмяСубконто > Счет.ВидыСубконто.Количество() Тогда
			Возврат;
		КонецЕсли;
		ВидСубк = Счет.ВидыСубконто[ИмяСубконто - 1].ВидСубконто;
	Иначе // если ИмяСубконто - его наименование
		ВидСубк = ПланыВидовХарактеристик[Метаданные.НайтиПоТипу(ТипЗнч(Счет)).ВидыСубконто.Имя][ИмяСубконто]; 
		Если Счет.ВидыСубконто.Найти(ВидСубк) = Неопределено Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	Если ВидСубк.ТипЗначения.СодержитТип(ТипЗнч(ЗначениеСубконто)) Тогда
		Субконто.Вставить(ВидСубк, ЗначениеСубконто);
	Иначе
		Сообщить("Неверное значение """ + ЗначениеСубконто + """ для вида субконто <" + ВидСубк + ">");
	КонецЕсли;
	
КонецПроцедуры

Ее вызов:

НомерСубконто = 0;
Для каждого ВидСубконто Из Проводка.СчетДт.ВидыСубконто Цикл
	
	НомерСубконто = НомерСубконто + 1;
	
	Если ЗначениеЗаполнено(ЗначениеСубконто) Тогда
		УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, НомерСубконто, ЗначениеСубконто);
	КонецЕсли;
	
КонецЦикла;
БухгалтерскийУчет.УстановитьСубконто(Движение.СчетДт,Движение.СубконтоДт, "НаименованиеСубконто", ЗначениеСубконто);

процедура в модуле БухгалтерскийУчет:

// Процедура устанавливает субконто на счете. Если такое субконто на счете
// отсутствует, то ничего не делается.
//
// Параметры:
//		Счет - Счет, к которому относится субконто
//      Субконто - набор субконто
//		Номер или имя устанавливаемого субконто
//      Значение субконто - значение устанавливаемого субконто
//
Процедура УстановитьСубконто(Счет, Субконто, ИмяСубконто, ЗначениеСубконто, Сообщать = Ложь, Заголовок = "", ВидыСубконтоСчета = Неопределено) Экспорт

	Если Счет = Неопределено ИЛИ Счет.Пустая() Тогда
		Возврат;
	КонецЕсли;

	Если ВидыСубконтоСчета = Неопределено Тогда
	     ВидыСубконтоСчета = Счет.ВидыСубконто;
	КонецЕсли; 
	
	Если ТипЗнч(ИмяСубконто) = Тип("Число") Тогда

		Если ИмяСубконто > ВидыСубконтоСчета.Количество() Тогда
			Возврат;
		КонецЕсли;

		ВидСубк = ВидыСубконтоСчета[ИмяСубконто - 1].ВидСубконто;

	Иначе

		ВидСубк = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные[ИмяСубконто];

		Если ВидыСубконтоСчета.Найти(ВидСубк) = Неопределено Тогда
			Если Сообщать тогда
				ОбщегоНазначения.СообщитьОбОшибке("Вид субконто <" + ВидСубк + "> для счета """+Счет.Код +" ("+Счет.Наименование+")"" не определен.",, Заголовок );
			КонецЕсли;
			Возврат;
		КонецЕсли;

	КонецЕсли;

	Если ВидСубк.ТипЗначения.СодержитТип(ТипЗнч(ЗначениеСубконто)) Тогда
		Субконто.Вставить(ВидСубк, ЗначениеСубконто);

	ИначеЕсли Сообщать тогда
		ОбщегоНазначения.СообщитьОбОшибке("Неверное значение """ + ЗначениеСубконто + """ для вида субконто <" + ВидСубк + ">",, Заголовок);

	КонецЕсли;

КонецПроцедуры // УстановитьСубконто()
// =============   МОДУЛЬ ОБЫЧНОГО ПРИЛОЖЕНИЯ =============
Процедура ПередНачаломРаботыСистемы(Отказ)
	
	УправлениеПользователями.ПроверитьВозможностьРаботыПользователя(Отказ);
	_ОбщегоНазначения.РегламентныеДействияПриНачалеРаботыСистемы(Отказ);
	
КонецПроцедуры
// =============   МОДУЛЬ ОБЫЧНОГО ПРИЛОЖЕНИЯ =============


// =============   МОДУЛЬ "_ОбщегоНазначения" =============
Процедура ИзмененитьПланСчетовИСубконто(Отказ) Экспорт
	
	Если НЕ Метаданные.ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Тип.СодержитТип(Тип("СправочникСсылка._КассыККМ")) Тогда
		Отказ = ИСТИНА;
		КомментарийОтказа = "В составе метаданных видов субконто не обнаружен тип <Кассы ККМ>!
					  |Дальнейшая работа невозможна!";
		ВызватьИсключение(КомментарийОтказа);
		Возврат;
	КонецЕсли;	
	
	Попытка
	     ВидСубконтоККМ = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные._КассыККМ;
	Исключение
		Отказ = ИСТИНА;
		КомментарийОтказа = "В составе метаданных видов субконто не обнаружен предопределенный элемент <_КассыККМ>!
					  |Дальнейшая работа невозможна!";
		ВызватьИсключение(КомментарийОтказа);
		Возврат;
	КонецПопытки;	
	
	Счет50_02           = ПланыСчетов.Хозрасчетный.НайтиПоКоду("50.02").ПолучитьОбъект();
	СубконтоККМПривязан = ЕстьВидСубконтоДляСчета(Счет50_02, ВидСубконтоККМ);
	
	Если НЕ СубконтоККМПривязан Тогда
		
		ДобавляемыйВидСубконто = Счет50_02.ВидыСубконто.Вставить(0);
		ДобавляемыйВидСубконто.Валютный       = ЛОЖЬ;
		ДобавляемыйВидСубконто.ВидСубконто    = ВидСубконтоККМ;
		ДобавляемыйВидСубконто.Количественный = ЛОЖЬ;
		ДобавляемыйВидСубконто.Суммовой       = ИСТИНА;
		ДобавляемыйВидСубконто.ТолькоОбороты  = ЛОЖЬ;
		
		Счет50_02.Записать();
		Сообщить("-> Добавлен новый вид субконто " + """" + "Кассы ККМ" + """" + " для счета 50.02");
		
	КонецЕсли;
	
	// конец добавления субконто "Кассы ККМ" на счет 50.02
	
КонецПроцедуры  // ИзмененитьПланСчетовИСубконто

Процедура РегламентныеДействияПриНачалеРаботыСистемы(Отказ)

     ИзмененитьПланСчетовИСубконто(Отказ);

КонецПроцедуры   // РегламентныеДействияПриНачалеРаботыСистемы
// =============   МОДУЛЬ "_ОбщегоНазначения" =============


  • Для Просмотра результата запроса в коде, где затруднен доступ отладчиком, удобно использовать метод таблицы значений ВыбратьСтроку(,). Метод ВыбратьСтроку() можно использовать и в отладчике для просмотра дерева значений.
  • Для получения последнего по дате документа можно использовать запрос к таблице документов с упорядочиванием по дате документа (по убыванию) и ключевым словом ВЫБРАТЬ ПЕРВЫЕ 1:
ВЫБРАТЬ ПЕРВЫЕ 1
	ПоступлениеТоваровУслуг.Ссылка
ИЗ
	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
УПОРЯДОЧИТЬ ПО
	ПоступлениеТоваровУслуг.Дата УБЫВ
  • Задание границы периода:
Новый Граница(КонецМесяца(Дата), ВидГраницы.Включая)
  • Для программного задания проводок в Бухгалтерии 2.0, ну или КОРП, свободного от всяких обработчиков, надо задать режим обмена данными:
...
НаборЗаписей.ОбменДанными.Загрузка = Истина;
...
ДокументОбъект.ОбменДанными.Загрузка = Истина;
...
  • Печать картинки с помощью IrfanView:
Команда = "" + ФайлIrfan.ПолноеИмя + " """ + ПолноеИмяКартинки + """ /resample /aspectratio /print";
ЗапуститьПриложение(Команда, , Истина);
  • Для того что бы понять, что в Переменной содержится ссылка на документ можно использовать:
Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Переменная))
  • Сохранение табличного документа в Excel:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента);
Для Каждого Область Из ТабДок.Области Цикл
	Попытка 
		СтароеЗначение = Область.Значение;
		Значение = Область.Текст; 
		Область.Формат = Неопределено; 
		Область.Значение = Значение;
	Исключение
		// нельзя читать 
	КонецПопытки;
КонецЦикла;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); 
Диалог.Фильтр = "Файл Excel(*.xls)|*.xls";
Если Диалог.Выбрать() Тогда
	ТабДок.Записать(Диалог.ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);
КонецЕсли;
  • Чтение документа из Excel через построитель запроса (метод табличного документа Прочитать(), платформа 8.3):
//Вывод в табличный документ

   ТабличныйДокумент = Новый ТабличныйДокумент;

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

//вывод в таблицу значений

   ПЗ = Новый ПостроительЗапроса;

   ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

   ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

   ПЗ.ЗаполнитьНастройки();

   ПЗ.Выполнить();

   ТаблицаЗначений = ПЗ.Результат.Выгрузить();
  • Создание элемента справочника с определенным UUID'ом:
УИД = Новый УникальныйИдентификатор();
НоваяСсылка = Справочники[ИмяМетаданных].ПолучитьСсылку(УИД);
НовыйЭлемент = Справочники[ИмяМетаданных].СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);