Всем привет!
Сегодня будет необычный кейс - будут представлены решения трех задач.
Задача 1
Задача 1 - поиск документов по номенклатуре (в другой формулировке - поиск документов по контрагенту, позже решил подобную задачу поиск документов по сотруднику).
Встает задача - как ускорить поиск. Решил оптимизировать решение так - сначала запускаю в конфигураторе по номенклатуре (контрагенту или сотруднику) "Поиск ссылок на объект" - копирую полученный результат в табличный документ обработки - далее запрос формирую динамически во время обхода строк табличного документа (рис. 1, 2, 3 - в ленте). Подходит для ОФ и УФ.
Текст = "";
Для К = 1 По Макет.ВысотаТаблицы Цикл
Стр = СокрЛП(Макет.Область(К,1,К,1).Текст);
МасПодстрок = РазложитьСтрокуВМассивПодстрок(Стр, ".");
Если МасПодстрок.Получить(0) <> "Документ" Тогда
Продолжить;
КонецЕсли;
Док = МасПодстрок.Получить(1);
Если МасПодстрок.Получить(2) = "Реквизит" Тогда
РеквизитТЧ = МасПодстрок.Получить(3);
Текст = Текст + "ВЫБРАТЬ
| """ + Док + """ КАК ТипДокумента,
| Ссылка КАК Ссылка,
| ""реквизит: " + РеквизитТЧ + """ КАК ТабЧасть
|ИЗ
| Документ." + Док + "
|ГДЕ
| " + РеквизитТЧ + " = &Сотрудник
|И
| Ссылка.Дата МЕЖДУ &НачПериода И &КонПериода
|ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
Если МасПодстрок.Получить(2) = "ТабличнаяЧасть" Тогда
//для табличной части аналогично анализируем и добавляем текст запроса...
//детали см. публикацию //infostart.ru/1c/tools/2728540/
КонецЕсли;
КонецЦикла;
Текст = Лев(Текст, СтрДлина(Текст) - 16);
Текст = Текст + "
|УПОРЯДОЧИТЬ ПО
| ТипДокумента,
| Ссылка
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос = Новый Запрос;
Запрос.Текст = Текст;
Запрос.УстановитьПараметр("Сотрудник", Объект.Сотрудник);
Запрос.УстановитьПараметр("НачПериода", Объект.НачПериода);
Запрос.УстановитьПараметр("КонПериода", Объект.КонПериода);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Объект.СписокДокументов.Очистить();
Пока Выборка.Следующий() Цикл
Если ЗначениеЗаполнено(Выборка.Ссылка) Тогда
Стр = Объект.СписокДокументов.Добавить();
Стр.Документ = Выборка.Ссылка;
Стр.ТипДокумента = Выборка.ТипДокумента;
Стр.ТабЧасть = Выборка.ТабЧасть;
КонецЕсли;
КонецЦикла;
Задача 2
Задача 2 - имеется динамический список номенклатуры - только для ОФ. Нужно на форме списка реализовать два отбора: отбор по остаткам - то есть показывать "только в наличии", и отбор по брендам (или по производителям, у кого как).
Другой способ - чтобы не запутаться в уже имеющемся коде и с перспективой развития функционала - я добавил в справочник Номенклатура еще один реквизит "Ссылка2", записываю его равным значению Ссылка. Когда накладываю дополнительный отбор по остаткам номенклатуры, то задействую отбор по полю Ссылка2, не сбивая отбор по полю Ссылка.
Задача 3
Имеется Файловая база 38 Гб - доработанная УТ 10.3 (рис. 5, 6).
Когда она перестанет открываться - неизвестно. Еженедельный анализ размеров таблиц показывает, что таблица "Товары" документа "РеализацияТоваровУслуг" растет быстрее всех - это первая строка сверху на рисунке 6. Задача 3 - спасти базу.
Третий способ - как временный способ - и как часть процесса будущей свертки - очистить таблицу Товары в документах РеализацияТоваровУслуг (за определенный период) с запретом на перепроведение этих документов.
Реализовать этот способ возможно благодаря тому, что режим удаления движений задан не "автоматический", а как "не удалять автоматически" - рис.7 - то есть перед проведением документа сначала программно вызываются процедуры удаления движений. А значит можно поставить "заглушку".
Вот это можно использовать: для 2017 года можно написать обход этих процедур (рис. 8, 9).
Далее я проверил, чтобы в процедурах ПередЗаписью() и ПриЗаписи() стояла проверка на режим обмена данных загрузка - это позволит при удалении таблицы Товары записывать документ Реализация товаров и услуг в режиме ОбменДанными.Загрузка = Истина (рис.10, 11) - чтобы не выполнялись никакие другие проверки.
Перепроведение документов в этом периоде 2017 года также запрещено стандартным механизмом "Датой запрета редактирования".
Еженедельно таблица товаров реализаций росла на 36 Мб, при таком темпе таблица достигла бы лимита в 4Гб через 2-2,5 месяца. Таким способом получилось удалить товары за период 2017-2019 включительно, освободить 1Гб этой таблицы, отсрочить переполнение таблицы почти на 7 мес.
Таблица по регистру накопления НДС-начисления (итоговая) растет с темпом 1Мб в неделю, поэтому не критично для ситуации в целом. Таким способом можно начать первый этап свертки больших файловых баз, работа в которых происходит в режиме 24х7.
В дальнейшем я развил мысль удаления табличных частей у документов - и реализовал свертку подокументно. О чем описал в статье Свертка базы УТ 10.3. Новая концепция.
На этом все. Всем добра!
С пользой для клиентов, Рустем
Вступайте в нашу телеграмм-группу Инфостарт
