Добрый день!
Вопрос конечно к Djelf, но его с нами нет, и как это ни прискорбно, но судя по: https://forum.dorex.pro/index.php?topic=326.0 уже и не будет >:(
Уже давно, при старте системы, с его подачи, использую такую процедуру:
Функция СписокГрупп(Сорт = 0) Экспорт
Перем Запрос;
Если ПустоеЗначение(БазаДанных) = 1 Тогда
БазаДанных = СоздатьОбъект("SQLiteBase");
КонецЕсли;
Если БазаДанных.Открыта() = 0 Тогда
БазаДанных.Открыть(":memory:");
КонецЕсли;
Запрос = БазаДанных.НовыйЗапрос();
ТекстЗапроса = "SELECT id [Гр:Справочник.Номенклатура] FROM [Справочник.Номенклатура] WHERE isfolder = 1";
Если Сорт = 1 Тогда
ТекстЗапроса = ТекстЗапроса + " ORDER BY DESCR";
ИначеЕсли Сорт = 2 Тогда
ТекстЗапроса = ТекстЗапроса + " ORDER BY CODE";
КонецЕсли;
Попытка
СЗ = СоздатьОбъект("СписокЗначений");
Рез = Запрос.ВыполнитьЗапрос(ТекстЗапроса, СЗ);
Запрос = 0;
Возврат Рез;
Исключение
Сообщить(ОписаниеОшибки());
Возврат 0;
КонецПопытки;
КонецФункции
Процедура КешироватьЗапрос() Экспорт
Состояние("Построение индекса полнотекстового поиска");
Если ПустоеЗначение(БазаДанных) = 1 Тогда
БазаДанных = СоздатьОбъект("SQLiteBase");
КонецЕсли;
Если БазаДанных.Открыта() = 0 Тогда
БазаДанных.Открыть(":memory:");
КонецЕсли;
БазаДанных.НовыйЗапрос().ВыполнитьЗапрос("DROP TABLE IF EXISTS tri;");
БазаДанных.НовыйЗапрос().ВыполнитьЗапрос("CREATE VIRTUAL TABLE tri USING fts5(ID UNINDEXED, DESCR, ismark, VERSTAMP UNINDEXED, tokenize='trigram');");
БазаДанных.НовыйЗапрос().ВыполнитьЗапрос("
|INSERT INTO tri(ROWID,ID,DESCR, ismark, VERSTAMP)
|SELECT
| Номенклатура.ROWID,
| Номенклатура.ID,
| Номенклатура.DESCR,
| Номенклатура.ismark,
| Номенклатура.VERSTAMP
|FROM Справочник_Номенклатура AS Номенклатура
|WHERE Номенклатура.isfolder=2 and Номенклатура.ismark <> '*'
|");
КэшФТС = 1;
СписокГрупп(); // Он нам тут не нужен, но, что-бы тоже закешировался
Состояние("");
КонецПроцедуры
В общем-то, работает отлично, значительно ускоряет "быстрый поиск" товара в справочнике.
Отрабатывает при старте - мгновенно, по крайней мере не заметно.
Магазинчики маленькие, в основном работают по одному пользователю, локально.
Но, подключил в одном магазине второго пользователя по сети - и вылезла проблема...
При запуске программа долго делает этот запрос по сети(файловая база, сетка обычная проводная одноранговая).
При запуске около минуты висит месага: "Построение индекса полнотекстового поиска"... Потом, когда наконец запустится - все работает идеально быстро...
Я конечно понимаю, что решением будет RDP... Но, как-то не хочется...
Может есть какие-то варианты, что еще "подкрутить" в этом запросе, что-бы минимизировать этот эффект? Или как-то запихнуть его в отдельный поток, что-бы он отрабатывал "незаметно" и не тормозил загрузку?
Никто не сталкивался с чем-то подобным?
Цитата: MWW_Ruza от 04 марта 2026, 08:41Или как-то запихнуть его в отдельный поток, что-бы он отрабатывал "незаметно" и не тормозил загрузку?
Через обработку ожидания например? Но, тут, как я понимаю, все равно, когда обработка ожидания сработает, 1Ска "задумается" до завершения запроса... В фон таким образом ее не получится запрятать...
Я в таких случаях использую решение от Вирт - V7DBNet 2.5. Вот описание технологии:
Клиентская часть разработки перехватывает обращения к файлам DBF и CDX и
передает запросы на сервер, сервер возвращает результат в виде кэш-страниц. Далее
клиент работает с такой страницей без обращения к серверу, пока сервер не сообщит о
потере ее актуальности.
Для обеспечения надежности (начиная с версии 2.0.0.1) каждый сеанс работает с
сервером через изолированную транзакцию, что помимо стабильности обеспечивает
полную параллельность доступа по чтению, даже если в данный момент происходит
запись в таблицы.
Запись происходит также в отдельной изолированной транзакции, но поочередно.
Клиент подает запрос серверу на запись, сервер добавляет его в очередь ожидания, если
кто-то уже пишет данные, или сразу дает разрешение. Сервер регулирует очередность
записи, разделяя время между претендентами, сводя к минимуму «Ошибку блокировки
транзакции». Также, для исключения неудачного захвата транзакции, в клиенте,
стандартный вопрос 1С о невозможности захвата транзакции заменен на вопрос с
автоповтором попытки через 3 секунды.
Когда клиенту разрешена запись, он отправляет на сервер модифицированные
данные. Если клиент сообщает, что он завершает запись успешно, и других измененных
данных не будет, сервер отражает измененные данные в файлах и фиксирует совою
транзакцию. В случае неудачного завершения транзакции, она просто удаляется, ни каких
изменений не происходит.
Сервер поддерживает три типа транзакций: оптимистический, пессимистический и
режим прямого доступа. Начиная с версии 1.0.0.2. клиент может выбрать тип транзакции
необходимый ему в текущий момент.
Я использовал это решение в нескольких местах в течении многих лет и каких-то проблем не фиксировал. Скорость, конечно, меньше чем у RDP, но работать вполне комфортно, примерно на уровне SQL. Я использовал кэш в районе 100 МБ, поэтому большинство часто используемых справочников кэшировались.
Автор в последней версии разрешил бесплатное использование. Могу расшарить инсталляшку.
https://forum.dorex.pro/index.php?topic=287.0
Цитата: item от 05 марта 2026, 01:00https://forum.dorex.pro/index.php?topic=287.0
Спасибо, не видел это обсуждение - как-то мимо меня прошло. К тому обсуждению могу только добавить, что можно выполнить запрос в монопольном режиме в базе без всяких Виртов и это будет максимально возможная скорость кэширования. Если она приемлемая, то можно искать способы приближения к ней.
Вот тоже интересно:
Цитата: Arbuz от 08 сентября 2025, 15:41Цитата: Djelf от 29 августа 2025, 15:223. Можно включить монопольный режим доступа в sqlite
Это что имеется в виду?
Как это сделать? Для моей задачи это более чем выход из положения был-бы... Одновременных обращений к SQLite от других пользователей в момент кеширования не будет, в виду того, что пользователей "кот наплакал", всего два в моем случае...
Цитата: MWW_Ruza от 04 марта 2026, 08:41СписокГрупп
А для чего СписокГрупп() ...?
Посмотрел - просто возвращает плоский список групп.
Цитата: MWW_Ruza от 05 марта 2026, 14:53Как это сделать? Для моей задачи это более чем выход из положения был-бы... Одновременных обращений к SQLite от других пользователей в момент кеширования не будет, в виду того, что пользователей "кот наплакал", всего два в моем случае...
Нашел в документации SQLite:
У объекта SQLiteQuery, который создается методом SQLiteBase::НовыйЗапрос есть свойство ВыполнятьВТранзакции / NeedTransaction: 1 - автоматически начинать транзакцию 1С при выполнении запроса в момент первого обращения к таблицам 1С, 0 - не начинать.
Цитата: Злоп от 05 марта 2026, 20:30А для чего СписокГрупп() ...?
Да, именно так. Этот список мне нужен для создания нового элемента справочника Номенклатура, из автоматических обработок например, "Сопоставление или создание номенклатуры из ЭДО" или "Создание номенклатуры по ШтрихКоду из интернет-базы ОлегОн". Для выбора - типа, куда поместить создаваемый эжлемент.
Без запроса, тупым перебором справочника, это отрабатывает дольше. Так комфортнее.
Цитата: Ветер в поле от 05 марта 2026, 21:44есть свойство ВыполнятьВТранзакции / NeedTransaction: 1 - автоматически начинать транзакцию 1С при выполнении запроса в момент первого обращения к таблицам 1С, 0 - не начинать.
Хм... Интересно, надо попробовать, хотя, как-то прямого смысла не улавливаю - если-бы я менял что-то в запросе, то запись порциями в транзакциях должна была бы ускорить... Но, тут я просто получаю данные... При чем тут транзакция?
Но, все равно попробую - х.з., какие там внутренние заморочки, может как-то повлияет.
Цитата: MWW_Ruza от 06 марта 2026, 08:07для создания нового элемента справочника Номенклатура, из автоматических обработок например,
в смысле..? эээ. и как ты определяешь в какую группу положить новый элемент? Имея список групп...
Выбором из списка вручную, пользователем
Цитата: MWW_Ruza от 06 марта 2026, 16:49Выбором из списка вручную, пользователем
ну.. так неинтересно ;-)
я думал это для каких-то занятных кунштюков...
Цитата: Злоп от 06 марта 2026, 18:10ну.. так неинтересно ;-)
я думал это для каких-то занятных кунштюков...
Да нет, тут все банально просто...
Вот, создание ноиенклатуры из интернета по ШтрихКоду из базы ОлегОн:
https://cloud.mail.ru/public/voj5/LQS94tDWo
Аналогично и по ЭДО...
Просто, у некоторых большие справочники, и появление списка групп, если не закешировать, особенно при обычном переборе и заполнении списка, затягивается на несколько секунд... Так - мгновенно.
PS К сабжу не относится, так, размышление на тему, но, хочу переделать выбор из списка группы - появился клиент с запчастями, а там разветвленное дерево групп, в отличии от продуктов - напимер: "МАЗ, КАМАЗ", а внутри каждой - "Двигатель, Тормоза и т.п....". И когда вываливается линейный список, трудно понять в какую группу с одинаковым названием засунуть новый элемент, что у "МАЗа", что у "КАМАЗа" есть "Двигатель, Тормоза и т.п..."... Надо будет сделать, что-бы не список открывался, а форма списка справочника с элементами(группами) из списка. Тогда там иерархия будет, и проще будет понять куда помещать новый элемент.
Цитата: MWW_Ruza от 07 марта 2026, 11:06Надо будет сделать, что-бы не список открывался, а форма списка справочника с элементами(группами) из списка.
Да, фиг там... "Малой кровью" не получается... "ИспользоватьСписокЭлементов" при открытии формы списка справочника нормально работает только для элементов, для групп получается такая фигня:
(https://content.foto.my.mail.ru/mail/m_w_w/590/h-632.jpg)
Надо что-то другое, более сложное придумывать...
Цитата: MWW_Ruza от 07 марта 2026, 11:06а там разветвленное дерево групп, в отличии от продуктов - напимер: "МАЗ, КАМАЗ", а внутри каждой - "Двигатель, Тормоза и т.п....".
.
Блин, у меня сейчас точно такой клиент.
Стоит задачка затяжки прайсов от поставщиков.
Можно скооперироваться.
Цитата: MWW_Ruza от 07 марта 2026, 11:06и проще будет понять куда помещать новый элемент.
возможно на StrMatch еще можно повысить предсказательность к какой группе скорее всего относится
Цитата: MWW_Ruza от 07 марта 2026, 11:06Надо что-то другое, более сложное придумывать...
Нарисовать свою формочку только с деревом групп типа? на формексе и скулайт должно хорошо получиться.
Да надо подумать... Своя форма только с деревом - интересный вариант... Попробую.
Пока сделал так:
(https://content.foto.my.mail.ru/mail/m_w_w/590/h-633.jpg)
Просто в мтроке списка в представлении наименование группы и ее родителя... В общем-то, для этой задачи сойдет, но дерево было бы интереснее...
PS А привязывать какие-то матчи и прочие "гадалки" по похожести, как-то не планирую... Не та задача, сомневаюсь, что какой-то "полуискуственный интелект" в моем случае нормально отработает... Уж очень специфическая задача...
Цитата: MWW_Ruza от 07 марта 2026, 12:26Своя форма только с деревом - интересный вариант... Попробую.
Интересный то интересный... Но, не все так просто. Дерево групп прорисовывается красиво, мгновенно, и ни какой список не нужен...
Но, как обработать выбор группы из дерева, я не нашел... Нет подходящего события. Оставил пока так, как в предыдущей месаге.
-
Цитата: MWW_Ruza от 07 марта 2026, 15:21Но, как обработать выбор группы из дерева, я не нашел... Нет подходящего события.
Если только кнопку отдельную делать, а группу в дереве ловить с помощью "ПриПереносеЭлементаВДругуюГруппу(<Элемент>,<Группа>)" - подсовывать первый попавшийся элемент справочника, "Группа" при этом будет выбранная в дереве группа... После этого СтатусВозврата(0)...
Но, не нравится мне этот вариант... Кнопка... Лишнее движение. А поймать событие выбора группы в дереве - похоже просто так не возможно... Можно конечно извратиться, через координаты дерева(как, например, переход по ссылке при клике на картинке) или что-то наподобии, но, похоже, того не стоит...
Если вы про справочник, то
ПриВыбореРодителя работает в дереве
Цитата: item от 08 марта 2026, 11:09ПриВыбореРодителя работает в дереве
Хм... Да? Сейчас попробую...
Получилось!
Спасибо за наводки!
Процедура ПриВыбореРодителя(Эл)
Форма.Параметр = Эл;
СтатусВозврата(0);
Форма.Закрыть(0);
КонецПроцедуры
Процедура Отм()
Форма.Параметр = "";
СтатусВозврата(0);
Форма.Закрыть(0);
КонецПроцедуры
Статус возврата нужен... Без него 1С падает, судя по всему, потому, что процедура "до конца не дорабатывает", с ним - нормально.
Вот так это работает: https://cloud.mail.ru/public/iALJ/wxYyxmjHh
Можно из кэширования убрать создание списка групп, оно теперь не нужно...
Но, это особо выигрыша не даст в скорости кэширования, там основное время не это занимало, а кэш всего справочника для поиска... Но, все равно, по крупицам...
Цитата: item от 08 марта 2026, 11:09Если вы про справочник, то
ПриВыбореРодителя работает в дереве
Логично...
Но мы, погромисты 1С, как реализующие всякие нелогичные хотелки, и сами уже стали нелогичными...
Вот, уж, когда коту делать нечего...
В эту форму для выбора групп, добавил:
Процедура ПриОткрытии()
Scr = CreateObject("WScript.Shell");
Scr.SendKeys("+{TAB}");
Scr.SendKeys("{RIGHT 1}");
КонецПроцедуры
Теперь открывается с развернутой группой верхнего уровня, корневой - "Номенклатура".
Так:
https://cloud.mail.ru/public/VVgA/EmtGm5NJt
К сабжу... Как выяснилось, там тормозит не только кеширование, а вообще тормозно программа работает, по сетке... Пользователей всего два, база совсем лёгкая, ей месяц от роду, и более тяжёлые базы, и с большим количеством пользователей в таких условиях "летают". Сетка проводная, 100 мегабит. Единственное, что не обычно для меня - на этом ноуте стоит WIN-11... На основном компе WIN-7, 64 bit.
Может 11 так влиять? Может надо режим совместимости включить, или ещё что-то?
PS Всякие радикальные решения, типа РДП, или клиент-сервер, как выше предлагали, не хотелось бы - это "из пушки по воробьям"... Ну не та задача.
С каких пор бызы в семерке летают по сети?
Как раз для этого умные люди и придумали дбнет и другие клиент-серверные решения, не касающиеся рдп.
Смотря что как построена работа. может тупо УРБД поставить и меняться автоматом
Урбд? Когда компы а пяти метрах друг от друга стоят, в одной локалке? Да, "месье знает толк в извращениях" ;-)
А насчёт "летает"... Ну, может и не летает, но такие маленькие базы вполне комфортно работают... А тут, заметно тормознее, чем обычно... Поэтому и подумал на винду 11, остальное всё как обычно.
Уж если извращаться, то тогда РДП... Пропатчить семёрку для доступности нескольких сеансов, и цеплять к ней ноут с 11 клиентом. Но, как то странно всё это. Обычно, для таких задач и простого файлового доступа по сетке хватало... А тут, прямо реальные тормоза.
Дбнет, как то не хочется разбираттся. Не использовал ни разу, и тут задача явно не та...
Совместимость стояла - XP. Для пробы переключил на Win-7, но есть изменения или нет, узнаю только завтра...
Она сегодня не работает, а говорит, что тормоза только когда что-то записывает... Так - не видно, работает нормально ИМХО. Кэш при старте формируется около 40 секунд. Долго конечно, не не смертельно.
А вот про запись, она говорит, "что по 7 минут записывается новый товар"...
Но, сказать можно все, я этого сам не видел, и как-то не особо верю... Завтра посмотрю сам.
Настройки файловой системы проверить. отключить DFS. отключить возможность автономной работы.
Это где?
На компе, с которого подключаются, или на том, на котором база?
С которого подключаются
Это всего лишь один из вариантов
Также посмотреть качество сетки.
Ну, с автономными файлами, проверю...
А DFS это же вроде только серверная фича? Или в 11 винде тоже её добавили?