Имя: Пароль:
1C
1С v8
Как 1С понимает, что "Информационная база была перемещена или восстановлена"
0 retrowave
 
13.05.25
18:19
Здравствуйте. 1С определяет, что файл с базой перемещён по другому пути и вызывает окно, где просит пользователя указать перемещена ли база или это копия.
Подскажите, где можно найти условие благодаря которому 1С понимает, что нужно выдать это окно. Я хочу прописать очищение одного регистра при выполнении этого условия.

Всем заранее спасибо!
1 PR
 
13.05.25
18:23
Это не объект метаданных, это где-то в скулевой базе лежит
Условие смотри в коде
2 Ёпрст
 
гуру
13.05.25
18:38
(0) отсутствие  DoNotCopy.txt в каталоге с базой
3 PR
 
13.05.25
18:48
(2) Это только для файловой
4 Ёпрст
 
гуру
13.05.25
18:49
(3) а для серверной, там вроде и нету нихрена, ну разве что где-то в общем модуле(только в типовых сверяют) имя базы/сервера /кластера..
5 retrowave
 
13.05.25
18:49
Я на одном из форумах нашел следующее:
"БСП 2.3.2.61, смотрю в коде:
Общий модуль РегламентныеЗаданияСлужебный, функция УстановленаБлокировкаРаботыСВнешнимиРесурсами(...), в самом конце:

Если ИмяБазы <> СохраненноеИмяБазы
Или (ПараметрыБлокировки.ПроверятьИмяСервера
И (ИмяКомпьютера <> СохраненноеИмяКомпьютера
И ИмяСервера <> СохраненноеИмяСервера)) Тогда (...)".

У меня версия БСП "3.1.3.303". Я не смог найти в своей версии ту проверку, которую описали на форуме. Может кто знает есть ли похожая в новых бсп?
6 retrowave
 
13.05.25
18:50
(4) У меня как раз типовая УТ
7 retrowave
 
13.05.25
18:50
Я самостоятельно поискал и не нашел. Решил написать сюда, вдруг есть знатоки :)
8 Ёпрст
 
гуру
13.05.25
18:51
(6) включи замер, да найди, где это г.. оне берут, если не файловая.
9 retrowave
 
13.05.25
18:52
(8) тогда придется админов дёргать, чтобы сделали копию какой-нибудь базы
10 Ёпрст
 
гуру
13.05.25
19:08
(9) в типовой УТ смотри общий модуль
БлокировкаРаботыСВнешнимиРесурсами
и метод
   Функция УстановитьБлокировкуРаботыСВнешнимиРесурсами()

там найдешь все ответы
11 Ёпрст
 
гуру
13.05.25
19:10
Короче, там тупо в константе Константы.ПараметрыБлокировкиРаботыСВнешнимиРесурсами
хранят имя базы и прочий мусор и сравнивают с этим при старте.
Усё
12 АнализДанных
 
13.05.25
21:01
(0)
ПараметрыБлокировки = БлокировкаРаботыСВнешнимиРесурсами.СохраненныеПараметрыБлокировки();
    
Если ПараметрыБлокировки.РаботаСВнешнимиРесурсамиЗаблокирована = Истина Тогда
   //это копия
   //там в параметрах ещё какая-то инфа есть
КонецЕсли;
13 bolder
 
13.05.25
22:12
(11) Да.В типовых эта константа содержит хранилище значений.Далее сравнивается строка подключения в клиент-серверном варианте.
Также в хранилище есть идентификатор базы и имя сервера.
Все это позволяет отследить изменение расположения базы и перемещение файловый режим- серверный. DoNotCopy.txt содержит идентификатор файловой базы, если он не совпадает с сохраненным или отсутствует- база перемещена как копия.
14 timurhv
 
13.05.25
22:18
(13) вроде не все так просто, у кого-то может быть сервер прописан по ip, у кого-то по доменному имени сервера. Наткнулся там есть обращение к серверу 1С по Com или RAS (смотря что доступно) для получения идентификатора базы. Но вопрос как в Linux отрабатывается.

Сильно не копал, но чет не очень понятно как будет БСП подсистема отрабатывать случаи 1 пользователь подрубается по шаре к файловой, а второй через публикацию БД через веб-сервер.

Вообщем, надо копать глубже.
15 bolder
 
13.05.25
22:28
(14) Не имеет значения.
2.Весь код выполняется на сервере, значит обращение идет к тому же файлу DoNotCopy.txt.
16 bolder
 
13.05.25
22:47
(14) 1.Тоже не имеет значения.Используется платформенный метод СтрокаСоединенияИнформационнойБазы().Гарантируется платформой на всех поддерживаемых ОС.А вы у себя можете запускать и по имени сервера, и по IP, и даже через localhost.Строка от этого не изменится, пока сервер и база не меняются.
17 Chai Nic
 
14.05.25
07:49
(16) А если у сервера несколько DNS-имен, и например к одной и той же базе обращаются по разным именам и даже через разные порты (скажем, если база дополнительно опубликована в интернете)?
18 Ненавижу 1С
 
гуру
14.05.25
08:13
(17) если база используется несколькими кластерами серверов 1С, то будет весело, да
19 bolder
 
14.05.25
08:50
(17) При публикации в интернете информация о доступе к базе запоминается web сервером.Веб сервер обращается к кластеру серверов,и сервер выдает строку соединения.В кластере имя базы уникально.
20 ldo6
 
14.05.25
08:57
Код жесть. За 10 мин я не разобрался как и где конкретно проверяется и закрыл нафиг.
21 bolder
 
14.05.25
08:59
(20) Код очень простой и хорошо прокомментирован.
22 Ёпрст
 
гуру
14.05.25
09:01
(21) да и без камментов там всё понятно
23 Winnie Buh
 
гуру
14.05.25
09:06
(17)(18) у "Константы.ПараметрыБлокировкиРаботыСВнешнимиРесурсами" есть флаг "Проверять имя сервера"
24 bolder
 
14.05.25
09:11
(22) Да.Понятно конечно.Но такие комментарии прямо адресованы админам и не программистам даже.Лайк 1С однозначно.
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
....
    
    // Ниже код с учетом того, что режим работы не менялся:
    // 1. была файловая осталась файловая;
    // 2. была клиент-серверная осталась клиент-серверная.
25 Гость из Мариуполя
 
гуру
14.05.25
09:25
(15) Весь код выполняется на сервере, значит обращение идет к тому же файлу DoNotCopy.txt.

А теперь прикинь фишку в файловом варианте, сам несколько раз нарвался, попробуй :)
Удали DoNotCopy.txt в любой базе, в которой уже работал. Подчеркиваю - не в новой, свежеперемещенной, а в ранее работавшей.
Запускаем программу. Никто ничего ни о чем не спрашивает. Никакого сабжа. База работает в обычном режиме. DoNotCopy.txt вообще отсутствует. И более того - не создается, зараза.

получается (для файлового варианта) - при первом запуске где-то  что-то запоминается [идентификатор], и в дальнейшем удаление DoNotCopy.txt уже ни на что не влияет. Это, кстати, дополнение к (2)
проверял на ЗиКГУ
26 bolder
 
14.05.25
09:24
(23) По умолчанию галочка включена.И это правильно.Галочка вынесена в интерфейс для разруливания нештатных ситуаций.
27 bolder
 
14.05.25
09:47
(25) Выше уже писали.В константе - хранилище значений- все запоминается.Файл нужен только для вспомогательной цели копирования каталогов с базой - можно явно указать копию.
PS/Проверил на Бухгалтерии.НИфига, при скопированном файле - нормально, не копия, при удалении файла - сразу же распознает как копию и просит принять решение.Что в общем то и следует из кода, (прерывать проверки).
28 Winnie Buh
 
гуру
14.05.25
09:38
(25) там алгоритм проверки есть,
сначала проверяется формат базы, потом строка соединения - если они не менялись, то база считается не перемещенной и до проверки DoNotCopy.txt просто не доходит
29 bolder
 
14.05.25
10:01
(28)Верно.Если сабж(25)- в работающей базе подтвердили когда то что база НЕ копия, то строка сохранится в константе и сравнение вернет равенство, значит и проверки можно прекратить.Достаточно скопировать базу в новый каталог и отсутствие файла DoNotCopy.txt тут же сработает.
30 retrowave
 
14.05.25
10:44
(10) Спасибо большое! Сильно выручили
31 Winnie Buh
 
гуру
14.05.25
12:16
еще пара занятных моментов с этой константой и файлом DoNotCopy.txt:

Если после перемещения информационной базы при первом запуске в каталоге с ИБ не будет обнаружен файл DoNotCopy.txt, то факт перемещения базы будет записан в константе "ПараметрыБлокировкиРаботыСВнешнимиРесурсами" в параметре "ПричинаБлокировки", после чего программа при запуске будет выдавать сообщение о перемещении ИБ, даже если в каталог "подложить" файл DoNotCopy.txt с идентификатором базы.

Если информационная база была перемещена вместе с файлом DoNotCopy.txt, то база запускается без сообщения о перемещении и без слова [КОПИЯ] в заголовке программы, но при этом в константе "ПараметрыБлокировкиРаботыСВнешнимиРесурсами" не перезаписывается поле "СтрокаСоединения" с адресом нового расположения ИБ, т.е. если файл DoNotCopy.txt будет удален только через некоторое время после перемещения, то будет выдано сообщение о перемещении базы, даже если до удаления файла эта база долгое время запускалась без такого сообщения.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший