КОПИЛКА: здесь всякие редкости, полезности, тонкости, неочевидности.

Автор Злоп, 03 ноября 2024, 01:02

« назад - далее »

Злоп

ОСОБЕННОСТИ ФИЛЬТРА НА ИТЗ C ИНДЕКСОМ ПО УБЫВАНИЮ

На примере колонки с числовыми значениями.
Если индекс построен по убыванию, то мин-макс значения фильтра следует задавать согласно установленному порядку в индексе (условно: мин.значение - значение вверху таблицы, макс.значение - значение внизу таблицы).

//*******************************************
Процедура Сформировать()
	ОчиститьОкноСообщений();
	
	Сообщить("Прямой индекс");
	ИТЗ = СоздатьОбъект("ИндексированнаяТаблица");
	ИТЗ.НоваяКолонка("НомерПартии");
	ИТЗ.ДобавитьИндекс("НомерПартии","НомерПартии");

	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 1;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 2;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 3;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 4;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 5;
	
	ИТЗ.УстановитьФильтр(3,4,"НомерПартии");  // хотим получить значения в диапазоне [3,4]
	ИТЗ.ВыбратьСтроки("НомерПартии");
	Пока ИТЗ.ПолучитьСтроку("НомерПартии") = 1 Цикл
		Сообщить(ИТЗ.НомерПартии);
	КонецЦикла;
	Сообщить("Прямой индекс (ожидали 3,4): готово! ок");

	Сообщить("Обратный индекс");
	ИТЗ = СоздатьОбъект("ИндексированнаяТаблица");
	ИТЗ.НоваяКолонка("НомерПартии");
	ИТЗ.ДобавитьИндекс("НомерПартии","НомерПартии-");

	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 1;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 2;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 3;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 4;
	ИТЗ.НоваяСтрока(); ИТЗ.НомерПартии = 5;
	
	ИТЗ.УстановитьФильтр(3,4,"НомерПартии"); // хотим получить значения в диапазоне [3,4]
	ИТЗ.ВыбратьСтроки("НомерПартии");
	Пока ИТЗ.ПолучитьСтроку("НомерПартии") = 1 Цикл
		Сообщить(ИТЗ.НомерПартии);
	КонецЦикла;
	Сообщить("Обратный индекс (ожидали 4,3): готово! ..трабл");	

	ИТЗ.УстановитьФильтр(4,3,"НомерПартии");  // хотим получить значения в диапазоне [3,4]
	ИТЗ.ВыбратьСтроки("НомерПартии");
	Пока ИТЗ.ПолучитьСтроку("НомерПартии") = 1 Цикл
		Сообщить(ИТЗ.НомерПартии);
	КонецЦикла;
	Сообщить("Обратный индекс (ожидали 4,3): готово! ок");	

	
КонецПроцедуры // Сформировать()

Со строковыми значениями - аналогично работает.
Если отбирать по фильтру на диапазон значений ссылочного типа, например номенклатуру от ТоварЧтоТо до ТоварЕщеТо - пока непонятно что будет, не проверял.

Обсуждения, если надо, ведем в отдельной ветке!  https://forum.dorex.pro/index.php?topic=232

Злоп

Быстро моргнуть окошком-сообщением при надобности можно так:
Предупреждение("Завершено!",-1); // таймер = -1, предупреждение появится и сразу же закроется (быстрее чем 1 сек)

Злоп

Графы отбора VS общие реквизиты
Ковычки: а чем графы отбора лучше общих реквизитов ?
Епрст: лежат в отдельной табличке, не пухнет 1sjourn и меньше времени на запись оной.

trad

Ну да, ну да..
Не в отдельной табличке, а в 1scrdoc, там же где и вся подчиненность документов
Так что, что то пухнет и замедляется, что это
Графы не лучше и не хуже общих реквизитов. Они имеют разное назначение

Злоп

ФОРМАТЫ ЗАДАНИЯ ДАТ
константы типа "Дата" и преобразование дат функцией Дата() корректно отрабатывают если в качестве разделителей заданы любые знаки, отличные от цифр.
'31/12/2025'
'31-12-2025'
'31+12+2025'
'31.12.2025'
'31ю12ю2025'
- все это нормально типизируется в дату
все указанные выше значения нормально отрабатывают и функцией Дата(), например, Дата("31ю12ю2025") вполне корректно отработает...

Злоп

ПРАВИЛЬНАЯ ПРОВЕРКА НАЛИЧИЯ КАТАЛОГА

так делать не надо:
Если ФС.СуществуетФайл(КакойТоКаталог)=0 Тогда
это будет работать правильно кроме единственного варианта, когда каталог - корень диска, типа D:\

делать надо так:
Если ФС.СуществуетФайл(КакойТоКаталог+"NUL")=0 Тогда
это будет работать правильно везде

Злоп


Злоп

ПОДМЕНИТЬ ШТАТНЫЙ ВЫБОР ПЕРИОДА В ЖУРНАЛАХ ДОКУМЕНТОВ

Используем Formex, в ГМ делаем вставку в предопределенную процедуру.
Процедура ПриПолученииКомандыГлавнымОкном(Команда, НулевойПараметр, ФСО)

  Если Команда = 32881 Тогда // нажата на тулбаре журнала кнопка выбора периода журнала
    КонтекстЖурнала = ""; глСервис.АктивныйКонтекст(КонтекстЖурнала);
    ДатаН = КонтекстЖурнала.НачалоИнтервала();
    ДатаК = КонтекстЖурнала.КонецИнтервала();
    глВвестиПериод(ДатаН,ДатаК); // здесь вызываем модально СВОЮ красивую обработку выбора периода
    КонтекстЖурнала.УстановитьИнтервал(ДатаН,ДатаК);
    ФСО = 0; 
    Возврат; 				
  КонецЕсли;

КонецПроцедуры // ПриПолученииКомандыГлавнымОкном()

Злоп

ПОДМЕНИТЬ ШТАТНЫЙ ВЫБОР ПЕРИОДА В ЖУРНАЛАХ ДОКУМЕНТОВ, продолжение
Ветка обсуждения

Поправочка.
Описанное выше не работает в системных предопределенных журналах, которых нет в перечне журналов документов в дереве метаданных, но их можно выбрать из перечня журналов, там они идентифицируются как "(Прочие)" и "(Полный)". Формы этих журналов формексом не отлавливаются (не имеют собственного контекста?), поэтому код надо вот так (чтобы не упал по ошибке на КонтекстЖурнала.НачалоИнтервала()):
Процедура ПриПолученииКомандыГлавнымОкном(Команда, НулевойПараметр, ФСО)

  Если Команда = 32881 Тогда
    КонтекстЖурнала = ""; глСервис.АктивныйКонтекст(КонтекстЖурнала);
    Если ПустоеЗначение(КонтекстЖурнала) = 1 Тогда Возврат; КонецЕсли; // тут штатный выбор периода
    ДатаН = КонтекстЖурнала.НачалоИнтервала();
    ДатаК = КонтекстЖурнала.КонецИнтервала();
    глВвестиПериод(ДатаН,ДатаК); // здесь вызываем модально СВОЮ обработку выбора периода
    КонтекстЖурнала.УстановитьИнтервал(ДатаН,ДатаК);
    ФСО = 0; 
    Возврат; 				
  КонецЕсли;

КонецПроцедуры // ПриПолученииКомандыГлавнымОкном()

Злоп

ТЕКСТ НА КНОПКЕ В НЕСКОЛЬКО СТРОК
Была такая тема: https://1cpp.ru/forum/YaBB.pl?num=1222937598

Процедура ПослеОткрытия()
   ФормаРасш = СоздатьОбъект("РасширениеФормы");
   Атр = ФормаРасш.ПолучитьАтрибут("кн1");  // ну или что-то там с именем кнопки.
   Атр.ИзменитьСтиль(11,8192+256);//выравнивание влево
   Атр.ИзменитьСтиль(11,8192);//выравнивание по центру
   Атр.Заголовок = "тест1"+РазделительСтрок+"тест2";
КонецПроцедуры // ПослеОткрытия()

Злоп

ТЕКСТ НА КНОПКЕ В НЕСКОЛЬКО СТРОК, ПРОДОЛЖЕНИЕ
Атр.ИзменитьСтиль(11,8192+256+256);//выравнивание вправо

Злоп

ЗАПРЕТ СМЕШИВАНИЯ ГРУПП И ЭЛЕМЕНТОВ НА УРОВНЕ СПРАВОЧНИКА
Ветка здесь, рецепт от Харлампий Дымба

Для интерактивного запрета ввода "в диалоге" (вставляем в форме группы и форме элемента) - универсальный код такой:
Процедура ВводНового() 
    МетаСпр=Метаданные.Справочник(Вид());
    Если МетаСпр.КоличествоУровней>1 Тогда
        Спр=СоздатьОбъект("Справочник."+Вид());
        Если ПустоеЗначение(МетаСпр.Владелец)=0 Тогда
            Спр.ИспользоватьВладельца(Владелец);
        КонецЕсли;
        Если ПустоеЗначение(Родитель)=0 Тогда
            Спр.ИспользоватьРодителя(Родитель);
        КонецЕсли;
        Если Спр.ВыбратьЭлементы()=1 Тогда
            Если Спр.ПолучитьЭлемент(0)=1 Тогда
                Если Спр.ЭтоГруппа()<>ЭтоГруппа() Тогда
                    Предупреждение("ОТКАЗ: нарушение принципа иерархии",-1); // или Сообщение
                    СтатусВозврата(0);
                    Возврат;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;    
КонецПроцедуры

Злоп

ШАБЛОН ИЕРАРХИЧЕСКОГО ВЫВОДА С РЕКУРСИЕЙ (ПО ИТЗ)
источник: trad
Ветка здесь

Перем мВсегоПозиций, мТекСтрока;

//*******************************************
Процедура ВывестиИерархию(Таб, ИТ, Отступ = "")
    ИТ.ВыбратьСтроки("индПорядок");
    Пока ИТ.ПолучитьСтроку("индПорядок") = 1 Цикл
        Если ИТ.__ЭтоГруппа__ = 1 Тогда
            ПечНаименование = Отступ + ИТ.Наименование;
            Если ИТ.__Уровень__ = 1 Тогда
                ИмяСекции = "Группа1уровня";
            Иначе
                ИмяСекции = "Группа";
            КонецЕсли;
            Таб.ВывестиСекцию(ИмяСекции);
            ВывестиИерархию(Таб, ИТ.тзПотомки, Отступ + " ");
        Иначе
            мТекСтрока = мТекСтрока + 1;
            Если мТекСтрока % 10 = 0 Тогда
                Состояние("Вывод... " + Цел(мТекСтрока / мВсегоПозиций * 100) + "%");
            КонецЕсли;
            ПечНаименование = ИТ.Наименование;
            Таб.ВывестиСекцию("Строка");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры


//*******************************************
Процедура ОбработатьИерархию(ИТ)
    ИТ.ВыбратьСтроки();
    Пока ИТ.ПолучитьСтроку() = 1 Цикл
        Если ИТ.__ЭтоГруппа__ = 1 Тогда
            ИТ.Наименование = ИТ.Ссылка.Наименование;
            ОбработатьИерархию(ИТ.тзПотомки);
        КонецЕсли;
    КонецЦикла;
    ИТ.ДобавитьИндекс("индПорядок", "Наименование");
КонецПроцедуры


//*******************************************
Процедура Сформировать()
    РезИТ = СоздатьОбъект("ИндексированнаяТаблица");
    
    // тут получение данных в ИТ
    //в данных должны быть поля Ссылка,Наименование
    //желательно наличие поля Ссылка_Родитель
    
    мВсегоПозиций = РезИТ.КоличествоСтрок();
    Если мВсегоПозиций = 0 Тогда
        Возврат;
    КонецЕсли;
    
    РезИТ.Группировать("Ссылка:Ссылка*&", , 0);
    ОбработатьИерархию(РезИТ);
    
    Таб = СоздатьОбъект("Таблица");
    //Таб.ИсходнаяТаблица();
    Таб.ВывестиСекцию("Шапка");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0, "Печать", "Окно");
    Таб.ПовторятьПриПечатиСтроки(Таб.ВысотаТаблицы(), Таб.ВысотаТаблицы());
    
    мТекСтрока=0;
    ВывестиИерархию(Таб, РезИТ);
    
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    //Таб.ПараметрыСтраницы();
    Таб.Показать();
КонецПроцедуры