Коллеги, приветствую вас в профессиональном пространстве, посвященном тонкостям Платформы 1С и СУБД!
Меня зовут Антон Дорошкевич, и я представляю Франчайзинговую сеть ИнфоСофт из Новосибирска.
Более двух десятилетий я влюблён в лучшую в мире платформу 1С и PostgreSQL, хотя не могу не признать, что MS SQL также является отличным выбором для 1С на сегодняшний день.
Что вас ждёт в этом канале:
✅ Интересные кейсы и расследования по работе с платформой 1С и СУБД, включая как PostgreSQL, так и MS SQL.
✅ Ответы на часто задаваемые вопросы, которые не всегда можно найти в документации или которые требуют дополнительного разъяснения.
✅ Выкладки из Технологического журнала, логи СУБД и полезные скриншоты.
✅ Анонсы выступлений на конференциях, посвящённых 1С и СУБД
Наше рабочее пространство: Здесь нет места опросам, рекламе и лишнему шуму. Только концентрат полезного контента для экспертов.
Если у вас есть вопрос или нужна помощь?
Воспользуйтесь формой для разовой консультации
❗️Важно: Если у вас критическая ситуация (например, остановлен прод), напишите мне напрямую в личные сообщения @doroshkevich_anton или на email: a.doroshkevich@is1c.ru. Постараюсь сделать всё возможное, чтобы помочь в срочном порядке.
Так же теперь канал есть в MAX и dzen
Присоединяйтесь!
Здесь ценят профессионализм, ясность и готовность разбираться в сложном. Это будет место для тех, кто предпочитает глубину поверхностным решениям!
Рад видеть вас в числе подписчиков! 😊
Меня зовут Антон Дорошкевич, и я представляю Франчайзинговую сеть ИнфоСофт из Новосибирска.
Более двух десятилетий я влюблён в лучшую в мире платформу 1С и PostgreSQL, хотя не могу не признать, что MS SQL также является отличным выбором для 1С на сегодняшний день.
Что вас ждёт в этом канале:
✅ Интересные кейсы и расследования по работе с платформой 1С и СУБД, включая как PostgreSQL, так и MS SQL.
✅ Ответы на часто задаваемые вопросы, которые не всегда можно найти в документации или которые требуют дополнительного разъяснения.
✅ Выкладки из Технологического журнала, логи СУБД и полезные скриншоты.
✅ Анонсы выступлений на конференциях, посвящённых 1С и СУБД
Наше рабочее пространство: Здесь нет места опросам, рекламе и лишнему шуму. Только концентрат полезного контента для экспертов.
Если у вас есть вопрос или нужна помощь?
Воспользуйтесь формой для разовой консультации
❗️Важно: Если у вас критическая ситуация (например, остановлен прод), напишите мне напрямую в личные сообщения @doroshkevich_anton или на email: a.doroshkevich@is1c.ru. Постараюсь сделать всё возможное, чтобы помочь в срочном порядке.
Так же теперь канал есть в MAX и dzen
Присоединяйтесь!
Здесь ценят профессионализм, ясность и готовность разбираться в сложном. Это будет место для тех, кто предпочитает глубину поверхностным решениям!
Рад видеть вас в числе подписчиков! 😊
is1c.ru
1С:РКЛ в «ИнфоCофт» - IT-эксперт для бизнеса и госсектора
ИнфоCофт - 1С:РКЛ: цены на услуги 1С от экспертов области.
👍20🔥9❤8
Антон Дорошкевич | проводник в мире 1С и СУБД pinned «Коллеги, приветствую вас в профессиональном пространстве, посвященном тонкостям Платформы 1С и СУБД! Меня зовут Антон Дорошкевич, и я представляю Франчайзинговую сеть ИнфоСофт из Новосибирска. Более двух десятилетий я влюблён в лучшую в мире платформу 1С…»
Недавно столкнулся с ситуацией, когда поговорки "Не верь глазам своим" и "Доверяй, но проверяй" звучат очень актуально)
Было замечено что Рабочие процессы сервера 1С не перезапускаются уже несколько дней
Скриншот на 12/08/2025
Что мы тут видим:
▫️Установлен параметр Интервал перезапуска в 86400 секунд (одни сутки).
▫️При этом в кластере все Рабочие процессы, которые родились 07/08/2025 (Время запуска), т.е. почти 5 дней назад, до сих пор имеют статус Активен.
Первая мысль: Ошибка в платформе и кластер перестал реагировать на Интервал перезапуска
НО, по своему опыту я знаю, что в 99% случаев когда кажется что это ошибка, оказывается что платформа тут не при чём и ошибка где-то в другом месте или мы просто не пониманием механизма работы.
При этом факты на лицо и спорить с ними очень сложно.
Давайте разбираться.
Информация о настройках и составе кластера 1С платформа хранит в файле Реестра кластера 1CV8Clst.lst https://its.1c.ru/db/v8327doc#bookmark:adm:TI000000372
К сожалению описания состава этого файла в документации нет, поэтому обратимся к практике
В первых двух строках файла Реестра кластера видим:
{0,
{a2e908eb-b732-4807-ac75-166a8ee4c099,"server-1c",1541,"server-1c",0,0,0,30,0,0,0,Тут важно подчеркнуть что ситуация была на платформе 8.3.26, в платформе 8.3.27 параметр перезапуска полностью изменился как внешне так и по механике поведения.
Итак, что мы тут видим?
Очень знакомая цифра 30, подозрительно похожая на значения параметра кластера "Проблемные процессы завершать через"...
И при этом нигде в файле реестра не видно цифры 86400
Что делать:
1. Верить файлу реестру кластера
2. Перезапустить консоль или как минимум перейти на самый верх в консоле и нажать Обновить (но это не всегда помогает)
После перезапуска в консоли видим что Интервал перезапуска оказывается 0. а не 86400
И в файле реестра кластера теперь запись:
{0,
{a2e908eb-b732-4807-ac75-166a8ee4c099,"server-1c",1541,"server-1c",0,0,86400,30,0,0,0,Надеюсь это поможет вам разобраться с "чудесным" поведением казалось бы Платформы, а на самом деле mmc-консоли
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍9❤2
При настройке ТНФ (Требований назначения функциональности) в консоле администрирования и в обработке Управление серверами невозможно отличить уже применённое ТНФ от просто созданного.
Это приводит к неоднозначности понимания работы кластера.
Так как кажется что он работает не так как его настроили.
Опять же, в 99% случаев Платформа работает верно, это просто мы не понимаем почему сейчас верно работать именно так, а не иначе 😁
Итак, возьмём кластер состоящий из двух серверов:
▫️ Server1c - сервис программного лицензирования
▫️ Server1c-2 - центральный сервер
Уже настроенные и применённые ТНФ этих серверов на (скриншоте 1)
Добавляем ТНФ для Server1c: Сервис Дата акселератора - Не назначать (скриншот 2)
❗️ И вот теперь попробуйте догадаться, применено это требование или нет?
И тут нам на помощь опять приходит файл реестра кластера.
При применённых ТНФ с первого скриншота часть файла, относящаяся к ТНФ выглядит так:
{2,0cd2713d-8663-4ce1-8c43-8823ebfae4a4,
{2,
{e53260f6-2ad5-4562-935a-a17ad4db3220,1,1,1,1,1,0},
{a963ead5-cc11-41bc-b89b-c02d2c16bf80,0,"DataAcceleratorService",1,1,0,3,0}
},a51a9c1e-cfdc-464e-a966-c526cf9c41d7,
{2,
{f029efbd-99d9-4b39-a678-43fe969d1bcb,0,"LicenseService",1,1,2,1,0},
{4204e792-f02f-452d-b2a8-9c3b60ac8581,1,1,1,0,1,0}
}
},
{2,0cd2713d-8663-4ce1-8c43-8823ebfae4a4,
{2,
{e53260f6-2ad5-4562-935a-a17ad4db3220,1,1,1,1,1,0},
{a963ead5-cc11-41bc-b89b-c02d2c16bf80,0,"DataAcceleratorService",1,1,0,3,0}
},a51a9c1e-cfdc-464e-a966-c526cf9c41d7,
{2,
{f029efbd-99d9-4b39-a678-43fe969d1bcb,0,"LicenseService",1,1,2,1,0},
{4204e792-f02f-452d-b2a8-9c3b60ac8581,1,1,1,0,1,0}
}Теперь создадим ТНФ для Server1c: Сервис Дата акселератора - Не назначать
{2,0cd2713d-8663-4ce1-8c43-8823ebfae4a4,
{2,
{e53260f6-2ad5-4562-935a-a17ad4db3220,1,1,1,1,1,0},
{a963ead5-cc11-41bc-b89b-c02d2c16bf80,0,"DataAcceleratorService",1,1,0,3,0}
},a51a9c1e-cfdc-464e-a966-c526cf9c41d7,
{3,
{46d69966-6805-4689-8768-b6f89aa3cbdb,0,"DataAcceleratorService",1,1,0,1,0},
{f029efbd-99d9-4b39-a678-43fe969d1bcb,0,"LicenseService",1,1,2,1,0},
{4204e792-f02f-452d-b2a8-9c3b60ac8581,1,1,1,0,1,0}
}
},
{2,0cd2713d-8663-4ce1-8c43-8823ebfae4a4,
{2,
{e53260f6-2ad5-4562-935a-a17ad4db3220,1,1,1,1,1,0},
{a963ead5-cc11-41bc-b89b-c02d2c16bf80,0,"DataAcceleratorService",1,1,0,3,0}
},a51a9c1e-cfdc-464e-a966-c526cf9c41d7,
{2,
{f029efbd-99d9-4b39-a678-43fe969d1bcb,0,"LicenseService",1,1,2,1,0},
{4204e792-f02f-452d-b2a8-9c3b60ac8581,1,1,1,0,1,0}
}Тут видно что в верхнем блоке у нас появилась запись: {46d69966-6805-4689-8768-b6f89aa3cbdb,0,"DataAcceleratorService",1,1,0,1,0},
А теперь выполним полное применение ТНФ:
{2,0cd2713d-8663-4ce1-8c43-8823ebfae4a4,
{2,
{e53260f6-2ad5-4562-935a-a17ad4db3220,1,1,1,1,1,0},
{a963ead5-cc11-41bc-b89b-c02d2c16bf80,0,"DataAcceleratorService",1,1,0,3,0}
},a51a9c1e-cfdc-464e-a966-c526cf9c41d7,
{3,
{46d69966-6805-4689-8768-b6f89aa3cbdb,0,"DataAcceleratorService",1,1,0,1,0},
{f029efbd-99d9-4b39-a678-43fe969d1bcb,0,"LicenseService",1,1,2,1,0},
{4204e792-f02f-452d-b2a8-9c3b60ac8581,1,1,1,0,1,0}
}
},
{2,0cd2713d-8663-4ce1-8c43-8823ebfae4a4,
{2,
{e53260f6-2ad5-4562-935a-a17ad4db3220,1,1,1,1,1,0},
{a963ead5-cc11-41bc-b89b-c02d2c16bf80,0,"DataAcceleratorService",1,1,0,3,0}
},a51a9c1e-cfdc-464e-a966-c526cf9c41d7,
{3,
{46d69966-6805-4689-8768-b6f89aa3cbdb,0,"DataAcceleratorService",1,1,0,1,0},
{f029efbd-99d9-4b39-a678-43fe969d1bcb,0,"LicenseService",1,1,2,1,0},
{4204e792-f02f-452d-b2a8-9c3b60ac8581,1,1,1,0,1,0}
}И вот теперь запись {46d69966-6805-4689-8768-b6f89aa3cbdb,0,"DataAcceleratorService",1,1,0,1,0}, появилась не только в пером, но и во втором блоке!
❗️Именно наличие записи в двух блоках говорит о том что ТНФ применено
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🔥4
В файле есть состав кластера:
{2,
{aef09594-d129-4af5-8760-d29b3cadb460,"server1c",1,0,1000,a51a9c1e-cfdc-464e-a966-c526cf9c41d7,1},
{1fee5301-406f-4669-8111-6f3922040417,"SERVER1C-2",1,0,1000,0cd2713d-8663-4ce1-8c43-8823ebfae4a4,0}▫️server1c имеет id a51a9c1e-cfdc-464e-a966-c526cf9c41d7
▫️server1c-2 имеет id 0cd2713d-8663-4ce1-8c43-8823ebfae4a4
И каждый блок ТНФ так же имеет запись, к какому id он относится:
0cd2713d-8663-4ce1-8c43-8823ebfae4a4,
{2,
{e53260f6-2ad5-4562-935a-a17ad4db3220,1,1,1,1,1,0},
{a963ead5-cc11-41bc-b89b-c02d2c16bf80,0,"DataAcceleratorService",1,1,0,3,0}
}
Тут видим что к id 0cd2713d-8663-4ce1-8c43-8823ebfae4a4 (server1c-2) относятся 2 ТНФ (цифра 2 после id) и затем описание этих ТНФ
Соответственно следующий блок описывает 3 ТНФ для Server1c:
a51a9c1e-cfdc-464e-a966-c526cf9c41d7,
{3,
{46d69966-6805-4689-8768-b6f89aa3cbdb,0,"DataAcceleratorService",1,1,0,1,0},
{f029efbd-99d9-4b39-a678-43fe969d1bcb,0,"LicenseService",1,1,2,1,0},
{4204e792-f02f-452d-b2a8-9c3b60ac8581,1,1,1,0,1,0}
Таким образом, чтобы увидеть какие ТНФ созданы, а какие уже применены у нас есть хоть и не удобный, но инструмент,
❗️ВАЖНО: Состав файла реестра кластера не документирован и может поменяться, поэтому необходимо обязательно тестировать свои предположения на новых платформах
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥6❤5
Переход на Linux инфраструктуры 1С это уже не какие-то непонятные слова, а реальность от которой убегать всё сложнее.
И в процессе эксплуатации таких систем случаются "чудеса", которые не то что в документации по 1С не отражены, но и не находятся в поисковиках интернета и даже не решаются с помощью ИИ 😁
Одним из таких чудес является неожиданная смена пользователя в открытой базе 1С с вас на кого-то другого из работающих в базе...
Для получения такого эффекта нам нужна база 1С опубликованная на Linux+apache и авторизация в 1С настроенная на Active Directory
❗️И тогда, при нажатии в браузере F5 у вас неожиданно может измениться пользователь под которым вы работаете в 1С.
Очень опасное поведение, но как ни странно - опять платформа 1С не при чём!
А кто виноват?
Виновата связка apache и mod_auth_gssapi (модуль авторизации AD) + режим работы mpm (модуль многопоточности, Multi-Processing Modules)
Модуль mpm может работать в 3-х режимах:
▫️ Event
▫️ Worker
▫️ Perfork
Каждый из этих режимов имеет свои плюсы и минусы и возможности тонкой настройки, но для 1С обычно хватает настройки по умолчанию.
На разных Linux, а их десятки, по умолчанию при установке apache или уже на установленном может быть выбран любой из них.
Проверить какой именно можно командами:
httpd -V | grep MPM
или
```shell
apachectl -V | grep -i mpm
`Так вот, для корректной работы авторизации нам требуется режим prefork
Как переключиться на этот режим mpm с режима event:
▫️
sudo a2dismod mpm_event (отключаем текущий режим)▫️
sudo a2enmod mpm_prefork (включаем нужный нам режим prefork)▫️
sudo systemctl restart apache2 (перезапускаем apache)Эта проблема очень сложно выявляется на тесте, так как редко тестируется под несколькими пользователями.
Надо знать про наличие такой проблемы чтобы специально её тестировать.
❗️Будьте внимательны!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥49👍18😱6❤3
▫️27-28 Сентября - Партнёрский семинар 1С, Москва
▫️29 Сентября - PGConf.СПб 2025, Санкт-Петербург
▫️09-12 Октября - Infostart Tech Event 2025, Санкт-Петербург
▫️17-19 Октября - Merge.Baltic, Калининград/Светлогорск
▫️24 Октября - Жёлтая конфа, Москва
Не знаю почему для организаторов не существует в году месяцев кроме Сентября и Октября 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
😁28👍12🔥11
Сразу оговорюсь - dump это крайне надёжный и очень гибкий способ создания резервных копий!
Но, есть нюансы...
Рекомендуемая в том числе и мной схема организации резервного копирования:
▫️Мастер
▫️Реплика для отказоустойчивости
▫️Реплика для резервных копий
Соответственно резервные копии, например с помощью утилиты pg_dump (а в PostgreSQL есть ещё и другие способы сделать backup) рекомендуется делать с "Реплики для резервного копирования".
Так как dump это длительная транзакция, а длительные транзакции для PostgreSQL это плохой сценарий для мастера приводящий к блокировке работы autovacuum (процесс автоочистки "мёртвых" строк).
Помимо этого dump это ещё и достаточно большая нагрузка на диски, что так же не зачем мастеру, его работа пользователей обслуживать, а не ит-шные хотелки 😁
Итак, осознавая зачем и почему мы прилежно делаем dump-ы с реплики и считаем что всё хорошо. В целом оно так и есть при одном условии:
❗️Если реплика не отстаёт от мастера
Давайте на цифрах:
▫️Время на мастере - 12:00:00
▫️Время на которое реплика уже "проиграла" в себя данные - 11:59:59.389
▫️Время старта dump с реплики - 12:00:00
✅В этом случае всё прекрасно, делаем dump, и при восстановлении данные в базе будут на 11:59:59.389. так как dump консистентен на начало транзакции.
Теперь другой сценарий:
▫️Время на мастере - 13:00:00
▫️Время на которое реплика уже "проиграла" в себя данные - 11:59:59.389
▫️Время старта dump с реплики - 13:00:00
❗️В этом случае при восстановлении данные в базе будут на 11:59:59.389 и это неожиданно! Ведь мы то думали что они будут на момент старта dump-а 13:00:00!
Как такое произошло?
Всё дело в отставании реплики, оно на момент старта dump-а составило чуть более 1 часа.
Откуда может взяться отставание?
Дело в том, что в отличии от мастера, реплика однопоточная и ничего не знает о версиях, номерах транзакций и т.д., очень нужных вещей для мастера и совершенно бесполезных для реплики.
И если на реплики идёт транзакция, то "проигрывание" данные в базу останавливается (начинается накопление WAL - журнала предзаписи), "проигрывание" продолжится как только транзакция будет завершена. И так до следующей транзакции.
И как ни странно, этой первой транзакцией может легко оказаться наш первый dump, который просто длился более 1 часа
Второй вариант отставания - это чисто "железное" отставание, когда не справляется сеть между мастером и репликой. В этом случае на реплику просто не поступили ещё WAL-ы с мастера и ей нечего записать в базу.
Как получить отставание реплики от мастера?
Для этого есть специальное представление
pg_stat_replicationselect replay_lag from pg_stat_replication
Вернёт нам отставание реплики от мастера. например 00:00:00.003122
Но отставание как мы выше поняли может быть 2х типов (на самом деле больше, но это уже экзотика), получить отставание, которое обосновано не транзакциями на реплике, а сетью можно тем же представлением:
select wtite_lag from pg_stat_replication
❗️Что с этим со всем делать?
1. Следить за отставанием реплик
2. Иметь более одной реплики от мастера
3. Использовать другие средства резервного копирования (pg_basebackup, probackup и ещё штук 10 вариантов открытого ПО)
4. При крайней необходимости сделать dump с мастера, он всегда будет содержать данные на момент начала dump-а
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥12👏3❤1
Есть довольная распространённая практика переноса каталога Журнала предзаписи транзакций (WAL) на другой диск, что даже рекомендуется разработчиками Postgres и звучит эта рекомендация так:
Имеет смысл размещать WAL на другом диске, отличном от того, где находятся основные файлы базы данных. Для этого можно переместить каталог pg_wal в другое место (разумеется, когда сервер остановлен) и создать символическую ссылку из исходного места на перемещённый каталог.
И тут всё хорошо. Действительно в Postgres нет настройки расположения каталога pg_wal и его перенос решается через создание символической ссылки на каталог (symlink).
По всей видимости лёгкость, понятность и распространённость такого подхода повлияла на то что Администраторы СУБД либо Системные администраторы помимо каталога pg_wal так же этим способом переносят и другие каталоги Postgres.
А тут нас ждёт очень интересная проблема...
Дело в том, что утилита pg_basebackup с помощью которой создаются резервные копии кластера PostgreSQL и реплики (для них создание резервной копии кластера это первый шаг создания) не учитывает символические ссылки.
Что в итоге мы можем получить:
Допустим что установили Postgres и он по умолчанию создал каталог с базой данный в /var/lib/postgres/data.
Далее мы создали в нём базу ERP (пока пустую) её OID пусть будет 358924. Соответсвенно все данные этой базы будут у нас располагаться в каталоге /var/lib/postgres/data/base/358924
Заранее зная что база будет большой, админы выделили место под базу в каталоге /data, а место под wal в каталоге /wal_data
Опираясь на опыт переноса каталог pg_wal:
▫️Останавливаем postgres
▫️Переносим каталог var/lib/postgres/data/pg_wal в /wal_data/pg_wal
▫️Делаем symlink между этими каталогами
❗️Переносим каталог var/lib/postgres/data/base/358924 в /data/358924 (каталог нашей ERP)
▫️Делаем symlink между этими каталогами
Стартуем postgres - всё работает!!!
Казалось бы, что может пойти не так? 😁
Рассказываю:
Как правильные админы, после создания мастера мы делаем реплику
Утилитой pg_basebackup заливаем данные с мастера на реплику.
Стартуем реплику и тоже всё стартует и работает!!!
И даже когда мы начнём заливать в базу ERP данные - они послушно побегут на реплику, так как передаются посредством трансляции WAL.
Так мы счастливо работаем какое-то время и затем наступает момент когда нам потребовалось сделать резервную копию кластера с мастера:
❗️Мы запускаем pg_basebackup. она выполняется, вот только копия не содержит нашу базу ERP.
Поскольку база на мастере располагается в каталоге с символической ссылкой и вместо данных, утилита в бэкап кластера скопирует просто пустой каталог /358924.
❗️Тоже самое нас ждёт при попытке создать новую реплику.
Она создастся, но вот только без базы ERP.
Как же правильно вынести какую-то базу или несколько баз, а может и все сразу в другое место?
Для этого необходимо использовать Таблиные пространства (tablespace)
Т.е. в нашем сценарии мы должны были сначала создать табличное пространство
CREATE TABLESPACE erp_data LOCATION '/data'
а затем создать базу ERP уже в этом табличном пространстве
CREATE DATABASE ERP WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = erp_data
Если же мы хотим чтобы все базы по умолчанию создавались в нужном нам каталоге, то есть 2 варианта:
1. Заново инициализировать кластер Postgres через Initdb указав в качестве расположения каталог /data
2. Переопределить табличное пространство по умолчанию в конфигурационном файле postgresql.conf переопределив параметр
default_tablespace = '/data'❗️Будьте очень осторожны с символическими ссылками не смотря на то, что это очень удобный и быстрый инструмент!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34👍13❤3
Согласно документации:
Вариант расходования лицензии - Лицензия получена клиентским приложением на локальном компьютере, Программная/Аппаратная - На компьютер
"Под термином «на компьютер» понимается следующее: если лицензия получена в варианте «на компьютер», то на компьютере, получившим лицензию, допускается запуск произвольного количества клиентских приложений, работающих с произвольным количеством информационных баз."
Для нас тут важно слово "произвольное".
Обычно это понимается как бесконечное, но на практике это не так.
Часто проводя нагрузочное тестирование не только фоновыми операциями, но и реальными запусками клиентских приложений 1С было обнаружено что ограничение всё таки есть,
Потом этот факт подтвердился на партнёрском форуме, у кого есть доступ, почитайте: https://partners.v8.1c.ru/forum/message/2241411
❗️Итак, в реальности ограничение равно 256 запускам приложений (Конфигуратор, Толстый клиент, Тонкий клиент).
Для некоторых сценариев это очень важное недокументированное ограничение.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥15❤6
Представьте, запустили вы реструктуризацию своей любимой 1С-ки через оптимизированный механизм реструктуризации 2.0 , всё идёт хорошо и вдруг получаем ошибку обрыва соединения, реструктуризация прерывается и достаточно сложно вернуть базу в начальное состояние без восстановления на резервную копию ДО реструктуризации (а резервные копии же у вас есть всегда!?).
Такая же ситуация может произойти и когда идёт репликация базы между СУБД с помощью утилиты ibcmd replicate...
Причём ошибка может звучать либо очень странно - что-то там про таймаут либо в случае ibcmd будет просто сообщение что репликация завершилась с ошибкой.
❗️Главная особенность именно этой ошибки, что она происходит по истечении более чем ДВУХ часов!
Что за волшебные 2 часа и что вообще происходит?
В операционных системах Windows и почти во всех Linux есть ограничение на ожидание последнего пакета, отправленного по сети.
По прошествии этого времени соединение помечается как требующее проверки, затем несколько раз проверяется и если проверки закончились неудачно. то оно разрывается.
А с чего это вдруг система решила что прошло уже 2 часа?
Это будет в том случае, если мы натолкнулись на создание огромного индекса .т.е. команду CREATE INDEX.
Эта команда вернёт обратно утилите своё состояние только по завершению создания индекса, т.е. это одна транзакция., а не несколько (единиц, десятков, сотен, тысяч и т.д.) как в случае когда мы заполняем таблицы данным при реструктуризации или репликации.
Повлиять на скорость создания индекса достаточно сложно, хотя можно, и как это сделать в PostgreSQL расскажу в следующий раз.
А вот повлиять на поведение системы, чтобы она не прерывала такое соединение можно достаточно просто.
Для Linux:
▫️
sysctl net.ipv4.tcp_keepalive_time узнаём какой сейчас стоит таймаут, обычно ответ будет 7200▫️Если он меньше чем нам нужно, то устанавливаем новое значение в секундах, которое заведомо больше нашего времени создания индекса
sysctl -w net.ipv4.tcp_keepalive_time=14400 в секундах!▫️Если мы хотим установить этот параметр так чтобы он подтянулся и после перезагрузки, то нужно в файле
/etc/sysctl.conf добавить строчку: net.ipv4.tcp_keepalive_time = 14400Для Windows:
▫️В разделе реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
создаём параметр DWORD с именем KeepAliveTime и значением 14400000 в миллисекундах!
▫️Перезагружаем систему
Какое время необходимо вам для создания индекса конечно нужно смотреть в логах СУБД заранее настроив их на сбор длительных запросов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥51👍14❤4🤔1
Большинство из нас привыкло, что при изменении состава публикуемых web или http сервисов нужно заново публиковать базу на веб-сервере чтобы новшества заработали.
При этом файл default.vrd выглядит очень большим и сложным:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/buh"
ib="Srvr="server1c:1541";Ref="buh";">
<standardOdata enable="false"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
<ws>
<point name="AccHRMDataTransfer"
alias="AccHRMDataTransfer.1cws"
enable="true"
reuseSessions="dontuse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
<point name="EnterpriseDataExchange_1_0_1_1"
alias="EnterpriseDataExchange_1_0_1_1.1cws"
enable="true"
reuseSessions="dontuse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
<point name="EnterpriseDataUpload_1_0_1_1"
alias="EnterpriseDataUpload_1_0_1_1.1cws"
enable="true"
reuseSessions="dontuse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
...
Но если внимательно прочитать ИТС, то можно обнаружить что для работы всех возможных сервисов публикации, в том числе и тех, которые в расширениях, достаточно сделать вот такой файл default.vrd:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/buh"
ib="Srvr=server1c:1541;Ref=buh;"
<ws pointEnableCommon="true"
publishExtensionsByDefault="true"/>
<httpServices publishExtensionsByDefault="true"/>
<standardOdata enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
<analytics enable="true"/>
</point>
❗️Помимо того что это просто красиво, такая настройка позволяет ничего не переопубликовывать при добавлении нового web или http-сервиса, всё сразу работает!
Так зачем же тогда Платформа 1С делает такую развёрнутую публикацию?
Ответ достаточно прост - чтобы была возможность что-то исключить из публикации, например какому-то одному или нескольким сервисам установить значение
enable="false" либо наоборот, запретив всё разрешить только некоторые<httpServices publishByDefault="false"
publishExtensionsByDefault="false">
<service name="ПолучениеЗаказовПоAPI"
rootUrl="Marketplace_API"
enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
</httpServices>
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥55👍11❤9👏7
Достаточно редкая, но очень "противная" и непонятная ошибка.
Что только не делают чтобы её убрать:
▫️Удаляют базу с кластера 1С и регистрируют заново.
▫️Добавляют базу в другой кластер 1С.
▫️Останавливают службу 1С с очисткой сеансовых данных.
Все эти способы почти никогда не помогают.
❗️Что было замечено?
▫️Эта ошибка практически в 100% случаев возникает только с базами PostgreSQL.
▫️Так же практически всегда она возникает после того как базу восстановили из дампа с помощью pg_restore.
Давайте разбираться в чём же проблема? Неужели виновата "православная" СУБД?
Проблема в том, что по умолчанию pg_restore НЕ УДАЛЯЕТ базу перед восстановлением в неё дампа.
Т.е. в восстановленной базе есть "ошмётки" от старой базы и новые данные из дампа.
Именно это и приводит к появлению ошибки "Запись не найдена в менеджере имён базы данных".
Почему ошибка не всегда и не у всех?
Потому что если вы восстанавливаете базу в её же "старый вариант", то возможно вам повезёт и платформа не обнаружит нарушений в своих системных данных и всё будет работать.
Как сделать так чтобы ошибка возникла с вероятностью 99%?
▫️На СУБД не должно быть нашей базы test.
▫️Добавить базу в кластере 1С с установленной галкой "Создать в случае отсутствия".
▫️Восстановить дамп в эту базу, причём дамп сливался с базы с названием отличным от test.
В отличии от PostgreSQL, MS SQL наоборот всегда УДАЛЯТ базу, СОЗДАЁТ заново пустую и в неё уже восстанавливает резервную копию - поэтому при использованию MS SQL этой ошибки и не возникает.
Как же правильно восстанавливать/обновлять существующую базу 1С на PostgreSQL?
❗️Вариант 1 (универсальный):
▫️Удалить базу с кластера 1С
▫️Удалить базу с СУБД PostgreSQL
▫️Создать пустую базу 1С на PostgreSQL скриптом (пример для PG 17):
CREATE DATABASE test
WITH
OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'ru_RU.UTF-8'
LC_CTYPE = 'ru_RU.UTF-8'
ICU_LOCALE = 'ru-RU'
LOCALE_PROVIDER = 'icu'
TABLESPACE = pg_default
CONNECTION LIMIT = -1
IS_TEMPLATE = False;
▫️Восстановить дамп через pg_restore в базу test
▫️Добавить базу в кластер 1С
❗️Вариант 2:
▫️Удалить базу с кластера 1С
▫️Восстановить дамп через pg_restore в базу с тем названием, которое было у оригинальной базы с которой делался дам с параметрами --clean --create
▫️Добавить базу в кластер 1С
❗️Небольшая, но важная особенность:
С параметром --create база, заданная параметром -d, применяется только для подключения и выполнения начальных команд DROP DATABASE и CREATE DATABASE. Все данные восстанавливаются в базу данных, имя которой записано в архиве.
❗️Так же обратите внимание что во всех вариантах при восстановлении базы на уровне СУБД (не перезаливкой dt) необходимо удалять базу с кластера 1С и добавлять заново. Так как кластер 1С не в курсе что ему подсунули новую базу и вся система кэширования в итоге оказывается проблемой, а не помощником.
Эта особенность не зависит от того какую СУБД использовать PostgreSQL или MS SQL
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥40❤9👍8😱1🤬1
Ни для кого не секрет что с одной стороны запросы 1С все буквально сотканы из временных таблиц.
С другой стороны, именно работа с временными таблицами является ахилесовой пятой postgresql.
За последние несколько лет сделано очень много оптимизаций и изменений, касающихся работы с времеными таблицами как со стороны Платформы 1с так и со стороны postgres.
Но недавно нагрузочные тесты показали еще один интересный момент, про который сегодня расскажу.
Все мы знаем, что временные таблицы сеанса postgres размещаются в оперативной памяти, пока не исчерпают обьем, указанный в параметре temp_buffers.
И конечно есть соблазн купить много оперативной памяти и выкрутить этот параметр в бОльшую сторону.
Например вместо рекомендуемых 128-256МБ поставить 2ГБ.
И конечно же ожидать от этого только плюсы и увеличение скорости работы с временными таблицами.
Оказалось что при достаточно больших значениях temp_buffers, 1ГБ и более (но как и при любом тесте многое зависит от железа и эта цифра может быть как больше так и меньше), удаление временной таблицы из памяти занимает достаточно продолжительное время.
Это происходит из-за того что при работе с памятью системе нужно последовательно пройти все страницы и освободить их, при размере временной таблицы в 1ГБ таких проходов около 0.5 млн.
В итоге пришли в неожиданному выводу, что эффективнее наоборот уменьшить temp_buffers, но при этом вынести табличное пространство для временных таблиц на диск в оперативной памяти (RAM-диск, tmpfs).
Так как удаление файла размером в 1ГБ это очень быстрая файловая операция, а не последовательный проход страниц.
Как же вынести временные таблицы в отдельное табличное пространство?
За это отвечает параметр в postgresql.conf - temp_tablespaces
Итого, нам нужно смонтировать каталог в tmpfs, дать на него права пользователю и группе postgres и указать его абсолютный путь в параметре temp_tablespaces.
Только будьте внимательны!
Размер каталога должен соответствовать профилю вашей нагрузки.
Тут проще всего ориентироваться на статистику максимального размера занимаемого места временными таблицами.
К сожалению именно такого разреза статистики в postgresql нет, но зато это знает операционная система.
Просто выносим временные таблицы в отдельное табличное пространство на диске, где работаем сейчас.
И ставим размер свободного или занятого места на этом диске на мониторинг в вашей системе мониторинга.
Ждём релевантный для вашего профиля нагрузки период и смотрим там максимальный показатель занятого места.
Прибавляем к нему 20-30% и именно столько нам нужно будет выделить место в оперативной памяти для уверенности в том что его хватит.
Опять же, это справедливо для случая когда мы не меняем параметр temp_buffers. Если же мы его уменьшаем, то таблиц на диске будет еще больше и вам нужна новая статистика для определения необходимого объема.
Это особенно актуально в системах, где вы часто видите запрос drop temptable, который длится более 1 сек.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥53👍12❤3
При давно отработанной процедуре обновления платформы 1с, при переходе на 27 версию достаточно часто стали получать прямо таки неадекватное поведение системы при в общем-то штатной работе и отсутствием обшибок в ТехЖурнале.
Что за процедура?
Для Windows:
▫️Устанавливаем новую версию на сервер, снимая галку "установить как службу"
▫️Правим реестр ОС с указанием нового каталога исполняемых файлов службы Агент сервера 1с
▫️В технологическое окно:
- удаляем все сеансы
- останавливаем службу
- дожидаемся остановки всех процессов rphost, rmngr, ragent
- запускаем службу
Для Linux всё тоже самое, только вместо реестра заменяем симлинк файла службы на новый
Заходим в 1С и всё работает, по крайней мере так было последние несколько лет стабильно.
Но при обновлении именно на 27 версию начались чудеса: странные ошибки как на картинке, исчезновение кнопок у платформенных форм, ругань на отсутсвие каких-то очень странных файлов по странным путям и т.д.
При этом в ТехЖурнале тишь да благодать...
В ходе попыток найти решение было обнаружено что причиной такого поведения является каталог сеансовых данных.
В нем странным образом переставали создаваться файлы и структуры каталогов, хотя с правами у пользователя всё хорошо.
В итоге система стабилизировалась только после полной очистки каталога C:\Program Files\1cv8\srvinfo\reg_1541\snccntx
Да, в чек-листе от 1С в примере скрипта по остановке службы 1С всегда была строка:
DEL /Q /F /S %CNTX_PATH%\snccntx*НО:
Во-первых - ктож вообще читает инструкции? 😁
Во-вторых - давно уже обходилось обновление без этого действия, но вот опять 😄
❗️Если вы столкнулись с очень странными сообщениями платформы, то перезапустите службу 1С с очисткой сеансовых данных и не забудьте это сделать при обновлении версии платформы!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥25❤2🙏1
Мой первый опыт в подкастах
https://vkvideo.ru/video-227129566_456239066
Спасибо Сергею Сыпачеву за приглашение и атмосферу!)
https://vkvideo.ru/video-227129566_456239066
Спасибо Сергею Сыпачеву за приглашение и атмосферу!)
🔥49👍19👏7🎉3
