Это старая версия документа.
Элементарные алгоритмы
Удаление строк таблицы значений
Сч = 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'ом:
УИД = Новый УникальныйИдентификатор(); НоваяСсылка = Справочники[ИмяМетаданных].ПолучитьСсылку(УИД); НовыйЭлемент = Справочники[ИмяМетаданных].СоздатьЭлемент(); НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);